Entwickler-Ecke

Sonstiges (Delphi) - Step by Step (F7) alles okay - F9 bringt Fehler


Morpheus1572 - So 13.07.08 13:10
Titel: Step by Step (F7) alles okay - F9 bringt Fehler
Hallo Leutz,

ich habe ein Phänomen, was ich mir nicht erklären kann.

Wenn ich mein Programm mit F7 durchlaufen lasse, klappt alles so wie es sein soll!!!

ABER:
Mache ich einen Start mit F9, dann verhält sich das Programm anders. Ich versuche mal das Prob. zu schildern:

Nachdem das Prog eine Zählschleife durchlaufen hat, soll es einen Button von rot in gelb färben (gekoppelt an einer Bedingung natürlich)! Mit F7 klappt es Bilderbuchmäßig. Bei F9 jedoch muss ich quasi 2 mal in die Schleife gehen um das selbe ergebnis zu bekommen.

Bin ich bekloppt? Für ärztlichen Beistand bin ich wirklich dankbar.

Gruß Morph.


BenBE - So 13.07.08 14:06

Sind alle Variablen initialisiert?
Gibt es keine Zahlenüberläufe oder anderen Seiteneffekte?
Zeig mal etwas Quelltext von der Stelle, die nicht geht ... Du weißt, wir arbeiten mit Quelltext und nicht irgendwelchen Kristallkugeln ;-)


Morpheus1572 - So 13.07.08 14:11


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
var
  StrDBStat, StrStraStat,DatZaehler : String;
  i, z, dz: Integer;
begin
  StrDBStat := IntToStr(DBStat);
  Label2.Caption := 'Der Wert von DBStatus ist: ' + StrDBStat;
//  StrAGStat := IntToStr(AGStat);
//  StrStraStat := IntToStr(StraStat);

  // Hier muss eine intelliegente IF-Abfrage rein!!!

  // Frage1: Ist die DB vorhanden?
  if StrDBStat = '1' then
    begin
      Image1.Picture.LoadFromFile('Btn_gr50x25.ico');
      Label3.Caption := 'Der Status der Datenbank ist okay.';
      BitBtn1.Visible := False;
      // Prüfung ob Einträge in der Tab 'AG'
      ADOQuery1.ConnectionString := ConStr;
      ADOQuery1.Active := False;
      ADOQuery1.SQL.Text := 'SELECT count([AG-ID]) as ANZ FROM AG';
      ADOQuery1.Active := True;
      DatZaehler := ADOQuery1.FieldByName('ANZ').AsString; //.AsInteger später!!

********************>

      // Prüfung2: Ist eine AG gelistet?
      if DatZaehler = '1' then
        begin
          // Hol dir die gelistete AG und prüfe ob die Daten in der
          // Tabelle AGInfo vorhanden sind!
          ADOQuery1.Active := False;
          ADOQuery1.SQL.Text := 'SELECT * FROM AGInfo';
          ADOQuery1.Active := True;
          i := ADOQuery1.Fields.Count;
          dz := 0;
          z :=0;
          while z < i do
            begin
              if ADOQuery1.Fields.Fields[z].AsString = '' then dz := dz+1;
              z := z+1;
            end;
          DatZaehler := IntToStr(dz);
          ShowMessage('Die Anzahl der leeren Felder beträgt: ' + DatZaehler);
          // Wenn Informationen fehlen, zeige gelben Button
          if dz <> 0 then
            begin
              Image2.Picture.LoadFromFile('Btn_g50x25.ico');
              Label5.Caption := 'Es sind AG-Daten erfasst, jedoch noch nicht ' +
                'vollständig! Mit Bearbeiten können Sie sie editieren.'
            end
