Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Linien Komponente (https://www.delphipraxis.net/77174-linien-komponente.html)

halinchen 15. Sep 2006 16:22


Linien Komponente
 
Hi!

Ich hab mal wieder ein Problem:
Ich suche ein Linien-Komponente. Im Internet hab ich gefunden das man die am besten selber macht und von TShapes ableitet.
Ich hab sowas aber noch nie gemacht und weiß nicht wie's geht. :?:

Ich bräuchte das so:
x1,y1,x2,y2 als Punkte und dazwischen eine Linie (vielleicht noch mit Breiten-änderung).
(Wie das mit der Linie geht weiß ich auch nicht)

Ich brauch sozugen nur ein Starthilfe. :)

Achso wenn es sowas schon gibt dann brauch ich das nicht selber programmieren. Aber ich hab schonmal geguckt und nichts gefunden.)

Der_Unwissende 15. Sep 2006 16:35

Re: Linien Komponente
 
Hi,
was genau verstehst du denn unter einer Linien Komponente?
Also am einfachsten ist es, wenn du die Linie selbst zeichnest. Dazu brauchst du einen Canvas, das ist die Zeichenfläche. So ein Canvas ist etwas, was du nie direkt selbst erzeugst, du verwendest vielmehr immer einen, der dir zur Verfügung gestellt wird. Typsiche Beispiele sind hier alle Fenster von Windows. Die Zeichenroutine bekommt einfach deren Canvas übergeben und die zeichnet dann darauf. Das was die zeichnet ist dann das, was du siehst.
Auch dein Formular hat einen Canvas. Auf den könntest du direkt zeichnen (was aber nicht so wirklich schön ist).

Am einfachsten kannst du selbst zeichnen, wenn du eine Bitmap verwendest. TBitmap kapselt alles was du brauchst, da gibt es dann sogar schon eine Funktion für das was du vor hast:
Delphi-Quellcode:
procedure drawLine(const x1, y1, x2, y2 : Integer);
var bitmap : TBitmap;
begin
  bitmap := TBitmap.Create;
  // wichtig Größe setzen
  bitmap.Width := xxx;
  bitmap.Height := xxx;
 
  // das eigentliche Zeichnen
  bitmap.Canvas.MoveTo(x1, y1);
  bitmap.Canvas.LineTo(x2, y2);
 
  bitmap.Free;
end;
Ok, hier fehlt natürlich als erstes mal die Größe der Bitmap. Da musst du schauen, welche Größe du brauchst. Dann fehlt auch noch das Anzeigen. Der einfachste Weg ist, dass du ein TImage nimmst. Um hier ein Bitmap anzuzeigen musst du (vor dem Bitmap.Free) der Eigenschaft Image.Picture das Bitmap zuweisen.

Gruß Der Unwissende

oki 15. Sep 2006 16:52

Re: Linien Komponente
 
Hi Unwissender (da war er wieder :stupid: )

warum redest du immer von Bitmap und Image. Halinchen will doch nur eine Linie.

Ich dächte TBevel währe da doch schon mal was.

wenn die Linie dann noch was anderes können muß außer eine Linie zu sein, dann können wir ja noch mal schauen. :stupid:

gruß oki

Der_Unwissende 15. Sep 2006 19:14

Re: Linien Komponente
 
Hi Oki,
ja hast schon recht, ich dachte nur wenn man zwei x,y Tupel angibt, dann doch eigentlich weil man nicht langweilig gerade Linien möchte (also senkrecht zu den Seiten des Fensters).
Ansonsten fehlt (soweit ich weiß) dem TBevel die Möglichkeit die Dicke der Linie zu verändern. Bei einem Canvas gibt es einen Strift, mit dem die Linie gezeichnet wird (Eigenschaft Pen des Canvas), dieser hat dann eine Farbe und eine Dicke.
Für Shapes gibt es einen ähnlichen Grund, aus dem ich sie ausgeschlossen hatte. Einem TShape fehlt die Linie (oder irre ich mich auch da?).

Gruß Der Unwissende

halinchen 16. Sep 2006 11:22

Re: Linien Komponente
 
Erstmal danke für die Antworten!

Mit Canvas kenn ich mich nicht so aus, aber ich wollte die Linie zur Laufzeit immer wieder wo anders hinsetzen und länger oder kürzer machen. Außerdem sollte die Linie auch diagonal sein können.

Das geht zwar alles mit Canvas, aber ich hätte das lieber als Object, da ich mich da besser auskenne.

Bevel und Shape-Control können nicht diagonal sein. (Wenn man Shape auf Rechteck setzt und Height auf 1 setzt hat man waagerechte Linie, aber keine diagonale.)

mkinzler 16. Sep 2006 11:25

Re: Linien Komponente
 
Ein Canvas ist doch auch ein Objekt. da man auf dem Canvae zeichen kann, ist diese Lösung doch flexibel. Es gibt verschiedene Komponenten, welche einen Canvas anbieten z.B. TImage, TPaintBox, ...

halinchen 17. Sep 2006 17:21

Re: Linien Komponente
 
Ich hab das alles nochmal überdacht. Es gibt eigentlich 1 gute Möglichkeiten.

Ich mache eine Komponente oder ein Objekt mit den vier Punkten als Property. Wenn die Propertys berabeitet werden mach ich eine Line dazwischen. Dann muss ich aber vorher refresh aufrufen, da sonst die alte Linie erhaltenbleibt. Die anderen Linien die die gezeichnet worden (Im falle von mehreren Variablen des Linien-Objekts) sind dann aber auch weg. Da scheib ich eine Prozedur die alle Linien Objekte durchgeht und die dann neuzeichnet.

Kann mir vielleicht jemand sagen wie das bei TShapes geht? Die werden ja automatisch neugezeichnet. Das könnte ich vielleicht bei mir einbauen.) :-D

mkinzler 17. Sep 2006 17:24

Re: Linien Komponente
 
Das mit einer festen Anzahl von Properties für die Punkte ist aber schlecht. Nimm lieber eine dynamische Anzahl von Punkten so kannst du statt Linien auch komplexere Linienzüge zeichen ( Polyline, Polygone)

oki 18. Sep 2006 07:35

Re: Linien Komponente
 
Hi hallinche,

klar, bei diagonalen Linien ist es natürlich vorbei mit den Bevels. Also mußt du dir wirklich ein geeignetes Basisobjekt suchen und deine eigenen Zeichenroutinen schreiben. Achte aber darauf, das es von TComponent abgeleitet ist. Dann nehme z.B. bei einem Panel nicht TPanel, sondern TCustomPanel...

Als nächstes würde ich erst mal genau sortieren, was du mit deiner neuen Komponente alles machen möchtest. Diese Idee ist nicht schlecht:
Zitat:

Zitat von mkinzler
Das mit einer festen Anzahl von Properties für die Punkte ist aber schlecht. Nimm lieber eine dynamische Anzahl von Punkten so kannst du statt Linien auch komplexere Linienzüge zeichen ( Polyline, Polygone)

wird aber bedeutend komplexer.

das automatische Zeichnen ist nicht weiter schlimm. Hier vererbst du die Paint-Methode via override und implementierst deine eigene Zeichenmethode.

Delphi-Quellcode:
procedure TMyObject.Paint;
begin
  inherited;
  MyPaint;
end;
In MyPaint schreibst du alles was du für dein Zeichen brauchst.


gruß oki

halinchen 18. Sep 2006 15:37

Re: Linien Komponente
 
Das klingt gut, da weiß ich jetzt was ich machen muss.
:-D

Danke für die vielen Antworten. :party:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.
Seite 1 von 2  1 2      

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