试试这种:常用鼠标事件
常用的鼠标事件有:
(1) OnMouseDown
当按下鼠标上的任一个键,会产生一个O n M o u s e D o w n事件。
(2) OnMouseMove
当鼠标的位置发生了改变后会产生一个O n M o u s e M o v e事件。
如果窗体有O n M o u s e M o v e事件的处理过程,窗体中的某个组件也具有O n M o u s e M o v e事件
的处理过程,那么当鼠标在窗体中移动时,执行的是窗体的O n M o u s e M o v e事件的处理过程;
当鼠标在组件上移动时,执行的则是组件的O n M o u s e M o v e事件的处理过程,而将窗体的
O n M o u s e M o v e事件的处理过程屏蔽掉了。
(3) OnMouseUp
当鼠标的某个按键按下,然后松开后会产生一个O n M o u s e U p事件。
此外,O n C l i c k事件也与鼠标的操作有关,如在按钮组件上单击鼠标左键,可以产生该按
钮组件的一个O n C l i c k事件。需要注意,O n C l i c k事件只有在一个组件上按下鼠标左键并在同一
个组件上释放左键的情况下才会发生。如果按下左键后将鼠标移动到别的地方再释放组件,就
不会产生该组件的O n C l i c k事件,但是会产生O n M o u s e D o w n、O n M o u s e M o v e和O n M o u s e U p等
事件。
拖曳事件
常用的拖曳事件有:
(1) OnDragDrop
在拖曳事件开始时会产生一个O n D r a g D r o p事件。
(2) OnDragOver
当拖曳对象跨过一个组件时会产生一个O n D r a g O v e r事件。
(3) OnEndDrag
当拖曳事件结束后会产生一个O n E n d D r a g事件。
通过上面的拖曳事件,可以很方便地实现一些拖曳操作。具体过程如下:
(1) 拖曳操作开始
大多数的组件具有D r a g M o d e属性,表示开始拖曳操作的方式。D r a g M o d e属性的默认值为
d m M a n u a l,也就是要在被拖动组件的O n M o u s e D o w n事件的处理过程中调用B e g i n D r a g过程才
下载
开始拖曳操作。如果将D r a g M o d e属性设置为d m A u t o m a t i c,则鼠标左键在被拖动组件上按下后
就自动开始拖曳操作。
(2) 接受拖曳操作
当拖动一个组件经过第二个组件的时候,第二个组件会产生一个O n D r a g O v e r事件。在该
事件的处理过程中有一个布尔类型的参数,该参数的设置直接影响是否产生O n D r a g D r o p事件。
一般情况下,在O n D r a g O v e r事件的处理过程中,根据参数S o u r c e判断拖曳操作的源。如果
是可以接受的源,则将A c c e p t参数设置为True ;否则,将其设置为F a l s e。
(3) 处理拖曳操作
在第二个组件的O n D r a g D r o p事件的处理过程中,根据拖曳操作的源做一些相应的处理。
(4) 拖曳操作结束
拖曳操作完成后释放鼠标左键,会在第一个组件中产生一个O n E n d D r a g事件,可以根据参
数Ta rg e t的数值进行相应的处理。如果参数Ta rg e t的值为n i l,则表示拖曳操作没有被接受;如
果Ta rg e t的值不为n i l,则Ta rg e t的值就是接受拖曳操作的组件。
后面的例程S 5 _ 1简洁地说明了拖曳操作的实现过程。
例程S5_1 该例程说明了拖动操作的实现过程。程
序运行结果界面如图5 - 1所示,上面有一个E d i t组件,接
着是一个P a n e l组件,最下面是一个M e m o组件。程序运
行后,可以在E d i t组件中输入一些文字,然后将鼠标移
动到E d i t组件上并按下左键,从P a n e l组件拖动到M e m o
组件并松开左键,则E d i t组件中的文字就被添加到M e m o
组件中了。
具体实现过程如下:
1) 通过菜单File | New Application创建一个新的工程。
2) 在窗体中添加一个E d i t组件、一个P a n e l组件和一个M e m o组件。其中P a n e l组件的C a p t i o n
属性设置为“楚河汉界”,M e m o组件的R e a d O n l y属性设置为Tr u e。
3) 选中E d i t组件并在对象编辑器中为其添加O n M o u s e D o w n事件的处理过程如下:
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
b e g i n
if Button = mbLeft then
// 开始进行拖动操作
(Sender As TEdit).BeginDrag(False);
e n d ;
注意:过程B e g i n D r a g具有一个布尔类型的参数,如果该参数设置为F a l s e,表示当按下鼠
标左键并拖动一小段距离后才进行拖曳操作;如果设置为Tr u e,表示当按下鼠标左键后立即进
行拖曳操作。通常将该参数设置为F a l s e。
4) 选中M e m o组件并在对象编辑器中为其添加O n D r a g O v e r事件和O n D r a g D r o p事件的处理
过程如下:
procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
b e g i n
if Source Is TEdit then
第5章章键盘和鼠标章名121
下载
图5-1 例程S5_1运行结果界面
A c c e p t : = True; // 可以接受拖动操作
e n d ;
procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
b e g i n
if(Sender Is TMemo) and (Source Is TEdit) then
// 将E d i t组件中的内容添加到M e m o组件的最后
(Sender As TMemo).Lines.Add((Source As TEdit).Te x t ) ;
e n d ;
5) 编译、链接和运行程序。在E d i t 1组件中输入一些文字,然后将其拖动到M e m o 1组件中。
e n d ;
e n d ;

