Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   if Schleife? (https://www.delphipraxis.net/148974-if-schleife.html)

Sanguis 11. Mär 2010 19:05


if Schleife?
 
Hallo,

ich wurde gebeten, zu dem Thema einen neuen Thread zu eröffnen.
Code ist folgender:
Delphi-Quellcode:
Ini := TIniFile.Create(form1.programmdirectory.Caption+'..\game.ini');
Ausgelesen := Ini.ReadString('Global','LangFile','' ); //1
stream := Ini.ReadString('Global', 'Stream', '');
music := Ini.ReadInteger('Global', 'Music', 0);
slot := Ini.ReadString('Global', 'Slot', '');
musik := Ini.ReadString('Global', 'Musik', '');
firststart := ini.ReadInteger('Global', 'firststart', 0);

form1.Caption := IntToStr(firststart);
firststart := 0;
if(firststart = 0) then begin
if MessageDlg('Do you want to play Backgroundmusic ?', mtConfirmation, [mbYes, mbNo], 0)=mrYes then
begin
 Musik :='1';
 ini.WriteString('Global', 'Musik', '1');
 ini.WriteString('Global', 'firststart', '0');
 end
 else begin
 Musik:='0';
  ini.WriteString('Global', 'Musik', '0');
  ini.WriteString('Global', 'firststart', '0');
 end;
end;
 Ini.Free;
Das Problem ist, die Variable "firststart" wird einfach übergangen. Die dazugehörige if Schleife, macht einfach nichts und ich weiß nicht wieso. Haltepunkte in der if Schleife, funzen nicht.

Gruß,
Andreas

Wolfgang Mix 11. Mär 2010 19:08

Re: if Schleife?
 
If-Schleifen gibt es nicht!

DeddyH 11. Mär 2010 19:09

Re: if Schleife?
 
Setz doch mal den Haltepunkt VOR die If-Schleife :mrgreen:. Wo geht es dann lang? Wird evtl. noch ein Ereignis ausgelöst?

haentschman 11. Mär 2010 19:17

Re: if Schleife?
 
[OT]
Zitat:

If-Schleife...
...war das nicht :cheers: für alle ?

:cheer:
[/OT]

wo und wie hast du firststart deklariert ?

fatalerror 11. Mär 2010 19:33

Re: if Schleife?
 
Bitte formatiere deinen Quelltext korrekt!

Hier dein Problem:
du liest firststart aus der Ini-Datei aus und definierst anschliessend firststart:= 0


Delphi-Quellcode:
  firststart := ini.ReadInteger('Global', 'firststart', 0);
  form1.Caption := IntToStr(firststart);
  firststart := 0; // diese Zeile entfernen

haentschman 11. Mär 2010 19:36

Re: if Schleife?
 
:gruebel: trotzdem sollte firststart 0 sein und die Bedingung erfüllt sein.

Sanguis 11. Mär 2010 19:37

Re: if Schleife?
 
Hallo,

firststart ist in einer ini Datei definiert. Vor der if Schleife (ich bleib dabei, das ist ne Schleife fg) steht aber auch noch firststart:=0;... ist ein Integer Feld. Der Haltepunkt auf dieser Zeile funktioniert, das Programm hält an.

Gruß,
Andreas

Sanguis 11. Mär 2010 19:40

Re: if Schleife?
 
Zitat:

Zitat von haentschman
:gruebel: trotzdem sollte firststart 0 sein und die Bedingung erfüllt sein.

Eben... das ist das, was ich nicht kapiere. firstart := 0; hab ich nur zum testen reingesetzt.

omata 11. Mär 2010 19:43

Re: if Schleife?
 
Zitat:

Zitat von Sanguis
...ich bleib dabei, das ist ne Schleife...

lernresistent?

Du willst also gar nichts dazulernen? Dann brauchen wir dir ja eigentlich auch nicht weiterhelfen.

haentschman 11. Mär 2010 19:43

Re: if Schleife?
 
Vermutung:
In deinem restlichen Quelltext fehlt irgendwo ein "end". Dadurch kommen machmal komische Programmabläufe zustande.
Formatiere deinen gesamten Quelltext mal etwas übersichtlicher und kontrolliere die begin/end Blöcke.

:hi:

Beispiel um die Zusammengehörigkeit der begin/end besser zu sehen, da untereinander
Delphi-Quellcode:
form1.Caption := IntToStr(firststart);
firststart := 0;
if(firststart = 0) then
  begin
    if MessageDlg('Do you want to play Backgroundmusic ?', mtConfirmation, [mbYes, mbNo], 0)=mrYes then
      begin
        Musik :='1';
        ini.WriteString('Global', 'Musik', '1');
        ini.WriteString('Global', 'firststart', '0');
      end
        else
          begin
            Musik:='0';
            ini.WriteString('Global', 'Musik', '0');
            ini.WriteString('Global', 'firststart', '0');
          end;
  end;

Sanguis 11. Mär 2010 19:53

Re: if Schleife?
 
Zitat:

Zitat von omata
Zitat:

Zitat von Sanguis
...ich bleib dabei, das ist ne Schleife...

lernresistent?

Du willst also gar nichts dazulernen? Dann brauchen wir dir ja eigentlich auch nicht weiterhelfen.

Unsinn, nur ist das nicht meine Frage. Ich hab es als Schleife gelernt und kann damit eig. prima leben.

Die Neuformatierung bringt leider nix...

mirage228 11. Mär 2010 19:55

Re: if Schleife?
 
Hast du besagte Zeile (firststart := 0) entfernt? Wie lautet dein überarbeiteter/neuformatierter Code-Abschnitt?

haentschman 11. Mär 2010 19:57

Re: if Schleife?
 
Zitat:

Die Neuformatierung bringt leider nix...
:gruebel: du hast in 10 Minuten den gesamten Quelltext neu formatiert und kontrolliert ?

omata 11. Mär 2010 20:11

Re: if Schleife?
 
Zitat:

Zitat von Sanguis
...Ich hab es als Schleife gelernt und kann damit eig. prima leben.

Das kann nicht sein (niemand mit Ahnung würde dir das so beibringen), es sei denn du hast es dir selber beigebracht. In beiden Fällen würde ich mich ja mal etwas bewegen, nur so kannst du dich sinnvoll weiterentwickeln. Aber vielleicht willst du das gar nicht.

Sanguis 11. Mär 2010 20:18

Re: if Schleife?
 
Zitat:

Zitat von mirage228
Hast du besagte Zeile (firststart := 0) entfernt? Wie lautet dein überarbeiteter/neuformatierter Code-Abschnitt?

Nein, die Zeile ist noch drin.
Am Code hab ich nix geändert, außer ihn zu formatieren. Dafür hab ich nen IDE Plugin, deshalb ging es so schnell.

Wolfgang Mix 11. Mär 2010 20:21

Re: if Schleife?
 
Schleifen wiederholen Befehlssequenzen, IF-Abfragen durchlaufen Befehlsequenzen 1 mal.
Wenn du "If-Schleife" nicht aus deinem Wortschatz streichst, wirst du noch öfter anecken.

Ich habe einmal gelernt: "Der Strom sucht sich den kürzesten Weg".
Genau so ein Quatsch! Das disqualifiziert dich lebenslang als Laien!

[Edit] Sorry, die Wortkombination macht mich kirre [/Edit]

Muetze1 11. Mär 2010 20:25

Re: if Schleife?
 
Zitat:

Zitat von Wolfgang Mix
Wenn du "If-Abfrage" nicht aus deinem Wortschatz streichst, wirst du noch öfter anecken.

Nee, dann wird er noch eher anecken. Er sollte mal lieber "If-Schleife" streichen und mit "If-Abfrage" ersetzen :drunken:

Sanguis 11. Mär 2010 20:26

Re: if Schleife?
 
Ok, kapiert... wie heisst es dann?

Muetze1 11. Mär 2010 20:28

Re: if Schleife?
 
Zitat:

Zitat von Sanguis
Ok, kapiert... wie heisst es dann?

Lesen kannste aber schon noch, oder? :wall:

alzaimar 11. Mär 2010 20:28

Re: if Schleife?
 
"Bedingte Verzeigung", "IF-Abfrage", "IF-Sequenz",... "IF-Befehl".... sowas in der Art. Aber eben keine Schleife.

Da das nun geklärt ist...

haentschman 11. Mär 2010 20:31

Re: if Schleife?
 
...ist ja alles gut und schön, hilft aber nicht bei dem Problem :zwinker:

Hänge doch mal die gesamte Unit an. Mit diesem Ausschnitt kann man nicht wirklich weiterkommen.

Sanguis 11. Mär 2010 20:38

Re: if Schleife?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab die Unit angehängt, ist aber nicht grade klein :)

