![]() |
Neue Komponente erstellen - Zahlenedit
Hallo Leute,
wieder einmal stehe ich vor einem Problem, und zwar ist es diesmal die Erstellung neuer Komponenten. Um in diesem Bereich ein wenig zu üben, wollte ich ein Editfeld erstellen, das nur Zahlen als Eingabe annimmt. Also habe ich mich an ![]() Folgender Code steht nun in der .pas-Datei:
Delphi-Quellcode:
Im Register "Beispiele" ist die Komponente drin, aber annehmen tut sie nach wie vor alle Zeichen. Was mach ich denn nun falsch?
unit Zahlenedit;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TZahlenedit = class(TEdit) private { Private-Deklarationen } procedure KeyPress(Sender: TObject; var Key: Char); protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TZahlenedit]); end; procedure TZahlenedit.KeyPress(Sender: TObject; var Key: Char); begin if not (key in [#8, #9, #44, #48 .. #57]) then key:=#0; end; end. MfG davar |
Re: Neue Komponente erstellen - Zahlenedit
Hallo davar,
in deinem Code versuchst du dem Edit-Control eine Ereignis-Behandlungsroutine als "normale" Methode einzupflanzen. Da das Control aber nichts über die Existenz dieser neuen Routine weiß, wird es sie nicht aufrufen. Du mußt die Methode KeyPress des Original-Edits überschreiben:
Delphi-Quellcode:
Gruß Hawkeye
type
TZahlenEdit = class (TEdit) protected procedure KeyPress (var Key: Char); override; end; procedure TZahlenEdit.KeyPress (var Key: Char); begin if (not (key in [#8, #9, #44, #48 .. #57])) then key := #0; inherited; end; |
Re: Neue Komponente erstellen - Zahlenedit
Tatsächlich, jetzt gehts.. :)
Danke! Noch eine ganz kurze Frage, die Hilfe hat mich auch nicht schlauer gemacht: wofür steht das Wort "inherited"? |
Re: Neue Komponente erstellen - Zahlenedit
inherited; führt die Funktion aus die in der Komponente (Klasse) deklariert ist, von der deine Komponente abstammt. Du fügst also deinen Prüfcode nur hinzu (so wie du's bisher vermutlich in jedem Projekt gemacht hast)
|
Re: Neue Komponente erstellen - Zahlenedit
Guten Morgen.
Zu "inherited" habe ich noch eine Verständnisfrage: Ich glaube mich zu erinnern, dass ich gelesen habe, inhereted dient dazu, dass auf alle Fälle - zusätzlich zu dem selbst programmierten Code - der geerbte Code der Komponente ausgeführt wird. Deshalb dachte ich, inherited müsste vor dem eigenen Code aufgerufen werden. Angenommen, ich wollte nun die neue Komponente ZahlenEdit verwenden und daraus eine eigene Komponente entwickeln, die z.B. nur die Zahlen 1 bis 6 als Eingabe akzeptiert. Würde dann der Aufruf von inhereted nach meinem eigenen Code nicht dazu führen, dass dann doch wieder alle Zahlen akzeptiert würden? Möglicherweise macht es bei der Komponente ZahlenEdit ja deshalb keinen Unterschied, weil TEdit.Keypress die Zeicheneingabe nicht beschränkt. Muss inhereted nun vor oder nach dem eigenen Code stehen oder ist es eventuell sogar egal, wo es steht? Für "Aufklärung" wäre ich dankbar. Ich wünsche Euch allen noch einen schönen Tag. Gruß Jürgen |
Re: Neue Komponente erstellen - Zahlenedit
Hai gfjs,
pauschal kann man nicht sagen wo das inherited stehen muss/darf. In deinem Fall sollte es nach deinem Code stehen. Dann sind die "unerwünschten" Zeichen im OnKeyPress der Komponente schon raus gefiltert. Hier mal ein Beispiel für die falsche Position in TMyClass2. In TMyClass1 ist es richtig.
Delphi-Quellcode:
In der TMyClass1 wird eine Object vom Typ TObjectList erzeugt. Wenn ich im Construction von TMyClass2 vor dem inherited, welches in diesem Fall ja den Constructon von TMyClass1 aufruft, versuche auf fList zuzugreifen kommt es zu einer Schutzverletzung da von fList ja noch keine Instanz erzeugt wurde. Analog dazu knallt es beim freigeben von TMyClass2 da ich nachdem aufruf des Destructors von TMyClass1 noch einmal versuche auf fList zuzugreifen. Diese ist zu diesem Zeitpunkt aber schon zerstört worden.
TMyClass1 = class(TObject)
private fList : TObjectList; public constructor Create; destructor Destroy; override; function AddItem (aValue : TObject) : integer; end; TMyClass2 = class(TMyClass1) public constructor Create; destructor Destroy; override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MyClass2 : TMyClass2; begin MyClass2 := TMyClass2.Create; end; { TMyClass1 } function TMyClass1.AddItem(aValue: TObject) : integer; begin fList.Add(aValue) end; constructor TMyClass1.Create; begin inherited; fList := TObjectList.Create; // Hier wird eine Instanz von fList erzeugt end; destructor TMyClass1.Destroy; begin fList.Free; // Hier wird fList wieder freigegeben. inherited; end; { TMyClass2 } constructor TMyClass2.Create; begin fList.Add(nil); // Hier kommt ein Fehler weil fList noch nicht erzeugt wurde. inherited; end; destructor TMyClass2.Destroy; var ndx: Integer; begin inherited; for ndx := fList.Count - 1 downto 0 do // und hier weil fList nicht mehr existier begin fList.Delete(ndx); end; end; Ich hoffe das hilft Dir etwas? |
Re: Neue Komponente erstellen - Zahlenedit
Zitat:
Delphi-Quellcode:
Hier ist es egal, wo das steht. So wie es da steht passiert folgendes : falsche Tasten werden auf #0 gesetzt, also quasi gesperrt. Dann werden die Methoden des Original-Edits noch durchlaufen. Bei Vertauschen der 2 Zeilen wäre es so : die Taste wird vom TEdit durchgelassen und erst danach von Deiner Komponente dann abgefangen. Ergo : egal fürs Programm. :zwinker: Gucke Dir mal Fremdkomponenten an. Da ist es durchaus normal, daß "inherited" irgendwo mittendrin steht. Und auch, daß das in abgeleiteten Komponenten ganz fehlt, das ist alles andere als ein Fehler. Du kannst ja auch das OnKeyPress ganz anders behandeln, als beim TEdit und willst sonst aber alles so lassen. Dann wäre das "inherit" sogar fehl am Platze.
procedure TZahlenEdit.KeyPress (var Key: Char);
begin if (not (key in [#8, #9, #44, #48 .. #57])) then key := #0; inherited; end; |
Re: Neue Komponente erstellen - Zahlenedit
Hi Sharky, hi Hansa.
Vielen Dank für Eure Beiträge - Ihr habt mir echt weitergeholfen. Servus und noch einen schönen Tag. Gruß Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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