Delphi-PRAXiS

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

ibp 11. Jan 2007 12:08


Linien-Komponente gesucht
 
Hi,

kennt jemand eine frei erhältliche Komponente mit der man einfach eine Gerade auf einer Form zur Designtime zeichnet.
Ich will das nicht per Code machen. Es soll so ähnlich sein wie z.B. ein Label...

Danke schon mal

Union 11. Jan 2007 12:10

Re: Linien-Komponente gesucht
 
Wie wäre es denn mit Delphi-Referenz durchsuchenTShape ?

ibp 11. Jan 2007 12:13

Re: Linien-Komponente gesucht
 
und wie zeichne ich da in der desingtime eine linie rein?

Tormentor32 11. Jan 2007 12:15

Re: Linien-Komponente gesucht
 
Ich glaube er meinte, dass du die Height Eigenschaft auf 1 setzt (?)

edit: oder auch die Width eigenschaft... Oder meinst du Linien, die in jede Richtung zeigen können?

ibp 11. Jan 2007 12:17

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von Tormentor32
... Oder meinst du Linien, die in jede Richtung zeigen können?

jupp genau! einfach eine gerade auf die form zeichnen!

Union 11. Jan 2007 12:18

Re: Linien-Komponente gesucht
 
Genau, Shape := stRectangle und dann je nachdem Height oder Width auf 0 setzen. Eine Alternative ist auch noch Delphi-Referenz durchsuchenTBevel.

Ehhemm: Eine Gerade wirst Du nie zeichnen können :idea:

Tormentor32 11. Jan 2007 12:20

Re: Linien-Komponente gesucht
 
Also IMHO wäre das einfachste, das über Canvas.Lineto zu machen...

ibp 11. Jan 2007 12:21

Re: Linien-Komponente gesucht
 
das ist alles ein wenig overkill für ein paar linien! ausserdem müssen es auch schräge linien sein können!

ibp 11. Jan 2007 12:21

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von Tormentor32
Also IMHO wäre das einfachste, das über Canvas.Lineto zu machen...

ich möchte es nicht per code machen, daher suche ich eben eine kompo die das in der desingtime darstellen kann!

Union 11. Jan 2007 12:22

Re: Linien-Komponente gesucht
 
Aber wenn er keine Komponente verwendet sondern Lineto, muss er das im OnPaint machen, da sonst bei jedem Neuzeichnen die Linie verschwindet oder zerhackt wird. Wenn Du allerdings schräge Linien willst, kommst Du um eine externe Komponente oder die OnPaint/Canvas Methode nicht rum. Eine mögliche Lösung findest Du hier (Suchen hilft wirklich).

backdraft 11. Jan 2007 12:23

Re: Linien-Komponente gesucht
 
Wie wäre es mit einem Bevel?

mkinzler 11. Jan 2007 12:24

Re: Linien-Komponente gesucht
 
In diesem Fall wäre die [bi.onPaint[/i]-Property nicht so ideal, besser .Paint überschreiben.

ibp 11. Jan 2007 12:25

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von Union
... Wenn Du allerdings schräge Linien willst, kommst Du um eine externe Komponente ...

ja genau und das suche ich wie im ersten post beschrieben!


Zitat:

Zitat von ibp
kennt jemand eine frei erhältliche Komponente mit der man einfach eine Gerade auf einer Form zur Designtime zeichnet.
Ich will das nicht per Code machen.


backdraft 11. Jan 2007 13:23

Re: Linien-Komponente gesucht
 
Hier mal was ganz einfaches um zu verstehen, wie man sich selbst sowas macht... hehe

Delphi-Quellcode:
unit FormLine;

interface

uses
  SysUtils, Classes, Controls, Windows, Graphics;

type
  TFormLine = class(TCustomControl)
  private
   FStartPosX : Integer;
   FStartPosY : Integer;
   FEndPosX  : Integer;
   FEndPosY  : Integer;
   FPenColor : TColor;
   procedure SetStartPosX(const Value: Integer);
   procedure SetStartPosY(const Value: Integer);
   procedure SetEndPosX(const Value: Integer);
   procedure SetEndPosY(const Value: Integer);
   procedure SetPenColor(const Value: TColor);
   procedure Paint; override;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
   property StartPosX: Integer read FStartPosX write SetStartPosX;
   property StartPosY: Integer read FStartPosY write SetStartPosY;
   property EndPosX : Integer read FEndPosX  write SetEndPosX;
   property EndPosY : Integer read FEndPosY  write SetEndPosY;
   property Color;
   property PenColor : TColor read FPenColor write SetPenColor;
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TFormLine]);
end;

