Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Button Image bei Drag & Drop

  Alt 3. Dez 2013, 21:52
Hallo,

Zitat:
[...] Nun soll aber beim Drag over Der Button sichtbar bleiben [...]
Wenn Du es unbedingt mit Drag & Drop machen möchtest, dann hast Du ein kleines Problem: Solange der Mauszeiger auf Deinem Control ist gibt es kein "Drag". Erst wenn der Mauszeiger außerhalb des Controls ist kann Du mit DragOver darauf reagieren und dann musst Du den Button dem Mauszeiger "hinterherziehen".
Funktionieren würde es z. B. so:
Delphi-Quellcode:
TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  private
    { Private-Deklarationen }
    FDragButton : TButton;
  public
    { Public-Deklarationen }
  end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TButton) and (Button = mbLeft) then
    begin
      FDragButton := TButton (Sender);
      FDragButton.BeginDrag (False, 4)
    end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.DragMode := dmManual; // oder im OI zuweisen
  FDragButton := nil
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  FDragButton := nil
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  r : TRect;
begin
  Accept := Source = FDragButton;
  if Accept then
    begin
      r := FDragButton.BoundsRect;
      if X < r.Left - 1 then
        FDragButton.Left := X + 1
      else
        if r.Right < X then
          FDragButton.Left := X - r.Right + r.Left;

      if Y < r.Top - 1 then
        FDragButton.Top := Y + 1
      else
        if r.Bottom < Y then
          FDragButton.Top := Y - r.Bottom + r.Top
    end
end;
Eine andere Variante: Anstatt Drag & Drop verschiebe den Button über OnMouseMove. Das funktioniert dann z. B. so:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FCursorPos : TPoint;
    FDragButton : TButton;
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TButton) and (Button = mbLeft) then
    begin
      FCursorPos := Point (X, Y);
      FDragButton := TButton (Sender)
    end
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned (FDragButton) then
    begin
      if Screen.Cursor <> crDrag then
        Screen.Cursor := crDrag;

      FDragButton.Left := FDragButton.Left + X - FCursorPos.X;
      FDragButton.Top := FDragButton.Top + Y - FCursorPos.Y
    end
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FDragButton := nil;
  Screen.Cursor := crDefault
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDragButton := nil
end;
[EDIT]
BTW: Eine weitere Variante findest Du hier (wurde von Furtbichler bei einem ähnlichen Thema gepostet).
[/EDIT]

Gruß
Volker Zeller

Geändert von Volker Z. ( 3. Dez 2013 um 21:59 Uhr)
  Mit Zitat antworten Zitat