OnDataChange中的代码执行了多次

时间:2013-10-22 09:22:45

标签: database delphi

我有一个链接到TTable的TDatasource,我在Datasource.OnDataChange中执行了一些代码。

我的问题是,当我执行TTable.First或TTable.Last时,OnDataChange内部的代码将针对每条记录执行,直到光标到达第一个或最后一个位置(我想与TTable1.MoveBy相同)。

如何在流程结束时确保OnDataChange中的代码只执行一次?

1 个答案:

答案 0 :(得分:0)

我最近不得不处理类似的情况。在我的例子中,作为示例,OnDataChange事件中的代码旨在根据关联的TDBGrid中的最新数据调整关联的Dataset的列宽。我需要在数据发生变化时才进行此调整,但OnDataChange似乎连续多次执行。

那么,如何让它只执行一次代码?

我选择使用Boolean标志来限制OnDataChange事件中代码的执行,直到该标志设置为True。像这样......(基本示例代码)

var
  bLoading: Boolean;

procedure TfrmMain.btnExecuteSQLClick(Sender: TObject);
begin
  qry.SQL := memo.Lines;
  bLoading := True; // set flag to true so code in OnDataChange will execute
  qry.Open;
end;    

procedure TfrmMain.DataSource1OnDataChange(Sender: TObject; Field: TField);
begin
  if bLoading then // checks if your flag is set to true
  begin
    // insert the code you want to run only once here
    ...
    bLoading := False; // then set flag to false to prevent repetitive execution
  end;
end;

我不确定这是否对你有所帮助,而且我知道它不会回答你问题的第二部分“在流程结束时”,但也许只是使用布尔标志的想法会给你一些灵感继续你的问题。这是一种有用的技术,在多线程编程领域,它们甚至给它起了一个特殊的名称。他们称之为mutex!它只是一个布尔标志。门是打开的,还是关闭的。一旦打开,请确保关上门,以防止不速之客撞毁派对!