![]() |
Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
im Rahmen einer Schulaufgabe (das ist keine Hausaufgaben-Frage, keine Angst ;) ), soll ich Funktionen zum Abspeichern und Laden einer Liste schreiben, die die anderen Schüler dann zum Programmieren eines kleinen Vokabel-Trainers benutzen werden. Gegeben ist mir dafür eine u_list Unit, die die Programmierung einer Liste enthält, in der beliebige Daten gespeichert werden können (es werden TObjects gespeichert). Theoretisch soll ich nun Methoden schreiben, mit denen ich Vokabeln abspeichern (und Laden) kann. Das ist auch erstmal nicht das wirkliche Problem. Ich fände es allerdings extrem unschön, in einer "allgemeinen" Liste (beliebige Daten können gespeichert werden) Methoden zu schreiben, die exakt einen Typ von Daten speichern/laden können, da damit irgendwie die Vielseitigkeit der Listenklasse abhanden kommt. Somit komme ich zu meiner ersten Frage: Kann man Methoden schreiben, die allgemeine Daten abspeichern können (ein TObject), und diese exakt gleich wieder einlesen? Da ich keine Möglichkeiten kenne, Daten allgemein abzuspeichern, habe ich mir gedacht, ich erstelle einfach eine Klasse TStringList, die von der Liste erbt. An den Stellen, wo vorher die Klasse TObject vorkam, habe ich das ganze umgeschrieben und Strings verwendet. Um möglichst wenig Code zu wiederholen, habe ich die jeweiligen Funktionen und Prozeduren als overload makiert und in etwa so programmiert:
Delphi-Quellcode:
Die Klasse TStringElement beinhalted dabei nur einen String.
procedure TStringList.insertBefore(data: String);
var stringElement : TStringElement; begin stringElement := TStringElement.create(); stringElement.data := data; insertBefore(stringElement); //Das ist die Zeile, weswegen ich overload benutzen wollte. end; Das Problem was ich nun habe, wenn ich overload benutze, ist, dass ich auch bei einer StringList immernoch auf die inserBefore(TObject) Prozedur zugreifen kann. Bevor die anderen Schüler dadurch aber ungewollte Fehler verursachen, möchte ich ihnen gerne diese Möglichkeit garnicht geben. Daher meine zweite Frage: Kann man - ohne die eigentliche Listenklasse zu verändern - die Prozeduren der Listenklasse innerhalb der Stringklasse verfügbar machen, außerhalb allerdings nicht? Ich hoffe ihr versteht meine Fragen und bedanke mich bereits jetzt für die Zeit, die ihr zum helfen investiert! :) Vielleicht noch als kleine Übersicht, was das Ziel ist:
Im Anhang habe ich euch mal die beiden Units U_StringList und U_List gestellt, falls sich jemand dort Überblick verschaffen will. |
AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Ich würde den Schülern schlicht die Zusatzaufgabe geben ein LoadFromStream bzw. SaveToStream zu implementieren. Sprich z.B. von einem Basisobjekt abzuleiten, in dem diese Methoden abstrakt deklariert sind.
Allgemein ein TObject speichern nennt sich Marshalling, aber bei Delphi 6 dürfte das schwierig werden. Von TComponent abgeleitete Objekte lassen sich auch dort schon mit ReadComponent und WriteComponent speichern und laden, allerdings nur published Eigenschaften. Für ein Marshalling von Objektinhalten, die nicht published sind, reicht die RTTI von Delphi 6 soweit ich weiß nicht aus. |
AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Eine weitere Möglichkeit besteht darin alle zu speichernden Klassen von
![]() Per ![]() ![]() Wenn man völlig frei von allem sein möchte, dann gibt man ein Interface vor, was alle zu implementieren haben. |
AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Ein anderer Anstoß: Warum muss deine Listenklasse von der allgemeinen Liste erben, wenn sie gar nicht so benutzbar sein soll? Das deutet eher darauf hin, das du die allgemeine Liste ein Attribut deiner Listenklasse ist.
Vererbung ist ein wichtiges Konzept, aber nicht die Antwort auf alles :wink: |
AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Vielen Dank für die Antworten! :)
Zitat:
Ich versuch das erstmal dann so, es sollte eigentlich klappen; falls nicht, melde ich mich nochmal :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 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