<*****************************
          else
          // Wenn alle Informationen vorhanden, zeige grünen Button
            begin
              Image2.Picture.LoadFromFile('Btn_gr50x25.ico');
              Label5.Caption := 'Es sind alle Daten der Agentur erfasst!';
              // hier muss noch der EDIT-Button plaziert werden
              BitBtn2.Visible := False;
            end;
        end
      else
        // Sonst zeige roten Button
        begin
          Image2.Picture.LoadFromFile('Btn_r50x25.ico');
          Label5.Caption := 'Es ist bisher keine AG erfasst! Klicken sie auf ' +
                            'Bearbeiten um eine Agentur anzulegen.'
        end;
    // Prüfung ob Einträge in der Tab 'Strasse'
    ADOQuery1.Active := False;
    ADOQuery1.SQL.Text := 'SELECT count(StrID) as ANZ FROM Strasse';
    ADOQuery1.Active := True;
    DatZaehler := ADOQuery1.FieldByName('ANZ').AsString; //.AsInteger später!!
    ShowMessage('Anzahl der gelisteten Straßen: ' + DatZaehler);

    // Prüfung3: sind die Straßenverzeichnisse (für die AG) gelistet?
    if DatZaehler > '0' then            // Muss natürlich '> 0' !!!! lauten!
      begin
        // Wenn Einträge im Straßenverzeichnis vorhanden sind zeige den
        // grünen Button!
        Image3.Picture.LoadFromFile('Btn_gr50x25.ico');
        Label7.Caption := 'Das Straßenverzeichnis ist eingelesen. Es ' +
          'sind derzeit ' + DatZaehler + ' Straßen erfasst.'
        // hier muss noch der EDIT-Button plaziert werden
      end
    else
      // Wenn keine Informationen vorhanden, zeige roten Button
      begin
        Image3.Picture.LoadFromFile('Btn_r50x25.ico');
        Label7.Caption := 'Das Straßenverzeichnis der Agentur ' +
          'ist noch nicht erfasst! Sie müssen erst eine AG anlegen bevor ' +
          'Sie das Verzeichnis einlesen können!'
      end;
    end
  else
    begin
      Image1.Picture.LoadFromFile('Btn_r50x25.ico');
      Label3.Caption := 'Die Datenbank ist entweder nicht vorhanden oder ' +
                        'beschädigt. Wenden Sie sich bitte an Ihren ' +
                        'Administrator.';
      Image2.Picture.LoadFromFile('Btn_r50x25.ico');
      Label5.Caption := 'Es ist bisher keine AG erfasst!';
      BitBtn2.Visible := False;
      Image3.Picture.LoadFromFile('Btn_r50x25.ico');
      Label7.Caption := 'Es ist kein Straßenverzeichnis installiert!'
    end;
end;


Sorry, dachte das wäre ein allgemein bekanntes problem.

was ich nicht verstehe ist eben, dass es im Einzelschrittmodus funzt und im normalen nicht!!!???

die Markierungen zeigen den bestimmten bereich.


BenBE - So 13.07.08 23:34

hmmm, Also ne DB, die dahinter hängt und die erst bei Bedarf geladen wird.
Kannste kurz noch beschreiben, was er da jetzt konkret falsch macht?
Irgendne Exception, weil der Wert von DatZähler nicht stimmt?

Kannst Du mal schauen: ggf. musst Du nach dem ADOQuery.active := True; erst noch nen kleinen Moment warten, bis er die Daten von der DB geholt hat. Schau dazu mal kurz, ob die Daten Synchron oder Asynchron geholt werden


Morpheus1572 - Mo 14.07.08 09:03

Moin @ all,

BenBE DU bist der Hammer. Dadurch das du eben deine Gedanken niedergeschrieben hast statt sie für dich zu behalten, ist mir der Fehler förmlich ins Gesicht gesprungen!!! :idea:

In der Zeile 19 ist der Fehler! diese Zeile muss raus! die Connection wurde schon im Form1 hergestellt und ich mache hier noch einmal eine Verbindung. Ich weiß nicht wie genau das funzt aber wenn ich die Zeile herausnehme macht das Prog genau das was es auch tun soll. und zwar im ersten Durchlauf!

Wie ich schon sagte, es funktionierte ALLES perfekt solange ich step by step vorging. offensichtlich habe ich dem Programm genügend zeit gelassen alles zu aktualisieren, welche es im nomal-Modus wohl nicht bekam. Fehlermeldungen kamen nicht! nachdem ich aber die zweite Conection-Geschichte entfernt habe ist alles chick.

Vielen Dank an Dich! Deine geschriebene Überlegung war der Schlüssel. :D


BenBE - Mo 14.07.08 09:59

Ich hab früher auch mit den ADOs regelmäßig gearbeitet und da auch manchmal ähnliche Effekte gehabt ...

Außerdem ist unterschiedliches Verhalten abhängig von der Ausführungszeit eigentlich fast immer ein Zeichen von Timing-Problemen; und das einzige, was bei Dir Timing-Abhängig war, ist das Fetchen der Daten aus der Connection ;-)