Entwickler-Ecke

Sonstiges (Delphi) - ListView innerhalb if-Abrage erzeugt Absturz ???


padawan - Fr 12.11.10 17:55
Titel: ListView innerhalb if-Abrage erzeugt Absturz ???
Hallo Delphi-Freunde!

Ich Nix mehr verstehn..:

Per ListView(9 Spalten) liste ich versch. Daten, klappt alles bestens.

Nach dem Löschen eines Eintrags
Der gelöschte Datensatz(Record) wird in der Datei nicht gelöscht,
sondern das 8. Bit von BitMaske(Word-Variable im Record) gesetzt- Add(BitMaske, 255)

Das Neu-Listen der ListView soll nur bei NICHT-gesetztem 8.Bit erfolgen,
so werden die gelöschten Einträge nicht angezeigt- so denke ich.
Quittung = Name von Record


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if (Quittung.BitMaske < 255then
   with Listview1.Items.Add do
        begin
        Caption := DateToStr(Quittung.Datum0);
        SubItems.Add(s[0]);
        //... usw
        end;


Auch die Abfrage:

Delphi-Quelltext
1:
if (Quittung.BitMaske And 255) = 0 then                    

erzeugt einen Absturz.

Mit dieser if-Abfrage stürzt das Prog ab mit der Meldung-
habe Foto darüber im Dateianhang.

Habe versuchsweise eine 2. ListView platziert, um nur
die gelöschten Daten zu listen. Da klappt es:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if (Quittung.BitMaske >= 255then
   with Listview2.Items.Add do
        begin
        Caption := DateToStr(Quittung.Datum0);
        SubItems.Add(s[0]);
        //...
        end;


Weiß nicht mehr weiter.?:
Wenn ich da einen Tip bekommen könnte, wäre toll!!!

Gruß Uli


jaenicke - Fr 12.11.10 18:41

user profile iconpadawan hat folgendes geschrieben Zum zitierten Posting springen:
Mit dieser if-Abfrage stürzt das Prog ab mit der Meldung-
habe Foto darüber im Dateianhang.
Du kannst in der Meldung auch einfach Strg + C drücken um diese als Text zu kopieren. ;-)

Eine Zugriffsverletzung an einer solchen Stelle ist jedenfalls in der Regel eine Folge davon, dass ein Objekt nicht initialisiert wurde. Quittung wird vermutlich nil sein.

Setze doch einfach einen Haltepunkt auf die Zeile und schau nach was los ist. ;-)


padawan - Fr 12.11.10 20:03

Naja, wie ich schon geschrieben habe, geht die gleiche Geschichte wunderbar,
wenn es nur nicht um die ListView1 geht, bei ListView2 klappt es fehlerfrei.

Nun, ich versuche es mal weiter.


Gerd Kayser - Sa 13.11.10 07:20

user profile iconpadawan hat folgendes geschrieben Zum zitierten Posting springen:
Der gelöschte Datensatz(Record) wird in der Datei nicht gelöscht,
sondern das 8. Bit von BitMaske(Word-Variable im Record) gesetzt- Add(BitMaske, 255)

Wenn Du das erste Bit als Bit 0 bezeichnest, dann hat das 8. Bit den Wert 256, ansonsten den Wert 128, wenn das 1. Bit als Bit 1 bezeichnet wird. Aber niemals den Wert 255.
Setzen von Bit 8:

Delphi-Quelltext
1:
BitMaske or 256                    

Auslesen mit:

Delphi-Quelltext
1:
BitMaske and 256                    


padawan - Mi 17.11.10 16:18

Ja richtig!
Bei 255 sind alle Bits gesetzt.
War mein Denkfehler.

Vielen Dank!!!