2015年11月4日 星期三

Lazarus 系列–2. 視窗畫面的佈局

Lazarus LCL 元件組的佈局,跟 VCL 很相似。為什麼說「很相似」呢?是 Lazarus 的 LCL 元件提供比 VCL 還要多,可以更方便的做好畫面的佈局。

 

一、Align 屬性:這個屬性指定了元件在 parent 中「怎麼靠邊」有以下幾種:

  • alTop:往上靠
  • alBottom:往下靠
  • alLeft: 往左靠
  • alRight:往右靠
  • alClient:填滿中間
  • alNone:都不靠
  • alCustom:這個不明白他怎麼靠,反正不是靠北靠木就是了 (VCL 沒有這個)

  來張圖就更清楚了 (為了方便看清楚 panel 的邊界,把每一個 panel 的 BevelWidth 屬性設定為 5)
2015-11-04_075758

  善用 Align 屬性可以很方便的給畫面佈局「切版」。

 

二、Anchors 屬性:Anchor 就是船錨,這個屬性用來指定元件在 parent 中「哪幾個邊要與 parent 同方向的邊保持固定距離」(以下稱為設定錨點),有以下幾種,均可以分別開啟與關閉:

  • akTop:上方保持固定距離,預設開啟
  • akBottom:下方保持固定距離
  • akLeft:左方保持固定距離,預設開啟
  • akRight:右方保持固定距離

來兩張圖示範一下效果

Panel1 把四個 Anchors 屬性都打開了,然後把 form 拉大,Panel1 的四個邊界依然與 form 的邊界保持固定距離。

2015-11-04_082421

2015-11-04_082852

Lazarus 的 Anchors 屬性除了把錨點設定在 parent 上以外,還可以把錨點設定在不是 parent 的元件上,還可以設定錨定時如何對齊,錨定時要留多少距離

2015-11-04_203829

這是 LCL 的錨點設定視窗,可以看到每一個方向都有 4 個設定項目:

  • Enabled:是否開啟這個方向的錨點
  • Sibling:我的兄弟是誰,就是我要跟誰錨定
  • 三個按鈕:如何對齊,有「對齊邊界」「依序排列」「對齊中線」三種
  • Border space:對齊邊界或是依序排列時要空出多少寬度

打個比方,將 Edit1 做如下的錨點設定之後,移動 Label1 時,Edit1 就會跟著移動:

2015-11-04_204701

Edit1 的上邊界與 Label1 錨定,對齊中線,同時左方也與 Lable1 錨定,依序排列,中間間隔 5px,這樣設定的結果如下圖:

2015-11-04_204911

把 Label1 抓著移動時,Edit1 會跟著移動,但是 Edit1 就無法被抓著移動了:

2015-11-04_204926

 

三、ChildSizing 屬性,這是容器元件才有的屬性,用來規範自己內部的元件要如何排列

2015-11-04_205231

  • ControlsPerLine:一列要排幾個元件
  • EnlargeHorizontal:自己被拉寬時,內部元件的寬度要如何變化
  • EnlargeVertival:自己被拉高時,內部元件的高度要如何變化
  • HorizontalSpacing:內部元件的水平間距
  • Layout:要怎麼排列內部元件
  • LeftRightSpacing:排列時,左右要空多少不拿來排列內部元件,就相當於 CSS 的 padding-left 與 padding-right
  • ShrinkHorizontal:自己被拉窄時,內部元件的寬度要如何變化
  • ShrinkVertival:自己被拉矮時,內部元件的高度要如何變化
  • TopBottomSpacing:排列時,上下要空多少不拿來排列內部元件,就相當於 CSS 的 padding-top 與 padding-bottom
  • HorizontalSpacing:內部元件的垂直間距

拿兩張圖來示範一下排列前與排列後,隨意擺放幾個元件,準備來排列

2015-11-04_205845

接下來,設定 Form1 的 ChilldSizing 屬性以及這些元件的 Z-Order 如下:
(設定 Z-Order 可以在 form 上選擇一個元件,然後使用 Ctrl-PgUp 與 Ctrl-PgDn 這兩個熱鍵來調整)

2015-11-04_210238

2015-11-04_210252

然後,這些元件就排列好了:

2015-11-04_210629

將 form 改變大小試試:

2015-11-04_210733

2015-11-04_210741

很方便,對吧!
可惜有一點,一個元件固定佔用一個「格子」,沒辦法跨列、跨欄,不過已經非常方便了!

這一篇就講到這裡,我們下期再見!

沒有留言: