Autor Beitrag
achterburg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: So 21.09.03 15:24 
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.
ausblenden 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 user profile iconTino: Delphi-Tags hinzugefügt.
bIce
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 55



BeitragVerfasst: 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:
ausblenden 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
// Den Konstruktor kannst Du verstecken, damit keine Objekte
// erstellt werden können
   constructor Create; 
public
// Das ist die Ereignisbehandlungsroutine
   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:
ausblenden 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


Zuletzt bearbeitet von bIce am So 21.09.03 21:51, insgesamt 1-mal bearbeitet
bIce
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 55



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: So 21.09.03 18:25 
Hallo,

erstmal danke für deinen Hinweis, ich hab es ausprobiert, aber TEventHandler sei ein undefinierter Bezeichner.
ausblenden 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?
ausblenden volle Höhe 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
// Den Konstruktor kannst Du verstecken, damit keine Objekte
// erstellt werden können
   constructor Create;
public
// Das ist die Ereignisbehandlungsroutine
   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 user profile iconTino: Delphi- und Quote-Tags hinzugefügt.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.09.03 18:54 
Hallo!

Könnte man es nicht einfach so machen:
ausblenden volle Höhe 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
    { Private declarations }
  public
    { Public declarations }
  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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
achterburg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 55



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".