Delphi實現表單控制項自由擺布

來源:互聯網
上載者:User

在做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下測試通過。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.