![]() |
dyn. Panel-Array -> einzelne Panel mit Maus verschieben
Hallo,
ich bin grad dabei ein Programm für die Bewegung von Scannern aus der Lichttechnik zu schreiben. Dafür habe ich eine Tanzfläche erstellt, worauf die Scanner platziert werden. Nun müssen für eine Spiegelfahrt mehrere Punkte festgelegt werden. Dafür habe ich ein dynamisches TPanel-Array erzeugt, welches je nach Anzahl von Punkten vergrößert oder verkleinert wird. Also somit ist jeder Punkt ein Panel. Nun möchte ich die Punkte verschiebbar machen, was mir auch fast gelungen ist, zu mindestens verschiebt sich der Punkt schonmal, Problem ist aber, der bewegt sich nicht wie ich das will. Bei der Erzeugung jeden Punktes werden alle drei Mausfunktion (Up, Down, Move) festgelegt. Diese sind für alle Punkte gleich. Jedoch wird durch Sender der Punkt, welcher angeklickt wurde übergeben. Durch folgenden Code kann ein Kreis erstellt werden mit einer bestimmten Anzahl von Ecken. Weiterhin ist die Punktverschiebung implementiert.
Delphi-Quellcode:
'los' wird bei FormCreate auf false gesetzt.
var
StartX, StartY,StartPosX,StartPosY:integer; PanelArray: array of TPanel; los:boolean; procedure TForm2.DancefloorMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var dw: single; i,Arraylength:integer; begin if (radiokreis.checked = true) then begin Arraylength := length(PanelArray); dw := 2 * Pi / Ecken.Position; SetLength(PanelArray, Arraylength+Ecken.Position); for i := Arraylength to Arraylength + Ecken.Position - 1 do begin PanelArray[i] := TPanel.Create(Form2); with PanelArray[i] do begin Parent := Form2; Caption := ''; Height := 4; Width := 4; Color:=clBlack; BevelOuter := bvNone; Visible := true; name := 'Panel'+IntToStr(i); Left:= round(X + (StrToFloat(Radius.Text)*(cos(i*dw))*AbstandX) + 14); Top := round(Y + (StrToFloat(Radius.Text)*(sin(i*dw))*AbstandY) + 14); if i > ArrayLength then begin Dancefloor.Canvas.MoveTo(PanelArray[i-1].Left - 14,PanelArray[i-1].Top - 14); Dancefloor.Canvas.LineTo(PanelArray[i].Left - 14,PanelArray[i].Top - 14); end; if i = Arraylength + Ecken.Position - 1 then begin Dancefloor.Canvas.MoveTo(PanelArray[i].Left - 14,PanelArray[i].Top - 14); Dancefloor.Canvas.LineTo(PanelArray[Arraylength].Left - 14,PanelArray[Arraylength].Top - 14); end; OnMouseMove := PunktVerschieben; OnMouseDown := PunktKlick; OnMouseUp := PunktLoslassen; end; end; end; end; procedure TForm2.PunktVerschieben(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if los = true // nur verschieben, wenn die Maus gedrückt wurde then begin TPanel(Sender).Left := StartPosX + X - StartX + 14; // Verschiebung zur Anfangsposition für jetzige Position addieren TPanel(Sender).Top := StartPosY + Y - StartY + 14; end; end; procedure TForm2.PunktKlick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin los := true; StartX := X; StartY := Y; StartPosX := TPanel(Sender).Left; StartPosY := TPanel(Sender).Top; end; procedure TForm2.PunktLoslassen(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin los := false; end; Problem ist folgendes: beim Ziehen werden irgendwie immer 4 Punkte erzeugt, diese sind ein Stückchen auseinander und bilden ein Rechteck. Weiterhin werden diese Punkte nur um die Hälfte verschoben, also hat der Mauszeiger schon das doppelte zurückgelegt. Hat dafür jemand Abhilfe bzw eine andere Idee, wie ich die Punkte erzeugen kann, zu den Punkten gehören jeweils noch ein paar Daten, wie Höhe, X in Meter, Y in Meter, vorhergehender Punkt, nachfolgender Punkt,... Wenn irgendwelche Erklärungen fehlen, bitte ich um nettes Nachfragen. Vielen Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 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 by Thomas Breitkreuz