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;