![]() |
AW: TObjektList mit 2 oder mehr TObjekte
:party: ist vorbei. Ein gutes Neues an alle :party:
Zitat:
zu 2: Hat @jaenicke auch schon geschrieben. Hab ich auch schon dran gedacht. Aber wie löse ich das, wenn die Daten in eine Datei gespeichert und wieder ausgelesen werden sollen? Hab ich auch noch nie gemacht! zu 3: Delphi 7 Enterprise?? Alle Jubeljahre mal wieder ein kleines Project. Da fängt man immer wieder bei null an:oops: Wollte halt mal mit Objectlist arbeiten. Gerade wegen des abspeichern in eine Datei. Gruß alfold |
AW: TObjektList mit 2 oder mehr TObjekte
Das Speichern von mehreren Listen in eine Datei ist überhaupt kein Problem. Spendiere jedem Object eine SaveToStream-Methode (die musst du selbst schreiben). Eine Objektliste speicherst du dann, indem du zunächst die Anzahl der Elemente in den Stream schreibst und dann durch die Liste durchiterierst und so die einzelnen Objekte schreibst. Das Auslesen geht dann entsprechend umgekehrt.
Mein Sohn blockiert gerade den PC. Auf Wunsch kann ich später mal Code posten. P.S.: Ebenfalls ein Gutes Neues natürlich :) |
AW: TObjektList mit 2 oder mehr TObjekte
Anbei nun ein Beispielcode. Gibt noch andere Ansätze, aber das Grundprinzip sollte klar werden. Mit einer generischen TObjectList<T> wäre es noch eleganter, aber die steht Dir ja bei D7 nicht zur Verfügung...
Voila...
Delphi-Quellcode:
unit TestUnit;
interface uses Classes, SysUtils, Contnrs; type TObjekt1 = class(TObject) private FID : Integer; FValue : Integer; public property ID : Integer read FID write FID; property Value : Integer read FValue write FValue; procedure SavetoStream(AStream : TStream); procedure LoadFromStream(AStream : TStream); constructor Create(AID : Integer; AValue : Integer); end; type TObjektListe = class(TObjectList) public procedure LoadFromStream(AStream : TStream); procedure SaveToStream(AStream : TStream); end; implementation { TObjekt1 } constructor TObjekt1.Create(AID, AValue: Integer); begin FID := AID; FValue := AValue; end; procedure TObjekt1.LoadFromStream(AStream: TStream); begin AStream.ReadBuffer(FID, SizeOf(FID)); AStream.ReadBuffer(FValue, SizeOf(FValue)); end; procedure TObjekt1.SavetoStream(AStream: TStream); begin AStream.WriteBuffer(FID, SizeOf(FID)); AStream.WriteBuffer(FValue, SizeOf(FValue)); end; { TObjektListe } procedure TObjektListe.LoadFromStream(AStream: TStream); var FCount : Integer; i: Integer; begin (* Liste löschen *) Clear; (* Anzahl der Elemente auslesen *) AStream.ReadBuffer(FCount, SizeOf(Fcount)); for i := 0 to FCount-1 do begin Add(TObjekt1.Create(-1, -1)); TObjekt1(Last).LoadFromStream(AStream); end; end; procedure TObjektListe.SaveToStream(AStream: TStream); var FCount : Integer; i: Integer; begin (* Anzahl der Elemente speichern *) FCount := Count; AStream.WriteBuffer(FCount, SizeOf(FCount)); (* Einzelne Elemente speichern *) for i := 0 to FCount-1 do TObjekt1(Items[i]).SavetoStream(AStream); end; end. |
AW: TObjektList mit 2 oder mehr TObjekte
Zitat:
![]() |
AW: TObjektList mit 2 oder mehr TObjekte
Zitat:
Delphi-Quellcode:
wenn ich also jeden Parameter einzel aufführen muss, bei mir also
procedure TObjekt1.LoadFromStream(AStream: TStream);
begin AStream.ReadBuffer(FID, SizeOf(FID)); AStream.ReadBuffer(FValue, SizeOf(FValue)); end; procedure TObjekt1.SavetoStream(AStream: TStream); begin AStream.WriteBuffer(FID, SizeOf(FID)); AStream.WriteBuffer(FValue, SizeOf(FValue)); end;
Code:
und da kommt sicherlich noch was hinzu, ist dies aber auch nicht effektiver als meine alte speichern und lesen Routine, wo ich alles als String umwandle mit ';' trenne dann in eine Datei Speichere und wieder einlese.
Soundfile: ShortString;
SoundName: ShortString; SoundColor: TColor; CommentText: ShortString; CommentColor: TColor; CommentSize: Integer; SzeneText: ShortString; SzeneColor: TColor; ColIndex: Integer; Start: TTime; Anfang: TTime; Ende: TTime; LoopA: TTime; LoopE: TTime; VolA: Integer; VolE: Integer; FadeTime: real; FadeIn: Boolean; FadeOut: Boolean; FwStop: Boolean; Ich dachte das Binär Speichern währe einfacher. Zitat:
|
AW: TObjektList mit 2 oder mehr TObjekte
Wieviele Instanzen pro Objekt?
Je eine? Nimm doch 'ne INI-Datei. Je Objekt 'nen Abschnitt und dort dann die Werte rein. Alle von Dir aufgeführten Werte können problemlos in 'ne INI-Datei geschrieben werden. Oder 'ne "Datenbank": Ein Feld für den Namen des Objektes (oder so) und ein Blob für den Stream. Es muss übrigens kein "richtiges" DBMS sein, kbmMemTable ( ![]() |
AW: TObjektList mit 2 oder mehr TObjekte
Naja, also es mag auf den ersten Blick zumindest aufwendig erscheinen, richtig - schwierig würde ich jedoch nicht sagen. Aber das ist bei der OOP ja oft so. Am Anfang deutlich zeitintensiver, die Wartung des Codes gestaltet sich zukünftig jedoch viel einfacher.
Ohne Deine bisherige Schreib- bzw. Leseroutinen zu kennen: Es scheint sich um eine Art Konfiguration zu handeln, welche Du speicherst - also nicht besonders zeitkritisch. Von daher ist es relativ egal was Du dort machst und ob Du vorher in einen String umwandelst. In meinem Code sparst du Dir zumindest die Konvertiertung und somit Rechenzeit. Ich habe auch ObjectLists mit deutlich mehr Parametern (s. Deine Liste) in den Objekten zu speichern. Aber wenn ich jetzt einen zusätzlichen Parameter brauche dann muss ich nur die LoadFromStream und SaveToStream-Methode des Objekts anpassen und alles läuft und nichts wird woanders übersehen. Alles schön gekapselt wie es sein soll. Willst Du nun 2 ObjectLists in einen Stream speichern, dann brauchst Du nur
Delphi-Quellcode:
schreiben und die Sache ist gegessen. LoadFromStream entsprechend zum lesen. Schwierig ist anders :-)
ObjectListe1.SaveToStream(MyStream);
ObjectListe2.SaveToStream(MyStream); Ich gehe noch einen Schritt weiter und benutze die TObjectList<T> nur intern in einer Oberklasse und kapsele die Zugriffe (inkl. Items[x]) von außen. Damit habe ich alle Funktionen welche ich brauche (AddItem, DeleteItem etc.) selbst in der Hand. |
AW: TObjektList mit 2 oder mehr TObjekte
So hab mal die Edition geladen, :shock: Exe gleich mal knapp 3MB groß und noch nicht mal eine Zeile geschrieben. Optisch aber schön.
Ok zurück zum Thema. Aufwendig ist es nicht! Aber nichts anderes, was ich schon gemacht habe, mit ne einfachen Stringliste um die Werte in eine Datei zu speichern. Muss aber leider jetzt erst mal wieder abbrechen. Fahre morgen für eine Woche weg und kann mich dann wieder mit meinem Project beschäftigen. THX an alle Gruß alfold |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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