大家拷过去运行一下
unit t;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  ReleaseCapture;
  if (Sender as TButton).Caption='Button1' then
  (Sender as TButton).Perform(wm_syscommand,$F012,0);
  if (Sender as TButton).Caption='Button' then
  (Sender as TButton).Perform(wm_syscommand,$F012,0);
  if (Sender as TEdit).Text='Edit' then showmessage('edit');end;procedure TForm1.Button1Click(Sender: TObject);
var btn1,btn2:TButton;
    edt:TEdit;
begin
  with TButton.Create(self) do
  begin
    left:=30;
    top:=50;
    caption:='Button1';
    parent:=self;
    onMouseMove:=ButtonMouseMove;
  end;
  with TButton.Create(self) do
  begin
     left:=160;
     top:=50;
     caption:='Button';
     parent:=self;
     onMouseMove:=ButtonMouseMove;
  end;
  with TEdit.Create(self) do
  begin
     left:=365;
     top:=120;
     text:='Edit';
     parent:=self;
     onMouseMove:=ButtonMouseMove;
  end;end;procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  ReleaseCapture;
  Button1.Perform(wm_syscommand,$F012,0);
end;end.
大家拷过去运行一下,然后拖动新产生的控件
问题出来了:如果产生的控件类型一样,拖动没有问题(注释调 if (Sender as TEdit).Text='Edit' then showmessage('edit');)否则拖动edit就有错,为什么?

解决方案 »

  1.   

    TEdit Tbutton有些属性是不同的。
    先判断Sender的类即可。
      

  2.   

    你的程序只是ButtonMouseMove
    你可以自定义个消息处理过程
    private
       procedure MyMouseMove(sender:TObject);
    然后处理sender
      

  3.   

    同意lgwangshu(我思...故我在!) 
    把ButtonMouseMove中的代码稍作修改即可
     procedure TForm1.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    begin
      ReleaseCapture;
      if (Sender is TButton) then 
      begin
        if (Sender as TButton).Caption='Button1' then
        (Sender as TButton).Perform(wm_syscommand,$F012,0);
        if (Sender as TButton).Caption='Button' then
        (Sender as TButton).Perform(wm_syscommand,$F012,0);
      end
      else if (Sender Is  TEdit) then
      if (Sender as TEdit).Text='Edit' then showmessage('edit');end;