線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1402
推到 Plurk!
推到 Facebook!

請問ReadRootComponent的用法

尚未結案
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-24 10:35:42 IP:211.74.xxx.xxx 未訂閱
請問 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-24 11:52:55 IP:61.219.xxx.xxx 未訂閱
你貼的程式碼太少了看不出實際用處, 你是在寫Delphi Expert嗎? 任何Method之位置都是在RunTime, Create後才能有真正之adress,此address會填入RTTI中 在RunTime若Form已Create, 你就不須Create Reader, 直接用GetPropInfo取得TMethod就可以了 DesignTime (Expert程式) Method均還無真正之Address不如用Method之name直接由Text處理
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-24 14:44:43 IP:211.74.xxx.xxx 未訂閱
引言: 你貼的程式碼太少了看不出實際用處, 你是在寫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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-10-24 17:09:32 IP:203.217.xxx.xxx 未訂閱
如果我沒有會錯意基本上是不可能的, 我們想想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元件?
系統時間:2024-05-04 16:09:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!