有两种方法
一种是用可停泊窗体
Form1的DockSite设为True;
Image的DragKind,DragMode分别设置为dkDock,dmAutomatic

解决方案 »

  1.   

    另外一种方法就是不连续移动
    OldPos,NewPos:TPoint;
    MidX,MidY:integer;//坐标的变化procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       oldpos.X:=X;
       oldpos.Y:=Y;
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      newpos.X:=X;
      newpos.Y:=Y;
      midx:=newpos.X-oldpos.X;
      midy:=newpos.Y-oldpos.Y;
      image1.Left:=image1.Left+midx;
      image1.Top:=image1.Top+midy;
    end;
      

  2.   

    这里面要在TForm1里先声明几个Public变量分别是
    FMouseDown: Boolean; // 是否按下
    FMouseDownPoint: TPoint;// 位置
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        FMouseDown          :=      True;
        Screen.Cursor       :=      crHandPoint;
        FMouseDownPoint     :=      Point(X, Y);
      end;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if FMouseDown then
      begin
        Image1.Left :=      Image1.Left + (X - FMouseDownPoint.X);
        Image1.Top  :=      Image1.Top + (Y - FMouseDownPoint.Y);
      end;
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        FMouseDown          :=      False;
        Screen.Cursor       :=      crDefault;
        FMouseDownPoint     :=      Point(X, Y);
      end;
    end;
      

  3.   

    这是一个类似于Office助手的程序的一部分,你改一下就可以了。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, jpeg, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        procedure FormCreate(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure Image1Click(Sender: TObject);
        procedure FormPaint(Sender: TObject); 
      private
        { Private declarations }
        source:TPoint;
        bDown:BOOL;
        bClick:BOOL;
      public
        { Public declarations }
        bShow: BOOL;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      bShow:=false;
      bDown:=false;
      bClick:=true;
    end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       source.X:=X;
       source.y:=Y;
       bDown:=true;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      S,T:TPoint;
    begin
      if bDown then
      begin
        bClick:=false;
        S:=clienttoscreen(source);
        T.X:=x;
        T.y:=y;
        T:=clienttoscreen(T);
        Form1.Left:=Form1.Left+(T.X-S.x);
        Form1.Top:=Form1.Top+(T.Y-S.Y);
      end;
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      bDown:=false;
      bClick:=true;
    end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key=VK_ESCAPE then
      begin
        bShow:=false;
        hide;
      end;
    end;end.
      

  4.   

    Image要是放在一个TPANEL上是不是就不能拖?
    如果有TPANEL后,设Image的两个原DRAG属性,还是不行吧?