![]() |
TListview - EAccessViolation
Hallo!
Ich habe mal wieder ein Problem. Ich hab auf meiner Form ein Listview, dem Listview habe ich zwei Columns zugeordnet. Das Listview befülle ich mit folgender Procedure:
Delphi-Quellcode:
Und nun mein Problem:
procedure AllUser(Listview: TListView);
var ADODataSet: TADODataSet; ListItem : TlistItem; begin ADODataSet:= TADODataSet.Create(nil); ADODataSet.Connection:=DataModule_DBConnect.ADOConnection1; try ADODataSet.CommandText:='SELECT * from tbl_username order by username'; ADODataSet.Open; rs:=ADODataSet.Recordset; Listview.Items.BeginUpdate; while not rs.EOF do begin ListItem:=Listview.Items.Add; ListItem.Caption:=VarToStr(rs.Fields['username'].Value); ListItem.SubItems.Add(VarToStr(rs.Fields['admin'].Value)); rs.MoveNext; end; Listview.Items.EndUpdate; except on E:Exception do begin MDialog(E.Message, mtError, [mbOK]); end; end; ADODataSet.Close; ADODataSet.Free; end; Wenn ich beim Listview in einem Bereich klicke wo nix ist, also keine Spalte, bekomme ich eine EAccessViolation! Wieso? Woran liegt das? Das OnClick-Event behandle ich so:
Delphi-Quellcode:
So sieht die Fehlermeldung aus:
procedure TForm_UserAnlegen.ListView1Click(Sender: TObject);
var i: integer; begin i:=ListView1.Selected.Index; if ListView1.Items.Count>=0 then begin Edit2.Text:=ListView1.Items[i].Caption; if ListView1.Items[i].SubItems[0] = '1' then CheckBox2.Checked:=True else CheckBox2.Checked:=False; end; end; ![]() MfG schuetze09 |
Re: TListview - EAccessViolation
wenn du in einen leeren bereich klickst ist der index = -1
die -1 verwendest du in deinem Feld asl index und da knallts also vorher noch überprüfen ob index <> -1 ist |
Re: TListview - EAccessViolation
Das sollte helfen:
Delphi-Quellcode:
Gruß
procedure TForm_UserAnlegen.ListView1Click(Sender: TObject);
var i: integer; begin i:=ListView1.Selected.Index; if i >= 0 then begin if ListView1.Items.Count>0 //wenn Count = 0 dann sind keine Items enthalten then begin Edit2.Text:=ListView1.Items[i].Caption; if ListView1.Items[i].SubItems.Count > 0 then begin if ListView1.Items[i].SubItems[0] = '1' then CheckBox2.Checked:=True else CheckBox2.Checked:=False; end else raise Exception.Create('Keine Subitems da!'); end else raise Exception.Create('Keine Items da!'); end else raise Exception.Create('Index kleiner 0!'); end; |
Re: TListview - EAccessViolation
Hallo,
leutet mir ein, aber leider tuts nicht... :? Ich habe denn kompletten Code so kopiert wie er hier ist, geht aber nicht! Obwohl es eigentlich tun sollte... Was soll ich machen? MfG schuetze09 |
Re: TListview - EAccessViolation
So, habe das Problem gelöst! Ich nehme jetzt nicht das onClick-Event, sondern SelectItem!
Delphi-Quellcode:
...manchmal sieht man den Wald vor lauter Bäumen nicht...
procedure TForm_UserAnlegen.ListView1SelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean); begin if Selected then begin Edit2.Text:=Item.Caption; if StrToInt(Item.SubItems[0]) = 0 then CheckBox2.Checked:=False else CheckBox2.Checked:=True; end; end; MfG schuetze09 |
Re: TListview - EAccessViolation
Moin!
Das Problem im OnClick Handler was (ich frage mich wirklich wieso) keiner gesehen hat war, das Selected an sich NIL ist, wenn nichts ausgewählt ist. Da ist dann aber schlecht bei einem Nil Objekt auf die Eigenschaft Index zu zu greifen, oder?
Delphi-Quellcode:
MfG
i: integer;
begin i:=ListView1.Selected.Index; // wenn Selected schon Nil ist - woher soll er sich dann Index herholen? Muetze1 |
Re: TListview - EAccessViolation
Jo, da hast du völlig recht!
:) MfG schuetze09 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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