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