AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Button Image bei Drag & Drop

Ein Thema von Natcree · begonnen am 3. Dez 2013 · letzter Beitrag vom 4. Dez 2013
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz