您的位置:首页 > 编程语言 > Delphi

Component List (delphi)

2008-01-31 11:04 85 查看
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TOperation = procedure (AObj: TObject);
TOpFilter = function (AObj: TObject): Boolean;

TActionManager = class(TObject)
private
ObjList: TList;
public
procedure AddObjs(Objects: array of TObject); overload;
procedure AddObj(AObj: TObject); overload;
procedure DelObj(Index: Integer);
procedure ClearObjs;
function IndexOf(AObj: TObject): Integer;
procedure Iterate(AOP: TOperation; AFilter: TOpFilter = nil);
constructor Create;
destructor Destroy; override;
end;

TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Panel1: TPanel;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Panel2: TPanel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Panel3: TPanel;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure ForEach(Objects: array of TObject;
AOP: TOperation; AFilter: TOpFilter = nil); overload;
var Mngr: TActionManager;
begin
Mngr := TActionManager.Create;
try
Mngr.AddObjs(Objects);
Mngr.Iterate(AOP, AFilter);
finally
Mngr.Free;
end;
end;

procedure ForEachChild(AParent: TWinControl;
AOP: TOperation; AFilter: TOpFilter = nil); overload;
var I: Integer;
begin
for I := 0 to AParent.ControlCount - 1 do
begin
if not Assigned(AFilter) or AFilter(TObject(AParent.Controls[I])) then
AOP(TObject(AParent.Controls[I])); { deference pointer }

{ recursively call into subcontainer }
if AParent.Controls[I] is TWinControl then
ForEachChild(TWinControl(AParent.Controls[I]), AOP, AFilter)
end
end;

procedure TestOper(AObj: TObject);
begin
if AObj is TEdit then
TEdit(AObj).Text := TEdit(AObj).Text + '1'
else if AObj is TLabel then
TLabel(AObj).Caption := TLabel(AObj).Caption + 'A';
end;

function IsTEdit(AObj: TObject): Boolean;
begin
Result := AObj is TEdit;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ForEach([Edit1, Edit2, Edit3, Label1], TestOper);
ForEachChild(Panel1, TestOper);
// ForEachChild(Panel1, TestOper, IsTEdit);
end;

{ TActionManager }

procedure TActionManager.AddObjs(Objects: array of TObject);
var I: Integer;
begin
for I := Low(Objects) to High(Objects) do ObjList.Add(Pointer(Objects[I]));
end;

procedure TActionManager.AddObj(AObj: TObject);
begin
ObjList.Add(Pointer(AObj));
end;

procedure TActionManager.ClearObjs;
begin
ObjList.Clear;
end;

constructor TActionManager.Create;
begin
ObjList := TList.Create;
end;

procedure TActionManager.DelObj(Index: Integer);
begin
ObjList.Delete(Index);
end;

destructor TActionManager.Destroy;
begin
FreeAndNil(ObjList);
end;

function TActionManager.IndexOf(AObj: TObject): Integer;
begin
Result := ObjList.IndexOf(Pointer(AObj))
end;

procedure TActionManager.Iterate(AOP: TOperation; AFilter: TOpFilter = nil);
var I: Integer;
begin
for I := 0 to ObjList.Count - 1 do
begin
{ if there is no filter or Items[I] pass the filter examination }
if not Assigned(AFilter) or AFilter(TObject(ObjList.Items[I])) then
AOP(TObject(ObjList.Items[I])); { deference pointer }
end;
end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: