我在Form1之上置放了十个speedbutton按钮,在运行时如何实现自由拖动这些按钮并随意摆放,并即时保存各自位置,以便下次打开时是最新保存状态位置。

解决方案 »

  1.   

    首先,你要在数据库中保存每个按钮的X、Y坐标值。
    你可以把这十个按钮赋值给一个数组,然后对改数组进行操作
    With 数组 do
    begin
        OnMouseDown:=MyMouseDown;
        OnMouseMove:=MyMouseMove;
        OnMouseUp:=MyMouseUp;
    end;
    上面的函数需要自己编写。
      

  2.   

    var
        Draging: Boolean;
        DownX,DownY: Integer;
    procedure TForm1.MyMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
        Draging := True;
        DownX := X;
        DownY := Y;
    end;
    procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
        if Draging then
        begin
            if Sender is TSpeedButton then
            begin
                (Sender as TSpeedButton).Left := X - DownX + (Sender as TSpeedButton).Left;
                (Sender as TSpeedButton).Top := Y - DownY + (Sender as TSpeedButton).Top;
            end;
        end;  
    end;
    procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        if Draging then
        begin
            Draging := False;
            //将当前的控件位置存放到数据库中
        end;
    end;
      

  3.   

    具体的移动代码:先要声明shellapi单元,再定义全局变量oldPT:TPoint;procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      GetCursorPos(oldPT);
    end;procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      pt: TPoint;
    begin
      GetCursorPos(pt);
      if ssLeft in Shift then
      begin
        Button1.Left := Button1.Left + pt.X - oldPT.X;
        Button1.Top := Button1.Top + pt.Y - oldPT.Y;
        self.Refresh;
      end;
      oldPT := pt;
    end;