Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Di 30.07.02 19:39 
Wie kann man auf die SubItems von TListView zugreifen. Bisher ist es mir nur gelungen, Subitems zwar hinzuzfügen, oder ganz zu löschen (alle), aber nicht ein einzelnes zu bearbeiten. Hab mir gedacht, da SubItems ja vom Typ TStrings ist, das man dann mit einem Index darauf zugreifen kann, hat aber nicht funktioniert. Kann mir da bitte einer helfen?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 30.07.02 19:42 
O'rallY hat folgendes geschrieben:
Hab mir gedacht, da SubItems ja vom Typ TStrings ist, das man dann mit einem Index darauf zugreifen kann, hat aber nicht funktioniert.
Das ist auch eigentlich der richtige Weg! Poste doch mal etwas Code wo und wie Du auf die SubItems zugreifst.

Gruß
cbs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: Di 30.07.02 19:46 
Tag auch

ausblenden Quelltext
1:
listview1.Items[1].SubItems[1]:= 'test';					

so greifst du auf die zeile 2 und subitem 2 zu, also zeile 2 und spalte 3
Arakis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: Di 30.07.02 19:47 
Hi user defined image,
so sollte es gehen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
  item:TListItem;
  st: TStringList;
begin
  item := self.ListView1.Items.Add;
  item.Caption:='cappi';
  item.SubItems.Add('sub1');
  item.SubItems.Add('sub2');

  st:=TStringList.Create;
  st.Assign(self.ListView1.Items.Item[0].SubItems);
  showmessage(st.Strings[0]);
  st.free;
end;


Bis dann
user defined image

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: Di 30.07.02 20:20 
Wie Du auf Listviews zugreifen kannst scheint Dir ja klar zu sein. Um ListItems zu erstellen benutze den Code von Arakis.

Im folgenden gehe ich davon aus, daß ListItem ein gültiger Listeneintrag ist.

Subitems werden in der Eigenschaft Subitems vom Listeneintrag gespeichert. Diese Eigenschaft ist ein TStrings Nachfahre. Vom Handling vergleichbar mit der Lines Eigenschaft von Memofeldern. Damit die Untereigenschaften angezeigt werden mußt Du ListView.ViewStyle auf vsReport setzen.

Doch nun zum Code.
Um Untereigenschaften zu erstellen verwende die Add Methode von TStrings und übergebe den Text als Parameter von Add. Beachte: Untereigenschaften können nur Strings sein! Dir steht allerdings natürlich frei die Werte hin und her zu konvertieren, wie z.B. von String nach Integer und umgekehrt.
Du kannst auch jedem Untereintrag ein Objekt über AddObject zuweisen. Näheres findest dazu in der Delphi Hilfe zu TStrings bzw TStringlist. Somit kann der String nur die Darstellung des Objektes sein. Ändert sich das Objekt - änderst Du auch den String (manuell).
Die Stringliste Subitems wird vom Listenobjekt automatisch erstellt - darum brauchst Du Dich nicht zu kümmern.

Um auf die Subitems zugreifen zu können greifst Du einfach arraylike per eckigen Klammern auf die Zeilen der Stringlist zu.
ListItem.SubItems[0] greift also auf die erste Untereigenschaft zu, ListItems.SubItems[1] auf die Zweite, usw.

Hierbei ist aber zu beachten, daß Du nicht davon ausgehen darfst, daß Untereigenschaften existieren. Bevor Du also direkt auf Untereigenschaften zugreifst solltest Du immer erst prüfen ob die Eigenschaft existiert, und zwar nach folgendem Schema (SubItemIndex ist der Index der Untereigenschaft):
ausblenden Quelltext
1:
2:
if SubItemIndex<ListItems.Subitems.count then 
  ProcessSubItem(ListItems.Subitems[SubItemIndex]);

Der Grund ist eigentlich einfach: Bei TListView müssen nicht alle Untereinträge wirklich existieren. Ebenso kann auch ein Untereintrag leer sein. Verwende dazu einfach
ausblenden Quelltext
1:
ListView.Subitems.Add('');					


Noch ein letzter Tipp wenn Du die Einträge OnTheFly erstellen möchtest: Benutze ListView.Items.BeginUpdate und ListView.Items.EndUpdate, damit unterbindest Du das sofortige Neuzeichnen wenn sich ein Eintrag ändert.