procedure TFormLine.SetStartPosX(const Value: Integer);
begin
 IF (Value <> FStartPosX) THEN BEGIN
  FStartPosX := Value;
  Invalidate;
 END;
end;

procedure TFormLine.SetStartPosY(const Value: Integer);
begin
 IF (Value <> FStartPosY) THEN BEGIN
  FStartPosY := Value;
  Invalidate;
 END;
end;

procedure TFormLine.SetEndPosX(const Value: Integer);
begin
 IF (Value <> FEndPosX) THEN BEGIN
  FEndPosX := Value;
  Invalidate;
 END;
end;

procedure TFormLine.SetEndPosY(const Value: Integer);
begin
 IF (Value <> FEndPosY) THEN BEGIN
  FEndPosY := Value;
  Invalidate;
 END;
end;

procedure TFormLine.SetPenColor(const Value: TColor);
begin
 IF Value <> FPenColor THEN BEGIn
  FPenColor := Value;
  invalidate;
 END;
end;


procedure TFormLine.Paint;
begin
 Canvas.Brush.Color := Color;
 Canvas.FillRect(Canvas.ClipRect);
 Canvas.Pen.Color := FPenColor;
 Canvas.MoveTo(FStartPosX, FStartPosY);
 Canvas.LineTo(FEndPosX, FEndPosY);
end;

end.

Muetze1 11. Jan 2007 16:53

Re: Linien-Komponente gesucht
 
Veröffentliche doch einfach Pen und Brush ...

Delphi-Quellcode:
unit FormLine;

interface

uses
  SysUtils, Classes, Controls, Windows, Graphics;

type
  TFormLine = class(TGraphicControl)
  private
   FStartPosX : Integer;
   FStartPosY : Integer;
   FEndPosX  : Integer;
   FEndPosY  : Integer;
   procedure SetStartPosX(const Value: Integer);
   procedure SetStartPosY(const Value: Integer);
   procedure SetEndPosX(const Value: Integer);
   procedure SetEndPosY(const Value: Integer);
   procedure SetPen(const Value: TPen);
   procedure GetPen: TPen;
   procedure SetBrush(const Value: TBrush);
   procedure GetBrush: TBrush;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
   procedure Paint; override;
  published
   property StartPosX: Integer read FStartPosX write SetStartPosX;
   property StartPosY: Integer read FStartPosY write SetStartPosY;
   property EndPosX : Integer read FEndPosX  write SetEndPosX;
   property EndPosY : Integer read FEndPosY  write SetEndPosY;
   property Pen: TPen read GetPen write SetPen;
   property Brush: TBrush read GetBrush write SetBrush;
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TFormLine]);
end;

procedure TFormLine.SetStartPosX(const Value: Integer);
begin
IF (Value <> FStartPosX) THEN BEGIN
  FStartPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetStartPosY(const Value: Integer);
begin
IF (Value <> FStartPosY) THEN BEGIN
  FStartPosY := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosX(const Value: Integer);
begin
IF (Value <> FEndPosX) THEN BEGIN
  FEndPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosY(const Value: Integer);
begin
IF (Value <> FEndPosY) THEN BEGIN
  FEndPosY := Value;
  Invalidate;
END;
end;

procedure SetPen(const Value: TPen);
Begin
  Canvas.Pen.Assign(Value);
End;

procedure GetPen: TPen;
Begin
  Result := Canvas.Pen;
End;

procedure SetBrush(const Value: TBrush);
Begin
  Canvas.Brush.Assign(Value);
End;

procedure GetBrush: TBrush;
Begin
  Result := Canvas.Brush;
End;

procedure TFormLine.Paint;
begin
  Canvas.FillRect(Canvas.ClipRect);
  Canvas.MoveTo(FStartPosX, FStartPosY);
  Canvas.LineTo(FEndPosX, FEndPosY);
end;

end.

ibp 12. Jan 2007 10:01

Re: Linien-Komponente gesucht
 
@muetze da sind noch einige fehler drin

