AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi dyn. Panel-Array -> einzelne Panel mit Maus verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "strohmas"
Ein Thema von strohmas · begonnen am 4. Apr 2007
Antwort Antwort
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
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 23:28 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