![]() |
An ListView ein SubItem anhängen
Hallo,
ich füge mit der Methode AddItem ein neues ListenEintrag in eine ListView ein. Wenn die Daten aus einem Stream gelesen werden, habe ich kein Problem:
Delphi-Quellcode:
Ich habe dann ein Problem, wenn ein neuer Eintrag an die Liste angehängt werden soll
MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
MSObj.MSDateiName:= MSDateiName; MSObj.MSLesen:= i+1; // Datensatz auslesen MSAnzeigenListView.AddItem(MSObj.MaNr+MSObj.MSNr,MSObj); MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaNr); MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MSNr); MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaBez); MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaGruppe1); // Anzeige des Richtigen Icons If MSObj.DarstellungsArt = 0 then begin MSAnzeigenListView.Items.Item[i].ImageIndex:= 1; end;
Delphi-Quellcode:
Das funktioniert auch, aber mir ist nun nicht klar, wie ich die SubItems für diesen neuen Eintrag in die ListView bekomme.
if (NOT(blIdNrVorhanden)) then
begin MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen MSAnzeigenListView.SmallImages:= ImageList1; MSObj.MaNr:= MaNrComboBox3.Text; MSObj.MSNr:= MSNrComboBox4.Text; MSObj.MABez:= MaBezComboBox1.Text; MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text; MSAnzeigenListView.AddItem(MSObj.MaNr+MSObj.MSNr,MSObj); Mit
Delphi-Quellcode:
geht’s nicht, weil der Index hinter Item fehlt, nur wie bekomme ich diesen Index für diesen neuen Eintrag?
MSAnzeigenListView.Items.Item.SubItems.Add(MSObj.MSNr);
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. Bis bald Chemiker |
Re: An ListView ein SubItem anhängen
Hallo,
sollte doch irgendwie so funktionieren
Delphi-Quellcode:
je nachdem auch
MSAnzeigenListView.Items.Item[DeinIndex].SubItems.Add(MSObj.MSNr);
Delphi-Quellcode:
MSAnzeigenListView.Items.Item[Listview1.Selected.Index].SubItems.Add(MSObj.MSNr);
|
Re: An ListView ein SubItem anhängen
Hallo uwewo,
danke für die schnelle Antwort. Mit
Delphi-Quellcode:
bekomme ich leider eine Zugriffverletzung.
MSAnzeigenListView.Items.Item[MSAnzeigenListView.Selected.Index].SubItems.Add(MSObj.MaNr);
Bis bald Chemiker |
Re: An ListView ein SubItem anhängen
Hallo,
Zitat:
Delphi-Quellcode:
Grüße vom marabu
// ...
if not blIdNrVorhanden then begin MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen MSAnzeigenListView.SmallImages:= ImageList1; MSObj.MaNr:= MaNrComboBox3.Text; MSObj.MSNr:= MSNrComboBox4.Text; MSObj.MABez:= MaBezComboBox1.Text; MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text; with MSAnzeigenListView.Items.Add do begin Caption := MSObj.MaNr + MSObj.MSNr; Data := MSObj; SubItems.Add('...'); end; |
Re: An ListView ein SubItem anhängen
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:
Zitat:
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
Delphi-Quellcode:
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.
i = ListView.Items.Count - 1;
|
Re: An ListView ein SubItem anhängen
Pflichte meinen Vorrednern bei, und auch hier brauchst du keinen Index:
Das:
Code:
ist von hinten durch die Brust ins Bein geschossen dasselbe wie
MSAnzeigenListView.Items.Item[MSAnzeigenListView.Selected.Index]...
Code:
MSAnzeigenListView.Selected...
|
Re: An ListView ein SubItem anhängen
Hallo,
danke für die Antwort. Mit
Delphi-Quellcode:
wird das SubItem nicht angezeigt.
MSAnzeigenListView.Items.Item[MSAnzeigenListView.Items.Count-1].SubItems.Add(MSObj.MaNr);
Ich habe die Methode ListView.AddItem verwendet, weil sonst die Daten ins Object kopiert werden müssen und mit der Methode nur einfach angehängt werden. Ich werden das ganze noch mal Testen, vielleicht habe ich ja irgendetwas übersehen beim ersten Versuch. Bis bald Chemiker |
Re: An ListView ein SubItem anhängen
kopiert wird da nichts. wie gesagt ruft addobject auch nur Items.Add auf und weißt Data und caption zu
|
Re: An ListView ein SubItem anhängen
Hallo,
habe das ganze noch auf ListView.Item.add umgeschrieben.
Delphi-Quellcode:
und einzelne Einträge so
for I := 0 to AnzahlDatenSaetze - 1 do
begin MSObj:= TMSV1.Create; MSObj.MSDateiName:= MSDateiName; MSObj.MSLesen:= i+1; // Datensatz auslesen ListIt:= MSAnzeigenListView.Items.Add(); ListIt.Caption:= MSObj.MaNr+MSObj.MSNr; ListIt.Data:= MSObj; ListIt.SubItems.Add(MSObj.MaNr); ListIt.SubItems.Add(MSObj.MSNr); ListIt.SubItems.Add(MSObj.MaBez); ListIt.SubItems.Add(MSObj.MaGruppe1); ListIt.ImageIndex:= MSObj.DarstellungsArt; end;
Delphi-Quellcode:
und es funktioniert ohne Problem, weis auch nicht was ich beim erstenmal Falsch gemacht habe.
if (NOT(blIdNrVorhanden)) then
begin MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen MSAnzeigenListView.SmallImages:= ImageList1; MSObj.MaNr:= MaNrComboBox3.Text; MSObj.MSNr:= MSNrComboBox4.Text; MSObj.MABez:= MaBezComboBox1.Text; MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text; MSObj.DarstellungsArt:= ComboBoxEx1.ItemIndex; ListIt:= MSAnzeigenListView.Items.Add; ListIt.Caption:= MSObj.MaNr+MSObj.MSNr; ListIt.SubItems.Add(MSObj.MaNr); ListIt.SubItems.Add(MSObj.MSNr); ListIt.SubItems.Add(MSObj.MaBez); ListIt.SubItems.Add(MSObj.MaGruppe1); ListIt.ImageIndex:= MSObj.DarstellungsArt; ListIt.Data:= MSObj; end Vielen dank für die Tipps. Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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 by Thomas Breitkreuz