Delphi-PRAXiS
Seite 1 von 13  1 2311     Letzte »    

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 Benötige Hilfe beim Entwickeln einer Komponente (https://www.delphipraxis.net/98560-benoetige-hilfe-beim-entwickeln-einer-komponente.html)

torud 29. Aug 2007 06:11


Benötige Hilfe beim Entwickeln einer Komponente
 
Hallo Wissende,

ich möchte/muss eine eigene Komponente entwickeln, die im Prinzip wie ein Panel aufgebaut ist, nur etwas anders aussieht und etwas mehr zu bieten hat. Dazu möchte/muss ich wohl nun erstmalig eine eigene Komponente entwickeln. Das einzige Tutorial was bisher finden konnte, war hier zu finden. http://www.dsdt.info/tutorials/kompentwickeln/?page=1 Ich finde, dass es dort eingermaßen gut erläutert wurde und suche hier keinen, der mir die komplette Arbeit abnimmt, sondern nur hin und wieder jemand, der mir zeigt, wo ich wie was zu tun habe, damit es klappen kann.

Als Add-On benötige ich folgendes.
einen Border mit abgerundeten Ecken
Hintergrund einfarbig oder als Gradient horizontal, vertikal oder diagonal
Aufname eine Bildes mit den abgerundeten Ecken als Rahmen
ODER
Aufnahme, Anzeige von formtaierten Text (es wird beides NIE gleichzeitig benötigt)

Da ich das Tutorial gelesen aber nicht alles verstanden habe und auch hier im Forum schon etwas gesucht und gelesen habe, bin ich auf den Dreh gekommen, dass ich die neue Komponente von TCustomControl ableiten müsste. Folgendes habe ich derzeit erstellt, aber leider funktioniert so gut wie nichts. Warum weiss ich leider nicht.

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle    = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    procedure SetBGColor(Value: TColor);
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor  read FBgColorFrom  write FBgColorFrom;
    property BgColorTo : TColor  read FBgColorTo  write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient  write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection  write FGradientDirection;
    property BorderColor : TColor read FBorderColor  write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle  write FBorderStyle;
    property BorderWidth : integer read FBorderWidth  write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges  write FRoundEdges;
    property CornerWidth : integer read FCornerWidth  write FCornerWidth;
    { Published-Deklarationen }

  end;

procedure Register;
 
implementation

procedure Register;
begin
  RegisterComponents('Beispiel', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  //Canvas  := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.SetBGColor(Value: TColor);
var
  Rect : TRect;
  notUsed : HWND;
begin
  Rect := GetClientRect;
  Canvas.Handle := GetDeviceContext(notUsed);
  if ColorToRGB(Value) > -1 then
  begin
    Canvas.Brush.Color := Value;
    Canvas.FillRect(Rect);
    FBGColorFrom := Value;
    FBgColorTo := Value;
  end;
  Canvas.Refresh;
end;

end.
Also wie Ihr sehen könnt, habe ich die ersten Schritte getan. Nun frage ich mich aber, wann und wo ich endlich was mit den ganzen Eigenschaften etwas anfangen kann!? Also so wie ich es sehe, müsste ich doch OnPaint irgendwo und irgendwie überschreiben und dann dort die Eigenschaften einfach nur auswerten.

Könnte mir bitte jemand mitteilen, wo und wie ich das realisieren muss? Also nur den Code, den ich benötige, damit OnPaint zur DesignTime und zur Laufzeit aufgerufen wird. Den Code werde ich dann selbste einpflegen, so weit und so gut es geht und hier wieder vorstellen....

Es könnte sein, dass in dem bisherigen Code schon ein Fehler ist, da mir jedes mal, nach dem Testen der Komponente mein Delphi abschmiert. SetBgColor kann, glaube ich raus. Das ist noch aus einem Beispiel eines anderen Users hier im Forum.

torud 29. Aug 2007 06:37

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Ich habe die Komponente jetzt dahingehend geändert, dass ich SetColor entfernt habe und OnPaint eingefügt habe. Leider bringt das gar nix, da die procedure scheinbar NIE aufgerufen oder ausgelöst wird. Warum nur?

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle    = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    Canvas  : TCanvas;
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor  read FBgColorFrom  write FBgColorFrom;
    property BgColorTo : TColor  read FBgColorTo  write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient  write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection  write FGradientDirection;
    property BorderColor : TColor read FBorderColor  write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle  write FBorderStyle;
    property BorderWidth : integer read FBorderWidth  write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges  write FRoundEdges;
    property CornerWidth : integer read FCornerWidth  write FCornerWidth;
    procedure OnPaint;
    { Published-Deklarationen }

  end;

procedure Register;
 
implementation

procedure Register;
begin
  RegisterComponents('Standard', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  Canvas  := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.OnPaint;
begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
    Canvas.Refresh;
end;

end.

Ghostwalker 29. Aug 2007 07:48

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Schnipps:

Delphi-Quellcode:
   :
   Procedure Paint;override;
   :
   :
   procedure TMyPanel.Paint;override;
   begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
    Canvas.Refresh;
   end;
Also im Prinzip aus onPaint, paint machen. :)

semo 29. Aug 2007 07:58

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
als ergänzung zu Ghostwalker:

da du von tcustomcontrol ableitest musst du in dieser komponente oder deren vorfahren gucken wo und wie das onpaint event deklariert ist.

du musst dann genau die gleiche deklaration der methode in deiner komponente dann per override kennzeichnen und die methode deinen wünschen entsprechend implementieren

torud 29. Aug 2007 08:01

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Unbekannte Anweisung 'override' erhalte ich vom Debugger als Meldung.

In diese Zeile springt der Kollege:

Delphi-Quellcode:
procedure TmyPanel.Paint; override;
in published habe ich

Delphi-Quellcode:
procedure Paint; override;
Also wo liegt nun das Problem???

oki 29. Aug 2007 08:02

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Nein, Paint ist eine Virtuelle Methode, die du überschreiben kannst. Paint wird jedesmal aufgerufen, wenn dein Control neu gezeichnet wird. Somit ist das die ideale Stelle um eigene Ausgaben (zeichnen, Text) vorzunehmen.

Der Ansatz ist richtig!

Gruß oki

torud 29. Aug 2007 08:03

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Zitat:

Zitat von M. Hassmann
als ergänzung zu Ghostwalker:

da du von tcustomcontrol ableitest musst du in dieser komponente oder deren vorfahren gucken wo und wie das onpaint event deklariert ist.

Vielleicht wäre es einfach von einem anderen Vorfahren abzuleiten? Ich habe aber immer wieder gelesen, dass es günstiger und einfacher sein soll von TCustomcontrol abzuleiten. Warum auch immer!?

oki 29. Aug 2007 08:06

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
grrr* roter Kasten!

Die Procedure Paint wird nur in der Klassendeklaration mit override deklariert. Im Implementation-Teil nicht.
Delphi-Quellcode:
:
   Procedure Paint;override;
   :
   :
   procedure TMyPanel.Paint;override;
   begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
   end;
und dann kein refresh, denn es wird ja schon gezeichnet. Sonst wird es rekursiv!!!

Gruß oki

[edit] Mann schon wieder roter Kasten. ich bin heut zu langsam! [/edit]

oki 29. Aug 2007 08:06

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
TCustomControl ist ok.

torud 29. Aug 2007 08:13

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Ok, ich habe es nun so wie von Dir empfohlen geändert, aber jetzt ist leider kein Zeichnen auf Leinwand mehr erlaubt...Scheinbar doch nicht alles so einfach, wie erwartet. Ein Buch ist bestellt, aber trotzdem will ich nicht warten :-) hier nochmal der gesamte Code:

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle    = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    Canvas  : TCanvas;
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor  read FBgColorFrom  write FBgColorFrom;
    property BgColorTo : TColor  read FBgColorTo  write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient  write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection  write FGradientDirection;
    property BorderColor : TColor read FBorderColor  write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle  write FBorderStyle;
    property BorderWidth : integer read FBorderWidth  write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges  write FRoundEdges;
    property CornerWidth : integer read FCornerWidth  write FCornerWidth;
    procedure Paint; override;
    { Published-Deklarationen }

  end;

procedure Register;
 
implementation

procedure Register;
begin
  RegisterComponents('Standard', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  Canvas  := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.Paint;
begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr.
Seite 1 von 13  1 2311     Letzte »    

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