Delphi-PRAXiS
Seite 2 von 2     12   

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 19. Sep 2006 18:26

Re: Linien Komponente
 
Hi!
Das hab ich jetzt im Quelltext stehen. (Hab mich erstmal nur für die einfache Linie entschieden.)

Delphi-Quellcode:
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.
Meine Fragen:
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:
private
FEreignis: TEreignis;
published
property OnEreignis: TEreignis read FEreignis write FEreignis;
Aber wie mach ich, dass das Programm OnEreignis aufruft, wenn irgentwas passiert ist (überzeichnet, geklickt)?

Sunlight7 19. Sep 2006 19:03

Re: Linien Komponente
 
1. Du kannst auf das Canvas der Form zugreifen mit

Delphi-Quellcode:
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 ...
2. Dort wo das Ereignis ausgelöst werden soll

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;

oki 20. Sep 2006 07:47

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:
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.
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.

Bsp.:
Delphi-Quellcode:
type
  TLineType = (ltNone,        // keine Linie
               ltLeft,        // Linie links
               ltRight,       // Linie rechts
               ltTop,         // Linie oben
               ltBottom,      // Linie unten
               ltVCenter,     // Mitte vertikal
               ltHCenter      // Mitte horizontal
               );
Hier kannst du dann auch noch weitere typen aufnehmen wie Diagonalen usw.

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

Sunlight7 20. Sep 2006 20:06

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.
Seite 2 von 2     12   

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