Thema: Delphi Linien Komponente

Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Linien Komponente

  Alt 20. Sep 2006, 08:47
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
  Mit Zitat antworten Zitat