Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag&Drop bei zur lausfzeit erstelltem Shape (https://www.delphipraxis.net/68318-drag-drop-bei-zur-lausfzeit-erstelltem-shape.html)

felxi 27. Apr 2006 20:08


Drag&Drop bei zur lausfzeit erstelltem Shape
 
Hallo,

habe folgenden Code:

Delphi-Quellcode:

..

procedure TForm1.DeskEndDrag(Sender, Target: TObject; X, Y: Integer);
var
  pos: TPoint;
begin

  pos := self.ScreenToClient(Mouse.CursorPos);
  DeskArray[btnAdd.tag].Left := pos.x;
  DeskArray[btnAdd.tag].top := pos.y;
end;

procedure TForm1.btnADDClick(Sender: TObject);
begin

  DeskArray[btnADD.Tag] := Tshape.Create(nil);
  DeskArray[btnADD.Tag].Parent := Form1;
  DeskArray[btnADD.Tag].Left := 100;
  DeskArray[btnADD.Tag].Top := 100;
  DeskArray[btnADD.Tag].Height := 30;
  DeskArray[btnADD.Tag].Width := 60;
  DeskArray[btnAdd.Tag].Brush.Color := $002C5F96;
  DeskArray[btnADD.Tag].Show;
  DeskArray[btnADD.Tag].DragMode := dmAutomatic;
  DeskArray[btnAdd.tag].OnEndDrag := DeskEndDrag;
  btnADD.Tag := btnADD.Tag + 1;



..
Hierbei will ich das erstelle Shape per Drag&Drop auf der Form verschieben, nur leider kommt bei mir eine Fehlermeldung, Zugriffsverletzung.

Hoffe, da kann mir jemand helfen :zwinker:

Gruß, Felix

Hawkeye219 27. Apr 2006 22:26

Re: Drag&Drop bei zur lausfzeit erstelltem Shape
 
Hallo Felix,

deinem Quelltext entnehme ich folgendes:
  • Mit dem Button btnAdd erzeugst du TShapes auf dem Formular und legst eine Referenz auf die Shapes im Feld DeskArray ab.
  • Die Anzahl der erzeugten Shapes merkst du dir im Tag-Feld des Buttons.
  • Zum Verschieben benutzt du die Drag&Drop-Funktion von Delphi.
Zum Fehler: nach dem Erzeugen eines Shapes erhöhst du die Anzahl im Feld btnAdd.Tag. Wenn du ein Shape verschiebst, wird am Ende die Routine DeskEndDrag aufgerufen. Diese greift mit dem bereits erhöhten Zähler auf ein Feldelement zu, in dem möglicherweise noch gar kein gültiger Zeiger steht!

Das Verschieben über Drag&Drop ist vielleicht der falsche Ansatz. Der Benutzer hat ja während des Vorgangs keine Kontrolle darüber, wo das Shape abgelegt wird.
Ein Vorschlag:
  • Benutze die Events OnMouseDown, OnMouseMove und OnMouseUp von TShape.
  • Bei OnMouseDown merkst du dir die übergebenen Koordinaten als relative Position des Mauszeigers im Shape. Zusätzlich merkst du dir in einer globalen Variablen, daß der Verschiebevorgang gestartet wurde.
  • Bei OnMouseMove prüfst du zunächst, ob gerade ein Shape verschoben wird (die globale Variable...). Falls ja, änderst du die Koordinaten des aktiven Shapes (Parameter Sender). Die Änderung für Left und Top kannst du aus der gemerkten relativen Position und den übergebenen Koordinaten X und Y errechnen.
  • Bei OnMouseUp setzt du die globale Variable zurück, weil das Verschieben beendet ist.
Falls du diesem Vorschlag folgen möchtest, solltest du das Setzen von DragMode aus deinem Code entfernen.

Gruß Hawkeye

felxi 28. Apr 2006 13:47

Re: Drag&Drop bei zur lausfzeit erstelltem Shape
 
Sehr gut :-D

Danke dir


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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