Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Polygonpunkte als graphische contol elemente (https://www.delphipraxis.net/109896-polygonpunkte-als-graphische-contol-elemente.html)

CADSDFrank 9. Mär 2008 20:28


Polygonpunkte als graphische contol elemente
 
Nach 15 Jahren Programmierpause (damals Turbo Pascal) habe ich mit Delphi begonnen und das erste Problem steht an. Ich hoffe, dass mir jemand evtl. mit einem Code Beispiel helfen kann.
Ich benötige zur Laufzeit in einem definierten Bereich eines Formulars (z.B. Paintbox, Panel, …?) die Punkte eines Polygons als graphische control elemete.
In diesem Bereich sollen z.B. 5 Punkte als kleine Kreise (z.B. 4 Pixel Durchmesser) jeweils einzeln per Mouse (Drag & Drop?) verschiebbar sein. Dabei sollen diese Punkte immer durch Linien von links nach rechts verbunden sein. Beim Verschieben der Punkte sollen sich die Verbindungslinien wie „Gummibänder“ anpassen. Die aktuellen X,Y-Koordinaten der Punkte sollen in einem Array als Werte für weitere Verarbeitungen verfügbar sein.
Vielen Dank für hoffentlich hilfreiche Antworten.
Frank

jfheins 9. Mär 2008 20:39

Re: Polygonpunkte als graphische contol elemente
 
Das geht z.B. mit einer Paintbox ;)

Dazu brauchst du:

:arrow: Array [5] of TPoint
:arrow: Pointer auf TPoint ActivePoint
:arrow: Paintbox

Im PaintBoxPaint machst du dann sowas:
Delphi-Quellcode:
for int i := 0 to 4 do
  paintbox.canvas.ellipse(array[i])
Und im OnMousedown sowas wie:
Delphi-Quellcode:
for int i := 0 to 4 do
begin
  int d = sqrt( sqr(maus.X - point[i].X) + sqr(aus.y - point[i].y))
  if d < 4 then // oder was fürn Radius anklickbar sein soll
  begin
    activepoint = point[i];
    break;
  end;
end;
Im OnMouseMove dann den ActivePoint (falls <> nil) bewegen (und paintbox updaten), und im OnMouseUp dann activePoint := nil;

Das sollte zumindest für einen Anfang reichen, ein paar einheiten kann man da aber bestimmt noch verbessern ;)

Obiger Code ist mehr oder weniger Pseudocode, also nicht syntaktisch korrekt oder gar getestet ;)

omata 9. Mär 2008 21:11

Re: Polygonpunkte als graphische contol elemente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Etwas konkreter...

jfheins 10. Mär 2008 09:53

Re: Polygonpunkte als graphische contol elemente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mir war grad mal langweilig, da hab ich mich nochmal damit beschäftigt, um noch ein paar Feinheiten zu machen :stupid:

:arrow: Man kann den Punkt nicht mahr aus der Paintbox hinausschieben
:arrow: Der Cursor verändert sich beim überfahren eines Punktes :mrgreen:
:arrow: Die rechte Maustaste kann nicht mehr dazwischenfunken
:arrow: Es gibt ein "delta" ==> Der Kreis geht nicht immer mit der Mitte auf den Mauszeiger/er springt nicht mehr/Man kann den Kreis an einem Punkt "anfassen" und ihn daran bewegen
:arrow: Sonst eigentlich nichts, nur ein, zwei optische Veränderungen

Das ganze könnte man natürlich noch in ein eigenes Control kapseln, aber das wäre etwas .... overkill ^^

CADSDFrank 10. Mär 2008 19:32

Re: Polygonpunkte als graphische contol elemente
 
Hallo "jfheins" und "omata", vielen dank für eure spontanen antworten und vor allem für das beispielprogramm. Ist eine grosse hilfe für mich und erleichtert meinen wiedereinstieg. Werde mich am wochenende intensiver damit beschäftigen. Toll, dass es euch und dieses forum gibt.
Frank

omata 10. Mär 2008 20:07

Re: Polygonpunkte als graphische contol elemente
 
Zitat:

Zitat von jfheins
:arrow: Sonst eigentlich nichts, nur ein, zwei optische Veränderungen

Alles soweit ok, bis auf die Verunstaltung der Funktion isPolygonPoint. Das break klappt mir da die Fussnägel hoch, autsch!

Gruss
Thorsten

jfheins 10. Mär 2008 20:20

Re: Polygonpunkte als graphische contol elemente
 
Zitat:

Zitat von omata
Zitat:

Zitat von jfheins
:arrow: Sonst eigentlich nichts, nur ein, zwei optische Veränderungen

Alles soweit ok, bis auf die Verunstaltung der Funktion isPolygonPoint. Das break klappt mir da die Fussnägel hoch, autsch!

Gruss
Thorsten

Oh, tut mir leid, das mit deinen Fußnägeln - Schmerzen wollte ich nicht :stupid:

Ich weiß nit, also ich find das break nicht soo schlimm (<> goto :!: ) - man könnte es auch rausnehmen, dann bräuchte die Funktion ein paar Millisekundne länger (ja nach Listenlänge) ... aber ich finde, man sieht so besser, was gemacht wird (über das Array iteriert) als mit der while-Schleife und der zusätlichen abbruch-Variablen ... :gruebel:

Aber für mich war das immer ein legitimes Mittel der Schleifensteuerung, genauso wie continue - eigentlich mache ich das bei fast jeder Suche im Array so: Durchiterieren, wenn was passt, Index in Result und break (da Ziel erfüllt)

Klar - man kann auch ohne break programmieren, aber imho geht da ein kleines bisschen Übersicht verloren ;)

omata 10. Mär 2008 22:39

Re: Polygonpunkte als graphische contol elemente
 
Zitat:

Zitat von jfheins
...dann bräuchte die Funktion ein paar Millisekundne länger...

Das halte ich für ein Gerücht. Immerhin ist die erste Regel bei Benutzung eines Compilers: optimiere nie selbst! (Compilerbau)

Zitat:

Zitat von jfheins
Klar - man kann auch ohne break programmieren, aber imho geht da ein kleines bisschen Übersicht verloren ;)

Natürlich kann man das. Ich versuche aber strukturiert zu programmieren. Da break ein Befehl ist, der zu den unstrukturierten Befehlen gehört, ist er für mich nicht existent. Break ist nunmal unnötig, unübersichtlich ist eine Strukturierte Programmierung eigentlich nicht (sagt ja schon der Name).

Wie auch immer, macht was ihr wollt. Ich wollte das nur nicht so stehen lassen, weil das mein Quellcode war, der da an einer Stelle so unschön verändert wurde.

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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-2025 by Thomas Breitkreuz