全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1072
推到 Plurk!
推到 Facebook!

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

答題得分者是:Mickey
ringox
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-04 18:16:38 IP:61.30.xxx.xxx 未訂閱
在FormCreate時ToolButton會由資料庫選單中產生對應的Caption 接著TreeView同時載入選單再讓程式可以指定按下的動作 請問我該如何,麻煩大家請大家幫幫忙以下是我目前想到的方式 procedure TFormMenu._TreePathMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Sel,ID:String; I:Integer; begin Sel:=TreePath.Selected.Text; for I:=10 to 90 do begin if FindComponent('B' Inttostr(I)) <> nil then ID:=TToolButton(FindComponent('B' inttostr(I))).Caption; if Sel=ID then <指定按下的動作不知如何處理> end; end; 因為已經想很久也找不到相關的例子所以才...
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-04 21:15:31 IP:218.32.xxx.xxx 未訂閱
ringox 你好:    試試看 : 
var TB:TToolButton;
...    if FindComponent('B' Inttostr(I)) <> nil then begin
  TB := TToolButton(FindComponent('B' Inttostr(I)));
  ID:=TB.Caption;
  if (Sel=ID) and Assigned(TB.OnClick) then
    TB.OnClick(TB);
...  
ringox
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-04 22:59:50 IP:61.30.xxx.xxx 未訂閱
太感謝Mickey板主這麼快回覆^^已經解決我的問題 但是我想再請問一下 若Button是在不同的視窗中我可以去呼叫嗎 ex: FormTime.TToolButton(FindComponent('ToolButton'+Inttostr(I))); 再如果我想再將Form設為變數是否可解 是否一定要有元件才可以用此方式 如果我的程式碼已經寫好但是FindComponent沒有元件可呼應這方式還可行嗎 是不是每一個有OnClick事件的元件都可以用此方式 抱歉百忙之中打擾一下  發表人 -
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-05 09:05:03 IP:218.163.xxx.xxx 未訂閱
引言: 若Button是在不同的視窗中我可以去呼叫嗎 ex: FormTime.TToolButton(FindComponent('ToolButton' Inttostr(I)));
可以. 1. use FormTime 所在的 Unit. 2. TToolButton(FormTime.FindComponent('ToolButton' Inttostr(I))); 但要注意 FormTime 是否已經 create 好了.
引言: 再如果我想再將Form設為變數是否可解
MDIForm 可以用一個 Loop 找 MdiChildForm, 如 :
for i := 0 to MdiChildCount-1 do
  if (MdiChildren[i].Name='FormTime') then ...
引言: 是否一定要有元件才可以用此方式
不太清楚你的問題... 用猜的回答 : FindComponent 是 TComponent 的 Method , 節錄一段 Help 內容: Indicates whether a given component is owned by the component. 只要是繼承自 TComponent Class 的, 都有此 Method.
引言: 如果我的程式碼已經寫好但是FindComponent沒有元件可呼應這方式還可行嗎
如果已是 exe/dll 等, 只能透過 Win API 的方式, 如用 FindWindow 找出 Button 的 Window Handle, 然後用 SendMessage, 送 Mouse or KeyBoard Message 給它.
引言: 是不是每一個有OnClick事件的元件都可以用此方式
基本上, 是的. 但是呼叫執行時, 不同的物件, 傳入的參數可能不同.
ringox
一般會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-05 10:13:22 IP:61.30.xxx.xxx 未訂閱
不太清楚你的問題... 用猜的回答 : FindComponent 是 TComponent 的 Method , 節錄一段 Help 內容: Indicates whether a given component is owned by the component. 只要是繼承自 TComponent Class 的, 都有此 Method.
引言: 如果我的程式碼已經寫好但是FindComponent沒有元件可呼應這方式還可行嗎
如果已是 exe/dll 等, 只能透過 Win API 的方式, 如用 FindWindow 找出 Button 的 Window Handle, 然後用 SendMessage, 送 Mouse or KeyBoard Message 給它. [quote] ------------------------ Mickey大哥你好: 我想我的敘述不是很清楚所以你可能造成你的誤會 我做法是先將OnClick編輯好<----我想這不是正確的做法所以 然後再讓產生的選單按下執行該段程式 所以procedure XXXClick(Sender: TObject);已經存在 而我不懂得如何讓XXX的部分成為變數再去執行那一段程式 有勞你費時解決我的疑惑
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-05 10:24:38 IP:218.163.xxx.xxx 未訂閱
ringox 你好: 參考這篇看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40505
ringox
一般會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-05 13:46:33 IP:61.30.xxx.xxx 未訂閱
抱歉我看了例子但是我還是作不出來 以下是我的程式碼請幫我看看 謝謝    var IniFile:TIniFile;     ID,Sel,Fot,BB:String;     I,F:Integer;     m:TMyPorcdure;     p:Pointer; begin     Sel:=TreeEdit.Selected.Text;     IniFile:=TIniFile.create('.\Databass\System.ini');     Fot:=EditID.Hint;     if Sel=IniFile.ReadString(Fot,'Button'+Inttostr(I),'') then     begin     for F := 0 to MdiChildCount-1 do      if (MdiChildren[F].Name=Fot) then       begin         for I:=0 to 9 do          begin            BB:='_B80';<------此處可否改為變數FORM if ID=BB then p:=MethodAddress(ID); if p<>nil then begin TMethod(m).Code := p; TMethod(m).Data := Self; m(Sender); end else raise Exception.CreateFmt('Procedure %ID not exists',[ID]); end; end; end; IniFile.Free;
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-05 22:55:08 IP:218.32.xxx.xxx 未訂閱
引言: 抱歉我看了例子但是我還是作不出來 以下是我的程式碼請幫我看看 謝謝
var IniFile:TIniFile;
    ID,Sel,Fot,BB:String;
    I,F:Integer;
    m:TMyPorcdure;
    p:Pointer;
begin
    Sel:=TreeEdit.Selected.Text;
    IniFile:=TIniFile.create('.\Databass\System.ini');
    Fot:=EditID.Hint;
    if Sel=IniFile.ReadString(Fot,'Button' Inttostr(I),'') then
    begin
    for F := 0 to MdiChildCount-1 do
     if (MdiChildren[F].Name=Fot) then
      begin
        for I:=0 to 9 do
         begin
           BB:='_B80';<------此處可否改為變數FORM
           if ID=BB then
           p:=MethodAddress(ID);
           if p<>nil then
           begin
           TMethod(m).Code := p;
           TMethod(m).Data := Self;
           m(Sender);
           end
      else raise Exception.CreateFmt('Procedure %ID not exists',[ID]);
        end;
      end;
    end;
    IniFile.Free;
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-05 23:06:41 IP:218.32.xxx.xxx 未訂閱
看不太懂...
ringox
一般會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-06 00:40:55 IP:61.30.xxx.xxx 未訂閱
還是謝謝Mickey大哥的回應 我想先就此結案再仔細研究看看 有無新的發現會比較如何恰當 到時候再來勞煩大家吧  再次謝謝板主
系統時間:2024-11-25 4:23:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!