如何取得另一個程序的key值? |
答題得分者是:Justmade
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 下面的案例
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 發送簡訊給我 |
大約明白你做甚麼但不大明白主要的問題... 看你的程序, 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 發送簡訊給我 |
引言: 大約明白你做甚麼但不大明白主要的問題... 看你的程序, 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 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
Justmade
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
不用全部移過用,只是執行該程序時轉用 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;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |