比如说,某个字符串集合,大约有80个元素,"test","fast","report",.............。
在某个定时器内判断,如果集合中的元素发生了变化,则返回真,否则为假。
这种变化包括在定时器时间片内集合中增加元素(但不会多于85个)、减少元素(但不会少于75个)或替换元素。
请提供最快的判断方法。
注意,定时器时间片大约只有5秒,因此这种判断至少应该在4秒内完成。
在某个定时器内判断,如果集合中的元素发生了变化,则返回真,否则为假。
这种变化包括在定时器时间片内集合中增加元素(但不会多于85个)、减少元素(但不会少于75个)或替换元素。
请提供最快的判断方法。
注意,定时器时间片大约只有5秒,因此这种判断至少应该在4秒内完成。
OnInsertItem, OnDeleteItem, OnUpdateItem, OnReplaceItem...
ISubject = interface
..................TMyStrings = class(TStrings, ISubject)
............把你需要得变化信息的元素变成观察者TMyForm = class(TForm, IObserver)
.......注册观察者
1、首先这个集合不一定是字符串,也可能是整数或其它基本数据类型,但不是对象;
2、其次这个集合的获得也是在定时器的时间段内,而且是从数据库通过adoquery获得的。
=========
这个有两种情况:
1.数据已经在本地内存,可以利用ClientDataSet的相应事件来处理
2.数据在后台数据库,由外部改变了数据. 那就需要你把新数据取回来比较原来的数据.
.......
DataModule9.ADOQuery1.sql:='select * from tbdocument order by createtime';
........
var
LastId:integer;//全局变量
//定时提示待批阅文件
procedure TMainForm.Timer2Timer(Sender: TObject);
var
id:integer;
BookMark:TBookMarkStr;
begin try
BookMark:=DataModule9.ADOQuery1.Book;
DataModule9.ADOQuery1.Requery();
DataModule9.ADOQuery1.Last;
id:=DataModule9.ADOQuery1.FieldByName('id').AsInteger;
DataModule9.ADOQuery1.Book:=BookMark;
except
end;
if DataModule9.ADOQuery1.IsEmpty then exit;
if id=LastId then exit; //如果没有增加新的批阅文档则退出
if flashForm=nil then
begin
playSound(Pchar(ExtractFilePath(Application.ExeName)+'Global.wav'), 0, SND_ASYNC or SND_FILENAME or SND_NODEFAULT);
flashForm:= TflashForm.Create(self);
flashForm.ShowModal;
sfts:=flashForm.ask; //释放前取得全局变量
FlashWindow(flashForm.Handle,true);
FreeAndNil(flashForm);
Timer2.Interval:=9000;//9秒后再提示
end;
if flashForm<>nil then FlashWindow(flashForm.Handle,true);
playSound(Pchar(ExtractFilePath(Application.ExeName)+'Global.wav'),0,SND_ASYNC or SND_FILENAME or SND_NODEFAULT);
LastId:=id; //原来要批阅的文档
end;
=========================
这个有两种情况:
1.数据已经在本地内存,可以利用ClientDataSet的相应事件来处理
2.数据在后台数据库,由外部改变了数据. 那就需要你把新数据取回来比较原来的数据.
=========================
你的情况是哪一种?
是第一种吗?
取日志表数据与上次的比较,如果大说明监视表发生了改变。