我有一个链接到TTable的TDatasource,我在Datasource.OnDataChange中执行了一些代码。
我的问题是,当我执行TTable.First或TTable.Last时,OnDataChange内部的代码将针对每条记录执行,直到光标到达第一个或最后一个位置(我想与TTable1.MoveBy相同)。
如何在流程结束时确保OnDataChange中的代码只执行一次?
答案 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
!它只是一个布尔标志。门是打开的,还是关闭的。一旦打开,请确保关上门,以防止不速之客撞毁派对!