Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListview - EAccessViolation (https://www.delphipraxis.net/34596-tlistview-eaccessviolation.html)

schuetze09 25. Nov 2004 09:53


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:
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;
Und nun mein Problem:
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:
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;
So sieht die Fehlermeldung aus:
http://home.arcor.de/andre.rauls/EAccessViolation.jpg

MfG
schuetze09

der-C 25. Nov 2004 10:00

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

Leuselator 25. Nov 2004 10:04

Re: TListview - EAccessViolation
 
Das sollte helfen:
Delphi-Quellcode:
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;
Gruß

schuetze09 25. Nov 2004 10:20

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

schuetze09 25. Nov 2004 13:11

Re: TListview - EAccessViolation
 
So, habe das Problem gelöst! Ich nehme jetzt nicht das onClick-Event, sondern SelectItem!
Delphi-Quellcode:
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;
...manchmal sieht man den Wald vor lauter Bäumen nicht...

MfG
schuetze09

Muetze1 25. Nov 2004 15:56

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:
  i: integer;
begin
  i:=ListView1.Selected.Index; // wenn Selected schon Nil ist - woher soll er sich dann Index herholen?
MfG
Muetze1

schuetze09 26. Nov 2004 05:36

Re: TListview - EAccessViolation
 
Jo, da hast du völlig recht!
:)

MfG
schuetze09


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz