AGB  ·  Datenschutz  ·  Impressum  







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

Drag&Drop bei zur lausfzeit erstelltem Shape

Ein Thema von felxi · begonnen am 27. Apr 2006 · letzter Beitrag vom 28. Apr 2006
Antwort Antwort
felxi

Registriert seit: 12. Mär 2005
29 Beiträge
 
Delphi 5 Professional
 
#1

Drag&Drop bei zur lausfzeit erstelltem Shape

  Alt 27. Apr 2006, 20:08
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

Gruß, Felix
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Drag&Drop bei zur lausfzeit erstelltem Shape

  Alt 27. Apr 2006, 22:26
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
  Mit Zitat antworten Zitat
felxi

Registriert seit: 12. Mär 2005
29 Beiträge
 
Delphi 5 Professional
 
#3

Re: Drag&Drop bei zur lausfzeit erstelltem Shape

  Alt 28. Apr 2006, 13:47
Sehr gut

Danke dir
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:41 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