![]() |
Re: Linien Komponente
Hi!
Das hab ich jetzt im Quelltext stehen. (Hab mich erstmal nur für die einfache Linie entschieden.)
Delphi-Quellcode:
Meine Fragen:
unit Line;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TLine = class(TComponent) private A,E:TPoint; //Anfang+Ende W:Integer; //Width C:TColor; //Color Can:TCanvas; /Canvas { Private-Deklarationen } protected { Protected-Deklarationen } public procedure Draw; { Public-Deklarationen } published property X1:Integer read A.X write A.X; property X2:Integer read A.Y write A.Y; property Y1:Integer read E.X write e.X; property Y2:Integer read E.Y write E.Y; property Witdth:integer read W write W; property Color:TColor read C write C; property Canvas:TCanvas read Can write Can; { Published-Deklarationen } end; procedure Register; implementation procedure Tline.Draw; begin Can.PenPos := A; Can.Pen.Width := W; Can.Pen.Color := C; Can.LineTo(E.X,E.Y); end; procedure Register; begin RegisterComponents('Zusätzlich', [TLine]); end; end. 1. Can := Form1.Canvas; geht nicht. (Geht schon aber da ist das ja kein Verweis auf Form1.Canvas sondern nur eine Wertübergabe. Und ich möchte einen Verwies. 2.Wie mach ich ein Ereignis? Im meinem Buch steht: type TEreignis = procedure (Sender: TComponent;var I: Integer) of object; und dann in der Klasse:
Delphi-Quellcode:
Aber wie mach ich, dass das Programm OnEreignis aufruft, wenn irgentwas passiert ist (überzeichnet, geklickt)?
private
FEreignis: TEreignis; published property OnEreignis: TEreignis read FEreignis write FEreignis; |
Re: Linien Komponente
1. Du kannst auf das Canvas der Form zugreifen mit
Delphi-Quellcode:
2. Dort wo das Ereignis ausgelöst werden soll
If Assigned(AOwner) then
if (AOwner is TForm) then TForm(AOwner).Canvas.LineTo ... // Besser wäre noch statt TForm TWinControl zu verwenden. If Assigned(AOwner) then if (AOwner is TWinControl) then TWinControl(AOwner).Canvas.LineTo ...
Delphi-Quellcode:
If Assigned(FEreignis) then
FEreignis; // Besser statt TEreignis TNotifyEvent // Dann aber If Assigned(FEreignis) then FEreignis(Self); // Damit kannst Du im OnEreignis abfragen (Sender) welche Komponente das Ereignis ausgelöst hat. // z.B. If Sender=LineControl2 then TueIrgendwas; |
Re: Linien Komponente
Hi halinchen,
@ Sunlight7: Vorsicht, TWincontrol besitzt keinen Canvas. Der ist erst ab TCustomcontrol dabei. @ Halinchen: Ich würde an deiner Stelle nicht auf dem Canvas des Parents malen. Sicher ist das Ansichtssache, aber mit einer visuellen Componente ist das Platzieren meiner Meinung nach einfacher. Somit würde ich die Kompo folgendermaßen aufbauen:
Delphi-Quellcode:
o.k., jetzt gibt das natürlich wenig Sinn mit den Koordinaten. so lange du hier keine Polygone zeichen möchtest, die du in einer Funktion abbilden kannst, reicht es hier eine Eigenschaft für die Linienart aufzunehmen. In einer visuellen Kompo nimmst du als koordinaten dann die entsprechenden eigenen Dimensionen wie self.left usw.
unit Line;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TLine = class(TCustomControl) private A,E:TPoint; //Anfang+Ende W:Integer; //Width C:TColor; //Color Can:TCanvas; //Canvas { Private-Deklarationen } protected { Protected-Deklarationen } procedure Draw; procedure Paint; override; public { Public-Deklarationen } published property X1:Integer read A.X write A.X; property X2:Integer read A.Y write A.Y; property Y1:Integer read E.X write e.X; property Y2:Integer read E.Y write E.Y; property Witdth:integer read W write W; property Color:TColor read C write C; property Canvas:TCanvas read Can write Can; { Published-Deklarationen } end; procedure Register; implementation procedure Tline.Draw; begin self.canvas.PenPos := A; self.canvas.Pen.Width := W; self.canvas.Pen.Color := C; self.canvas.LineTo(E.X,E.Y); end; procedure Register; begin RegisterComponents('Zusätzlich', [TLine]); end; procedure TLine.Paint; begin inherited; Draw; end; end. Bsp.:
Delphi-Quellcode:
Hier kannst du dann auch noch weitere typen aufnehmen wie Diagonalen usw.
type
TLineType = (ltNone, // keine Linie ltLeft, // Linie links ltRight, // Linie rechts ltTop, // Linie oben ltBottom, // Linie unten ltVCenter, // Mitte vertikal ltHCenter // Mitte horizontal ); weitere Eigenschaften für Linienenden (Pfeile, kreise ...) kannst du natürlich genauso einbinden. Diverse Graphikprogramme bitten da einen guten Überblick über probate Linieneigenschaften (vorallem vektor orientierte wie CorelDraw usw.). In deiner Draw Methode kannst du dann mit Case of in die entsprechenden Zeichenmethoden verzweigen. Gruß oki |
Re: Linien Komponente
@oki
Danke für den Hinweis. Eigentlich sollte ich das ja Wissen, aber auch nach 10 Jahren falle ich immer wieder auf TWinControl rein :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 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