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

有關TForm size 的問題

尚未結案
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-21 17:47:03 IP:218.103.xxx.xxx 未訂閱
正常的時候如圖1 圖2 但當我把splitter 拉到最右面的時候就會是圖三 我的設定是 左面的是 alleft, minwidth = 200, 右面的是 alclient , minwidth = 200, window 不在Maximized的時候, 如果拉splitter 到右面, 右面的listbox 還會跑出windows 請問是那裡的問題??
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-22 04:30:26 IP:218.19.xxx.xxx 未訂閱
SamSam1230 您好: 請查看一下您的 MainForm 是否未設定 MinWidth? 如果您未設定該值,而 MainForm 的 WindowState 不是 wsMaximized 的話,依據您的現有設定,MainForm 的寬度會在向右調整 Splitter 時一直增加,以至於超出視窗系統的右邊緣了。
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-22 09:48:53 IP:218.103.xxx.xxx 未訂閱
minwidth?? 不是 maxwidth??
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-22 14:56:27 IP:218.19.xxx.xxx 未訂閱
SamSam1230 您好: 抱歉,前一篇打錯字了,您說的沒錯,是 MaxWidth 才對。 如果 MainForm 沒有設定該屬性的話,MainForm 的寬度就等於沒有加以限制,而您對 Splitter 兩端的物件都設定了 MinWidth,所以會在 Splitter 向右調整時,系統會先將右邊物件的寬度先調小,當寬度等於 MinWidth 的設定時,右邊的物件就無法再縮小了,於是就會迫使 MainForm 加大寬度,以至於超出 Windows 的可視範圍。 您也可以依據實際的需求,在 MainForm 的 OnResize 事件中以 MainForm 的現有寬度為基準,來動態設定左右兩個物件的最大、最小寬度。
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-22 15:33:05 IP:218.103.xxx.xxx 未訂閱
RedSnow 你好 以下有兩個問題 1. 我已經把mainform 的 maxwidth 設定為 1024, 當我按maxmized,最大就不會超出windows 可見的範圍, 但當我是拉splitter 的時候,還會超出的 2. 如果要知道現在windows 的resolution , 要怎樣呢? 因為如果當程式放到另外的電腦,不同的resolution , design time 的時候設定會不夠動態 謝謝大大
xfile
初階會員


發表:21
回覆:80
積分:25
註冊:2004-10-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-22 18:41:08 IP:220.130.xxx.xxx 未訂閱
引言: RedSnow 你好 以下有兩個問題 1. 我已經把mainform 的 maxwidth 設定為 1024, 當我按maxmized,最大就不會超出windows 可見的範圍, 但當我是拉splitter 的時候,還會超出的
這時候只好手動在 splitter 的 OnMove 事件中即時判定大小以便做限制
引言: 2. 如果要知道現在windows 的resolution , 要怎樣呢? 因為如果當程式放到另外的電腦,不同的resolution , design time 的時候設定會不夠動態 謝謝大大
用 SystemParametersInfo 這個 API 來取得目前解析度 SystemParametersInfo(SPI_GETWORKAREA,0,&rec,SPIF_SENDCHANGE); rec 是 RECT 型態的變數
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-22 19:59:34 IP:218.19.xxx.xxx 未訂閱
SamSam1230 您好:    
引言: 以下有兩個問題 1. 我已經把mainform 的 maxwidth 設定為 1024, 當我按maxmized,最大就不會超出windows 可見的範圍, 但當我是拉splitter 的時候,還會超出的 2. 如果要知道現在windows 的resolution , 要怎樣呢? 因為如果當程式放到另外的電腦,不同的resolution , design time 的時候設定會不夠動態
我不太清楚您設定 MinWidth 的原因為何,因此不知道我的建議是否能滿足您的需求,您可否先試試看下列設定能否達到您的需求? 方法一: 1. 取消左右兩個物件的 MinWidth 設定。 2. 將 Spillter 的 MinSize 設為 1。 這樣設定反而比較簡單些,因為您的預期是將 Splitter 向右調整時,不讓 MainForm 的寬度向右增大,如果您的右方物件寬度有可能會呈現寬度為 0 的現象時,那麼上述的設定既簡單又方便,您不妨一試。
方法二:    void __fastcall TForm1::Splitter1CanResize(TObject *Sender, int &NewSize,
      bool &Accept)
{
    if((this->ClientWidth - Splitter1->Width - NewSize) < ListBox2->Constraints->MinWidth){
        Accept = false;
    }
}
上述的設定是透過 Splitter 的 OnCanResize 事件,可以在 Splitter 向右調整時,達到右方物件 (ListBox2) 所設定的 MinWidth 時,不會將 MainForm (例子中的 Form1) 的寬度向右增大。(我的環境是 BCB 4.0,上述設定經過測試可以正常運作) 另外有關螢幕的解析度,可以使用下列方式取得:
Screen->Width
您參考一下。 發表人 - RedSnow 於 2005/03/22 20:07:57
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-24 10:10:39 IP:218.103.xxx.xxx 未訂閱
方法二: void __fastcall TForm1::Splitter1CanResize(TObject *Sender, int &NewSize, bool &Accept) { if((this->ClientWidth - Splitter1->Width - NewSize) < ListBox2->Constraints->MinWidth){ Accept = false; } } 不知道是不是因為我用的delphi 4.0 , 所以 this 這個keyword complier 有問題 不知道什麼原因, 方法一行不通
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-24 11:31:40 IP:218.103.xxx.xxx 未訂閱
謝謝 RedSnow 我code 改一下就可以了 謝謝你
linuswang
一般會員


發表:0
回覆:1
積分:0
註冊:2005-02-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-26 21:20:44 IP:211.23.xxx.xxx 未訂閱
剛好我最近的程式,介面有點類似 不過我是用BCB,不曉得跟delphi一不一樣 我的做法是左右兩邊都放panel (我的介面有需要),中間放splitter 不需要另外寫code
系統時間:2024-05-17 11:10:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!