Delphi实现窗体控件自由摆布

风萧笑兮

风萧笑兮

2016-01-29 14:23

Delphi实现窗体控件自由摆布,Delphi实现窗体控件自由摆布
 
Delphi关键字导航
网络 界面 多媒体 数据库 图像 控件 文件 硬件 

在做Mis项目过程中,有时需要让用户自己来实现窗体控件的布局,比如酒店管理中就需要对餐厅餐桌位置进行布局。要实现这种功能,必须做好三件事:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/)

1、设置进入控件边缘的光标形状;

2、改变控件的大小及位置;

3、保存窗体控件的位置及状态,窗体下次启动时重新设置它们的这些信息。具体步骤如下:

1、修改控件光标。只需要在进入控件的时候,将screen的cursor属性设置成对应形状即可,控件都有一个OnMouseMove事件,在这个事件中调用它就可以实现。我已经将它封装成函数如下:

procedure CursorControl(Control: TControl; Shift: TShiftState; X, Y, Prec: integer);
 begin
  //光标在控件的最左侧
  if (X<=Prec) and (YPrec) and (Y<Control.Height-Prec) then Control.Cursor := crSizeWE
  // 光标在控件的最右侧
  else if (X=Control.Width-Prec) and (YPrec) and (Y<Control.Height-Prec) then   Control.Cursor := crSizeWE
  // 光标在控件的最上侧
  else if (XPrec) 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 (XPrec) 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 (X5) and (Y5) 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 (YPrec) and (Y<Control.Height-Prec) then SC_MANIPULATE := $F001
   // 光标在控件的最右侧
  else if (X=Control.Width-Prec) and (YPrec) and (Y<Control.Height-Prec) then SC_MANIPULATE := $F002
   // 光标在控件的最上侧
  else if (XPrec) 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 (XPrec) 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 (X5) and (Y5) 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下测试通过。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/) 
展开更多 50%)
分享

猜你喜欢

Delphi实现窗体控件自由摆布

Delphi
Delphi实现窗体控件自由摆布

在Delphi中巧改窗体文件实现控件数组

编程语言 网络编程
在Delphi中巧改窗体文件实现控件数组

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

模拟delphi编辑窗体操作控件

编程语言 网络编程
模拟delphi编辑窗体操作控件

在Delphi中巧改窗体文件实现控件数组化

Delphi
在Delphi中巧改窗体文件实现控件数组化

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

用Delphi实现快闪窗体信息提示

Delphi
用Delphi实现快闪窗体信息提示

jquery 可拖拽的窗体控件实现代码

Web开发
jquery 可拖拽的窗体控件实现代码

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Flash加载外部文件(5)

Flash加载外部文件(5)

用php+mysql一个名片库程序

用php+mysql一个名片库程序
下拉加载更多内容 ↓