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

如何讓MDIChildForm的大小不會自動轉換

答題得分者是:ccchen
Miles
尊榮會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-25 12:03:38 IP:210.58.xxx.xxx 未訂閱
各位先進大家好: 若有一MDI的子Form, 開啟時WindowsState皆為wsMaximized也就是最大化, 但現在我有另一個子Form WindowsState為wsNormal且不管BorderStyle 設成bsSizeable or bsNormal開啟時那些最大化的Form皆會自動縮成一般大小 請問我要如何做才能讓每個子Form還是維持本來的大小? 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-25 13:41:14 IP:61.219.xxx.xxx 未訂閱
大概只要有一個child是Maximized就所有child都會Maximized,只要所有child不 Maximized, 就都可以控制 找不到更好方法前, 我是如此做, 不知是否何你用 將要最大化之form, 不用maximized,而是改size至最大 fmMainChild.SetBounds(0,0,clientwidth-4,clientheight-4-StatusBar1.height);
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-25 15:30:43 IP:203.204.xxx.xxx 未訂閱
引言: 各位先進大家好: 若有一MDI的子Form, 開啟時WindowsState皆為wsMaximized也就是最大化, 但現在我有另一個子Form WindowsState為wsNormal且不管BorderStyle 設成bsSizeable or bsNormal開啟時那些最大化的Form皆會自動縮成一般大小 請問我要如何做才能讓每個子Form還是維持本來的大小? 我不是高手, 高手是正在銀幕前微笑的人.
我發現只要有不是最大化的Form出現(Create),ChildForm就會變成不是最大化,所以可以在Create後再將ChildForm最大化,試試看吧!
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Miles
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-26 09:34:13 IP:210.58.xxx.xxx 未訂閱
感謝兩位前輩的指導: 我想可能還是沒什麼辦法, 不曉得Borland的用意為何, jieshu前輩您好,若是都變成最大化是沒什麼問題, 但小弟現在的需求是將各個ChildForm的大小都維持好, 也就是已經最大化的若我叫出一個Normal Child Form他們不會跟著縮小, 不曉得是否有解. ccchen前輩我想最後無解的話我會考慮用這個方法, 指不過UI要一個一個 叫出來修改了, 因為他會多佔一行Caption, 而且也難保User不會習慣性的按 下最大化, 但這又讓我多學了一招. 還是感謝兩位前輩的指導. 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-26 11:59:58 IP:61.219.xxx.xxx 未訂閱
指不過UI要一個一個叫出來修改了, 因為他會多佔一行Caption 為什麼這麼麻煩, Caption拿掉不就得了 應寫一程序去create Form, 所以Form之Create均呼叫此一程序,以後Form要有什麼一致的修改時, 改此程序就好 另外提供你參考(只是參考想法)我們所有form在DesignTime都是normal, Create時在程序中自動改為MDIChild
function CreateUniqueChild(c:TFormClass):TFormclass;
var i: integer;
    curfunid: string;
begin
  result := nil;
  if curMenu<>nil then 
    curfunid := curMenu.Name;
  if Application.mainform.FormStyle = fsMDIForm then
    with Application.mainform do begin
      for i := 0 to MdiChildCount-1 do
        if (MdiChildren[i] is c) and (curfunid=TFmIkForm(MdiChildren[i]).funid) then
          result := TFormClass(MdiChildren[i]);
      if result = nil then
        result := CreateChild(c)
      else with TForm(result) do begin
        if WIndowState = wsMinimized then
          WindowState := wsNormal;
        BringToFront;
      end;
    end;
