Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Drag & Drop (https://www.delphipraxis.net/180895-drag-drop.html)

Natcree 29. Jun 2014 05:19

Drag & Drop
 
Hallo ich suche eine Lösung für ein Drag and Drop Problem. Ich möchte gerne einen Tbutton auf eine vorgegebene Position z.B. ein Panel mit der gleichen größe Umbewegen. Das Bewegen geht aber er soll auf der Panel Position einrasten wenn ich die linke maus taste los lasse. Hier mal mein Bisheriger Code.

Delphi-Quellcode:
procedure TForm1.SchaltflaecheMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
r:TRect;
begin
  SchaltflaecheUmbewegen := TLMDDockSpeedButton (Sender);
  if [ssLeft,ssRight]*Shift=[ssLeft,ssRight] then exit;
  with TControl(Sender) do
  begin
    p            :=ClientToScreen(Point(x,y));
    r            :=Parent.ClientRect;
    r.TopLeft    :=Parent.ClientToScreen(r.TopLeft);
    r.BottomRight :=Parent.ClientToScreen(r.BottomRight);
    inc(r.Left,x);
    dec(r.Right,Width-x);
    inc(r.Top,y);
    dec(r.Bottom,Height-y);
    ClipCursor(@r);
  end;
end;

procedure TForm1.SchaltflaecheMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
mpos:TPoint;
begin
  if [ssLeft,ssRight]*Shift=[] then exit;
  with TControl(Sender) do begin
  mpos     :=ClientToScreen(Point(x,y));
  x        := mpos.x - p.x;
  y        := mpos.y - p.y;
  SetBounds(Left+x,Top+y,Width,Height);
  p := mpos;
  end;
end;

procedure TForm1.SchaltflaecheMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
  if [ssLeft,ssRight]*Shift<>[] then exit;
  ClipCursor(nil);
end;

Natcree 29. Jun 2014 06:15

AW: Drag & Drop
 
Delphi-Quellcode:
procedure TForm1.SchaltflaecheMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
    if (sender is TLMDDockSpeedButton) then
    TLMDDockSpeedButton(Sender).Left:=Panel2.Left;
    TLMDDockSpeedButton(Sender).top:=Panel2.top;
    TLMDDockSpeedButton(Sender).BringToFront;
  if [ssLeft,ssRight]*Shift<>[] then exit;
end;
Das funktioniert schonmal wie bekomme ich es hin das er statt panel2 das Panel nimmt wo der Mauszeiger ist?

sx2008 29. Jun 2014 07:17

AW: Drag & Drop
 
Ich sehe hier gleich 2 Fehler:
Delphi-Quellcode:
procedure TForm1.SchaltflaecheMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
    if (sender is TLMDDockSpeedButton) then
    begin // hat gefehlt
       TLMDDockSpeedButton(Sender).Left:=Panel2.Left;
       TLMDDockSpeedButton(Sender).top:=Panel2.top;
       TLMDDockSpeedButton(Sender).BringToFront;
    end; // hat gefehlt
  if [ssLeft,ssRight]*Shift<>[] then exit; // völlig sinnlos, da kein weiterer Code folgt
end;

// und warum werden die Parameter x und y übergeben obwohl dann die Position von "panel2" benützt wird ?

Natcree 29. Jun 2014 07:23

AW: Drag & Drop
 
x und y werden Übergeben weil ich den Button beim Drag and drop mit sichtbar halte und ihm beim ziehen über die form sehen will.

Sir Rufo 29. Jun 2014 07:41

AW: Drag & Drop
 
Zitat:

Zitat von Natcree (Beitrag 1263705)
x und y werden Übergeben weil ich den Button beim Drag and drop mit sichtbar halte und ihm beim ziehen über die form sehen will.

Falsch, weil du den MouseUp Event dafür benutzt und der sieht halt so aus :roll:

Natcree 29. Jun 2014 08:13

AW: Drag & Drop
 
okay.

Wie bekomme ich denn das Panel raus über dem sich der cursor befindet?

Sir Rufo 29. Jun 2014 08:16

AW: Drag & Drop
 
Zitat:

Zitat von Natcree (Beitrag 1263707)
okay.

Wie bekomme ich denn das Panel raus über dem sich der cursor befindet?

Einmal gibt es Delphi-Referenz durchsuchenWindowFromPoint und dann noch Delphi-Referenz durchsuchenFindControl

Es gibt auch noch etwas ganz Neues Bei Google suchendelphi control unter maus und das führt einen u.a. zu den Schweizern ...

Allerdings frage ich mich warum du kein Drag'n'Drop machen möchtest, sondern irgendwie da was herumbastelst?
Tutorial: Drag'n'Drop mit Delphi


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz