![]() |
Eigene Komponente von TCustomControl > Eigenschaftseditor
Tach wohl...
Ich will mir mein eigener Button Programmieren, wie bereits im Titel erwähnt, leite ich meine Komponente von TCustomControl ab... Ich möchte jetzt, um die Farbe des Buttons verändern zu können, ein Eigenschaftseditor einbinden (TColorProperty) Nur habe ich mühe dabei.. Das Konkrete Fehlermeldung lautet: [Fehler] EButton_API.pas(10): Undefinierter Bezeichner: 'TPropertyColor' Hier meine zwei Dateien: Zwei Dateien sind notwendig weil es nicht erlaubt ist die Editoren ausserhalb IDE zu verwenden oder so.. ![]() Datei1: EButton.pas:
Delphi-Quellcode:
Datei2: EButton_API.pas:
unit EButton;
interface uses SysUtils, Classes, Controls, StdCtrls, Graphics; type TEButton = class(TCustomControl) private FFont : TFont; { Private-Deklarationen } protected procedure Paint; override; { Protected-Deklarationen } public constructor Create(AOwner: TComponent); override; destructor Destroy; override; { Public-Deklarationen } published property Font: TFont read FFont write FFont; { Published-Deklarationen } end; procedure Register; implementation procedure Register; //Procedure wird bei der Komponenteninstallation verwendet! begin RegisterComponents('RComponents', [TEButton]); end; {------------------------------------------------} { } { } { TRButton } { } {------------------------------------------------} constructor TEButton.Create(AOwner: TComponent); begin inherited Create(AOwner); FFont:=TFont.Create; end; destructor TEButton.Destroy; begin FFont.Free; inherited Destroy; end; procedure TEButton.Paint; begin inherited;//Zeichen Procedure des Vorfahren aufrufen. if csDesigning in ComponentState then //Wenn sich die Komponente in Entwicklung befindet. begin {Zeichung eines Rahmens} Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := clblue; Canvas.Pen.Color := clblack; Canvas.Rectangle(0,0,width,height);//Rechteck zeichnen {Namen der Komponente in die Mitte schreiben} canvas.Font := FFont; canvas.TextOut((width - Canvas.TextWidth(Name)) div 2,(height - Canvas.TextHeight(Name)) div 2,name); {Keine weitern Zeichnungen mehr ausführen} exit;//Verlässt die Procedure end; {Zeichung eines Rahmens} Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := clblue; Canvas.Pen.Color := clblack; Canvas.Rectangle(0,0,width,height);//Rechteck zeichnen {Namen der Komponente in die Mitte schreiben} canvas.Font := FFont; canvas.TextOut((width - Canvas.TextWidth(Name)) div 2,(height - Canvas.TextHeight(Name)) div 2,name); {Keine weitern Zeichnungen mehr ausführen} exit;//Verlässt die Procedure end; {------------------------------------------------} { } { } { TEColor } { } {------------------------------------------------} end.
Delphi-Quellcode:
Wäre echt cool wenn man da was machen könnte...
unit EButton_API;
interface uses {$ifdef ver150} DesignIntf, DesignEditors,{$else} DsgnIntf,{$endif} EButton,SysUtils,Classes,Controls,QGraphics; type TEColor = class(TColorProperty) public procedure Edit; override; function GetColor : TPropertyColor; override; end; procedure Register; implementation procedure Register; begin RegisterComponents('RComponents', [TEButton]); RegisterPropertyEditor(TypeInfo(TColor), TEButton, 'Color', TRColor); end; { TRColor } procedure TColorProperty.Edit; var ColorDialog: TColorDialog; begin **ColorDialog := TColorDialog.Create(Application);**********{ Editor erzeugen} try ****ColorDialog.Color := GetOrdValue;*********************{ Vorhandenen Wert verwenden } ****if ColorDialog.Execute then************************** { Wenn der Anwender auf OK klickt ... } ******SetOrdValue(ColorDialog.Color);*******************{ ...das Ergebnis verwenden, um den Wert zu setzen} finally ****ColorDialog.Free;*************************************{ Editor freigeben } *end; *end; end. Freundliche Grüsse und Danke zum Voraus Cherry |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Ich hab's jetzt nicht nachgeprüft, aber hätte gedacht, dass Delphi für Eigenschaften vom Typ TColor automatisch den passenden Editor im OI anbietet. Hast du schon mal probiert, den RegisterPropertyEditor-Aufruf einfach wegzulassen?
Außerdem benutzt du einmal die Unit Graphics und einmal die QGraphics. Ich würde mich an deiner Stelle für eine Variante entscheiden. :-) Und in der Unit EButton kannst du die Routine Register rausschmeißen - die muss nur im Designzeitpackage sein. |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Danke für deine Antwort...
Danke für deine Tipps.. Ich habe in der Zwischenzeit noch ein bisschen herumgesurft und getestet. Du hast vollkommen Recht was dies angeht: Zitat:
Allerdings habe ich da noch eine Frage: Was hatt es eigentlich damit auf sich? Ich Zitiere von MaBuSE -> ![]() "In Delphi 5 Komponenten wird oft die Unit DsgnIntf verwendet. Damit ist es möglich "Component-" und "Propertyeditoren" zu programmieren, die dann in der IDE ausgeführt werden. Diese Design-Editoren sind ausschließlich für die IDE lizenziert und dürfen nicht in die eigenen Programme, welche außerhalb der IDE laufen eingebunden werden. Da es einige Verstöße (meistens wohl aus Unwissenheit) gab, wurden die Units getrennt und durch "Compiler-Magic" können die Editoren jetzt nicht mehr in Programme außerhalb der IDE eingebunden werden. " Gruss |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Zitat:
Zitat:
Zitat:
@cherry: Ich habe mir Deine Komponente mal angeschaut und ein kleines Beispiel gemacht. (Die Font und Caption Eingenschaften habe ich bewust weggelassen, damit das Beispiel kleiner bleibt.)
Delphi-Quellcode:
Ich hoffe das hilft Dir.
///////////////////////////////////////////////////////////////////////////////
// TMyColorButton // // Beispielprogramm zur Komponentenerstellung // // Folgende Dinge sind zu sehen: // - eine einfache Message wird behandelt ( CM_MOUSEENTER und CM_MOUSELEAVE ) // - Propertys werden verwendet // - bei TColor und TBrushStyle werden automatisch // die Standard Property Editoren verwendet // - ein protected Event wird published (OnClick) // // Dieser Quelltext liegt auch auf [url]www.delphipraxis.net[/url] // ( [url]http://www.delphipraxis.net/topic80394_eigene+komponente+von+tcustomcontrol+eigenschaftseditor.html[/url] ) // /////////////////////////////////////////////////////////////////////////////// // Das Programm ist Freeware und darf beliebig benutzt und erweitert werden. // Es wäre nett, wenn dann auch der geänderte Quelltext in obige URL-Adresse // gesendet wird. Dann haben alle was davon. // Es wäre auch nett wenn mein (unser) Name in den Dateien enthalten bleibt. // Das Programm wird von Ihnen auf eigenes Risiko eingesetzt. Ich übernehme // keine Haftung für Schäden die durch das Programm oder die Benutzung des // Programms entstanden sind bzw. entstehen. /////////////////////////////////////////////////////////////////////////////// // (C) 2005, MaBuSE, member of DelphiPraxis.net /////////////////////////////////////////////////////////////////////////////// // ReleaseNotes: // v1.0 - 11.04.2006 - MaBuSE: Erste Version war in 10 min programmiert /////////////////////////////////////////////////////////////////////////////// unit MyColorButton; interface uses SysUtils, Classes, Controls, StdCtrls, Graphics, Messages; type TMyColorButton = class(TcustomControl) private { Private-Deklarationen } FmyActiveBrushColor: TColor; FmyBrushColor: TColor; FmyBrushStyle: TBrushStyle; FmyMouseOver: Boolean; FmyPenColor: TColor; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure SetmyActiveBrushColor(const Value: TColor); procedure SetmyBrushColor(const Value: TColor); procedure SetmyBrushStyle(const Value: TBrushStyle); procedure SetmyPenColor(const Value: TColor); protected { Protected-Deklarationen } procedure Paint; override; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; published { Published-Deklarationen } property myActiveBrushColor: TColor read FmyActiveBrushColor write SetmyActiveBrushColor; property myBrushColor: TColor read FmyBrushColor write SetmyBrushColor; property myBrushStyle: TBrushStyle read FmyBrushStyle write SetmyBrushStyle; property myPenColor: TColor read FmyPenColor write SetmyPenColor; property OnClick; end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TMyColorButton]); end; { TMyColorButton } procedure TMyColorButton.CMMouseEnter(var Message: TMessage); begin // wird automatisch aufgerufen wenn der Mauszeiger über dem Control ist. inherited; FmyMouseOver := true; RePaint; end; procedure TMyColorButton.CMMouseLeave(var Message: TMessage); begin // wird automatisch aufgerufen wenn der Mauszeiger nicht mehr über dem Control ist. inherited; FmyMouseOver := false; RePaint; end; constructor TMyColorButton.Create(AOwner: TComponent); begin inherited; FmyActiveBrushColor:= clRed; FmyBrushColor := clGreen; FmyBrushStyle := bsDiagCross; FmyMouseOver := false; FmyPenColor := clBlue; end; procedure TMyColorButton.Paint; begin inherited; if (csDesigning in ComponentState) or (not FmyMouseOver) then begin Canvas.Brush.Color := FmyBrushColor; end else begin Canvas.Brush.Color := FmyActiveBrushColor; end; Canvas.Brush.Style := FmyBrushStyle; Canvas.Pen.Color := FmyPenColor; Canvas.Rectangle(0,0,width,height); end; // Die folgenden proceduren werden beim Ändern einer Property aufgerufen // hier steht überall ein RePaint damit die geänderten Einstellungen // auch sichtbar werden. procedure TMyColorButton.SetmyActiveBrushColor(const Value: TColor); begin FmyActiveBrushColor := Value; RePaint; end; procedure TMyColorButton.SetmyBrushColor(const Value: TColor); begin FmyBrushColor := Value; RePaint; end; procedure TMyColorButton.SetmyBrushStyle(const Value: TBrushStyle); begin FmyBrushStyle := Value; RePaint; end; procedure TMyColorButton.SetmyPenColor(const Value: TColor); begin FmyPenColor := Value; RePaint; end; end. Viel Spaß [edit] url oben in Quelltext eingefügt [/edit] |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Zitat:
Dazu verwendet man Objekte von Borland, die nicht zur Weitergabe freigegeben sind. Das ist alles. Mal schauen, vieleicht schreib ich Dir Morgen mal ein kleines Beispiel. |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Vielen Dank MaBuSE
Ist echt net von dir!! :thumb: Ich werde entweder noch an meiner Version versuchen weiter zu basteln, oder vielleicht werde ich auch an deinem Beispiel weitermachen. Auf jedenfall stelle ich den Quellcode dann wieder unter diesem Thread zur Verfügung! Namen bleiben ;) Nochmals recht herzlichen Dank! Freundliche Grüsse Cherry |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Zitat:
Zitat:
Das ist nur mein Standard Header für Pascal Dateien, die ich in die DP stelle. Damit muß ich nicht jedesmal einen neuen erfinden ;-) |
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Zitat:
aber irgendwie passt hier (nach meinem Gefühl) "obiges" nicht. Oder!? URL = Uniform Resource Locator ! obiges Uniform Resource Locator ?? Eben wie gesagt, vielleicht liege ich falsch aber ich wurde einfach schreiben " ... in die obige URL-Adresse ... " Zitat:
|
Re: Eigene Komponente von TCustomControl > Eigenschaftsed
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Da im Quelltext durch die Kommentare (die grüne Schrift :-)) meinen Beitrag sehr kurz werden lies, habe ich das in Kauf genommen. Für alle die es nun auch zuhause ausprobieren wollen: Hier ist der komplette Quelltext:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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