请注意,以下内容并未明确回答此处的问题。这更像是对概念重新设计的提议(重定向 OnClick 事件而不是添加额外的 OnMouseUp)。它是关于如何将所有组件的 OnClick 事件处理程序(如果分配了一些)(如果需要,可能会被过滤)重定向到另一个(常见的)OnClick 事件处理程序。它还包括一种将它们恢复到原始状态的方法。
在下面的示例中,我将尝试向您展示如何将 OnClick 事件处理程序(如果组件已经编写了一些)替换为特定的事件处理程序,然后有选择地恢复该事件处理程序。这是对所有发布了 OnClick 事件的组件执行的,因此您无需提前知道组件类是否具有可用的 OnClick 事件(但可以非常简单地对其进行修改以仅使用特定类)。
代码由以下部分组成:
OnSpecialClick - 它是当您调用 ReplaceOnClickEvents 过程时所有 OnClick 事件将被绑定的事件处理程序,请注意它必须发布为对 RTTI 可见!!!
Button1Click - 在这里代表应该替换的旧事件处理程序,它在设计时绑定到 Button1.OnClick 事件
ReplaceOnClickEvents - 方法,它遍历表单上的所有组件并检查
当前迭代的组件是否分配了 OnClick 事件处理程序;如果是这样,它将其存储到备份集合中,并用 OnSpecialClick 替换此事件处理程序
RestoreOnClickEvents - 恢复原始 OnClick 事件处理程序的方法;它遍历备份集合并将事件方法分配给其存储的组件实例
CheckBox1Click - 这个复选框点击事件意味着在普通模式和特殊模式之间切换(CheckBox1 选中状态意味着是特殊模式),只有这个 OnClick 事件不会被 ReplaceOnClickEvents 调用替换(因为你不会能够将模式恢复正常)
这里是:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TypInfo, StdCtrls, Contnrs;
type
TEventBackup = class
Component: TComponent;
OnClickMethod: TMethod;
end;
type
TForm1 = class(TForm)
Button1: TButton;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
procedure ReplaceOnClickEvents;
procedure RestoreOnClickEvents;
published
procedure OnSpecialClick(Sender: TObject);
end;
var
Form1: TForm1;
EventBackupList: TObjectList;
implementation
{$R *.dfm}
procedure TForm1.OnSpecialClick(Sender: TObject);
begin
ShowMessage('Hi, I''m an OnSpecialClick event message!');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Hi, I''m just that boring original OnClick event message!');
end;
procedure TForm1.ReplaceOnClickEvents;
var
I: Integer;
Component: TComponent;
EventMethod: TMethod;
EventBackup: TEventBackup;
begin
for I := 0 to ComponentCount - 1 do
begin
Component := Components[I];
if Component = CheckBox1 then
Continue;
if IsPublishedProp(Component, 'OnClick') then
begin
EventMethod := GetMethodProp(Component, 'OnClick');
if Assigned(EventMethod.Code) and Assigned(EventMethod.Data) then
begin
EventBackup := TEventBackup.Create;
EventBackup.Component := Component;
EventBackup.OnClickMethod := EventMethod;
EventBackupList.Add(EventBackup);
EventMethod.Code := MethodAddress('OnSpecialClick');
EventMethod.Data := Pointer(Self);
SetMethodProp(Component, 'OnClick', EventMethod);
end;
end;
end;
end;
procedure TForm1.RestoreOnClickEvents;
var
I: Integer;
EventBackup: TEventBackup;
begin
for I := 0 to EventBackupList.Count - 1 do
begin
EventBackup := TEventBackup(EventBackupList[I]);
SetMethodProp(EventBackup.Component, 'OnClick', EventBackup.OnClickMethod);
end;
EventBackupList.Clear;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
ReplaceOnClickEvents
else
RestoreOnClickEvents;
end;
initialization
EventBackupList := TObjectList.Create;
EventBackupList.OwnsObjects := True;
finalization
EventBackupList.Free;
end.