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

關於 ShowModal 的問題

尚未結案
malon7
一般會員


發表:1
回覆:1
積分:0
註冊:2005-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-09 23:07:15 IP:220.132.xxx.xxx 未訂閱
各位前輩: 小弟最近碰到一個問題 現在是有三個form a,b,c , 當a叫 c showmodal的時候 ,a和b的滑鼠控制權都被c拿走了,我是希望這個時候滑鼠還可以對b做運作.... 因為a還要等c輸入資料才能運作,所以a要停住...不能讓c用show顯示然後把a給disable 之前一直以為showmodal是可以指定主視窗的,可是看來他是把其他視窗所有的的滑鼠訊息攔住了,還是這種情形不能用showmodal做?
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-09 23:21:44 IP:61.71.xxx.xxx 未訂閱
引言: 各位前輩: 小弟最近碰到一個問題 現在是有三個form a,b,c , 當a叫 c showmodal的時候 ,a和b的滑鼠控制權都被c拿走了,我是希望這個時候滑鼠還可以對b做運作.... 因為a還要等c輸入資料才能運作,所以a要停住...不能讓c用show顯示然後把a給disable 之前一直以為showmodal是可以指定主視窗的,可是看來他是把其他視窗所有的的滑鼠訊息攔住了,還是這種情形不能用showmodal做?
當然, showmodal是唯一性的, 依你的例子, 有一個方法解決, 就是 a, b, c 都是用 show 方式, 至於 c 出現後如何"鎖住", 其實很簡單, a.enabled:= False 就可以了, 然後在 c 的 onclose中再解開 a.enabled:= True, 如此 b, c 都可以做切換使用, 但要注意的是, 如果 c 意外當機關閉, 很可能就會造成 a 永遠無法執行, 所以建議 a 最好不要是main form, 因為這樣可能造成程式死機!
malon7
一般會員


發表:1
回覆:1
積分:0
註冊:2005-11-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-10 11:15:28 IP:220.132.xxx.xxx 未訂閱
謝謝 P.D. 大大的回應 使用設定enable的切換來解決是很好的方案 但是因為c是要做為輸入各式資料的dialog, 若按照在onclose中切換enabe的方法, 這樣有關這些資料處理的部分只能寫在c的onclose中了,這樣整個程式碼會顯得很散 ======================如果用 showModal的方式========================== -------------formA 的檔案------------------ procedure TFormA.fun1() begin if formC.ShowModal = mrOK then begin //處理由formc輸入的資料 end; end; procedure TFormA.fun2() begin if formC.ShowModal = mrOK then begin //處理由formc輸入的資料 end; end; ----------------------------------- 這樣處理資料的動作都可以在forma的檔案中完成 ======================如果用 show切換enable的方式==================== -------------formA 的檔案------------------ procedure TFormA.fun1() begin formC.state := 1 ; //告訴c是fun1叫他的 formC.Show; end; procedure TFormA.fun2() begin formC.state := 2 ; //告訴c是fun2叫他的 formC.Show; end; ------------formC的檔案---------------- procedure TformC.FormShow(Sender: TObject); begin formA.Enabled := false; end; procedure TformC.FormClose(Sender: TObject; var Action: TCloseAction); begin formA.Enabled := true; if state = 1 then //func1呼叫c的情況下 begin //對輸入的資料作處理 end else if state= 2 then //func2呼叫c的情況下 begin //對輸入的資料作處理 end; end; ----------------------------------- 由於使用show來顯示 處理資料的動作就必須在formc的檔案中才能操作 ============================================================== 若使用show來顯示,明明是要輸入給formA的資料就必須在formC處理,如果showmodal可以用,整個資料處理就都可以在formA編寫....不知還有其他替代showmodal都方案嗎?
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-17 14:18:29 IP:61.222.xxx.xxx 未訂閱
我並未深入瞭解您的問題。    直覺認為若不使 B 被 Disable 狀態。 (因為任何 Showmodal 含 application.MessageBox 會使得全部視窗 Disable。    禁止讓 B 被Disable 我的作法是:
type
  TForm1 = class(TForm)
..
  private
    Procedure WMENABLE (Var Msg:TWMEnable);Message  WM_ENABLE ;
  public
...    Procedure TForm1.WMENABLE (Var Msg:TWMEnable);
begin
  if Not Msg.Enabled then EnableWindow(Handle,True);
end;
參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
系統時間:2024-05-19 17:22:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!