怎样将label从一个panel拖动到另外一个上,label要在拖动过程中显示

efangDreamer 2001-07-19 06:13:41
想做一个报表格式设计工具,在Windows下设计,最终转化成Unix下的打印文本。
我用五个Panel装表头、页头、detail、表尾、页尾。将label控件动态生成,放在panel上后,在这个父亲panel上已经实现了label大小,位置的控制。但是现在的问题是:怎样将label在不同的panel上移动?移动时要实时显示这个label.
我试过用dragesit、dragmode一类的东西,很不好控制,希望不要说这方面的属性控制拖动,谢谢!
...全文
296 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
windindance 2001-07-24
  • 打赏
  • 举报
回复
那么……
你在MouseDown时把StaticText的Parent设置为Form,放下时再设置为panel吧。
我只能想到这个方法了。
windindance 2001-07-23
  • 打赏
  • 举报
回复

想找一个既有绘图功能又能当容器的控件?可以用ScrollBox+PaintBox。

整个应用程序中拦截鼠标事件,可以用Application.OnMessage,不过该方法耗资源多。

我不明白的是,为什么一定要改变statictext的父亲?不需要改变,可以直接显示呀?
可能需要调用BringToFront函数。
yangxb 2001-07-23
  • 打赏
  • 举报
回复
111
LoveSail 2001-07-23
  • 打赏
  • 举报
回复
那样好象不行
Label拖不出第一个Panel
efangDreamer 2001-07-23
  • 打赏
  • 举报
回复
to winindance:我将TStaticText简单的派生成TReport,增加了几个属性,定制了几个事件的句柄,作为报表中显示文本的载体。StaticText改变要改变父亲是为了在把报表格式文件保存时容易在特定区域(如PageHeader,Detail)找到它;而且因为Unix下打印报表是字符方式的,要求行距可变,把每一行放在Panel上,两个Panel间用spliter,拖动改变行距时,其上的staticText自动改变位置,可以偷懒少写程序。所以只要解决在不同panel上拖动statictext就好办了。
越来越佩服pb的datawindow了,真好用,我怎么做不可能有他好。可是他不能让Unix终端打印!
to all:呆在珠海这个鬼地方,找几本好书很难,见过一本delphi技术内幕,可惜是4.0版的,不知道有没有5.0的。想自己试着做组件,没见到很好的参考书,望大家给我提示,拜托了!
lsoft 2001-07-22
  • 打赏
  • 举报
回复
在托动过程中,当Lable已经离开了Panel1, 则把Lable的Parent设置为Form,
当Lable进入Panel2时把Lable的Parent设置为Panel2!

LoveSail 2001-07-22
  • 打赏
  • 举报
回复
首先将label的Owner改为Form
锁定光标在label中
随拖动改变位置
最后检测释放位置,重新设定Owner,释放光标

没有实现过,提供一个思路
efangDreamer 2001-07-22
  • 打赏
  • 举报
回复
windindance:试了,还是不行。谢谢你说的TStaticText,对我有启示!
kuchong:你说的是不是画一个和label同大小的矩形。可是panel没有canvas,不能画,本来想找一个既有绘图功能又能当容器的控件,除了TForm以外,我-找不到,在同一个Form要放另外的很多的Form,不好控制,费资源。
再请教一个问题,是不是是不是特定的某一个对象才能拦截鼠标事件,如Pannel1MouseUp,能不能在整个应用程序中拦截鼠标事件?也就是我不管在哪儿按下鼠标,总能触发事件。

现在只有求其次了,把label改为StaticText,单击激活,激活后可以用鼠标按住在同一个panel上拖动;激活后,单击panel,改变statictext的父亲,在当前位置显示出来。
torble 2001-07-21
  • 打赏
  • 举报
回复
关注,呵~
whatname 2001-07-21
  • 打赏
  • 举报
回复
关注
kuchong 2001-07-21
  • 打赏
  • 举报
回复
拦截鼠标按下消息
然后判断是否移动
如果移动则隐藏LABEL,在屏幕上画LABEL内容

拦截鼠标放开消息
清除屏幕上画的LABEL,显示LABEL
windindance 2001-07-21
  • 打赏
  • 举报
回复

你可以改用TStaticText控件。
windindance 2001-07-20
  • 打赏
  • 举报
回复
直接拦截label.OnMouseDown等属性吧。
efangDreamer 2001-07-20
  • 打赏
  • 举报
回复
是不是我没有说清楚?
label在同一个panel中拖动可以这样做:
label的mousedown中
capture:=ture;
MousePoint.x:=x;
MousePoint.y:=y;
label的mousemove中
if capture then
begin
label.left:=label.left+(x-MousePoint.x);
label.top:=label.top+(y-MousePoint.y);
end;
label的mouseup中
if capture then
begin
label.left:=label.left+(x-MousePoint.x);
label.top:=label.top+(y-MousePoint.y);
capture:=false;
end;
但是要想在两个panel中拖动label时,用鼠标左键按住label后,直到放开左键,鼠标才能响应其它控件;所以在按住鼠标拖动label,即使超出了panel的范围,移到另一个panel2上,panel2还是不能响应mousemove事件
不知道怎么做才好,很急。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