很多人总是问我,接口怎么用,什么时候用它。猛地被他们一问,只能讲讲以前的应用,发现都不是非常容易理解,今天发现有一个实例,还是非常好讲解的。
我们有一个对数据进行快速下载的函数。
procedure TDataSwitch.DownTable(ASQLStr, ATableName: string);
var
tmpDataSet: TDataSet;
tmpDestDataSet: TDataSet;
begin
SystemSetup.ServerAccess.OpenSQL(ASQLStr, tmpDataSet);
SystemSetup.ClientAccess.OpenSQL('select * from ' + ATableName + '_temp', tmpDestDataSet);
try
.....
while not tmpDataSet.Eof do
begin
NewRecordToTable(tmpDataSet, tmpDestDataSet);
tmpDataSet.Next;
end; // while
finally
tmpDataSet.Free;
tmpDestDataSet.Free;
end;
end
//我们想在外部能够知道执行快速发布的进度。一般情况下怎么办呢?
//要么传递一个委托方法进来,要么从这内部发消息到外部去等等。这些办法用起来还真麻烦,而且写代码后让人看着还真是不舒服。我们提供一个Iprocess接口就好了。
IProcess = Interface
procedure ProcessChange(AMax, APos: Integer);
end;
更改代码为
procedure TDataSwitch.DownTable(ASQLStr, ATableName: string; AProcess: IProcess);
var
tmpDataSet: TDataSet;
tmpDestDataSet: TDataSet;
begin
SystemSetup.ServerAccess.OpenSQL(ASQLStr, tmpDataSet);
SystemSetup.ClientAccess.OpenSQL('select * from ' + ATableName + '_temp', tmpDestDataSet);
try
.....
while not tmpDataSet.Eof do
begin
NewRecordToTable(tmpDataSet, tmpDestDataSet);
//新加入的
if AProcess <> nil then
AProcess.ProcessChange(tmpDataSet.RecordCount, tmpDataSet.RecNo);
tmpDataSet.Next;
end; // while
finally
tmpDataSet.Free;
tmpDestDataSet.Free;
end;
end;
//谁想知道进度,只要实现IProcess接口就好了,我们还可以让窗体来实现。
TFrm_DataSwtich = class(TForm, IProcess)
...
private
{ Private declarations }
procedure ProcessChange(AMax, APos: Integer);
end
procedure TFrm_DataSwtich.ProcessChange(AMax, APos: Integer);
begin
ProgressBar1.Max := AMax;
ProgressBar1.Position := APos;
ProgressBar1.Invalidate;
end;
调用就简单了。
...
DataSwitch.DownTable(ASQLStr, ATableName, self);
浙公网安备 33010602011771号