======================================================
注:本文源代码点此下载
======================================================
delphi窗体动态设计 在系统运行时动态更改控件属性
http://hi.baidu.com/xtfnpgy/blog/item/e3eab3e7c95f2239b93820c9.html
在应用程序的开发中,常常要将某些控件对象(如标签)用鼠标选中后进行拖动操作,用以改变控件的位置,在delphi中如何实现这一功能呢?笔者想了一个
方法:通过在 public 中定义全局变量用以跟踪 鼠标在移动和拖动控件时的坐标,然后在拖动结束时将鼠标的坐标值赋给控件的
top和left属性,以达到拖动的目的。
举例如下:创建一个 panel,再创建一个label,通过编程使控件 lable 可以在 panel 中被拖放到任意位置。以下是具体实现过程:
1. 首先做一下准备工作,运行delphi3.0,进入集成开发环境,在 file 菜单中选择new application 。
2. 在form1中创建对象 panel1,并在 panel1 中创建另一对象 label1。
3. 选中label1,修改其下列属性的值:
属性值:
caption:标签移动测试!
cursor:crhandpoint
dragcursor:crdrag
dragmode:dmautomatic
4.在程序的开头部分声明全局变量 x_panel,y_panel,x_label,y_label,其中,x_panel,y_panel :鼠标在panel1上的坐标;x_label,y_label :鼠标在label1上的坐标。
注:这里分别获取在panel1和label1上的坐标是为了更精确地计算出label1实际的移动距离。
5.在panel1的ondragover 和onmousemove 事件中添加如下代码:
x_panel:=x;
y_panel:=y;
注:该操作是获得 mouse 在panel1上的坐标。
6.在label1的onmousemove 事件中添加如下代码:
x_labell:=x;
y_label1:=y;
注:该操作是获得 mouse 在label1上的坐标。
7.在label1的onenddrag 事件中添加如下代码:
label1.left :=x_panel-x_label;
label1.top :=y_panel-y_label;
说明:两者相减是为了求得 label1 实际的移动距离。
8.创建一个对象 button1 ,并在其 onclick 事件中添加如下代码:
close; //用以关闭应用程序。
好了,现在运行程序,测试一下结果。
以下是程序源代码,在delphi3.0、windows95/98中测试通过。
unit test_move;
interface
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
stdctrls, extctrls;
type
tform1 = class(tform)
panel1: tpanel;
label1: tlabel;
button1: tbutton;
procedure button1click(sender: tobject);
procedure panel1mousemove(sender: tobject; shift: tshiftstate; x,y: integer);
procedure panel1dragover(sender, source: tobject; x, y: integer;
state: tdragstate; var accept: boolean);
procedure label1mousemove(sender: tobject; shift: tshiftstate; x,y: integer);
procedure label1enddrag(sender, target: tobject; x, y: integer);
private
{ private declarations }
public
{ public declarations }
x_panel,y_panel,x_label,y_label:integer;
end;
var
form1: tform1;
implementation
{$r *.dfm}
procedure tform1.button1click(sender: tobject);
begin
close;
end;
procedure ftorm1.panel1mousemove(sender: tobject; shift: tshiftstate;x,y: integer);
begin
x_panel:=x;
y_panel:=y;
end;
procedure tform1.panel1dragover(sender, source: tobject; x, y: integer;
state: tdragstate; var accept: boolean);
begin
x_panel:=x;
y_panel:=y;
end;
procedure tform1.label1mousemove(sender: tobject; shift: tshiftstate;x,y: integer);
begin
x_label:=x;
y_label:=y;
end;
procedure tform1.label1enddrag(sender, target: tobject; x, y: integer);
begin
label1.left :=x_panel-x_label;
label1.top:=y_panel-y_label;
end;
end.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2011-05-05 16:44 chulia 阅读(126) 评论(0)编辑 收藏
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/