Einzelnen Beitrag anzeigen

SneakyBagels
(Gast)

n/a Beiträge
 
#1

ListView Data befüllen?

  Alt 4. Jun 2017, 15:01
Ich möchte gerne meinen Code etwas besser gestalten.
Ich habe eine ListView und aktuell füge ich einfach nur neue Einträge hinzu und greife auf die Caption zu.

Ich möchte das gerne über eine Liste regeln denn das hätte auch den netten Effekt, dass ich an anderer Stelle im Programm auf das Laden aus einer ini-Datei verzichten könnte.

Reicht hier eine TObjectList wo ich jedes erstellte Object einfach so dranhänge( teils Pseudo-Code):
Delphi-Quellcode:
aItem := ListView1.Items.Add;
aItem.Caption := 'ABC';
aItem.SubItems.Add('123');

// Hier nun ein Item für die ObjectList erzeugen und ...
aItem.Data := MeinObjectListItem;
Später greife ich dann auf MeineObjectList[irgendeinindex].irgendeinproperty zu. Ist das richtig so?
Acha das alles noch zusammen mit einem Record ist ja klar.

Edit1
Hier mal wie ich es aktuell teste!
Delphi-Quellcode:
type
 PListViewData_Record = ^TListViewData_Record;

 TListViewData_Record = packed record
  Caption: string;
 end;

// Button1
var
 aListViewObjectList_Record_Item: PListViewData_Record;
begin
 New(aListViewObjectList_Record_Item);
 aListViewObjectList_Record_Item.Caption := 'Caption-' + IntToStr(Random(123));
 ListView1.Selected.Data := aListViewObjectList_Record_Item;
end;

// Button2
ShowMessage(PListViewData_Record(ListView1.Selected.Data).Caption);

// Button3
var
 i: Integer;
begin
 for i := ListView1.Items.Count - 1 downto 0 do
  if ListView1.Items[i].Data <> nil then
   Dispose(PListViewData_Record(ListView1.Items[i].Data));
Edit2
Hier meine neue Version. Vielleicht ist die besser?

Delphi-Quellcode:
type
 PListViewData_Record = ^TListViewData_Record;

 TListViewData_Record = class
  Caption: string;
 end;

var
 aListViewData_List: TList<TListViewData_Record>;

// Liste erzeugen und Eintrag hinzufügen
var
 aListViewObjectList_Record_Item: TListViewData_Record;
begin
 // Liste erzeugen
 if aListViewData_List = nil then
  aListViewData_List := TList<TListViewData_Record>.Create;

 // Object erzeugen (Caption und alle SubItems) und an Data hängen
 aListViewObjectList_Record_Item := TListViewData_Record.Create;
 aListViewObjectList_Record_Item.Caption := ListView1.Selected.Caption;
 ListView1.Selected.Data := aListViewObjectList_Record_Item;

 // Objekt der Liste hinzufügen
 aListViewData_List.Add(aListViewObjectList_Record_Item);
 ShowMessage('Added: ' + aListViewObjectList_Record_Item.Caption + sLineBreak + 'Index in TList: ' + IntToStr(aListViewData_List.Count - 1));
end;

// Data Caption anzeigen
begin
 // Test: Data Caption anzeigen
 if ListView1.Selected.Data <> nil then
  ShowMessage(TListViewData_Record(ListView1.Selected.Data).Caption);

// Alle Objekte und Liste löschen
var i: Integer;
begi
 for i := aListViewData_List.Count - 1 downto 0 do
  aListViewData_List.Items[i].Free;

 // Liste freigeben
 aListViewData_List.Free;
 aListViewData_List := nil;

// Einen Eintrag in der Liste finden
 function getIndexInList(sCaption: string): SmallInt;
 var
  i: Integer;
 begin
  Result := -1;
  for i := 0 to aListViewData_List.Count - 1 do
   if AnsiSameText(aListViewData_List.Items[i].Caption, sCaption) then
    Result := i;
 end;

var
 iIndex: Integer;
begin
 iIndex := getIndexInList('123456');
 if (iIndex > -1) and (iIndex <= aListViewData_List.Count - 1) then
  ShowMessage('Caption: ' + aListViewData_List.Items[iIndex].Caption + sLineBreak + 'Index in TList: ' + IntToStr(iIndex));
end;

Geändert von SneakyBagels ( 4. Jun 2017 um 16:33 Uhr)
  Mit Zitat antworten Zitat