我想动态地创建或更改表单上的事件,我该怎么做?

I want to create or change an event on a form, dynamically, how can i do that?

我正在尝试为我的程序编写一个任务栏,我需要在 2 个事件中添加一行代码,OnClose 和 OnActivate,但是我的程序有 100 多个表单,所以我想这样做动态地。有办法吗?

语言是Delphi7.

正如 TLama 和 David Hefferman 所说,继承是正确的方法,但有时实用主义会战胜正确的方法。所以这里有一个可怕的 Kludge 可以完成这项工作。

unit Unit1;

interface

uses
  VCL.Forms,
  System.Classes,
  System.Generics.Collections;

type
  TKludge = class
  private
    fForm: TForm;
    fOnClose: TCloseEvent;
    fOnActivate: TNotifyEvent;
    procedure fNewOnActivate( Sender : TObject );
    procedure fNewOnClose( Sender : TObject; var Action : TCloseAction );
  public
    property Form : TForm
             read fForm;
    property OnClose : TCloseEvent
             read fOnClose;
    property OnActivate : TNotifyEvent
             read fOnActivate;
    constructor Create( pForm : TForm );

  end;

  TKludges = class( TObjectList<TKludge> )
  private
    fApplication: TApplication;
    procedure SetApplication(const Value: TApplication);
  public
    property Application : TApplication
             read fApplication
             write SetApplication;
  end;


implementation

{ TKludge }

constructor TKludge.Create(pForm: TForm);
begin
  fForm := pForm;
  fOnClose := pForm.OnClose;
  pForm.OnClose := fNewOnClose;
  fOnActivate := pForm.OnActivate;
  pForm.OnActivate := fOnActivate;
end;

procedure TKludge.fNewOnActivate(Sender: TObject);
begin
  if assigned( fOnActivate ) then fOnActivate( Sender );
  // my extra line
end;

procedure TKludge.fNewOnClose(Sender: TObject; var Action: TCloseAction);
begin
  if assigned fOnClose then fOnClose( Sender, Action );
  // my extra line
end;

{ TKludges }

procedure TKludges.SetApplication(const Value: TApplication);
var
  i: Integer;
begin
  fApplication := Value;
  for i := 0 to fApplication.ComponentCount do
  begin
    if fApplication.Components[ i ] is TForm then
    begin
      Add( TKludge.Create( fApplication.Components[ i ] as TForm ));
    end;
  end;
end;

end.

创建 TKludges 的实例 class 并将应用程序传递给它。对于它发现的 每个 表单,它会将事件替换为调用原始事件(如果存在)的新事件,并将您的额外行放入(仅在一分钟内评论)。

特别可怕的是,每一种形式都会受到影响,包括您可能意想不到的形式。但是如果你确定...

使用风险自负!