如何讓視窗隨著元件位置變動大小?? |
答題得分者是:Justmade
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
小弟的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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
哎呀,我開打之前沒見你的修正... 若我是你我會這樣做 :
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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 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 發送簡訊給我 |
感謝前輩我了解了~~剛沒看清楚~~
不過會有兩個問題,一個是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 發送簡訊給我 |
所以我第三點說將 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)
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |