Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Linienkomponente (https://www.delphipraxis.net/58552-linienkomponente.html)

Hador 8. Dez 2005 18:33


Linienkomponente
 
Hi Leute!

Ich suche eine Möglichkeit, eine Klasse zu Programmieren, die folgendes kann:
  • Eine Linie darstellen
  • ggf. an einem Ende eine Pfeilspitze anzeigen
  • auf onClick-Ereignisse reagieren können

Zuerst wollte ich einfach per eine Klasse schreiben, der beim create ein Canvas übergeben, und dann auf dieses zeichenen.
Jedoch kann ich so keine OnClick ereignisse für die einzelnen Objekte erstellen (Oder doch?)

Meine zweite Idee war für jede Linie ein TImage zu benutzen und auf diesem zu zeichnen. So hätte ich auch ein onClick-Ereignis.
Jedoch entstand nun dass Problem, dass wenn eine Linie unter dem (durchsichtigen Teil) eines anderen TImage verläuft, dennoch das onClick-Ereignis des an der Stelle durchsichtigen TImage ausgeführt wird.

Bei Torry gibt dazu soweit ich gesehen habe auch keine andere Lösung.

Hat eventuell einer von euch eine Idee, wie ich sowas umsetzen kann?
(Die Linien werden erst zur Laufzeit erstellt)

Gruß Lars

Khabarakh 8. Dez 2005 18:44

Re: Linienkomponente
 
Lustig, solch eine Klasse will ich auch bald programmieren *g* . Da ich aber mit dem Projekt noch nicht angefangen habe, kann ich dir auch noch keinen Vorschlag zur Struktur machen.
So jedenfalls könnte ich mir es vorstellen:
Alle Punkte tragen sich in die Liste einer Container-Klasse ein, die sie verwaltet und Events an sie weiterleitet. Eine Möglichkeit wäre dann, die Containerklasse als nicht sichtbare Komponente zu entwerfen und sie mit den Events eines Images zu verknüpfen, oder die Containerklasse selbst von TImage abzuleiten.

Dj_Base 8. Dez 2005 18:45

Re: Linienkomponente
 
Hi!

Da gibt es doch TBevel...

Das kann doch eine wunderbare Linie zeichnen... :-D

mfg,

Dj_Base

Hador 8. Dez 2005 18:54

Re: Linienkomponente
 
Zitat:

Zitat von Dj_Base
Da gibt es doch TBevel...

Das kann doch eine wunderbare Linie zeichnen... :-D

Ne das wird garnicht so wunderbar, wenn die Linien auch schräg verlaufen sollen. (Oder sehe ich das falsch?)
Und es gibt auch kein OnClick-Ereignis

Zitat:

Alle Punkte tragen sich in die Liste einer Container-Klasse ein, die sie verwaltet und Events an sie weiterleitet.
Das währe evt. eine Idee. Allerdings währen direkte Ereignisse auf jeden Fall schöner (und einfacher ^^)

shmia 8. Dez 2005 18:57

Re: Linienkomponente
 
Ich würde die Linien von der Darstellung trennen.
Also keine Controls für die Linien verwenden.
Als Erstes eine Klasse für eine Linie:
Delphi-Quellcode:
TLinie = class(TPersistent)
   property X1:double;
   property Y1:double;
   property X2:double;
   property Y2:double;
   function CalcLength:double;  
   property Color:TColor;
   property ArrowStyle:TArrowStyle; // die Pfeile
end;
Dadurch, dass die Punkte als double gespeichert werden, kann später problemlos Skaliert werden.

Du sammelst alle Linien in einer TObjectList.
Dann brauchst du noch eine Klasse, die die Linien auf ein Canvas zeichnet:
Delphi-Quellcode:
TLineViewer = class(TObject)
   property Width:integer; // Breite deines Ausgabe Canvas
   property Height:integer;
   property Canvas:TCanvas;
   property ScaleX:double; // Vergrösserung in X-richtung
   property ScaleY:double; // Vergrösserung in Y-richtung

   procedure DawLine(line:TLinie); // hier wird gezeichnet
 
   procedure DrawLines(lines:TObjectList); // zeichnet ALLE Linien

   // findet die Linie an Position x,y oder liefert nil
   function FindLineAt(lines:TObjectList; x,y:integer):TLinie;
end;
Zu guter Letzt brauchst du noch etwas "Klebstoff".
Also ein TImage oder TPaintBox als Ausgabedevice für TLineViewer.
Ein Klick auf das Image wird dann auf FindLineAt weitergeleitet.
Wenn FindLineAt eine Linie liefert, dann entscheidet deine Anwendung, was mit dieser
Linie passieren soll: Löschen, Selektieren, Umfärben, Pfeil ändern,...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 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