解决方案 »

  1.   

    panel1.dragmode:=dmautomatic;
    panel1.dragkind:=dkdock;
    把它的parent的docksite属性设为true
      

  2.   

    这个问题太简单了,这样就搞定了
    panel1.dragmode:=dmautomatic;
    panel1.dragkind:=dkdock;
    panel1.parent.docksite:=true;
      

  3.   

    还以为是 DragDrop 呢. hammer_shi 已经把需要的都贴上来了.
    可以用 hammer_shi 所述的代码方法实现, 不过用 naughtyboy(淘气男孩) 的方法简单, 效果如浮动工具窗体. 还可以把它摆放到 TControlBar 容器上面就行了, 效果如 Delphi 的工具面板(摆放着 SpeedButton).乱发表建议, 希望大家不要见怪.
      

  4.   

    在form1上放一panel(代码我从前面贴字抄来的):unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        procedure Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);
    var SC_MANIPULATE: Word;
    begin
      //光标在控件的最左侧
      if (X <= Precision) and (Y > Precision) and (Y < Control.Height - Precision)
      then
      begin
        SC_MANIPULATE  := $F001;
        Control.Cursor := crSizeWE;
      end
      //光标在控件的最右侧
      else if (X >= Control.Width - Precision) and (Y > Precision) and
        (Y < Control.Height - Precision) then
      begin
        SC_MANIPULATE  := $F002;
        Control.Cursor := crSizeWE;
      end
      //光标在控件的最上侧
      else if (X > Precision) and (X < Control.Width - Precision) and (Y <= Precision) then
      begin
        SC_MANIPULATE  := $F003;
        Control.Cursor := crSizeNS;
      end
      //光标在控件的左上角
      else if (X <= Precision) and (Y <= Precision) then
      begin
        SC_MANIPULATE  := $F004;
        Control.Cursor := crSizeNWSE;
      end
      //光标在控件的右上角
      else if (X >= Control.Width - Precision) and (Y <= Precision) then
      begin
        SC_MANIPULATE  := $F005;
        Control.Cursor := crSizeNESW    ;
      end
      //光标在控件的最下侧
      else if (X > Precision) and (X < Control.Width - Precision) and
        (Y >= Control.Height - Precision) then
      begin
        SC_MANIPULATE  := $F006;
        Control.Cursor := crSizeNS;
      end
      //光标在控件的左下角
      else if (X <= Precision) and (Y >= Control.Height - Precision) then
      begin
        SC_MANIPULATE  := $F007;
        Control.Cursor := crSizeNESW;
      end
      //光标在控件的右下角
      else if (X >= Control.Width - Precision) and (Y >= Control.Height - Precision) then
      begin
        SC_MANIPULATE  := $F008;
        Control.Cursor := crSizeNWSE;
      end
      //光标在控件的客户区(移动整个控件)
      else if (X > Precision) and (Y > Precision) and (X < Control.Width - Precision) and
        (Y < Control.Height - Precision) then
      begin
        SC_MANIPULATE  := $F009;
        Control.Cursor := crSizeAll;
      end
      else begin
        SC_MANIPULATE := $F000;
        Control.Cursor := crDefault;
      end;  if Shift=[ssLeft] then
      begin
        ReleaseCapture;
        Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
      end;
    end;procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Caption := IntToStr(X) + '/' + IntToStr(Y);
      ManipulateControl(TControl(Sender), Shift, X, Y, 5);
    end;end.
      

  5.   

    叫hammer_shi的哥们真不错,这个技术我早就想学了,我按你说的试了一下,不错,有收获,谢谢了,我都想给你分,你有没有QQ号码啊?
      

  6.   

    理想的做法是在Panel的MouseDown事件中添加:
    procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
    const
      SC_DragMove = $F012;  
    begin
      ReleaseCapture;
      panel1.perform(WM_SysCommand, SC_DragMove, 0);
    end;
      

  7.   

    panel1.dragmode:=dmautomatic;
    panel1.dragkind:=dkdock;
    做出来的效果像word的工具箱,不错