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:
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;
'los' wird bei FormCreate auf false gesetzt.
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