怎么实现控件的自由拖拉?(100分)

  • 主题发起人 主题发起人 wx_zhang
  • 开始时间 开始时间
W

wx_zhang

Unregistered / Unconfirmed
GUEST, unregistred user!
PB中定义数据源的界面,可以自由拖拉表的示意图,并可以在多个表之间建立连接,同时
用联线的形式表示。在Delphi中怎么实现?
 
可能要用到许多东西,你在网上搜一下吧.应该有的.抱歉不能帮你.不过有时间我会试一下的.



 
//鼠标移动处理事件,主要是实现控件移动
procedure TDesignForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
tmp_X,tmp_Y:integer;
begin
if sender=self then exit; //如果调用者是窗体本身则退出
if not IsDrag then exit; //如果没有在拖放状态(鼠标左键按下)
tmp_X:=(Sender as TGraphicControl).Left+X-X_Image; //计算被拖动控件的左坐标
tmp_Y:=(Sender as TGraphicControl).Top+Y-Y_Image; //计算被拖动控件的顶坐标
(Sender as TGraphicControl).Left:=tmp_X; //设定被拖动控件的新位置
(Sender as TGraphicControl).Top:=tmp_Y;
RepDgnForm.Now_X.caption:=IntToStr(tmp_X); //动态显示被拖动控件的当前坐标
RepDgnForm.Now_Y.caption:=IntToStr(tmp_Y);
end;
 
已经实现了,其实很简单,把DragKind和DragMode的值改一下就可以。如果在两个控件间连
好了线,怎么实现在拖动控件的同时自动缩放连线?象有些画流程图的工具那样的效果。有
什么好的方法没有?除了手工画以外。
 
wx_zhang:
把DragKind和DragMode的值改成什么,好像效果不是你想要的吧
 
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
(Sender as TWinControl).Perform(WM_Syscommand,$f012,0);
end;
划线用 Canvas.MoveTo() Canvas.LineTo()
简单的要死,这个都搞不定,不用编程了。
 
hehe,是非常的简单,不过你针对由Twincontrol继承下来的控件可以这么做,但是对于
其他控件呢?从TGraphicControl继承下来的呢?比如TShape你有没有试过,是不是这么
简单?
 
依然简单,Tshape放在一个autosize:=true的panel上面。
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
(Tshape(Sender).parent as TWinControl).Perform(WM_Syscommand,$f012,0);
end;
容器的作用发挥出来了吧。
 
to free_knight:分别取除默认值外的值,DragKind设成dkDock,DragMode设成dmAutomatic,
就可以很方便地实现拖动。
to bubble:我不想用手工画的方式,因为拖动控件后,需要先把原来的线删掉,然后计算控件
的新位置,再联线。特别是如果控件很多,或者几个控件在水平方向上有重叠,还不太好处理。
我是想找一种处理类似问题的比较好的思路
 
bubble:不用panel呢?
 
这种连线效果不是太好。
你的设计期自由拖动,在深度历险中有一个这样的控件。
 
我现在也在做类似的东东,想通过动态连线的方式,不过要考虑的东西太多了;
zlj555兄,我到深度历险去看没有找到,能否帮忙看看是那个控件。
找到解决方法一定和大家共享!
bubble兄,看过你几个关于图形的帖子,很棒的,怎么不回答这个问题?很想和你
做朋友,QQ:6443443
 
我也想要,但这里的回复好象都没有回答楼主的问题
 
后退
顶部