- was mir nicht gefällt, ist dass ein rechteck entsteht, welches dann die linie beinhaltet. schön wären einfach nur ein start und endpunkt und dazwischen die linie und das direkt auf dem canvas des parent!

Muetze1 12. Jan 2007 10:14

Re: Linien-Komponente gesucht
 
Delphi-Quellcode:
unit FormLine;

interface

uses
  SysUtils, Classes, Controls, Windows, Graphics;

type
  TFormLine = class(TGraphicControl)
  private
   FStartPosX : Integer;
   FStartPosY : Integer;
   FEndPosX  : Integer;
   FEndPosY  : Integer;
   procedure SetStartPosX(const Value: Integer);
   procedure SetStartPosY(const Value: Integer);
   procedure SetEndPosX(const Value: Integer);
   procedure SetEndPosY(const Value: Integer);
   procedure SetPen(const Value: TPen);
   function GetPen: TPen;
   procedure SetBrush(const Value: TBrush);
   Function GetBrush: TBrush;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
   procedure Paint; override;
  published
   property StartPosX: Integer read FStartPosX write SetStartPosX;
   property StartPosY: Integer read FStartPosY write SetStartPosY;
   property EndPosX : Integer read FEndPosX  write SetEndPosX;
   property EndPosY : Integer read FEndPosY  write SetEndPosY;
   property Pen: TPen read GetPen write SetPen;
   property Brush: TBrush read GetBrush write SetBrush;
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TFormLine]);
end;

procedure TFormLine.SetStartPosX(const Value: Integer);
begin
IF (Value <> FStartPosX) THEN BEGIN
  FStartPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetStartPosY(const Value: Integer);
begin
IF (Value <> FStartPosY) THEN BEGIN
  FStartPosY := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosX(const Value: Integer);
begin
IF (Value <> FEndPosX) THEN BEGIN
  FEndPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosY(const Value: Integer);
begin
IF (Value <> FEndPosY) THEN BEGIN
  FEndPosY := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetPen(const Value: TPen);
Begin
  Canvas.Pen.Assign(Value);
End;

Function TFormLine.GetPen: TPen;
Begin
  Result := Canvas.Pen;
End;

procedure TFormLine.SetBrush(const Value: TBrush);
Begin
  Canvas.Brush.Assign(Value);
End;

Function TFormLine.GetBrush: TBrush;
Begin
  Result := Canvas.Brush;
End;

procedure TFormLine.Paint;
begin
  Canvas.FillRect(Canvas.ClipRect);
  Canvas.MoveTo(FStartPosX, FStartPosY);
  Canvas.LineTo(FEndPosX, FEndPosY);
end;

end.
So, nun sollten die Fehler raus sein.

Wenn er kein Rechteck füllen sollen, dann kannst du zum einen den Brush Style auf bsClear setzen oder du entfernst das FillRect in Paint. Erstere Methode lässt dir aber noch mehr andere Möglichkeiten offen.

Mein Code ist von TGraphicControl abgeleitet und dieses benutzt den Canvas des Parent und keinen eigenen

ibp 12. Jan 2007 10:22

Re: Linien-Komponente gesucht
 
nein sind sie immer noch nicht :wink:

Zitat:

Zitat von Muetze1
[delphi]
...
procedure GetPen: TPen; <--------- muss eine Funktion sein
...
procedure GetBrush: TBrush; <--------- muss eine Funktion sein

...
Canvas.Pen.Assign(Value); <--------- Canvas wird nicht gekannt da in TGraphicControl als protected deklariert!
...


Muetze1 12. Jan 2007 13:27

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von ibp
nein sind sie immer noch nicht :wink:

Ok, ersten beiden Dinge erledigt - hatte ich nicht gesehen. Ich habe die Kompo nur hier im Editor abgeändert von phpbb, nicht in Delphi.

Zu dem
Zitat:

Zitat von ibp
Canvas.Pen.Assign(Value); <--------- Canvas wird nicht gekannt da in TGraphicControl als protected deklariert!

kann ich nur sagen: ja, und?

Ich weiss nicht was du mir damit willst, schliesslich leite ich von TGraphicControl ab und habe somit Zugriff auf die protected-Member.

