Forum Forum MESA !! Strona Główna
 Strona glówna  •  FAQ  •  Szukaj  •  Użytkownicy  •  Grupy  •  Galerie  •  Rejestracja  •   Profil  •  Zaloguj się, by sprawdzić wiadomości  •  Zaloguj 
Delphi XE的RTTI增强&#65292 
Napisz nowy temat   Odpowiedz do tematu    Forum Forum MESA !! Strona Główna -> Korona Kielce
Zobacz poprzedni temat :: Zobacz następny temat  
Autor
Wiadomość
ghdhair100
ORANGE EKSTRAKLASA



Dołączył: 15 Gru 2010
Posty: 2005
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: England

PostWysłany: Wto 5:54, 08 Mar 2011  

m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);

至此这个,挂钩内部的FonChange过程,就完成了,完整代码

对于本申明过程,如果不是很明白的,请到CnPack的论坛上找本人对该类信息的详细分析过程。
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;
上面的代码就设置了MainMenu的items的私有事件变量FOnChange的新指向地址为本窗体的实现代码了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指针和传递的Self指针对象。用来在我们替换后的对象中进行调用,[link widoczny dla zalogowanych],不然原过程就不会被调用了。然后我们再来看看,新的FonChange的实现过程

Delphi2010RTTI的增强
代码
Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦。甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:
Delphi XE的RTTI增强,动态Hook某些内部事件

代码
Delphi的Anymouse方法探秘
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;
这个代码中最主要的就是如何来调用原来的FOnChange的执行过程了,熟悉Delphi的人应该都知道了Delphi的对象过程中可以使用Self表示当前对象,而这个对象在对象过程中的传递是通过EAX传递的,而此时我们的新过程不是在MainMenu.Items的对象内部调用执行的,所以,[link widoczny dla zalogowanych],我们需要显示的传递SelfData作为源对象中的Self对象指针,所以我申明了一个指针过程如下:
我这里的主要目的是挂钩某些内部私有事件,然后增加上一些自己的处理过程,这里我以TMenuItem的私有内部事件FOnChange作为例程。这个私有事件在菜单内部绑定,我们平常状态下,在外部无法更改!但是XE之后这个问题不在存在,使用它的全新RTTI,可以很容易的获得一个类对象的基本上所有的类的字段以及方法和属性等,[link widoczny dla zalogowanych]。
万一的Rtti系列

作者:不得闲
出处:http://dxsoft.cnblogs.com/

Many years ago there lived an Emperor who was so exceedingly fond of fine new clothes that he spent vast sums of money on dress. To him clothes meant more than anything else in the world. He took no interes
related links:


[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Forum MESA !! Strona Główna -> Korona Kielce Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1
   
 
Opcje 
Zezwolenia Opcje
Kto jest na Forum Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Kto jest na Forum
 
Jumpbox
Kto jest na Forum
Skocz do:  


fora.pl - załóż własne forum dyskusyjne za darmo
Theme FrayCan created by spleen & Download
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin