![]() |
ungewollter doppelter Formularaufruf
Hallo Liebe Delphi-Freunde,
als Anfänger bin ich mal wieder an einem (einfachen) Problem kleben geblieben. Ich habe eine Formular erstellt, indem man Einstellungen machen kann und dieses Formular über "OK" bzw. "Abbruch" wieder schließen kann. Die dazugehörige Funktion sieht dafür wie folgt aus:
Delphi-Quellcode:
// ruft das Formular modal auf, bis gueltige Eingabe oder Abbruch und gibt
// zurueck, ob OK oder Abbrechen geklickt wurde function TFrmSettings.execute:boolean; begin case ShowModal of mrOk: begin if not (FrmSettings.SpnEdtTaskNumber.Value<1) and not (FrmSettings.SpnEdtTaskNumber.Value>10) and (FrmSettings.RdGrpOperator.ItemIndex<>-1) then begin execute:=FALSE; ShowMessage(Correct); end else begin execute:=TRUE; ShowMessage(Fail); end; end; mrCancel: execute:=FALSE; end; end; Diese Funktion wird nun in der MainUnit aufgerufen:
Delphi-Quellcode:
procedure TFrmMain.BtnSettingsClick(Sender: TObject);
begin repeat FrmSettings.execute; until not FrmSettings.execute ; Das Problem ist, das immer 2 mal auf OK oder ABBRUCH geklickt werden muss bevor sich das Formular schließt. Habt ihr eine Idee, was ich da übersehen habe? Vielen vielen Dank |
AW: ungewollter doppelter Formularaufruf
Delphi-Quellcode:
repeat
until not FrmSettings.execute ; |
AW: ungewollter doppelter Formularaufruf
Vielen Dank für die Antwort.
Die Schleife brauche ich jedoch, damit das Fenster offen bleibt sofern Falsche oder keine Angaben gemacht wurden und dann OK gedrückt wird. Nehme ich die Schleife raus so schließt sich das Fenster unabhängig davon immer sofort. |
AW: ungewollter doppelter Formularaufruf
Ergänzt du bitte in deinem Beitrag die Delphi-Tags?
|
AW: ungewollter doppelter Formularaufruf
Zitat:
Ausserdem:
Delphi-Quellcode:
In dem Moment, wo die Schleife prüft, ob "FrmSettings.execute" TRUE / FALSE ergibt, wird die Funktion aufgerufen und somit der Code in ihr ausgeführt. Daher MUSS das funktionieren. :mrgreen:
function TFrmSettings.execute:boolean;
begin // Warum verwendest du nicht den Standardrückgabeparameter einer Funktion "Result"? Den Funktionsnamen zu nehmen ist zwar das gleiche, aber // Result hat ein paar Vorteile und die alte Variante stammt noch mit aus den Anfangszeiten von Pascal, ist also "Deprecated" (Veraltet) case ShowModal of mrOk: begin // Warum greifst du innerhalb der Klasse auf die globale Variable der Form zu? if not (SpnEdtTaskNumber.Value < 1) and not (SpnEdtTaskNumber.Value > 10) and (RdGrpOperator.ItemIndex <> -1) then Result := FALSE else Result := TRUE; end; mrCancel: Result := FALSE; end; end; [...] procedure TFrmMain.BtnSettingsClick(Sender: TObject); begin repeat until not FrmSettings.execute; end; Im Umkehrschluss kannst du dich natürlich auch selbst fragen, warum du 2x auf "OK" klicken musst: Weil auch 2x die Funktion aufgerufen wird? ;) |
AW: ungewollter doppelter Formularaufruf
Danke dir nuclearpinkg! Das Funktioniert. Ich habe Bummis kurze aber passende Antwort falsch interpretiert im Sinne das die Schleife überflüssig ist.
Ich habe Pascal tatsächlich zuvor gelernt und habe daher diesen Weg des Aufruf des Funktionsnamens gewählt. Mit der globalen Variable kann ich dir nicht ganz folgen. In der case-Anweisung überprüfe ich ob die Formulareinstellungen stimmen Als BWLer dauert bei mir in der Informatik alles ein wenig länger:o |
AW: ungewollter doppelter Formularaufruf
Delphi-Quellcode:
Das was du hier machst ist: Du sitzt auf dem Vordersitz deines Autos und willst etwas vom Rücksitz holen. Du lässt vorn und hinten das Fenster runter, lehnst dich aus dem Fenster der Vordertür und greifst durch das Fenster der Hintertür, um an den Gegenstand zu gelangen.
function TFrmSettings.execute:boolean;
begin [...] if not (FrmSettings.SpnEdtTaskNumber.Value < 1) ... then Du befindest dich hier bereits in der Klasse TFrmSettings und hast dementsprechend bereits Zugriff auf alle Eigenschaften, Methoden, etc. dieser Klasse. FrmSettings dagegen ist eine global angelegte Variable, die diese Klasse TFrmSettings repräsentiert, damit man "von aussen" auf sie und ihre Eigenschaften / Funktionen zugreifen kann. |
AW: ungewollter doppelter Formularaufruf
Anders ausgedrückt: die benannte Variable FrmSettings einfach durch self ersetzen oder ganz weglassen (inkl. dem anschließenden Punkt), dann wird auch die eigene Instanz verwendet. Das Problem bei dieser globalen Variablen ist, dass sie ja nicht zwingend verwendet werden muss, man kann ja auch eine Instanz anlegen und sie "Erbsensuppe" oder "TheHolyHandgranade" nennen. In dem Fall existiert die benannte Instanz FrmSettings u.U. überhaupt nicht, d.h. beim Zugriff gibt es eine AV. Existiert sie hingegen doch, bearbeitet man am Ende die falsche Instanz, was eigentlich noch schlimmer ist, da man diesen Fehler noch schlechter finden kann.
|
AW: ungewollter doppelter Formularaufruf
Da habt ihr recht, verstanden:)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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-2025 by Thomas Breitkreuz