AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ungewollter doppelter Formularaufruf

Ein Thema von Mojito · begonnen am 29. Okt 2012 · letzter Beitrag vom 29. Okt 2012
Antwort Antwort
Mojito

Registriert seit: 29. Okt 2012
39 Beiträge
 
#1

ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 11:24
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

Geändert von TBx (30. Okt 2012 um 07:17 Uhr) Grund: DElphi-Tags gesetzt, bitte zukünftig selber machen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 11:33
Delphi-Quellcode:
repeat
until not FrmSettings.execute ;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Mojito

Registriert seit: 29. Okt 2012
39 Beiträge
 
#3

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 11:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 11:48
Ergänzt du bitte in deinem Beitrag die Delphi-Tags?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 11:58
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?

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.

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

Registriert seit: 29. Okt 2012
39 Beiträge
 
#6

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 12:14
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
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 12:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 12:29
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Mojito

Registriert seit: 29. Okt 2012
39 Beiträge
 
#9

AW: ungewollter doppelter Formularaufruf

  Alt 29. Okt 2012, 20:47
Da habt ihr recht, verstanden
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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