AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Linienkomponente

Offene Frage von "Hador"
Ein Thema von Hador · begonnen am 8. Dez 2005 · letzter Beitrag vom 8. Dez 2005
Antwort Antwort
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#1

Linienkomponente

  Alt 8. Dez 2005, 19:33
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
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Linienkomponente

  Alt 8. Dez 2005, 19:44
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Dj_Base
Dj_Base

Registriert seit: 10. Aug 2004
Ort: Aachen
231 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Linienkomponente

  Alt 8. Dez 2005, 19:45
Hi!

Da gibt es doch TBevel...

Das kann doch eine wunderbare Linie zeichnen...

mfg,

Dj_Base
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Linienkomponente

  Alt 8. Dez 2005, 19:54
Zitat von Dj_Base:
Da gibt es doch TBevel...

Das kann doch eine wunderbare Linie zeichnen...
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 ^^)
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Linienkomponente

  Alt 8. Dez 2005, 19:57
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,...
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf