动态生成的panel控件组如何移动(100分)

  • 主题发起人 主题发起人 石光亮
  • 开始时间 开始时间

石光亮

Unregistered / Unconfirmed
GUEST, unregistred user!
我创建了一个panel控件,上面包含了一个animate和一个label,我想实现鼠标拖动整个控件
但鼠标在点击animate和label时,panel无法移动,怎么办?
 
在程序里控制PANEL的位置啊!
label1.parent.left:=x;
label1.parent.top:=y;

 
我刚好作了一个,不要直接加image控件,而是将一个bitmap对象,在paint事件中将他重画
出来.
 
能否给段代码看看,shiguangliang@263.net,chyni
 
我想我可能搞错了,我的控件顶多只能放动画,不能放avi 文件。
 
对于 label,可以在它 的 OnClick 事件中通知 Panel 鼠标左键已按下,而 TAnimate 没有
OnClick 事件,需要为它派生一个子类,在该子类中将 OnClick 事件 published 出来(
TControl 中已定义了 OnClick,但保护起来了),然后和 Label 一样处理。你的 Panel
创建时,再对它们的 OnClick 动态地赋予事件处理过程。
应该有更好的办法,不知道怎样只要改写 Panel 就能达到目的。
 
这个应该十分容易实现。实际起作用的代码应该只有两行。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure MovePanel(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
public
{ Public declarations }
end;
TAnimateMove = class(TAnimate)
published
property OnMouseDown;
end;
var
Form1: TForm1;

implementation

{$R *.DFM}
Function GetPanel(aControl:TControl):TPanel;
var pal:TControl;
begin
while not( (pal= nil) or (pal is TPanel) ) do
pal := pal.Parent;
Result := pal as TPanel;
end;

procedure TForm1.Button1Click(Sender: TObject);
var palDynamic:TPanel;
begin
palDynamic := TPanel.Create(Self);
with palDynamic do
begin
Parent := Self;
OnMouseDown := MovePanel;
end;

with TLabel.Create(self) do
begin
Parent := palDynamic;
Caption := '动态创建示例';
Align := alTop;
Alignment:= taCenter;
OnMouseDown:=MovePanel;
end;

with TAnimateMove.Create(Self) do
begin
Parent := palDynamic;
Align := alClient;
CommonAVI := aviFindComputer;
Active :=True;
OnMouseDown := MovePanel;
end;

end;

procedure TForm1.MovePanel(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var palDynamic:TPanel;
begin
palDynamic := GetPanel(Sender as TControl);
if(palDynamic = nil) then exit;
ReleaseCapture;
palDynamic.Perform(WM_SYSCOMMAND,$F012,0);

end;

end.


 
茶壶大哥给出的 TAnimateMove 应该是这样的:
TAnimateMove = calss(TAnimate)
published
property OnMouseDown;
end;
标准的 TAnimate 没有 OnMouseDown 事件。
 
茶壶大哥的代码中,好象Function GetPanel有点问题。
 
这是一个例子,看看会不会对你有所帮助。

在Form中放入一个Panel,加入如下代码:
procedure TForm1.Panel1MouseDown(Sender: Tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);const
SC_DragMove = $F012; { a magic number }begin ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);end;
 
前一阵子,我接触过这个问题。
下面的代码是,
Panel1上面放了一个Image2,当移动这个Image2时发生的,
和你的问题我沉着有些相同之处。

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012; { a magic number }
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
 
在一个新的Form中放入一个Panel,加入如下代码:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012; { a magic number }
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
 
我试过,有一点点问题。就是当鼠标点击在TIMAGE控件上的时候还是不会移动。
必须点在PANEL上才能移动。
 
后退
顶部