![]() |
AccessViolation mit Checkbox aber warum?
Guten Tag Delphianer,
Ich habe einige Checkboxen womit ich verschiedene Kategorieen (TV - Kids, DVD-r unsw) einer Listview anzeichen und ausblenden moechte. Jetzt mache ich das mittels StringListen, bei einem Click auf die Checkbox wird geprueft ob Sie markiert ist oder nicht und der Entsprechende Code wird dan ausgefuehrt. Standard sind die Checkboxen markiert(Checked := true). Hier mein Code von einer Checkbox:
Delphi-Quellcode:
Wenn die Checkbox demarkiert ist und ich wieder die Checkbox clicke gibt es eine AccesViolation ab der Zeile wie oben beschrieben im Code.
procedure THaupt.KidsClick(Sender: TObject);
var z, i : Integer; slLines, slFields, FieldList : TStringList; begin if Kids.Checked = false then begin slFields := TStringList.Create; slLines := TStringList.Create; for z := ListView.Items.Count-1 downto 0 do if ListView.Items[z].SubItems[1] = 'TV - Kids' then begin slFields.Assign(Listview.Items[z].SubItems); slFields.Insert(0, Listview.Items[z].Caption); slLines.Add(slFields.CommaText); ListView.Items[z].Delete; end; Listview.Invalidate; showmessage(slLines.CommaText); //<-- Items in StringListe werden korrekt angezeigt// end else begin FieldList := TStringList.Create; for i := 0 to Pred(slLines.Count) do //<-- Ab hier gibt es eine AccessViolation// begin FieldList.CommaText := slLines[i]; with ListView.Items.Add do begin Caption := FieldList[0]; FieldList.Delete(0); SubItems.Assign(FieldList); end; end; slLines.Free; slFields.Free; FieldList.Free; end; end; Meine Frage lautet wie kann das sein? Vielen Dank im voraus. MFG Lucius. |
Re: AccessViolation mit Checkbox aber warum?
Ich behaupte mal ganz locker, das du eine Warnung erhältst, die etwa so lautet:
"slLines könnte undefiniert sein" Also der Fehler ist: Du greifst im "else"-Zweig auf slLines zu. Du erzeugst es aber nur im If-Zweig. Daher kann er im else-Zweig nur fehlerbehaftet darauf zugreifen. :) |
Re: AccessViolation mit Checkbox aber warum?
Hi chaosben, deine Behauptung stimmt nicht ganz.
Zitat:
Delphi-Quellcode:
also muessten die Items doch noch im else Zweig vorhanden sein wenn ich Sie wieder in der Listview anzeigen moechte?
slLines.Free;
slFields.Free; FieldList.Free; Gruss Lucius. |
Re: AccessViolation mit Checkbox aber warum?
nur mal so als Denkanstoss:
und wann wird slLines angelegt? |
Re: AccessViolation mit Checkbox aber warum?
Hallo RavenIV,
Zitat:
Delphi-Quellcode:
oder verstehe ich dich falsh?
if Kids.Checked = false then
begin slFields := TStringList.Create; slLines := TStringList.Create; //<---- Hier// |
Re: AccessViolation mit Checkbox aber warum?
oh Mann .. du kostest mich Nerven :stupid:
slLines ist eine lokale Variable und wird nur im If-Zweig erstellt. Daher kannst du nur im IF-Zweig unbeschadtet auf dieses Objekt zugreifen. Wenn du es im Else-Teil tust, kommt eine AV. Und meine angedeutete Warnung ist eine, die vom Compiler kommt. Nicht vom Exception-Handling. Die einfachste und sicherste Lösung ist folgende:
Delphi-Quellcode:
procedure THaupt.KidsClick(Sender: TObject);
var z, i : Integer; slLines, slFields, FieldList : TStringList; begin try slLines := TStringList.Create; //<--- Vor dem If erzeugen if Kids.Checked = false then begin slFields := TStringList.Create; for z := ListView.Items.Count-1 downto 0 do if ListView.Items[z].SubItems[1] = 'TV - Kids' then begin slFields.Assign(Listview.Items[z].SubItems); slFields.Insert(0, Listview.Items[z].Caption); slLines.Add(slFields.CommaText); ListView.Items[z].Delete; end; Listview.Invalidate; showmessage(slLines.CommaText); end else begin FieldList := TStringList.Create; for i := 0 to Pred(slLines.Count) do //<--- Und hier unbeschadet verwenden begin FieldList.CommaText := slLines[i]; with ListView.Items.Add do begin Caption := FieldList[0]; FieldList.Delete(0); SubItems.Assign(FieldList); end; end; slFields.Free; FieldList.Free; end; end; finally slLines.Free; //<--- und in jedem Falle freigeben end; end; |
Re: AccessViolation mit Checkbox aber warum?
Kids.Checked ist beim Start, wie Du sagtest = false. Wenn Du nun das erste Mal clickst, läuft er in den else Zweig und slLines ist nicht initialisiert. Bei Deiner Lösung müsstest Du die Stringlisten-Objekte Global deklarieren, sonst funktioniert der else nie!
chaosben: Du Schneller... |
Re: AccessViolation mit Checkbox aber warum?
Habs Global deklariert und jetzt gehts, dummer Denkfehler entschuldigung dafuer.
Danke fuer eure Hilfe und Antworten. Lucius. |
Re: AccessViolation mit Checkbox aber warum?
Für Denkfehler braucht man sich nicht entschuldigen. Die kommen einfach vor. Und bei Unsereins alle Weile. :stupid:
//edit: Die Methode, es global zu deklarieren ist unschön, denn dadurch belegst du unnötig lange Speicherplatz, den du nicht nutzt. |
Re: AccessViolation mit Checkbox aber warum?
Hi chaosben, kann ich auch noch irgendwie im Code einbauen das er sich den ListviewIndex merkt von dem Item das rausgenommen wird und es spaeter wieder an der selben Stelle einfuegt?
Delphi-Quellcode:
Besten Dank.
if ListView.Items[z].SubItems[1] = 'TV - Kids' then
begin slCheckFields.Assign(Listview.Items[z].SubItems); slCheckFields.Insert(0, IntToStr(z) + Listview.Items[z].Caption); //IntToStr(z)// slCheckLines.Add(slCheckFields.CommaText); ListView.Items[z].Delete; end; MFG Lucius. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr. |
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