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

如何讓視窗隨著元件位置變動大小??

答題得分者是:Justmade
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-09 14:46:29 IP:61.220.xxx.xxx 未訂閱
小弟的form上的元件是動態產生的,想要讓form的height和width值隨著元件位置超過form的height和width值而變動大小, 我這樣寫若有好幾個元件都超過的話,會以最後一個來調整,但最後一個又不一定是最右邊或最下面的元件,請問各位大大有何方式更好更快ㄋ?? for i:=0 to ComponentCount-1 do if (Components[i] is TWinControl) and (TWinControl(Components[i]).parent.Name='Panel1') then begin if TWinControl(Components[i]).Left TWinControl(Components[i]).width > Width then Width:=TWinControl(Components[i]).Left TWinControl(Components[i]).width 15; if TWinControl(Components[i]).Top TWinControl(Components[i]).Height > Height then Height:=TWinControl(Components[i]).Top TWinControl(Components[i]).Height 80; end; ShowModal; 忘記說了一點,from上有panel元件 alClient所以無法用autoSize 發表人 - ivankuo 於 2003/05/09 14:57:42
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-09 15:00:08 IP:218.16.xxx.xxx 未訂閱
在 Form 設定 borderwidth 為你想留的邊界 (如 15) 設定 autosize 為 True
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-09 15:15:18 IP:218.16.xxx.xxx 未訂閱
哎呀,我開打之前沒見你的修正... 若我是你我會這樣做 : 1. Panel1 設計時先不要設 alClient, alNone 就好 2. 動態加完所有元件時設 Panel 1 的 autosize 做 true, 之後設 Form 的 AutoSize 做 True; 3. 設 Panel1/Form 的 AutoSize 是 false, 改 Panel1 為 alClient 若你不喜歡用 Form 的 BorderSize 做邊界,可以 : 1. 改 AutoSize 為 True 前在 Panel1 的左上角放一個 invisible 的小Panel 來定義上邊界和左邊介 (若沒有這 Panel autosize 時元件會向左上移) 2. 改 AutoSize 為 False 後加上右邊界和下邊界 (如 Height := Height 10) 3. 若你喜歡可 Free 了第一步的 panel。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-09 15:46:24 IP:61.220.xxx.xxx 未訂閱
版主前輩: 可是元件的parent是panel1,但是panel1的size大小已經固定了,form就算autosize打開也只是跟panel一樣大阿,且form的autosize被打開後,form的大小就不能改變了. 發表人 - ivankuo 於 2003/05/09 15:48:24
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-09 16:15:12 IP:218.16.xxx.xxx 未訂閱
引言: 1. Panel1 設計時先不要設 alClient, alNone 就好 2. 動態加完所有元件時設 Panel1 的 autosize 做 true, 之後設 Form 的 AutoSize 做 True; 3. 設 Panel1/Form 的 AutoSize 是 false, 改 Panel1 為 alClient 若你不喜歡用 Form 的 BorderSize 做邊界,可以 : 1. 改 AutoSize 為 True 前在 Panel1 的左上角放一個 invisible 的小Panel 來定義上邊界和左邊介 (若沒有這 Panel autosize 時元件會向左上移) 2. 改 AutoSize 為 False 後加上右邊界和下邊界 (如 Height := Height 10) 3. 若你喜歡可 Free 了第一步的 panel。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-09 16:26:36 IP:61.220.xxx.xxx 未訂閱
感謝前輩我了解了~~剛沒看清楚~~ 不過會有兩個問題,一個是autosize會把最左邊最上面的元件變成0,0 ,必須另用panel來控制,另一個問題是autosize後,form的大小就不能變動了. 小弟稍微改一下原來的code如下,已經可以做到了,感謝前輩提供解答^^ fh:=Height; fw:=Width; for i:=0 to ComponentCount-1 do if (Components[i] is TWinControl) and (TWinControl(Components[i]).parent.Name='Panel1') then begin if TWinControl(Components[i]).Left TWinControl(Components[i]).width >= fw then fw:=TWinControl(Components[i]).Left TWinControl(Components[i]).width; if TWinControl(Components[i]).Top TWinControl(Components[i]).Height >= fh then fh:=TWinControl(Components[i]).Top TWinControl(Components[i]).Height; end; if fh>Height then Height:=fh 80; if fw>Width then Width:=fw 10; ShowModal;
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-09 16:42:33 IP:218.16.xxx.xxx 未訂閱
所以我第三點說將 panel1/form 的 autosize 改回 false 並將 panel1 設 alientclient 丫 你現在的程式跟你原本的基本上沒分別,效能反而可能較差,因為你做這個動作時 Form 未 show, 即使改 Form.Height 等不會引發 repaint 但若是 show 後, 用變數來先計算 改變最後才一次更改真的會是比較好。 若你想打少些程式碼,亦可將 : if TWinControl(Components[i]).Left TWinControl(Components[i]).width >= fw then fw:=TWinControl(Components[i]).Left TWinControl(Components[i]).width; 改成 fw:= Max(TWinControl(Components[i]).Left TWinControl(Components[i]).width, fw); (要 uses Math)
系統時間:2024-05-17 2:59:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!