Strona glówna
•
FAQ
•
Szukaj
•
Użytkownicy
•
Grupy
•
Galerie
•
Rejestracja
•
Profil
•
Zaloguj się, by sprawdzić wiadomości
•
Zaloguj
Forum Forum MESA !! Strona Główna
->
Korona Kielce
Napisz odpowiedź
Użytkownik
Temat
Treść wiadomości
Emotikony
Więcej Ikon
Kolor:
Domyślny
Ciemnoczerwony
Czerwony
Pomarańćzowy
Brązowy
Żółty
Zielony
Oliwkowy
Błękitny
Niebieski
Ciemnoniebieski
Purpurowy
Fioletowy
Biały
Czarny
Rozmiar:
Minimalny
Mały
Normalny
Duży
Ogromny
Zamknij Tagi
Opcje
HTML:
TAK
BBCode
:
TAK
Uśmieszki:
TAK
Wyłącz HTML w tym poście
Wyłącz BBCode w tym poście
Wyłącz Uśmieszki w tym poście
Kod potwierdzający: *
Wszystkie czasy w strefie EET (Europa)
Skocz do:
Wybierz forum
Nabór do ZESPÓŁ Forum MESA
----------------
Nabór
MESA - DRUŻYNY
----------------
GKS Bełchatów
Cracovia Kraków
Dyskobolia Grodzisk Wielkopolski
Górnik Zabrze
Jagiellonia Białystok
Korona Kielce
Lech Poznań
Legia Warszawa
ŁKS Łódź
Odra Wodzisław Śląski
Polonia Bytom
Ruch Chorzów
Wisła Kraków
Zagłębie Lubin
Zagłębie Sosnowiec
MESA - OGÓLNIE
----------------
Regulamin
Terminarz
Sędziowie
Wyniki
DLA KIBICA
----------------
Typer
Rozrywka
Sonda
INNE
----------------
Hydepark
Reklama
PARTNERZY
----------------
Parnerzy w reklamie i realizacji projektu !!
Przegląd tematu
Autor
Wiadomość
ghdhair100
Wysłany: Wto 5:54, 08 Mar 2011
Temat postu: Delphi XE的RTTI增强,
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指针对象。用来在我们替换后的对象中进行调用,
Chi Red Original Iron
,不然原过程就不会被调用了。然后我们再来看看,新的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的对象内部调用执行的,所以,
Chi Pink Original Iron
,我们需要显示的传递SelfData作为源对象中的Self对象指针,所以我申明了一个指针过程如下:
我这里的主要目的是挂钩某些内部私有事件,然后增加上一些自己的处理过程,这里我以TMenuItem的私有内部事件FOnChange作为例程。这个私有事件在菜单内部绑定,我们平常状态下,在外部无法更改!但是XE之后这个问题不在存在,使用它的全新RTTI,可以很容易的获得一个类对象的基本上所有的类的字段以及方法和属性等,
Chi Flat Iron
。
万一的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:
纯银袖扣 对于男人而言,就是面积最小的装饰
fora.pl
- załóż własne forum dyskusyjne za darmo
Theme
FrayCan
created by
spleen
&
Download
Powered by
phpBB
© 2001, 2005 phpBB Group
Regulamin