mirage228 11. Mär 2010 20:54

Re: if Schleife?
 
Entferne Zeile 366 (firststart := 0; ) und versuche es erneut. Dann sollte es ggf. klappen :)

Sanguis 11. Mär 2010 20:58

Re: if Schleife?
 
Nein, klappt leider nicht...

Balu der Bär 11. Mär 2010 21:01

Re: if Schleife?
 
Zitat:

Zitat von Wolfgang Mix
Wenn du "If-Schleife" nicht aus deinem Wortschatz streichst, wirst du noch öfter anecken.

Du würdest weniger anecken wenn du anstatt eines sinnlosen
Zitat:

Zitat von Wolfgang Mix
If-Schleifen gibt es nicht!

den User lieber normal und in einem freundlichen Ton aufklären würdest.

mirage228 11. Mär 2010 21:07

Re: if Schleife?
 
Der Pfad könnte ggf. falsch sein, verwende "IncludeTrailingPathDelimiter". Weiterhin solltest Du eher auf firststart = 1 prüfen. Die Abfrage nach der Musik soll ja beim ersten Start kommen ;-)

Delphi-Quellcode:
  Ini := TIniFile.Create(IncludeTrailingPathDelimiter(Self.programmdirectory.Caption) + '..\game.ini');
  try
    Ausgelesen := Ini.ReadString('Global', 'LangFile', ''); // 1
    stream := Ini.ReadString('Global', 'Stream', '');
    music := Ini.ReadInteger('Global', 'Music', 0);
    slot := Ini.ReadString('Global', 'Slot', '');
    musik := Ini.ReadString('Global', 'Musik', '');
    firststart := Ini.ReadInteger('Global', 'firststart', 0);

    Self.Caption := IntToStr(firststart);
    if (firststart = 1) then
    begin
      if MessageDlg('Do you want to play Backgroundmusic ?', mtConfirmation,
        [mbYes, mbNo], 0) = mrYes then
      begin
        musik := '1';
        Ini.WriteString('Global', 'Musik', '1');
        Ini.WriteString('Global', 'firststart', '0');
      end
      else
      begin
        musik := '0';
        Ini.WriteString('Global', 'Musik', '0');
        Ini.WriteString('Global', 'firststart', '0');
      end;
    end;
  finally
    Ini.Free;
  end;

