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

關於程式可以指定按下的動作問題

缺席
ringox
一般會員


發表:7
回覆:14
積分:4
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-08 00:33:11 IP:61.30.xxx.xxx 未訂閱
以下的程式碼來自http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40505 內容其目的是要讓已存在於unit的動作P1&P2在Button1Click中執行指定 但我有不解的地方是 1.該變數s如何判斷我按下的時候s=P1 or P2 2.我將s=checkerbox 如果check=true s=P1這方式可以嗎 3.如果可以為何我實作時又錯誤發生是我少了或多了什麼?? 4.以此方式我可否改為呼叫別的form中的動作 ex:Form2.P2 procedure TForm1.P1(Sender: TObject); begin showmessage('In P1 Procedure'); end; procedure TForm1.P2(Sender: TObject); begin showmessage('In P2 Procedure'); end; procedure TForm1.Button1Click(Sender: TObject); var m : TMyPorcdure; s : string; p : Pointer; begin s := 'P1'; p := MethodAddress(s); if p<>nil then begin TMethod(m).Code := p; TMethod(m).Data := Self; m(Sender); end else raise Exception.CreateFmt('Procedure %s not exists',[s]); s := 'P2'; p := MethodAddress(s); if p<>nil then begin TMethod(m).Code := p; TMethod(m).Data := Self; m(Sender); end else raise Exception.CreateFmt('Procedure %s not exists',[s]); end; 板主抱歉因為不知到要將該題發表至何處所以...
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-08 08:17:35 IP:218.163.xxx.xxx 未訂閱
整個程式的目的只是在用Method之名稱, 找到此Method所在之位置, 然後去執行此Method
procedure TForm1.Button1Click(Sender: TObject);
var m : TMyPorcdure;
    s : string;
    p : Pointer;
begin
  s := 'P1';  //此處直接給s為'P1'只是demo一個參數
  p := MethodAddress(s); //找到此method之address
  if p<>nil then begin
    TMethod(m).Code := p;     //m 宣告為一TMethod,將找到之Method address assgin給m
    TMethod(m).Data := Self;  // m 之object 為本身(即form上之method)
    m(Sender); //執行此method
  end
  else raise Exception.CreateFmt('Procedure %s not exists',[s]);
  s := 'P2';
  p := MethodAddress(s);
  if p<>nil then begin
    TMethod(m).Code := p;
    TMethod(m).Data := Self;
    m(Sender);
  end
  else raise Exception.CreateFmt('Procedure %s not exists',[s]);
end;
1.該變數s如何判斷我按下的時候s=P1 or P2 該變數不會判斷, 必須你告訴他, 例如:s := 'P1' 2.我將s=checkerbox 如果check=true s=P1這方式可以嗎 你可能對變數型態不太清楚,若s=checkerbox就不可能s=P1, 因一個是TCheckBox, 一個是Method, 差很多, 實際上s是字串 可以
  if checkbox.checked then
     s:='P1'
  else
    s:='P2';
3.如果可以為何我實作時又錯誤發生是我少了或多了什麼?? 沒看到程式, 如何知道你錯在那 4.以此方式我可否改為呼叫別的form中的動作 ex:Form2.P2 直接用這個程式當然不行, 但如果你能完全了解自然可找到應如何做,可能還是先讀些Delphi的書較好,看起來你對Delphi的基本還不是很熟, 這算是比例高階的了(抱歉我這麼說) 板主抱歉因為不知到要將該題發表至何處所以... 不知發表何處, 所以此處很好
ringox
一般會員


發表:7
回覆:14
積分:4
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-09 04:07:21 IP:61.30.xxx.xxx 未訂閱
首先多謝板主的回答但是關於問題還是有不解之處請見諒    3.如果可以為何我實作時又錯誤發生是我少了或多了什麼?? 沒看到程式, 如何知道你錯在那 出現procedure p1 not exsits. 但是我已經將p1 & p2編輯了為何還是會出現不存在的錯誤 procedure TForm1.P1Click(Sender: TObject); begin Showmessage('p1'); end; 4.以此方式我可否改為呼叫別的form中的動作 ex:Form2.P2 沒有像是P1Click(nil);這一類的編輯方法嗎 5.因為對於型態上的不同所以再轉換型態的時候就會有一堆的問題出現了 其實書是有但是看不懂得實在很多又不知道如何問起 所以才想先從範例做看看遇到問題在發問 所以可能會造成大家的不便請多見諒
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-09 07:46:02 IP:218.163.xxx.xxx 未訂閱
沒看到程式, 如何知道你錯在那 出現procedure p1 not exsits. 沒看到程式實在很難猜, 最大的可能是宣告位置不對,只有published Method會放在VMT內 4.以此方式我可否改為呼叫別的form中的動作 ex:Form2.P2 MethodAdress主要是透過VMT(Virtual Memory Table)找Object之published Method, 因此你可以由form2.MethodAdress('p2')去找到method pointer 5.因為對於型態上的不同所以再轉換型態的時候就會有一堆的問題出現了 其實書是有但是看不懂得實在很多又不知道如何問起 所以才想先從範例做看看遇到問題在發問 所以可能會造成大家的不便請多見諒 我想這是很好的學習方式, 不過本例的原理對初學者可能有些難了(當然只是照做很容易)
系統時間:2024-05-16 7:22:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!