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

如何取得另一個程序的key值?

答題得分者是:Justmade
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-28 17:29:27 IP:211.78.xxx.xxx 未訂閱
請問各位!     下面的案例    
main.pas
...
form1.showmodal;
...
end;    form1.pas
...
...
 call form2.proc2
..
..
proedure keydownpress(...)
begin
...
  if key=vk_F12 then stoprun:= true;
...
end;
end.    form2.pas
...
...
procedure proc2;
begin
...
  while not form1.stoprun do begin
     ....
     ....
     application.processmessages;
   end;
end;
end.
以上是大致的程序狀況 說明: 有兩支程序, 分別是form1, form2 (都是form型態) 1.由 main 呼叫 form1, 然後 form1去呼叫 form2.proc2程序 2.此時form2是被create, 但沒有被show出來 3.兩支form的keypreview 都被on起來 4.當我由form1去call form2檔的 proc2時會進入一個迴圈, 但form2是沒有 show出來(只有create), 這時我在form1上有一個按鍵偵測, 如果被按下F12 時則form2的迴圈必須被停止, 現在問題在這裡, 因為 form2沒有被show出來 , 如何令form1的onkeydownpress生效, 進而使 form2的 while 判別 stoprun 可以被接受為 true 希望各位看得懂, 謝謝!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-28 18:23:41 IP:218.16.xxx.xxx 未訂閱
大約明白你做甚麼但不大明白主要的問題... 看你的程序, StopRun 應放在 Form2 會較好,因為 Form2 既可呼叫 Form2 的 proc2 便一定可修改 Form2 的Public參數。 另外,你可以用一個 onKeyDown / onKeyPress 程序才處理數個Form 的 KeyDown / KeyPress 的,只要先在 Form2 寫好 onKeyDown 然後在 Form1 : onKeyDown := Form2.onKeyDown; 這樣在 Form1 press 的 key 便會在 Form2 執行 Form2 的 onKeyDown 來處理
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-28 21:28:28 IP:61.66.xxx.xxx 未訂閱
引言: 大約明白你做甚麼但不大明白主要的問題... 看你的程序, StopRun 應放在 Form2 會較好,因為 Form2 既可呼叫 Form2 的 proc2 便一定可修改 Form2 的Public參數。 另外,你可以用一個 onKeyDown / onKeyPress 程序才處理數個Form 的 KeyDown / KeyPress 的,只要先在 Form2 寫好 onKeyDown 然後在 Form1 : onKeyDown := Form2.onKeyDown; 這樣在 Form1 press 的 key 便會在 Form2 執行 Form2 的 onKeyDown 來處理
這的確很難說的明白, 因為這是一支前人開發, form1放著所有主要程式, form2是一個共用的function程式, 由 form1, form3, form5 所共用, 雖說 是存放共用function, procedure程序, 但卻是以form型態來開啟, 所以我上 面為何會說 form2不用show出來, 那為何form2 不用單純的unit來做, 因為 form2裡面用上不少的vcl元件, 如果用unit就要自己去create物件出來, 比 不上從元件盤拉下來快! 好了, 廢話一堆, 我的目的就是 form1是主要的程式區, 當執行某一個 button所觸發的程序, 有一段是在form2 做的, 如果把這支loop程序拉到form1, 那form3, form5也要如法泡製, form3, form5又不能 uses form1, 因為這關聯頗為複雜, 所以問題就來了, 我非得在form2中執行這個loop, 可是這個loop又必須可以接受form1所傳來的 onkeypress, 但當我在 form1中call form2的loop, 這時的控制權是在form2, 所以form1的onkeydownpress無法作用, 但form2又沒有show出來, 那如何使 form2 onkeypress生效然後促使stoprun=true而中止程序回到form1呢? 嗯! 好像越解釋越多哦!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-28 21:35:54 IP:218.16.xxx.xxx 未訂閱
有沒有試過我說的這個,應是可以的 只要先在 Form2 寫好 onKeyDown 然後在 Form1, Form3, Form5 : onKeyDown := Form2.onKeyDown; Form2.Proc2; onKeyDown := NIL (或本Form 的 OnKeyDown)
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-28 22:10:30 IP:61.66.xxx.xxx 未訂閱
引言: 有沒有試過我說的這個,應是可以的 只要先在 Form2 寫好 onKeyDown 然後在 Form1, Form3, Form5 : onKeyDown := Form2.onKeyDown; Form2.Proc2; onKeyDown := NIL (或本Form 的 OnKeyDown)
我試作一個簡單demo是可行, 不過原來的form1.onkeydown有不少code處理 要移到form2.onkeydown 有點困難, 我再想其他方法, 謝謝了!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-28 23:29:05 IP:218.16.xxx.xxx 未訂閱
不用全部移過用,只是執行該程序時轉用 Form2 的 onKeyDown,程序完後轉回原來的, 但若你需要執行該程序時Form1,3,5還正常運作,也可以這樣啊 : 1. 先寫好Form2 的 OnKeyDown 2. Form1,3,5 private 加入 DoingProc2 : Boolean; 3. 呼叫 Form2 的程序 : DoingProc2 := true; Form2.Proc2; DoingProc2 := false; 4. Form1,3,5 的 onKeyDown 時件 : procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //各自獨有的程序 .... .... .... //若Proc2 執行中則將執行Form2 的 onKeyDown 事件 if DoingProc2 then Form2.FormKeyDown(Sender,Key,Shift); end;
系統時間:2024-09-07 5:57:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!