5,386
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure FormShow1(Sender: TObject);
procedure MenuItemChange(Sender: TObject; Source: TMenuItem; Rebuild: Boolean);
public
{ Public declarations }
OldCode: Pointer;
OldMenuItemChangeCode: Pointer;
OldSelfData: TObject;
end;
var
Form1: TForm1;
implementation
uses Rtti,TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
Item: TMenuItem;
begin
Item := TMenuItem.Create(self);
Item.Caption := '测试';
MainMenu1.Items.Add(item);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TMenuItem;
begin
Item := TMenuItem.Create(self);
Item.Caption := '测试';
if MainMenu1.Items.Count > 0 then
MainMenu1.Items.Items[0].Add(item);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
rttiContext: TRttiContext;
rtype: TRttiType;
rField: TRttiField;
V: TValue;
begin
rttiContext := TRttiContext.Create;
rtype := rttiContext.GetType(TMenuItem);
rField := rType.GetField('FOnChange');
if rField <> nil then
begin
V := rField.GetValue(MainMenu1.Items);
OldMenuItemChangeCode := TValueData(V).FAsMethod.Code;
OldSelfData := TValuedata(V).FAsMethod.Data;
TValueData(V).FAsMethod.Code := @TForm1.MenuItemChange;//菜单项目变化
TValueData(V).FAsMethod.Data := self;
rField.SetValue(self.MainMenu1.Items,v);
end;
end;
procedure TForm1.MenuItemChange(Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);
var
m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);
begin
if Assigned(OldMenuItemChangeCode) then
begin
m := OldMenuItemChangeCode;
m(OldSelfData,Sender,Source,Rebuild);
end;
ShowMessage('菜单修改事件挂钩');
end;
function MulInt2(I: Integer): Integer;
begin
Result := I * 2;
end;
add eax, eax
ret
push ebp
mov ebp,esp
add esp,-$08
mov [ebp-$04],eax
mov eax,[ebp-$04]
add eax,eax
mov [ebp-$08],eax
mov eax,[ebp-$08]
pop ecx
pop ecx
pop ebp
ret