代码片断一、
procedure TfrmMain.btnDeleteClick(Sender: TObject);
var
i: Integer;
nextRecord: TBookmark;
begin
for i := 0 to aDBGridEh.SelectedRows.Count - 1 do
begin
qryQuery.GotoBookmark(aDBGridEh.SelectedRows[i]);
_EditableQuery.Delete('Scripts', 'WHERE Id=' + qryAllScripts.FieldByName('className').AsString);
end;
......
end;
代码片断二、
TraversalDBGridEh(
aDBGridEh,
procedure ()
begin
_EditableQuery.Delete('Scripts', 'WHERE Id=' + qryQuery.FieldByName('className').AsString);
end
);
代码片断一,使用的是正常的遍历方式,for..do,找到dbgrideh控件的一条选中记录,然后做某个动作,这在项目中到处可见。代码片断二则把这个遍历动作放到了可随时方便定制的匿名函数中,这样正常的遍历就被“模块化”了,我们下次再要遍历某个dbgrideh控件,只要再找出这个TravelSalDBGridEh(),写上当前需要的遍历时的动作(匿名函数),就可以了,这一定程度上消除了重复代码,使代码保持良好的可读性。
以下是这个TravelSalDBGridEh()的具体实现,这个思路大家可以推广开来,利用了匿名函数。
type
TTraversalDBGridEhAction = reference to procedure;
procedure TraversalDBGridEh(aDBGridEh: TDBGridEh; doAction: TTraversalDBGridEhAction);
var
i: Integer;
begin
if aDBGridEh.SelectedRows.Count > 0 then
Exit;
aDBGridEh.DataSource.DataSet.DisableControls();
for i := 0 to aDBGridEh.SelectedRows.Count - 1 do
begin
if aDBGridEh.DataSource.DataSet.BookmarkValid(aDBGridEh.SelectedRows[i]) then
begin
aDBGridEh.DataSource.DataSet.GotoBookmark(aDBGridEh.SelectedRows[i]);
doAction;
end;
end;
aDBGridEh.DataSource.DataSet.EnableControls();
end;