請問ReadRootComponent的用法 |
尚未結案
|
shing.net
中階會員 ![]() ![]() ![]() 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
請問
Reader := TReader.Create(Input, 4096);
Reader.OnFindMethod := FindMethod;// 其Address=nil????
Reader.ReadRootComponent(frm);
若frm中有Event為何使用FindMethod無法繼承其Address=nil???? procedure TForm1.FindMethod(Reader: TReader; const MethodName: string;
var Address: Pointer; var Error: Boolean);
begin
Address:= Reader.MethodAddress(MethodName);
if Address = nil then
Error := False;
|
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
shing.net
中階會員 ![]() ![]() ![]() 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
引言: 你貼的程式碼太少了看不出實際用處, 你是在寫Delphi Expert嗎? 任何Method之位置都是在RunTime, Create後才能有真正之adress,此address會填入RTTI中 在RunTime若Form已Create, 你就不須Create Reader, 直接用GetPropInfo取得TMethod就可以了 DesignTime (Expert程式) Method均還無真正之Address不如用Method之name直接由Text處理 我是想寫一支程式可以將另一form Create起來,因為我是直接讀xxx.dfm 但是未讀其xxx.pas因此產生之form無相對應之Event,是否有何方式可達到該功能 完整程式如下 procedure Tfmreadform.Button1Click(Sender: TObject); var Reader: TReader; Input: TFileStream; MyStr: string; filepath: string; pFirst: Pchar; First: byte; i, DFMDataLen, Position: Integer; frm: TForm; PropInfo: PPropInfo; Method: TMethod; FileStream: TStream; begin frm := Tform.create(self); if OpenDialog.Execute then MYSTR := OpenDialog.FileName; Input := TFileStream.Create(MyStr, fmShareDenyWrite); Input.ReadResHeader; Reader := TReader.Create(Input, 4096); Reader.OnFindMethod := FindMethod; Reader.ReadRootComponent(frm); frm.ShowModal; end; procedure Tfmreadform.FindMethod(Reader: TReader; const MethodName: string; var Address: Pointer; var Error: Boolean); begin Address := Reader.MethodAddress(MethodName); if Address = nil then Error := False; end; |
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
如果我沒有會錯意基本上是不可能的, 我們想想AP之執行程序
每一個Method, Compiler成machine code後存在.exe中, 當AP起始時被load到Memory中, 並將其位置存在RTTI中,元件之Method則指向此address.
當Event被Trigger時跳到此位置執行. 你如此做法, 所有method並未經compiler, 即使有.pas都不行,除非你的程式中加入Delphi Interpreter可直接執行Source Code [NOTE]其實你如此做, 所有被讀入Form上之component均須先做RegisterClass對不對,想來應該是某些特定之Form, 只含某些特定之元件, 否則難到你在程式開始Registe所有Delphi元件?
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |