您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi中常用的匿名方法示例

时间:2011/9/3 15:29:15 点击:

  核心提示:比如:Unicode、Generics(泛型)和Anonymous Methods(匿名方法)。下面是我整理的几个常用的匿名方法,和传统的方法相比,能减少不少重复代码,顺便一起分享给大家。// 锁定同...

比如:UnicodeGenerics(泛型)和Anonymous Methods(匿名方法)。下面是我整理的几个常用的匿名方法,和传统的方法相比,能减少不少重复代码,顺便一起分享给大家。

// 锁定同步对象,保证线程安全
procedure Lock(obj: TObject; proc: TProc); inline;
// 批量更新TStrings
procedure UpdateStrings(strings: TStrings; proc: TProc<TStrings>);
// 遍历TDataSet
procedure EnumerateDataSet(dataSet: TDataSet; proc: TProc<TDataset>);
// 按照Tab-Order顺序递归遍历子控件 
procedure EnumerateControls(parentControl: TWinControl; proc: TProc<TWinControl>);
操作代码演示:
procedure Test;
var
  strings: TStrings;
begin
  strings := TStringList.Create;
  try
    Lock(strings,
      procedure
      begin
        // manipute strings in thread-safe
      end
    );
 
    UpdateStrings(strings,
      procedure(strings: TStrings)
      begin
        strings.Add('A');
        strings.Add('B');
        strings.Add('C');
      end
    );
  finally
    strings.Free;
  end;
end;
完整实现代码:
procedure CheckArgumentNotNull(argument: Pointer; const argumentName: string);
begin
  if argument = nil then
  begin
    raise EArgumentException.CreateFmt(SArgumentNullException, [argumentName]);
  end;
end;
 
procedure Lock(obj: TObject; proc: TProc);
begin
  CheckArgumentNotNull(obj, 'obj');
  System.MonitorEnter(obj);
  try
    proc;
  finally
    System.MonitorExit(obj);
  end;
end;
 
procedure UpdateStrings(strings: TStrings; proc: TProc<TStrings>);
begin
  CheckArgumentNotNull(strings, 'strings');
  strings.BeginUpdate;
  try
    proc(strings);
  finally
    strings.EndUpdate;
  end;
end;
 
procedure EnumerateDataSet(dataSet: TDataSet; proc: TProc<TDataSet>);
begin
  CheckArgumentNotNull(dataSet, 'dataSet');
  dataSet.DisableControls;
  try
    dataSet.First;
    while not dataSet.Eof do
    begin
      proc(dataSet);
      dataSet.Next;
    end;
  finally
    dataSet.EnableControls;
  end;
end;
 
procedure EnumerateControls(parentControl: TWinControl; proc: TProc<TWinControl>);
var
  list: TList;
  i: Integer;
begin
  CheckArgumentNotNull(parentControl, 'parentControl');
  list := TList.Create;
  try
    parentControl.GetTabOrderList(list);
    for i := 0 to list.Count - 1 do
    begin
      proc(TWinControl(list[i]));
    end;
  finally
    list.Free;
  end;
end;

作者:左保权 (Bob) 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号