ibp 12. Jan 2007 15:18

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von Muetze1
Ich weiss nicht was du mir damit willst, schliesslich leite ich von TGraphicControl ab und habe somit Zugriff auf die protected-Member.

bei mir meckert er aber, dass canvas nicht bekannt ist!

Muetze1 12. Jan 2007 15:38

Re: Linien-Komponente gesucht
 
Zitat:

Zitat von ibp
bei mir meckert er aber, dass canvas nicht bekannt ist!

Ich habe nun die Komponente bei mir in Delphi 7 Architect installiert und sie läuft ohne Warnung etc durch und funktioniert. Ich habe dabei noch festgestellt, dass sie so nicht auf Änderungen bei Pen und Brush reagiert und das noch schnell erweitert. Da ich es nun sogar mit einem richtigen Delphi Compiler getestet habe und nicht nur mit meinen (schlechten) Augen, kann ich nun sagen: Die Komponente läuft unter Delphi 7 ohne Probleme.

Delphi-Quellcode:
unit FormLine;

interface

uses
  SysUtils, Classes, Controls, Windows, Graphics;

type
  TFormLine = class(TGraphicControl)
  private
    FStartPosX : Integer;
    FStartPosY : Integer;
    FEndPosX  : Integer;
    FEndPosY  : Integer;
    procedure SetStartPosX(const Value: Integer);
    procedure SetStartPosY(const Value: Integer);
    procedure SetEndPosX(const Value: Integer);
    procedure SetEndPosY(const Value: Integer);
    procedure SetPen(const Value: TPen);
    function GetPen: TPen;
    procedure SetBrush(const Value: TBrush);
    Function GetBrush: TBrush;
    Procedure ValueChanged(Sender: TObject);

  protected
    { Protected-Deklarationen }

  public
    { Public-Deklarationen }
    Constructor Create(AOwner: TComponent); Override;
    Procedure Paint; Override;

  published
    { Published-Deklarationen }
    property StartPosX: Integer read FStartPosX write SetStartPosX;
    property StartPosY: Integer read FStartPosY write SetStartPosY;
    property EndPosX : Integer read FEndPosX  write SetEndPosX;
    property EndPosY : Integer read FEndPosY  write SetEndPosY;
    property Pen: TPen read GetPen write SetPen;
    property Brush: TBrush read GetBrush write SetBrush;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TFormLine]);
end;

procedure TFormLine.SetStartPosX(const Value: Integer);
begin
IF (Value <> FStartPosX) THEN BEGIN
  FStartPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetStartPosY(const Value: Integer);
begin
IF (Value <> FStartPosY) THEN BEGIN
  FStartPosY := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosX(const Value: Integer);
begin
IF (Value <> FEndPosX) THEN BEGIN
  FEndPosX := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetEndPosY(const Value: Integer);
begin
IF (Value <> FEndPosY) THEN BEGIN
  FEndPosY := Value;
  Invalidate;
END;
end;

procedure TFormLine.SetPen(const Value: TPen);
Begin
  Canvas.Pen.Assign(Value);
End;

Function TFormLine.GetPen: TPen;
Begin
  Result := Canvas.Pen;
End;

procedure TFormLine.SetBrush(const Value: TBrush);
Begin
  Canvas.Brush.Assign(Value);
End;

Function TFormLine.GetBrush: TBrush;
Begin
  Result := Canvas.Brush;
End;

procedure TFormLine.Paint;
begin
  Canvas.FillRect(Canvas.ClipRect);
  Canvas.MoveTo(FStartPosX, FStartPosY);
  Canvas.LineTo(FEndPosX, FEndPosY);
end;

Constructor TFormLine.Create(AOwner: TComponent);
Begin
  inherited;

  Canvas.Pen.OnChange := ValueChanged;
  Canvas.Brush.OnChange := ValueChanged;
End;

Procedure TFormLine.ValueChanged(Sender: TObject);
Begin
  If ( Not ( csLoading In ComponentState ) ) Then
    Invalidate;
End;

end.
/EDIT: Was mich aber noch viel mehr wundert ist, dass du hier in Beitrag #16 schreibst, dass dich das Rechteck stört, somit muss die Komponente doch schon bei dir gelaufen sein. Somit frage ich mich, was du seit dem verändert hast? Schliesslich wurde das Canvas zuvor auch genutzt und war damals aber anscheinend noch bekannt... :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.

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