![]() |
ObjectList
Hallo Freunde*innen,
das wollte ich eigentlich fragen, als das Problem mit den 2 Fenstern dazwischen kam. Ich will den Umgang mit TObjectList lernen und habe ein Telefonbuch entwickelt. Nicht gerade originell aber das ist mir egal. Ich habe alles gelernt, Anlegen, Daten anhängen, einfügen löschen, sortieren, speichern und öffnen.. Nur eines kann ich noch nicht richtig einen Eintrag korrigieren. Ich habe diesen Weg gewählt aber das geht doch sicher einfacher.
Delphi-Quellcode:
Willie.
type
TTel = record Name: string; VName: string; Nr: string; Mobil: string; G: Integer; end; TTelAdress = class(TObject) private Tel: TTel; public constructor Create; destructor Destroy; override; end; TTelList = class(TObjectList) function AddTel(Tel: TTel): Integer; procedure SetTel(Index: Integer; Tel: TTel); function GetTel(Index: Integer): TTel; end; ... procedure TTellist.SetTel(Index: Integer; Tel: TTel); var TelA: TTelAdress; begin TelA:=TTelAdress.Create; TelA.Tel:=Tel; self.Delete(Index); self.Insert(Index,TelA); end; |
AW: ObjectList
Unabhängig von der Frage finde ich die Konstruktion etwas unglücklich.
TTelAdress ist nur dafür da um den Record TTel in ein Objekt zu packen. Da hätte man doch direkt ein Objekt TKontakt machen können und fertig ist das Ganze:
Delphi-Quellcode:
So mal als Minimal-Beispiel weil eigentlich ist es ja nicht sauber einfach alle Variablen Public zu machen.
type
TKontakt = Object public Name: string; VName: string; Nr: string; Mobil: string; G: Integer; end; |
AW: ObjectList
Ich würde hier garkeine Objektliste verwenden, sondern eine TCollection mit TCollectionItems.
Erstmal verwaltet die von Haus aus alles selber, vor allem auch das Erstellen und Freigeben der Items und gerade hier kann es auch von Vorteil sein, dass Collections sich bereits von Haus aus serialisieren lassen. (TReader/TWriter) |
AW: ObjectList
Record ist überflüssig. Zumindest in dieser Konstellation.
Wie Jumpy bereits gesagt hat, pack deine Variablen direkt in die Klasse.
Delphi-Quellcode:
Lesen und Schreiben der Daten kannst du recht einfach über TelBuch[Index].Name oder TelBuch[index].TelNummer.
Type
TTelEintrag=class private FName: string; FTelNummer: string; Procedure SetName(value: string); Procedure SetTelNummer(value: string); published property Name: string read FName write SetName; property TelNummer: string read FTelNummer write SetTelNummer; end; TTelBuch=class(TObjectList<TTelEintrag>); Wenn du eine Liste hast, dann wirst du in den meisten Fällen diese Liste irgendwie abbilden. Im simpelsten Fall in einer Listbox. Laden könntest du die vielleicht so:
Delphi-Quellcode:
Wenn du jetzt einen Eintrag der ListBox selektierst könnte du auf die Daten ungefär so zugreifen:
Listbox.clear;
for i:=0 to TelBuch.Count-1 do ListBox.Items.Add(TelBuch[i].Name);
Delphi-Quellcode:
(oder .TelNummer)
TelBuch[ListBox.ItemIndex].Name
Du kannst diese Daten halt in ein Control laden z.B.
Delphi-Quellcode:
nach der Änderung z.B: über
edit1.Text:=TElBuch[ListBox.ItemIndex].Name
Delphi-Quellcode:
.
TelBuch[ListBox.ItemIndex].Name:=edit1.Text;
Einfach mal ein bisschen mit rumspielen. Du kannst natürlich in dem Object auch anderen Objecte als properties verwenden z.B. eine TStringList oder TNummernList (eine weitere TObjectList, die du natürlich vorher deklariert haben solltest), usw. Dann solltest du den Constructor Create und den Destructor Destoy mit in deine Klasse aufnehmen und dort entsprechen diese Objecte erzeugen bzw. Freigeben.
Delphi-Quellcode:
Wichtig ist im Interface-Abschnitt beim Destroy nicht das override zu vergessen.
.
. . public constructor Create; destructor Destroy; override; . . . implementation constructor TTelEintrag.Create; begin inherited; FNummernList:=TNummernList.Create; end; destructor TTelEintrag.Destroy; begin FNummernList.free; inherited; end; |
AW: ObjectList
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal eine meiner Meinung nach ausreichende Mini-Demo für die ObjectList (Telefonbuch, hinzufügen/löschen) erstellt. Es ist auch eine ListView zur Anzeige vorhanden. Die kann aber eigentlich ignoriert werden weil die mehr schlecht als recht ist.
Es geht nur um das Hinzufügen und Löschen! |
AW: ObjectList
Zitat:
Wenn Record, dann die generische TList<>, TDictionary<> oder TStack<> und das Objekt weglassen.
Delphi-Quellcode:
var
L: TList<TTel>; R: TTel; L := TList<TTel>.Create; R.Name := 'Hans'; R.Tel := '0190666666'; L.Add(R); R := L.First // L[0] R := L.Last // L[i.Count-1] i := L.IndexOf(R); // wobei ein TDictionary<> zum Suchen besser ist, außer man baut eine eigene Suchfunktion, welche auch Einzelfelder suchen kann if L[i].Name = 'Hans' then R := L[i]; if R.Name = 'Hans' then L[i] := R; // überschreiben (dein Delete + Insert) L.Free; |
AW: ObjectList
Hallo, jetzt bekomme ich das hin. Danke.
Ich darf mal kurz abschweifen: ich habe oft Briefe als PDF eingescannt und mir von Edge vorlesen lassen. Nach dem letzten Update von Windows steht diese Option nicht mehr zur Verfügung. Das trifft mich. Gruß Willie. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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-2025 by Thomas Breitkreuz