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

MDI子視窗的排列

尚未結案
ericaleu
一般會員


發表:6
回覆:1
積分:1
註冊:2004-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-04 16:23:23 IP:203.69.xxx.xxx 未訂閱
我在每一個MDI的子視窗開啟的時候,都自動用水平方式排列,讓開啟的子視窗能平均排列在畫面中,但當其中一個子視窗關閉的時候,如何讓剩餘開啟的子視窗能重新排列一次?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-04 17:40:30 IP:210.65.xxx.xxx 未訂閱
Hi ericaleu,    1.Add a timer on the mainform,set enabled to false & interval to 100 2.add below codes on it's OnTimer event
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
  TTimer(Sender).Enabled := False;
  MainForm.TileMode := tbHorizontal;
  MainForm.Tile;
end;
3.add below codes on MDIChild's on close event
...
implementation    uses MAIN;    {$R *.dfm}
...    procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Mainform.Timer1.Enabled := True;
  Action := caFree;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
wameng
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-04 18:07:26 IP:61.222.xxx.xxx 未訂閱
補充(建議): 重排MDI CHILD 動作在 MDI Child 結束後處理。 可參考: 如何得知MDI Child 關閉了! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=64486
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-05 08:26:41 IP:210.65.xxx.xxx 未訂閱
Hi All,    感謝 wameng 版大指教,讓小弟又多學了一招!!    昨天本來是把重新排列的程式碼寫在 MDIChild 的 OnClose 事件上,但發現有一個小問題,亦即重新排列的程式碼會先被觸發後再關掉該 MDIChild,導致螢幕上會有一個空洞(不知該如何形容),效果相當於排列後再關掉一個 MDIChild(先排再關,而非先關再排),所以才會運用 Timer 的方法來進行,不知如何克服此問題?     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
ericaleu
一般會員


發表:6
回覆:1
積分:1
註冊:2004-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-14 10:20:59 IP:203.69.xxx.xxx 未訂閱
很感謝Fishman和wameng兩位大大的回應, 我試了一下wameng的寫法,遇到跟Fishman大大一樣的問題,
雖然會先觸發子視窗的FormClose Event,再到主視窗的ApplicationEvent,但是子視窗的數目還是一樣,所以在排列的時候,還是會依照原本的數目排列,等到子視窗關閉後,畫面就產生一塊空白沒有填滿,不知道MDIChildCount要什麼時候才會真的減1?
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-14 22:36:04 IP:211.74.xxx.xxx 未訂閱
您好:請參見範例,重點在於FormDestroy時把自己的FormStyle設成fsNormal, 這樣他就不會在MDIChild中了。    
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
  Form1.Memo1.Lines.Add('FormClose');
end;    procedure TForm2.FormDestroy(Sender: TObject);
begin
  Self.FormStyle:=fsNormal;
  Form1.TileMode := tbHorizontal;
  Form1.Tile;
  Form1.Memo1.Lines.Add('FormDestroy');
  Form1.Memo1.Lines.Add(IntToStr(Form1.MDIChildCount));
end;
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-15 10:58:28 IP:220.135.xxx.xxx 未訂閱
Hi ericaleu 你好: 參考http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20290095.html 以下是我New一個MDI Project的程式碼, 要修改部分用紅字標出
private
    { Private declarations }
    FClientInstance : TFarProc;
    FPrevClientProc : TFarProc;
    procedure ClientWndProc(var aMessage: TMessage);      public
    { Public declarations }
  end;    procedure TMainForm.ClientWndProc(var aMessage: TMessage);
begin
   case aMessage.Msg of
      WM_MDIDESTROY:
         begin
           aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, Msg, wParam,lParam);
           MainForm.Tile;
         end;
   else
      aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, Msg, wParam,lParam);
   end;
end;    procedure TMainForm.FormShow(Sender: TObject);
begin
   FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
   FClientInstance := MakeObjectInstance(ClientWndProc);
   SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
end;    procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FPrevClientProc));
end;    
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-26 01:45:26 IP:203.73.xxx.xxx 未訂閱
改良Fishman的做法:    1.在Mainform的FormCreate事件中 ... procedure TForm1.FormCreate(Sender: TObject); begin   MdiCnt:=0;  // 暫存已開啟的MDICHILD數量   Timer1.Interval:=500;  // 設定半秒檢查一次MDICHILD數量的變化 end;    2.在Timer1的Timer1Timer事件中 ... procedure TForm1.Timer1Timer(Sender: TObject); begin   if (MdiCnt<>Form1.MDIChildCount) then begin      Form1.TileMode:=tbHorizontal;      Form1.Tile;      MdiCnt:=Form1.MDIChildCount;   end; end;     3.在MDICHLID的FormClose事件中.. procedure TfmChild_1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end; 試試看這樣的效果如何 .....
系統時間:2024-05-06 16:41:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!