AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)
Thema durchsuchen
Ansicht
Themen-Optionen

Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

Ein Thema von Astobix · begonnen am 6. Feb 2015 · letzter Beitrag vom 8. Feb 2015
Antwort Antwort
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#1

Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

  Alt 6. Feb 2015, 19:56
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:
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;
Die Klasse TStringElement beinhalted dabei nur einen String.

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:
  • Ich habe eine Klasse Liste gegeben, die allgemeine Objekte speichert
  • Ich möchte nur Strings speichern, aber damit nicht die eigentliche Listenklasse behindern
  • Die Schüler sollten nach Möglichkeit nur mit den Befehlen der Liste zu tun haben, keine weiteren (außer speichern und laden)
  • Die Klasse soll für andere Nutzer möglichst Narrensicher sein

Im Anhang habe ich euch mal die beiden Units U_StringList und U_List gestellt, falls sich jemand dort Überblick verschaffen will.
Angehängte Dateien
Dateityp: pas u_list.pas (16,5 KB, 5x aufgerufen)
Dateityp: pas u_stringlist.pas (1,3 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

  Alt 6. Feb 2015, 21:11
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

  Alt 6. Feb 2015, 21:28
Eine weitere Möglichkeit besteht darin alle zu speichernden Klassen von Delphi-Referenz durchsuchenTPersistent abzuleiten.

Per Delphi-Referenz durchsuchenTPersistent.Assign bzw. indirekt per Delphi-Referenz durchsuchenTPersistent.AssignTo können dann die Daten-Instanzen an eine Speicher-Instanz übergeben, bzw. daraus wiederhergestellt werden.

Wenn man völlig frei von allem sein möchte, dann gibt man ein Interface vor, was alle zu implementieren haben.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

  Alt 6. Feb 2015, 22:33
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

Geändert von BUG ( 6. Feb 2015 um 22:38 Uhr)
  Mit Zitat antworten Zitat
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#5

AW: Speichern einer allgemeinen Liste (Inhalt sind beliebige Objekte)

  Alt 8. Feb 2015, 17:50
Vielen Dank für die Antworten!

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
Die Idee hatte ich in der Tat auch, habe sie aber dann erstmal wieder vergessen, weil ich es gerne durch Vererbung lösen wollte. Da dies scheinbar aber nicht so einfach geht, ist es vermutlich wirklich sinnvoller, die gennante Methode von dir zu nehmen

Ich versuch das erstmal dann so, es sollte eigentlich klappen; falls nicht, melde ich mich nochmal
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz