Items.Add gibt dir ein TListItem zurück. Dieses kannst du direkt ansprechen und musst somit nicht per Index drauf zugreifen.
Also an stelle von:
Delphi-Quellcode:
var
lListItem: TListItem;
begin
MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
MSObj.MSDateiName:= MSDateiName;
MSObj.MSLesen:= i+1; // Datensatz auslesen
lListItem := MSAnzeigenListView.Items.Add();
lListItem.Caption := MSObj.MaNr+MSObj.MSNr;
lListItem.Data := MSObj;
lListItem.SubItems.Add(MSObj.MaNr);
lListItem.SubItems.Add(MSObj.MSNr);
lListItem.SubItems.Add(MSObj.MaBez);
lListItem.SubItems.Add(MSObj.MaGruppe1);
// Anzeige des Richtigen Icons
If MSObj.DarstellungsArt = 0 then
begin
lListItem.ImageIndex:= 1;
end;
Zitat:
Noch ein Hinweis, mir ist klar das ich auch mit TListItem arbeiten könnte und die Methode
ListView.Items.Add; verwenden könnte, dies hat aber den Nachteil das ich die Daten ins Object kopieren müsste.
versteh ich nicht
es ist doch das gleiche ob du AddItem verwendest oder Add einzeln und anschließend Item.Data und Item.Caption zuweist. AddItem macht ja auch nichts anderes:
Zitat:
procedure TCustomListView.AddItem(Item: String; AObject: TObject);
begin
with Items.Add do
begin
Caption := Item;
Data := AObject;
end;
end;
ich versteh nicht warum man diese unbedingt 2 zeilen sparen will und sich damit solche Probleme bzw. schwierigkeiten einhandelt.
Aber wenn du unbedingt bei deiner Variante bleiben willst versteh ich auch nicht das Problem. Im ersteren Quelltext greifst du mit i drauf zu. Wenn du mit AddObject ein neues Item hinzufügst wird dieses auch nur ans Ende angehangen. Dementsprechend ist
i = ListView.Items.Count - 1;
Was aber wie gesagt völlig unnötig ist. Denn durch den Zugriff mit Items.Item[i] werden intern auch GetMethoden aufgerufen die das ganze nur langsamer machen als ein direktzugriff auf das Item. Denn durch Items.Item[i] wird jedesmal erst das Items abgerufen (was du ja auch gleich hamm könntest wenn du Add verwendest) und danach passiert das gleiche. Also unnötige Schritte.