Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ungewollter doppelter Formularaufruf (https://www.delphipraxis.net/171267-ungewollter-doppelter-formularaufruf.html)

Mojito 29. Okt 2012 11:24


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

Bummi 29. Okt 2012 11:33

AW: ungewollter doppelter Formularaufruf
 
Delphi-Quellcode:
repeat
until not FrmSettings.execute ;

Mojito 29. Okt 2012 11:40

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.

SirThornberry 29. Okt 2012 11:48

AW: ungewollter doppelter Formularaufruf
 
Ergänzt du bitte in deinem Beitrag die Delphi-Tags?

nuclearping 29. Okt 2012 11:58

AW: ungewollter doppelter Formularaufruf
 
Zitat:

Zitat von Mojito (Beitrag 1188889)
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.

Hast du den Code von Bummi überhaupt getestet? :stupid:

Ausserdem:
Delphi-Quellcode:
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;
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:

Im Umkehrschluss kannst du dich natürlich auch selbst fragen, warum du 2x auf "OK" klicken musst: Weil auch 2x die Funktion aufgerufen wird? ;)

Mojito 29. Okt 2012 12:14

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

nuclearping 29. Okt 2012 12:24

AW: ungewollter doppelter Formularaufruf
 
Delphi-Quellcode:
function TFrmSettings.execute:boolean;
begin
  [...] if not (FrmSettings.SpnEdtTaskNumber.Value < 1) ... then
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.

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.

DeddyH 29. Okt 2012 12:29

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.

Mojito 29. Okt 2012 20:47

AW: ungewollter doppelter Formularaufruf
 
Da habt ihr recht, verstanden:)


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