Einzelnen Beitrag anzeigen

strohmas

Registriert seit: 4. Apr 2007
1 Beiträge
 
#1

dyn. Panel-Array -> einzelne Panel mit Maus verschieben

  Alt 4. Apr 2007, 17:04
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
  Mit Zitat antworten Zitat