Entwickler-Ecke

Programmierwerkzeuge - D2006: Debugger spint bei Checklistbox.checked


Kralle - So 24.07.11 09:58
Titel: D2006: Debugger spint bei Checklistbox.checked
Moin,

wenn ich den Status eines Eintrages einer "Checklistbox" mittels "Checklistbox.checked[i]" überwachen will,
dann verhält sich der Debugger wie ein Blinker (geht - geht nicht).

Mal zeigt es direkt im "OnKlickCheck" den richtigen Zustand und beim nächsten Durchlauf wieder nicht.

Was kann Ursache sein?

Gruß Heiko


jaenicke - So 24.07.11 13:39

Das kann ich mit Delphi 2006 nicht reproduzieren. :nixweiss:
Alle Projektoptionen sind auf Standard, also auch die Optimierung an. Es geht aber alles.


Kralle - So 24.07.11 16:27

Hallo Jaenicke,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das kann ich mit Delphi 2006 nicht reproduzieren. :nixweiss:
Alle Projektoptionen sind auf Standard, also auch die Optimierung an. Es geht aber alles.


Kannst Du mir "Deine" Standard-Einstellungen zukommen lassen? Vielleicht habe ich irgendetwas verstellt.

Gruß Heiko


jaenicke - So 24.07.11 17:36

Da gibt es eigentlich nichts zu verstellen. :gruebel:
Ich hänge mal einen Screenshot an.

Wie genau äußert sich das Problem denn? Also in welchem Code an welcher Stelle?

Mein Test sieht so aus, ich habe gerade beim ersten Eintrag das Häkchen gesetzt:

D2006CheckListBoxDebugger

Wie du siehst stimmt links alles.


Kralle - So 24.07.11 17:53

Moin,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie genau äußert sich das Problem denn?


Dahingehend, das der Debugger beim Haltepunkt in der Procedure des "OnClickCheck"-Ereignisses mal anzeigt, das der entsprechende Einrag "true" und manchmal "false" und das ohne das am Quellcoe auch nur ein Buchstabe geändert wurde.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Also in welchem Code an welcher Stelle?



Delphi-Quelltext
1:
2:
3:
4:
procedure TF_Main.CLB_HeaderClickCheck(Sender: TObject);
  begin
    Zeilennr_aktualiseren;
  end;

und der "Breakpoint" ist beim Procedureaufruf, d.h. es ist noch keine Zeile des Codes in dem Moment ausgeführt worden.


Zitat:
Mein Test sieht so aus, ich habe gerade beim ersten Eintrag das Häkchen gesetzt:

[Bild: D2006CheckListBoxDebugger]

Wie du siehst stimmt links alles.


Tja, bei einem Start sieht es auch so richtig aus und wenn ich dann denke, okay jetzt klappt es und ich könnte mit der Suche des Fehlers in nachfolgenden Code beginnen, dann klappt es wieder nicht.
Wobei nicht nur der Debugger dann einen falschen Wert anzeigt, sondern auch Abfragen auf den Wert, entsprechend falsch reagieren.

Aus lauter Frust, wollte ich mit schon die "Delphi XE Demo" runterladen und damit testen, aber der Server reagiert nicht.

Gruß Heiko


jaenicke - So 24.07.11 18:23

In dieser Zeile ist die Variable i gar nicht verfügbar, wenn du dort anhältst. Welche Ausdrücke wertest du denn dort aus?

Kannst du vielleicht einen Screenshot oder ein Beispielprojekt anhängen und genau schreiben was du in welcher Reihenfolge gemacht hast? :gruebel:


Kralle - So 24.07.11 19:59

Hallo,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In dieser Zeile ist die Variable i gar nicht verfügbar, wenn du dort anhältst. Welche Ausdrücke wertest du denn dort aus?

Checklistbox.checked[1] in "Lokale Variablen"

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Kannst du vielleicht einen Screenshot oder ein Beispielprojekt anhängen und genau schreiben was du in welcher Reihenfolge gemacht hast? :gruebel:


"Leider" läuft das anbei liegenden Testprogramm OHNE Fehler des Debuggers.
Ich setze einen Breakpoint auf:

Delphi-Quelltext
1:
2:
3:
procedure TForm4.CheckListBox1Click(Sender: TObject);
begin
   if Checklistbox1.Checked[0] = true then


und überwache die Variable
Zitat:
Checklistbox1.Checked[0]
in der "Liste überwachter Ausdrücke".
Dann starte ich das Programm und setze beim ersten Checkboxlist-Eintrag einen Haken.

So und jetzt kommt es bei dem eigentlichen Programm bereits an diesem Punkt vor, das der Debugger mal meint der Haken wäre nicht gesetzt und mal das er gesetzt wäre.

Nur was kann dazu führen, das der Debugger bei einem Start funktioniert und mal nicht?

Wenn Du den Haken schnell änders, dann wird zwar der Test in der Box geändert, aber der Labeltext kommt nicht mit. Ist ist das bei Dir auch so?


Gruß Heiko


jaenicke - So 24.07.11 20:11

user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du den Haken schnell änders, dann wird zwar der Test in der Box geändert, aber der Labeltext kommt nicht mit. Ist ist das bei Dir auch so?
Ja, aber das liegt ja nur daran, dass du das nicht bei jeder Änderung aktualisierst. Warum schreibst du das in OnClick :shock: statt wie es ja wohl sinnvoller wäre in OnClickCheck (wo es auch funktioniert)? :gruebel:

OnClick wird nicht notwendigerweise zum richtigen Zeitpunkt ausgelöst, weil es nichts mit dem Setzen oder Entfernen der Häkchen zu tun hat.

// EDIT:
Nebenbei hast du da noch einen großen Fehler drin:
user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
procedure TForm4.CheckListBox1Click(Sender: TObject);
begin
   if Checklistbox1.Checked[0] = true then
Der Vergleich mit Booleanwerten ist nicht nur unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637


Kralle - Mo 25.07.11 07:29

Moin,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ja, aber das liegt ja nur daran, dass du das nicht bei jeder Änderung aktualisierst. Warum schreibst du das in OnClick :shock: statt wie es ja wohl sinnvoller wäre in OnClickCheck (wo es auch funktioniert)? :gruebel:


Okay, das habe ich hier in dem Testprojekt falsch gemacht. im Hauptprojekt gibt es nur das "OnClickCheck".

Zitat:
// EDIT:
Nebenbei hast du da noch einen großen Fehler drin:

Delphi-Quelltext
1:
2:
3:
procedure TForm4.CheckListBox1Click(Sender: TObject);
begin
   if Checklistbox1.Checked[0] = true then

Der Vergleich mit Booleanwerten ist nicht nur unlogisch, sondern falsch.

Wie so unlogisch? Oder soll das "Unlogisch" sein, weil es die "= true" Abfrage hat?

Das mit dem "falsch" habe ich nach dem Lesen von den unten stehenden Beiträgen verstanden und werde es ändern.

Gruß Heiko


jaenicke - Mo 25.07.11 09:53

user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:
Wie so unlogisch? Oder soll das "Unlogisch" sein, weil es die "= true" Abfrage hat?
Ja, nur wegen dem Vergleich mit true. Warum das unlogisch ist, hatte ich in dem letzten Link ja auch geschrieben. :mrgreen: