我想动态地创建或更改表单上的事件,我该怎么做?
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 并将应用程序传递给它。对于它发现的 每个 表单,它会将事件替换为调用原始事件(如果存在)的新事件,并将您的额外行放入(仅在一分钟内评论)。
特别可怕的是,每一种形式都会受到影响,包括您可能意想不到的形式。但是如果你确定...
使用风险自负!
我正在尝试为我的程序编写一个任务栏,我需要在 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 并将应用程序传递给它。对于它发现的 每个 表单,它会将事件替换为调用原始事件(如果存在)的新事件,并将您的额外行放入(仅在一分钟内评论)。
特别可怕的是,每一种形式都会受到影响,包括您可能意想不到的形式。但是如果你确定...
使用风险自负!