关于控件拖动的一个问题。OLEContainer ( 积分: 200 )

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
往Panel上面丢个控件(OLEContainer),如果没有加载ocx的时候,可以用下面的代码进行拖动。

OldPosition:TPoint; //目标原始位置
PY:TPoint; //鼠标按下和目标位置的偏移量
bDragMode:Boolean; //True为鼠标按下,False为鼠标松开

procedure TForm1.OleContainer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=True;
//保存偏移量,这里的X,Y是以TextTool组件的原点作为参考的,所以直接就是偏移量
PY.X:=X;
PY.Y:=Y;
//
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;

procedure TForm1.OleContainer1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if bDragMode=False then
Exit;

//这里的X,Y是移动的距离,例如右移100象素,X就是100。
TOleContainer(Sender).Left:=OldPosition.X+X-PY.X;
TOleContainer(Sender).Top:=OldPosition.Y+Y-PY.Y;
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;

procedure TForm1.OleContainer1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=False;
end;

但是,一旦OLEContainer加载了内容后,就没法接收到我鼠标的信息了。因为我设置OleContainer的SizeMode是smAutoSize,只有1个象素的边框可以让我点,而且没法方便拖动。

谁有好一点的解决方案?我的想法是:
(1)捕捉鼠标的移动,如果处于某个OleContainer内,显示一个同样大小的漂浮Panel在正上方供我拖动,OleContainer的位置和Panel同步。
(2)好像OleContainer中的内容以Icon方式显示的时候,可以获得鼠标输入,可以拖动。但是我的ActiveForm不知道如何支持这种方式的显示。要做什么额外代码么?
 
往Panel上面丢个控件(OLEContainer),如果没有加载ocx的时候,可以用下面的代码进行拖动。

OldPosition:TPoint; //目标原始位置
PY:TPoint; //鼠标按下和目标位置的偏移量
bDragMode:Boolean; //True为鼠标按下,False为鼠标松开

procedure TForm1.OleContainer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=True;
//保存偏移量,这里的X,Y是以TextTool组件的原点作为参考的,所以直接就是偏移量
PY.X:=X;
PY.Y:=Y;
//
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;

procedure TForm1.OleContainer1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if bDragMode=False then
Exit;

//这里的X,Y是移动的距离,例如右移100象素,X就是100。
TOleContainer(Sender).Left:=OldPosition.X+X-PY.X;
TOleContainer(Sender).Top:=OldPosition.Y+Y-PY.Y;
OldPosition:=Point(TOleContainer(Sender).Left,TOleContainer(Sender).Top);
end;

procedure TForm1.OleContainer1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
bDragMode:=False;
end;

但是,一旦OLEContainer加载了内容后,就没法接收到我鼠标的信息了。因为我设置OleContainer的SizeMode是smAutoSize,只有1个象素的边框可以让我点,而且没法方便拖动。

谁有好一点的解决方案?我的想法是:
(1)捕捉鼠标的移动,如果处于某个OleContainer内,显示一个同样大小的漂浮Panel在正上方供我拖动,OleContainer的位置和Panel同步。
(2)好像OleContainer中的内容以Icon方式显示的时候,可以获得鼠标输入,可以拖动。但是我的ActiveForm不知道如何支持这种方式的显示。要做什么额外代码么?
 
将OLE放到一个Panel中,做个假标题栏拖动,折衷一下:(
 
1.虚假或真实的标题栏(假的如楼上所述/真的代码调整内部的OleObjece大小)
2.OleContainer未激活的时候可以操作
 
OleContainer未激活时候确实可以操作,那么我如何在程序中让它激活或者不激活呢?
 
OLEContainer.Active := False
 
有Active这个属性么??楼上什么版本的?
 
或者类似的属性/函数.因为我身边没有环境,因此这一句是从网上搜得
 
帮忙看看:) 我也知道找类似的属性呢~
 
我做了一个小的Panel漂在OleContainer上方来实现拖动了。不过最好的办法应该是需要拖动时,让OleContainer以Icon方式显示,这样最好了。
 
算了。派分吧。
 

Similar threads

后退
顶部