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/)
-   -   TListView - Denkfehler beim Löschen einzelner TListItem (https://www.delphipraxis.net/170189-tlistview-denkfehler-beim-loeschen-einzelner-tlistitem.html)

TiGü 4. Sep 2012 16:30

TListView - Denkfehler beim Löschen einzelner TListItem
 
Hallo,

sieht jemand meinen Denkfehler?
Ich will einen ListItem-Eintrag entfernen über ListView.Items.Delete(...), wenn der SearchString schon in den SubItems der ListView vorhanden ist.
Jedoch gelingt es mir nicht, die entsprechenden Einträge aus der ListView zu entfernen. Es verbleiben Einträge mit SubItems.Count > 1.

Oder bin ich total auf dem Holzweg?
Vielen Dank!

Delphi-Quellcode:
procedure CreateOrAddSearchStringToListItem(ASearchString, AName : string; ASearchID : Int64);
  var
    MyListItem : TListItem;
    SearchStringIndex : Integer;
  begin
    MyListItem := MyListView.FindCaption(0, AName, False, True, False);

    if Assigned(MyListItem) then
    begin
      // Schon vorhandenen ListItem-Eintrag um weitere SearchStrings- und IDs erweitern!
      SearchStrungIndex := MyListItem.SubItems.IndexOf(ASearchString);

      if SearchStringIndex = -1 then
      begin
        // Diesen SearchString gibt es im ListItem-Eintrag noch nicht, daher ergänzen (Add)
        MyListItem.SubItems.AddObject(ASearchString, TObject(ASearchID));
      end else
      begin
        // Diesen SearchString gibt es schon, das ListItem muss gelöscht werden
        MyListView.Items.Delete(MyListItem.Index); //<------ Problem: hier bleiben aber noch SubItems übrig!!!!
      end;
    end
    else
    begin
      // ListItem-Eintrag noch nicht vorhanden -> neu anlegen (Create)!
      MyListItem := MyListView.Items.Add;
      MyListItem.Caption := AName;
      MyListItem.SubItems.AddObject(ASearchString, TObject(ASearchID));
    end;
  end;

Uwe Raabe 4. Sep 2012 16:45

AW: TListView - Denkfehler beim Löschen einzelner TListItem
 
Mir ist das große Ganze noch nicht klar. Was ich aber aus dem Code lese ist, daß ein SearchEintrag angelegt wird, wenn er nicht als SubItem des Items "Name" existiert oder wenn das Item "Name" nicht existiert.

Was ich nicht verstehe ist, warum das ganze Item gelöscht wird, wenn der SearchString als SubItem in Item "Name" existiert. Ich hätte es noch nachvollziehen können, wenn lediglich das SubItem entfernt wird.

Zur Zeit passiert einfach folgendes:

Delphi-Quellcode:
CreateOrAddSearchStringToListItem('SubItem1', 'Item1');
CreateOrAddSearchStringToListItem('SubItem2', 'Item1');
CreateOrAddSearchStringToListItem('SubItem1', 'Item1');
CreateOrAddSearchStringToListItem('SubItem2', 'Item1');
  1. Item1 - SubItem1 wird angelegt
  2. Item1 - SubItem2 wird angelegt
  3. Item1 - wird gelöscht (mitsamt allen SubItems)
  4. Item1 - SubItem2 wird angelegt (weil Item1 nicht existiert)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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