Eigene Komponete von TEdit ableiten?
Hai ihr lieben,
ich möchte mir gerne ein eigenes TEdit erzeugen. Jetzt gehört die Ableitung von (VCL)-Komponeten nicht zu meinen Stärken :oops: Darum habe ich folgende Frage: "Mein" Edit soll diese Funktionalität/Eigenschaft haben:
Ich könnte das ja jetzt in OnChange eines Edits lösen. Aber wie mache ich das sauber in einer von TEdit abgeleiteten Komponente/Klasse ? Ich währe echt froh wenn mir einer von euch einen Anstoss geben könnte. Danke :-D |
Re: Eigene Komponete von TEdit ableiten?
Zitat:
Delphi-Quellcode:
Ich hoffe, das war was du gewünscht hast.
unit Edit1;
interface uses SysUtils, Classes, Controls, StdCtrls, Graphics; type TMyEdit = class(TEdit) private { Private-Deklarationen } FCheckEmpty: Boolean; FEmptyColor: TColor; FNoEmptyColor: TColor; protected { Protected-Deklarationen } public { Public-Deklarationen } function GetColor: TColor; published { Published-Deklarationen } property CheckEmpty: Boolean read FCheckEmpty write FCheckEmpty; Property Color: TColor read getColor; end; procedure Register; implementation function TMyEdit.GetColor: TColor; begin if FCheckEmpty then result := FEmptyColor else result := FNoEmptyColor; end; procedure Register; begin RegisterComponents('MyComp', [TMyEdit]); end; end. |
Re: Eigene Komponete von TEdit ableiten?
du müsstest schauen wo das OnChange ausgelöst wird und die methode überschreiben (falls es eine methode gibt). In der Regel ist das eine Methode namens doChange etc.
Wenn dem nicht so ist musst du entweder von TCustomEdit ableiten (und das Onchange nicht nach außen reichen) und das OnChange dann wie normal auf eine Private/Public/protected-Procedure zuweisen oder das OnChange umbiegen. @mkinzler: Ich denke sein Problem ist mehr die OnChange nutzung innerhalb der Komponente. Im übrigen stimmt deine GetColor methode nicht. Denn wenn CheckEmpty aktiv ist wird immer die Farbe verwendet als wäre es leer. |
Re: Eigene Komponete von TEdit ableiten?
Sorry es wär natürlich auch sinnvoll die Farben zu setzen :-) Bitte wie folgt ergänzen:
Delphi-Quellcode:
property EmptyColor: TColor read FEmptyColor write FEmptyColor;
property NoEmptyColor: TColor read FNoEmptyColor write FNoEmptyColor; |
Re: Eigene Komponete von TEdit ableiten?
so, hab geschaut. TCustomEdit hat die Methode "Change". Diese also überschreiben (darin die Farbe setzen) und dann inherited.
@mkinzler: Wie ich gerade sehe hast du auch vergessen die Farben zu initialisieren mit standardwerten.
Delphi-Quellcode:
type
TEdit = class(StdCtrls.TEdit) protected fCheckEmpty: Boolean; fEmptyColor: TColor; fNonEmptyColor: TColor; procedure Change; override; procedure FSetCheckEmpty(AValue: Boolean); procedure FSetColor(AType: Integer; AColor: TColor); public constructor Create(AOwner: TComponent); override; published property CheckEmpty: Boolean read fCheckEmpty write fSetCheckEmpty default True; property ColorEmpty: TColor Index 0 read fEmptyColor write FSetColor; property ColorNonEmpty: TColor Index 1 read fNonEmptyColor write FSetColor; end; [...] constructor TEdit.Create(AOwner: TComponent); begin fCheckEmpty := True; fEmptyColor := clBlue; inherited Create(AOwner); fNonEmptyColor := Color; Change; end; procedure TEdit.Change; var LColor: TColor; begin if fCheckEmpty then begin if Self.Text = '' then LColor := fEmptyColor else LColor := fNonEmptyColor; end else LColor := fNonEmptyColor; if LColor <> Color then Color := LColor; inherited; end; procedure TEdit.FSetCheckEmpty(AValue: Boolean); begin if AValue <> fCheckEmpty then begin fCheckEmpty := AValue; Change; end; end; procedure TEdit.FSetColor(AType: Integer; AColor: TColor); procedure LSetVal(var ACurrVal: TColor); begin if (ACurrVal <> AColor) then begin ACurrVal := AColor; if fCheckEmpty then Change; end; end; begin case AType of 0: LSetVal(fEmptyColor); 1: LSetVal(fNonEmptyColor); end; end; |
Re: Eigene Komponete von TEdit ableiten?
Zitat:
genau das war der Tip den ich brauchte :-D Ich wusste einfach nicht welche Methode ich überschreiben muss. Gibt es denn eine Liste welche Methode wan aufgerufen wird? |
Re: Eigene Komponete von TEdit ableiten?
keine Ahnung ob es solch eine Liste gibt, ich schau bei sowas in den sourcen nach bzw. verbiege das Event wenn ich die Methode nicht finde. In dem Fall hab ich also geschaut wo das onChange ausgelöst wird.
Ich hab so eben mal einen Blick in die Hilfe schweifen lassen um zu sehen ob bei OnChange vermerkt ist das man mit überschreiben der "Change"-Methode da noch was dazu basteln kann. Und Siehe da. Wenn man auf "See also" klickt kommt da unter anderem "change method" Bei MouseDown hab ich aber zum Beispiel nix dergleichen gefunden, ist also immer ein bischen glück dabei oder man durchstöbert gleich die Quelltexte. |
Re: Eigene Komponete von TEdit ableiten?
Hai Sir,
eine Frage habe ich noch: Wenn ich deinen Code nehme und mir das ganze als eine Komponente registriere und ein "MyEdit" auf die Form ziehe funktioniert alles wie es soll. Wenn ich aber ein "MyEdit" das auf der Form liegt markiere , kopiere und ein neues einfüge hat diese als Wet für Color immer den Wert von ColorEmpty? Woran kann das denn liegen? Wie gesagt es ist nur zur Entwurfzeit so, zur Leufzweit ist alles so wie es sein soll. |
Re: Eigene Komponete von TEdit ableiten?
ich hab eine Vermutung, aber eben nur eine Vermutung. Wenn du das Edit vom Form kopierst ist das property "Color" gesetzt. Wenn du jetzt die Componente auf dem anderen Form wieder einfügst wird das Property Color auch gesetzt was ja im ersten Form den Wert von ColorEmpty hatte. Man müsste also noch das Property Color überschreiben.
Ich seh grad das Color so ein Property ist wo man nicht einfach eine Methode überschreiben kann (Set-Methode). Entweder man würde die Message abfangen oder das ganze umbiegen. Werd das gleich mal noch machen und dann hier reinstellen. Werde dafür das Property ColorNonEmpty weg rationalisieren so dass, das Edit den Wert von Color hat wenn es nicht leer ist.
Delphi-Quellcode:
Zu beachten ist das mit einem Cast auf TCustomEdit oder StdCtrls.TEdit die Farbe trotzdem gesetzt werden kann.
TEdit = class(StdCtrls.TEdit)
protected fCheckEmpty: Boolean; fEmptyColor: TColor; fNonEmptyColor: TColor; procedure Change; override; procedure FSetCheckEmpty(AValue: Boolean); procedure FSetColor(AType: Integer; AColor: TColor); public constructor Create(AOwner: TComponent); override; published property CheckEmpty: Boolean read fCheckEmpty write fSetCheckEmpty default True; property ColorEmpty: TColor Index 0 read fEmptyColor write FSetColor; property Color: TColor Index 1 read fNonEmptyColor write FSetColor; end; [...] constructor TEdit.Create(AOwner: TComponent); begin fCheckEmpty := True; fEmptyColor := clBlue; inherited Create(AOwner); fNonEmptyColor := inherited Color; Change; end; procedure TEdit.Change; var LColor: TColor; begin if fCheckEmpty then begin if Self.Text = '' then LColor := fEmptyColor else LColor := fNonEmptyColor; end else LColor := fNonEmptyColor; if LColor <> inherited Color then inherited Color := LColor; inherited; end; procedure TEdit.FSetCheckEmpty(AValue: Boolean); begin if AValue <> fCheckEmpty then begin fCheckEmpty := AValue; Change; end; end; procedure TEdit.FSetColor(AType: Integer; AColor: TColor); procedure LSetVal(var ACurrVal: TColor); begin if (ACurrVal <> AColor) then begin ACurrVal := AColor; if fCheckEmpty then Change; end; end; begin case AType of 0: LSetVal(fEmptyColor); 1: LSetVal(fNonEmptyColor); end; end; |
Re: Eigene Komponete von TEdit ableiten?
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
es passiert innerhalb einer Form. Aber das dürfte egal sein. Der Punkt ist ja das im ersten Edit Color den Standardwert hat (siehe Edit1.jpg) und nur nach dem kopieren der Kompo und einfügen Color im zweiten Edit den Wert von ColorEmpty bekommt (edit2.jpg). [Edit]Werde es gleich mal mit deinem Code versuche[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 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