Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Var ohne Variable bzw. mit Variablen-Dummy (https://www.delphipraxis.net/176575-var-ohne-variable-bzw-mit-variablen-dummy.html)

Schwedenbitter 14. Sep 2013 10:17

Var ohne Variable bzw. mit Variablen-Dummy
 
Hallo,

ich bin mir nicht sicher, ob mein Titel erklärt, was mein Problem ist und ob ich überhaupt in der richtigen Rubrik schreibe. Ich bin aber auch ideenlos, wie man das besser umschreiben könnte.

In einer VCL-Anwendung existiert eine Procedure für das Ereignis
Delphi-Quellcode:
OnKeyPress
für ein TEdit-Feld. Es ist ein Setup-Fenster und es wid geprüft, ob der Benutzer Änderungen gemacht hat. Diese Procedure wird - weil gleicher Code - von weiteren TEdits aufgerufen. Ich stehe jetzt vor dem Problem, dass ich die Procedure auch von Ereignissen anderen Componenten (TUpDown) aus aufrufen möchte. Dabei stellt sich aber "das Problem", dass OnKeyPress so gestaltet ist, dass eine Rückgabe über
Delphi-Quellcode:
Var Key:Char;
erfolgt.

Ich kann jetzt natürlich in jeder der aufrufenden Prozeduren eine sinnlose Variable definieren, mitgeben und das Ergebnis nicht beachten. Ich meine aber, mich zu erinnern, dass man das auch eleganter lösen konnte. Leider weiß ich nicht wie und ich weiß auch nicht, nach welchen Stichworten ich suchen muss. Um mein Problem noch anschaulicher zu machen, hier mal quick and dirty folgenden kurzen Code:
Delphi-Quellcode:
Procedure TForm1UpDown1Changing(Sender: TObject);
Var
   Ch : Char;
Begin
   HandleKeyPress(nil, Ch);
End;

// Das möchte ich gern verkürzen in so etwas wie

Procedure TForm1.UpDown1Changing(Sender: TObject);
Begin
   HandleKeyPress(nil, ...);
End;
Geht das überhaupt? Falls ja, wie?

Gruß, Alex

Helmi 14. Sep 2013 10:22

AW: Var ohne Variable bzw. mit Variablen-Dummy
 
Hallo,

wie ist
Delphi-Quellcode:
HandleKeyPress
definiert?

Ich vermute mal so:
Delphi-Quellcode:
procedure HandleKeyPress(Sender: TObject; c: Char);
.

du kannst in der Definition ein "Default" definieren
Delphi-Quellcode:
procedure HandleKeyPress(Sender: TObject; c: Char = '.');
.

Dadurch reicht beim Aufruf (wenn man c nicht braucht):
Delphi-Quellcode:
HandleKeyPress(nil);
.

sx2008 14. Sep 2013 11:24

AW: Var ohne Variable bzw. mit Variablen-Dummy
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1228438)
In einer VCL-Anwendung existiert eine Procedure für das Ereignis
Delphi-Quellcode:
OnKeyPress
für ein TEdit-Feld. Es ist ein Setup-Fenster und es wid geprüft, ob der Benutzer Änderungen gemacht hat. Diese Procedure wird - weil gleicher Code - von weiteren TEdits aufgerufen. Ich stehe jetzt vor dem Problem...

Der Code der sich bislang in der Procedure HandleKeyPress() befindet gehört in eine eigene Methode (Namensvorschlag DataChanged()) ausgelagert.
Delphi-Quellcode:
Procedure TForm1.UpDown1Changing(Sender: TObject);
Begin
   DataChanged;
End;
Die bisherige Methode HandleKeyPress() wird "entkernt" und ruft natürlich auch DataChanged() auf.
Eigentlich ganz einfach.

Schwedenbitter 14. Sep 2013 11:25

AW: Var ohne Variable bzw. mit Variablen-Dummy
 
Danke für die Vorschläge.

Zitat:

Zitat von Helmi (Beitrag 1228439)
wie ist
Delphi-Quellcode:
HandleKeyPress
definiert?

Ich vermute mal so:
Delphi-Quellcode:
procedure HandleKeyPress(Sender: TObject; c: Char);
.

Fast.
Es ist so definiert
Delphi-Quellcode:
Procedure AccountChange(Sender: TObject; Var Key: Char);
Zitat:

Zitat von Helmi (Beitrag 1228439)
du kannst in der Definition ein "Default" definieren
Delphi-Quellcode:
procedure HandleKeyPress(Sender: TObject; c: Char = '.');
.

Das klappt leider nicht.
Wenn ich im Interface-Teil die Definition per Hand so ändere
Delphi-Quellcode:
Procedure AccountChange(Sender: TObject; Var Key: Char = '.');
, kommt beim Compilieren die Fehlermeldung "E2239: Der Vorgabeparameter 'key' muss als Wert oder Konstante übergeben werden.".

Die Möglichkeit, Code durch z.B.
Delphi-Quellcode:
Const Variable: Boolean = True
erheblich zu verkürzen, ist mir bekannt. Das klappt aber nach meiner Kenntnis eben nur bei Konstanten und nicht bei Variablen. Ich habe das vorübergehend so "gelöst", dass ich eine globale Variable definiert habe und die dann immer als "Opfergabe" mitschicke.

Immerhin spare ich so mehr als 20 Zeilen Code. Das ist auf den ersten Blick nicht viel. Aber mir geht es insoweit auch um die grundsätzliche Frage, ob so etwas möglich ist. Die Möglichkeit das Auszulagern besteht auch, macht es aber wieder unübersichtlicher.

Gruß, Alex

Uwe Raabe 14. Sep 2013 11:43

AW: Var ohne Variable bzw. mit Variablen-Dummy
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1228446)
Die Möglichkeit das Auszulagern besteht auch, macht es aber wieder unübersichtlicher.

Der Aufruf eines Event-Handlers namens HandleKeyPress mit nicht relevanten Parametern innerhalb eines TUpDown-Changing Events ist an Unübersichtlichkeit kaum zu überbieten.

Das Auslagern der Aktion in eine separate Methode (deren Name das angibt, was sie macht) ist genau der richtige Weg den Code lesbarer und wartbarer zu machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 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