end;
發表人 - ccchen 於 2002/12/26 12:03:11
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-26 14:52:46 IP:210.202.xxx.xxx 未訂閱
引言: 指不過UI要一個一個叫出來修改了, 因為他會多佔一行Caption 為什麼這麼麻煩, Caption拿掉不就得了 應寫一程序去create Form, 所以Form之Create均呼叫此一程序,以後Form要有什麼一致的修改時, 改此程序就好 另外提供你參考(只是參考想法)我們所有form在DesignTime都是normal, Create時在程序中自動改為MDIChild
請問 ccchen 兄 Caption 要如何拿掉呢 ? (之前我試過 BorderStyle := bsNone 方法不成功) 另外您說 "Create 時在程序中自動改為MDIChild" 其實我目前就是這樣作, 但還是不可以有一個 Form 是 Maximized, 否則其他 Form 會影響到.
------
將問題盡快結案也是一種禮貌!
Miles
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-26 14:53:20 IP:210.58.xxx.xxx 未訂閱
ccchen先進您好: 小弟有寫一個標準的Procedure在MainForm上讓他開啟子Form,  但有些子Form的功能比較麻煩, 可能會被好幾支程式共用到 例如:
  在第一支程式呼叫
  if not Assigned(AForm) then
     AForm := AForm.Create(MainForm);
  AForm.Procedure1;
  AForm.Show;
  在第二支程式也會呼叫
  if not Assigned(AForm) then
     AForm := AForm.Create(MainForm);
  AForm.Procedure2;
  AForm.Show;
像上面的東西有非常多支, 為了維護容易我並沒有將比較Detail全部寫在 MainForm上面Procedure, 所以就會有每一支叫出來Check的情形. 小弟有在網路上找了一些資料, 有先進建議在Message WM_GETMINMAXINFO上面下手, 但小弟實在是沒有頭緒,找了一下VCL的SourceCode, 也希望各位先進大大能夠幫忙, 感謝~~~
procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;    procedure TCustomForm.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
begin
  if not (csReading in ComponentState) and FSizeChanging then
    with Message.MinMaxInfo^, Constraints do
    begin
      with ptMinTrackSize do
      begin
        if MinWidth > 0 then X := MinWidth;
        if MinHeight > 0 then Y := MinHeight;
      end;
      with ptMaxTrackSize do
      begin
        if MaxWidth > 0 then X := MaxWidth;
        if MaxHeight > 0 then Y := MaxHeight;
      end;
      ConstrainedResize(ptMinTrackSize.X, ptMinTrackSize.Y, ptMaxTrackSize.X,
        ptMaxTrackSize.Y);
    end;
  inherited;
end;
我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2002/12/26 14:55:12
------


我不是高手, 高手是正在銀幕前微笑的人.
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-27 10:15:39 IP:61.219.xxx.xxx 未訂閱
我想WM_GETMINMAXINFO也達不到你的目的 因此時, 要MAX已成即成事實, 你可以改變max之size定義(例如改成你要的大小), 但他還是算max了(child form右上之system menu仍併入Parent)
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-27 11:27:59 IP:203.204.xxx.xxx 未訂閱
引言: 我想可能還是沒什麼辦法, 不曉得Borland的用意為何, jieshu前輩您好,若是都變成最大化是沒什麼問題, 但小弟現在的需求是將各個ChildForm的大小都維持好, 也就是已經最大化的若我叫出一個Normal Child Form他們不會跟著縮小, 不曉得是否有解. 我不是高手, 高手是正在銀幕前微笑的人.
這應該是MDI視窗的特性吧(猜的)! 不知你是否有試過我說的,若你目前程式(FormStyle是fsMDIChild)是最大化,要叫出一個FormStyle是fsNormal的Form(要用ShowModal不然Focus移開就會不見)就有效,一樣是fsMDIChild就都會被最大化。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Miles
尊榮會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-27 17:15:55 IP:210.58.xxx.xxx 未訂閱
感謝個位前輩的指導和建議, 山不轉路轉, 研究了半天Source Code卻還不曉得是哪裡做怪, 個位的建議對我的幫助非常大, 再次感謝.    PS. ~~><~~~ 分數只能給一個 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
系統時間:2024-05-07 22:44:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!