Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ONKEYPRESS Procedure für mehrer TEDITS in mehreren Units
achterburg - So 21.09.03 15:24
Titel: ONKEYPRESS Procedure für mehrer TEDITS in mehreren Units
Hallo,
ich habe ein problem: Mit der Procedure On KEy Press kann ich ja eine Einagebbeschränkung vornehmen, das funktionirt auch. Da aber bei uns jetzt das "saubere Programmieren" angesagt ist, möchte ich eine einzige OnKey Press Procedure in eine Unit schreiben, wo nur procedure drin stehen, also eine öffentliche Procedure, auf die ich von anderen Units mit einer Form und veerschiedenen Edit Feldern drauf zugreifen kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure nurzahlen(Sender: TObject); VAR KEY: CHAR; begin IF NOT (KEY IN['0'..'9', #8]) THEN KEY := #0; end; |
Diese Procedure soll mit der Onkeypress Eigenschaft mehrerer TEdits in mehreren Units aufgerufen werden. Hat da jemand eine Idee?
vielen Dank
Moderiert von
Tino: Delphi-Tags hinzugefügt.
bIce - So 21.09.03 17:39
Also, erstens: procedure nurzahlen(Sender: TObject); ist keine Prozedur um KeyPress ereignisse abzufangen, dazu fehlt da var Key: Char.
Wenn Du eine gemeinsame Ereignisbehandlungsroutine für die Komponenten verwenden willst, musst Du eine Klasse mit einer Klassenmethode - oder wie das heißt - erstellen. Diese Methode kannst Du dann benutzen ohne die Klasse aufzurufen.
Ein Beispiel:
Unit für die Ereignisbehandlung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| unit EventHandler;
interface type TKeyPressHandler = class private constructor Create; public class procedure nurzahlen(Sender: TObject; var Key: Char); end;
implementation
constructor TKeyPressHandler.Create; begin inherited; end;
class procedure TKeyPressHandler.nurzahlen(Sender: TObject; var Key: Char); begin IF NOT (KEY IN['0'..'9', #8]) THEN KEY := #0; end;
end. |
Die Routine musst Du dann per Hand im Quelltext zuweisen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| [...] procedure TForm1.FormCreate(Sender: TObject); begin with TKeyPressHandler do begin Edit1.OnKeyPress := nurzahlen; Edit2.OnKeyPress := nurzahlen; Edit3.OnKeyPress := nurzahlen; end; end; [...] |
Edit: So, jetzt sollte es funktionieren
bIce - So 21.09.03 17:44
Wobei was mich noch an deiner Funktion stört ist dass sie nicht gegen Cut'n'Paste abgesichert ist, dazu kannst Du in einer OnChange prozedur, alle Buchstaben entfernen.
achterburg - So 21.09.03 18:25
Hallo,
erstmal danke für deinen Hinweis, ich hab es ausprobiert, aber TEventHandler sei ein undefinierter Bezeichner.
Delphi-Quelltext
1: 2: 3: 4:
| implementation
constructor TEventHandler.Create; begin |
habe es auch unter neuer Unit mit Namen TEventHandler probiert, aber das Resultat ist das gleiche. Kann es sein, dass ich noch Delphi 5 habe oder leigt es an was anderem?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| unit EventHandler;
interface type TKeyPressHandler = class private constructor Create; public class procedure nurzahlen(Sender: TObject; var Key: Char); end;
implementation
constructor TEventHandler.Create;
begin
inherited; end;
class procedure TEventHandler.nurzahlen(Sender: TObject; var Key: Char); begin IF NOT (KEY IN['0'..'9', #8]) THEN KEY := #0; end;
end. |
| Zitat: |
[Fehler] Unit6.pas(17): Undefinierter Bezeichner: 'TEventHandler' |
Was mach ich falsch???
Moderiert von
Tino: Delphi- und Quote-Tags hinzugefügt.
Christian S. - So 21.09.03 18:54
Hallo!
Könnte man es nicht einfach so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure FormCreate(Sender: TObject); procedure myKeyPress (Sender : TObject; var key :Char); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.myKeyPress (Sender : TObject; var Key:Char); begin if not (key in ['0'..'9', #8]) then key := #0; end;
procedure TForm1.FormCreate(Sender: TObject); begin edit1.OnKeyPress := myKeyPress; edit2.OnKeyPress := myKeyPress; edit3.OnKeyPress := myKeyPress; end; |
MfG
Peter
achterburg - So 21.09.03 21:28
Also ersteinmal vielen Dank euch beiden, beim unteren hat es dann sofort gefunzt. Aber mich würde trotzdem interessieren, wie die erste Version funktioniert, bzw was das bedeutet, undfinierter Bezeichner, da man erstens nicht dummer wird und zweitens vielleicht auch noch andere Sachen mit realisieren lassen,
Vielen Dank noch mal,
Berni
bIce - So 21.09.03 21:50
Der grund warum das nicht funktioniert hat ist, dass ich die Klasse zunächst TEventHandler benannte, dann aus Übersichtlichkeitsgründen in TKeyPressHandler umbenannt habe und vergaß alle TEventHandler durch TKeyPressHandler zu ersetzen. Wenn Du das machst dann sollte es funktionieren. Es ist also kein versionsspezifisches Problem, da ich auch die 5 besitze. ;)
@Peter Lustig: Dein Beispiel funktioniert zwar auch, ist auch in manchen Fällen besser. Wenn Du es aber wiederverwendbar machen willst, dann musst Du immer die Unit mit der Form einbinden, was oft nicht passieren darf, z.B. wenn Du für ein weiteres Projekt wieder dasselbe Verhalten haben willst, dann must Du mit deiner Version entweder wieder neuimplementieren, oder die Unit mit der Form-Klasse einbindinden, was unerwünscht ist. Meine Version hat den Nachteil dass man die Routine per Hand an die Komponenten zuweisen muss. Aber durch ein Selbstgeschriebenes Plugin könnte man es effizienter machen.
Edit: Die Anweisungen im Konstruktor sind in Deinem Beispiel nicht notwendig, da du die Ereignisse im Objektinspektor zuweisen kannst.
Christian S. - So 21.09.03 22:06
@bIce:
jo, wenn Du was Wiedervernwendbares haben willst, dann ist Deine Mehtode definitiv besser. Aber in diesem Fall wäre das mit Spatzen auf Kanonen geworfen ... oder so.
Das mit dem Objektinspektor stimmt zwar, aber wenn ich es im OnCreate mache, sehe ich sofort auf einen Blick, welche Komponenten nicht das Standardereignis haben (also das, welches beim Doppelklick ertellt wird).
MfG
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!