DeddyH 11. Mär 2010 21:08

Re: if Schleife?
 
Ich muss leider zugeben, dass ich keine Ursache für dieses Verhalten finden kann. Es handelt sich um eine lokale Variable des korrekten Typs, die Abfrage sollte IMO auf jeden Fall erreicht werden, die Bedingung trifft auch zu, da explizit vorher sichergestellt :gruebel:. Es könnte höchstens sein, dass ich aufgrund der ziemlich gruseligen Formatierung einen Fall übersehen habe.

haentschman 11. Mär 2010 21:10

Re: if Schleife?
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab das ganze mal eingerückt und nach den begin /end geschaut. Sieht soweit in Ordnung aus. Dann weis ich auch nicht mehr. :gruebel:

Sanguis 11. Mär 2010 21:11

Re: if Schleife?
 
Leider hilft das nicht, der Pfad stimmt, die Ini Datei wird auch korrekt ausgelesen. Das Ergebnis steht ja auch in form1.caption, kann ich also überprüfen. Und das stimmt.

mirage228 11. Mär 2010 21:15

Re: if Schleife?
 
Also beim Start der Anwendung (FormCreate bzw. FormShow) hatte ich manchmal Probleme mit Application.MessageBox. Vielleicht trifft dieses Problem ja auch hier bei MessageDlg zu:

Versuch mal statt
Delphi-Quellcode:
      if MessageDlg('Do you want to play Backgroundmusic ?', mtConfirmation,
        [mbYes, mbNo], 0) = mrYes then
dieses:
Delphi-Quellcode:
      if MessageBox(Handle, 'Do you want to play Backgroundmusic ?', 'Confirmation',
        MB_YESNO or MB_ICONQUESTION) = IDYES then

DeddyH 11. Mär 2010 21:16

Re: if Schleife?
 
Angeblich überspringt der Debugger aber die Abfrage (wobei ich mir das nur schwer vorstellen kann).

mirage228 11. Mär 2010 21:18

Re: if Schleife?
 
Zitat:

Zitat von DeddyH
Angeblich überspringt der Debugger aber die Abfrage (wobei ich mir das nur schwer vorstellen kann).

