![]() |
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. ![]() 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:
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.
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. 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. |
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. |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Schnipps:
Delphi-Quellcode:
Also im Prinzip aus onPaint, paint machen. :)
:
Procedure Paint;override; : : procedure TMyPanel.Paint;override; begin Canvas.Brush.Color := FBgColorFrom; Canvas.TextOut(1,1,'Test'); Canvas.Refresh; end; |
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 |
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:
in published habe ich
procedure TmyPanel.Paint; override;
Delphi-Quellcode:
Also wo liegt nun das Problem???
procedure Paint; override;
|
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 |
Re: Benötige Hilfe beim Entwickeln einer Komponente
Zitat:
|
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:
und dann kein refresh, denn es wird ja schon gezeichnet. Sonst wird es rekursiv!!!
:
Procedure Paint;override; : : procedure TMyPanel.Paint;override; begin Canvas.Brush.Color := FBgColorFrom; Canvas.TextOut(1,1,'Test'); end; Gruß oki [edit] Mann schon wieder roter Kasten. ich bin heut zu langsam! [/edit] |
Re: Benötige Hilfe beim Entwickeln einer Komponente
TCustomControl ist ok.
|
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 20:18 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 by Thomas Breitkreuz