在做Mis項目過程中,有時需要讓使用者自己來實現表單控制項的布局,比如酒店管理中就需要對餐廳餐桌位置進行布局。要實現這種功能,必須做好三件事:
1、設定進入控制項邊緣的游標形狀;
2、改變控制項的大小及位置;
3、儲存表單控制項的位置及狀態,表單下次啟動時重新設定它們的這些資訊。具體步驟如下:
1、修改控制項游標。只需要在進入控制項的時候,將screen的cursor屬性設定成對應形狀即可,控制項都有一個OnMouseMove事件,在這個事件中調用它就可以實現。我已經將它封裝成函數如下:
procedure CursorControl(Control: TControl; Shift: TShiftState; X, Y, Prec: integer);
begin
//游標在控制項的最左側
if (X<=Prec) and (Y>Prec) and (Y<Control.Height-Prec) then Control.Cursor := crSizeWE
// 游標在控制項的最右側
else if (X>=Control.Width-Prec) and (Y>Prec) and (Y<Control.Height-Prec) then Control.Cursor := crSizeWE
// 游標在控制項的最上側
else if (X>Prec) and (X<Control.Width-Prec) and (Y<=Prec) then Control.Cursor := crSizeNS
// 游標在控制項的左上方
else if (X<=Prec) and (Y<=Prec) then Control.Cursor := crSizeNWSE
// 游標在控制項的右上方
else if (X>=Control.Width-Prec) and (Y<=Prec) then Control.Cursor := crSizeNESW
// 游標在控制項的最下側
else if (X>Prec) and (X<Control.Width-Prec) and (Y>=Control.Height-Prec) then Control.Cursor := crSizeNS
// 游標在控制項的左下角
else if (X<=Prec) and (Y>=Control.Height-Prec) then Control.Cursor := crSizeNESW
// 游標在控制項的右下角
else if (X>=Control.Width-Prec) and (Y>=Control.Height-Prec) then
Control.Cursor := crSizeNWSE
// 游標在控制項的客戶區(移動整個控制項)
else if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5) then Control.Cursor := crSizeAll
else Control.Cursor := crDefault;//恢複預設游標
end;
2、修改表單控制項的大小和位置。其實有一種最簡便的方法那就是向控制項發送相應的訊息即可。我也已將它封裝成一個函數,在控制項的OnMouseDown事件中調用即可。函數如下:
procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Prec: integer);
var
SC_MANIPULATE: Word;//儲存對應訊息值
begin
// 游標在控制項的最左側
if (X<=Prec) and (Y>Prec) and (Y<Control.Height-Prec) then SC_MANIPULATE := $F001
// 游標在控制項的最右側
else if (X>=Control.Width-Prec) and (Y>Prec) and (Y<Control.Height-Prec) then SC_MANIPULATE := $F002
// 游標在控制項的最上側
else if (X>Prec) and (X<Control.Width-Prec) and (Y<=Prec) then begin
SC_MANIPULATE := $F003
// 游標在控制項的左上方
else if (X<=Prec) and (Y<=Prec) then SC_MANIPULATE := $F004
// 游標在控制項的右上方
else if (X>=Control.Width-Prec) and (Y<=Prec) then SC_MANIPULATE := $F005
// 游標在控制項的最下側
else if (X>Prec) and (X<Control.Width-Prec) and (Y>=Control.Height-Prec) then SC_MANIPULATE := $F006
// 游標在控制項的左下角
else if (X<=Prec) and (Y>=Control.Height-Prec) then SC_MANIPULATE := $F007
// 游標在控制項的右下角
else if (X>=Control.Width-Prec) and (Y>=Control.Height-Prec) then SC_MANIPULATE := $F008
// 游標在控制項的客戶區 ( 移動整個控制項 )
else if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5) then SC_MANIPULATE := $F009
else SC_MANIPULATE := $F000;
if Shift=[ssLeft] then
begin
ReleaseCapture;
Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);//向控制項發送改變游標訊息
end;
end;
3、儲存和恢複表單控制項的大小及位置。通過對表單的Component元件進行遍曆,然後將它們的位置及大小屬性值寫入INI檔案中,表單下次啟動時再通過讀取INI檔案恢複表單控制項的這些屬性即可。關於這個解決辦法網上有很多,還有現成的控制項不用寫一行代碼就可實現的,限於篇幅在此我就不再累述了。有興趣的朋友不防一試。所有代碼在WIN2000/DELPHI7下測試通過。