Component List (delphi)

这篇博客介绍了一个名为TActionManager的类,用于管理并操作Delphi中的组件对象。TActionManager提供了添加、删除组件的方法,以及迭代组件执行特定操作的功能。通过示例展示了如何遍历控件并修改其文本或标题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值