Wenn es das selbe Problem ist das ich früher da mal mit den gekapselten Messageboxen hatte und er nicht hineinsteppt, dann überspringt der Debugger evtl. wirklich diese Stelle... :gruebel:
Es sei denn Du meinst die Abfrage da rüber (if firstatrt = ...), das sollte wirklich nicht übersprungen werden. (Falls der Wert stimmt)

Sanguis 11. Mär 2010 21:22

Re: if Schleife?
 
Zitat:

Zitat von mirage228
Also beim Start der Anwendung (FormCreate bzw. FormShow) hatte ich manchmal Probleme mit Application.MessageBox. Vielleicht trifft dieses Problem ja auch hier bei MessageDlg zu:

Versuch mal statt
Delphi-Quellcode:
      if MessageDlg('Do you want to play Backgroundmusic ?', mtConfirmation,
        [mbYes, mbNo], 0) = mrYes then
dieses:
Delphi-Quellcode:
      if MessageBox(Handle, 'Do you want to play Backgroundmusic ?', 'Confirmation',
        MB_YESNO or MB_ICONQUESTION) = IDYES then

Ha! Danke, das wars! So funktioniert es!
Tausend Dank, du bist meine Rettung.
Nu muß nur noch mein anderer Thread gehn.

Gruß,
Andreas

DeddyH 11. Mär 2010 21:25

Re: if Schleife?
 
:wall: Schön, wenn man die Infos so zeitig erhält. Ich war die ganze Zeit davon ausgegangen, dass die Abfrage nicht erfüllt wird.

Sanguis 11. Mär 2010 21:29

Re: if Schleife?
 
Zitat:

Zitat von DeddyH
:wall: Schön, wenn man die Infos so zeitig erhält. Ich war die ganze Zeit davon ausgegangen, dass die Abfrage nicht erfüllt wird.

Das dachte ich ja auch. Wobei ich den verdacht hatte, das es an der MessageBox liegt, hab ich auch in nem Beitrag geschrieben.
Aber da der Haltepunkt übergangen wurde, dachte ich es liegt am if-Statement.

Sir Rufo 11. Mär 2010 21:41

Re: if Schleife?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich habe da mal mit Delphi 2010 Professional (Win 7 x64 Prof, Win Vista x64 Prof) ein kleines Test-Projekt angelegt und da wird der MessageDlg korrekt angezeigt.

Wäre ja jetzt interessant zu wissen, ob das an der Delphi-Version liegt oder am Betriebssystem (scheint wohl am Delphi zu liegen).

@Sanguis: Compiliere doch mal das angehängte Projekt und teile uns mit, ob das Programm direkt beim Start den MessageDlg anzeigt.

mirage228 11. Mär 2010 21:43

Re: if Schleife?
 
Das trat bei mir zumindest noch bei Delphi 7 oder Delphi 2005 auf (Welches genau, vermag ich allerdings nicht mehr zu sagen). Aber wenn es unter Delphi 2010 funktioniert, ist das ja schon mal erfreulich :)

Sanguis 11. Mär 2010 21:56

Re: if Schleife?
 
Das angehängte Programm zeigt keine MessaeBox. Aber ist ja zum Glück gelöst, auch wenn ich es nicht logisch finde *g*

Ich nutze Delphi2007

samso 12. Mär 2010 06:46

Re: if Schleife?
 
Also, ich kann bestätigen, dass es bei Delphi 2007 einen Bug mit der Funktion "TApplication.GetActiveFormHandle" gibt. Der Fehler kann wie folgt reproduziert werden.

(Vergleiche: QC #75756/#78400/#78883: No exceptionmessage shown if form is released)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Show;
  Form2.Release;
  raise Exception.Create('Keine Fehlermeldung - oder doch?');
end;
Die Ursache des Problems ist, dass die CM_RELEASE-Message in der Message-Warteschlange steckt und dann erst beim Anzeigen der Messagebox abgearbeitet wird. Da die Messagebox als Parent genau das zu schließende Fenster hat, wird sie ebenfalls geschlossen - also nie angezeigt.

Ich verstehe allerdings nicht, wie man das hier besprochene Verhalten reproduzieren kann.

Nun meine Frage: Hat jemand ein Beispielprogramm, welches den Fehler (MessageDlg wird nicht angezeigt - MessageBox wird aber angezeigt) von Sanguis mit Delphi 2007 reproduziert?

thepaine91 12. Mär 2010 10:54

Re: if Schleife?
 
samso siehe Beitrag von Sir Rufo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.
Seite 1 von 2  1 2      

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