Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TListe als Datei Speichern (https://www.delphipraxis.net/177613-tliste-als-datei-speichern.html)

Vaporizor 15. Nov 2013 20:59

Delphi-Version: 6

TListe als Datei Speichern
 
Hallo,
ich bin neu hier.
Ich habe folgendes Problem:
In meinem Programm Wer wird Millionär verwende ich mehrere Listen für verschiedene Fragen ,jeweils sortiert nach Geldstufe d.h. pro Liste eine Geldstufe. in diesen Listen sind die "Spielkaten" als Objekte der Klasse TSpielkarte gespeichert.
Diese Listen möchte ich als Datei Speichern jedoch überfordert mich die Klasse TStream etwas , da ich bisher nur beispiele für Arrays gefunden habe (die mir bisher nicht bekannt sind).
Es mag sich möglicherweise etwas banal anhören aber könnte man mir hier bitte erklären wie das mit dem speichern funktioniert?

mfG. Vaporizor

Bei diesem Projekt handelt es sich um eine freiwillige Hausaufgabe.

EDIT : Bei der Klasse TListe handelt es sich um eine Selbst erstellte Liste aus dem Informatik Unterricht

Perlsau 15. Nov 2013 21:12

AW: TListe als Datei Speichern
 
1. Aus deinem Posting geht nicht hervor, was genau du wo speichern möchtest. Willst du einen Stream speichern, dann verwende die Methode SaveToFile.

2. Aus deinem Text geht ebenfalls nicht hervor, um welche Listen es sich handelt.

3. Eine Klasse ist keine Liste. Somit entbehrt die Aussage, "Bei der Klasse TListe handelt es sich um eine Selbst erstellte Liste" jeglichen Sinns hinsichtlich deines Problems.

4. Es gibt keine grundsätzliche Speichermethode für alles.

Fazit: Du solltest deine Anfrage schon etwas detaillierter gestalten, wenn du ernsthaft Antworten erwartest.

Vaporizor 15. Nov 2013 21:17

AW: TListe als Datei Speichern
 
1. Ich will die einzelnen Objekte der Klasste TLIste als Datei Speichern.
2. Diese Listen stammen von der selbst geschriebenen Klasse TListe.
4. Das wusste ich nicht deswegen frage ich ja.

Popov 15. Nov 2013 22:04

AW: TListe als Datei Speichern
 
Also "Objekte" speichern ist sehr allgemein. Objekt kann eine eigene Klasse sein, kann Bitmap sein, kann Text sein, kann andere Objekte enthalten.

Zu 4: gehst du mit der Frage auf die Idee aus, dass man den Inhalt des Objekts speichern kann?

Lemmy 15. Nov 2013 22:09

AW: TListe als Datei Speichern
 
Zitat:

Zitat von Vaporizor (Beitrag 1236182)
Diese Listen möchte ich als Datei Speichern jedoch überfordert mich die Klasse TStream etwas

muss es unbedingt über TStream sein? FÜr sowas würde ich XML einsetzen. Evtl. hast Du ein Delphi das TXMLDocument besitzt. Wenn ja, einfach deine Liste durchgehen deine TSpielkarte holen und die notwendigen Felder abspeichern...

Grüße

Bjoerk 15. Nov 2013 22:24

AW: TListe als Datei Speichern
 
TSpielkarte.SaveToFile ist dein Freund. Zeig mal die Klasse TSpielkarte, dann kann man mehr dazu sagen?

Sir Rufo 15. Nov 2013 22:32

AW: TListe als Datei Speichern
 
Zitat:

Zitat von Bjoerk (Beitrag 1236191)
TSpielkarte.SaveToFile ist dein Freund. Zeig mal die Klasse TSpielkarte, dann kann man mehr dazu sagen?

Es geht doch nicht nur um das Speichern einer Spielkarte, sondern eines ganzen Stapels (evtl. sogar noch Meta-Informationen über die Spielstufe, etc.)

@Vaporizor

Hast du dir schon mal überlegt, wie und vor allem was in der Datei stehen soll?
Das ist der erste Schritt, danach überlegt man sich, wie man das in eine Datei bekommt.

Thomasl 16. Nov 2013 00:18

AW: TListe als Datei Speichern
 
Ich habe hier mal was ungetestet zusammenkopiert.
Bei einer Class geht das nicht, da wird dann nur der Pointer gespeichert.
Bei normalen Strings muss auch die länge gespeichert werden.
Mit >500Mb/Sec kann ich so bei mir Daten auf SSD Speichern
Wenn die Datenpunkte in TSpielkarte mal erweitert werden sollen ist XML wohl die bessere Wahl


Delphi-Quellcode:
procedure SaveToStream(Stream: TStream);
var
  n: Integer;
  Spielkarte: TSpielkarte;
begin
    // DataCount
    Stream.WriteBuffer(Data.Count, SizeOf(Integer));
    // Data
    for n := 0 to Data.Count - 1 do
    begin
      Spielkarte := Data.Items[n];
      Stream.WriteBuffer(Spielkarte[n], SizeOf(TSpielkarte));
    end;

    //for Spielkarte in Data.List do
    //  Stream.WriteBuffer(Spielkarte, SizeOf(TSpielkarte));
end;

procedure SaveToFile(const FileName: String);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate or fmShareDenyWrite);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure LoadFromStream(Stream: TStream);
var
  n, Count: Integer;
  Spielkarte: TSpielkarte;
begin
    // DataCount
    Stream.ReadBuffer(Count, SizeOf(Integer));
    // Data
    Data.Clear;
    for n := 0 to Count - 1 do
    begin
      Stream.ReadBuffer(Spielkarte, SizeOf(TSpielkarte));
      Data.Add(Spielkarte);
    end;
end;

procedure LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


Delphi-Quellcode:

type
  TSpielkarte = record
    Value: String[20]; //ShortString
    DateTime: TDateTime;
    Nr: Integer;
  end;

//das geht in Delphi7 noch nicht (Generics)
uses
  generics.defaults, generics.Collections;
...
var
  Data: TList<TSpielkarte>;
...
Data: TList<TSpielkarte>.Create;
...
Data.Free;
...


//zb. String Schreiben
    StrLen := Length(TempString);
    Stream.WriteBuffer(StrLen, SizeOf(Integer));
{$IFDEF ZEROBASEDSTRINGS}
    Stream.WriteBuffer(TempString[0], StrLen * SizeOf(Char));
{$ELSE}
    Stream.WriteBuffer(TempString[1], StrLen * SizeOf(Char));
{$ENDIF}


//zb. String Lesen
    Stream.ReadBuffer(StrLen, SizeOf(Integer));
    if StrLen > -1 then
    begin
      SetLength(TempString, StrLen);
{$IFDEF ZEROBASEDSTRINGS}
      Stream.ReadBuffer(TempString[0], StrLen * SizeOf(Char));
{$ELSE}
      Stream.ReadBuffer(TempString[1], StrLen * SizeOf(Char));
{$ENDIF}
    end
    else
      TempString := '';

Perlsau 16. Nov 2013 01:44

AW: TListe als Datei Speichern
 
Zitat:

Zitat von Vaporizor (Beitrag 1236184)
1. Ich will die einzelnen Objekte der Klasste TLIste als Datei Speichern.

Die Objekte werden bereits in deiner Unit gespeichert. Offenbar weißt du nicht, was ein Objekt in Delphi ist und verwendest diesen Begriff daher für etwas ganz anderes.

Zitat:

Zitat von Vaporizor (Beitrag 1236184)
2. Diese Listen stammen von der selbst geschriebenen Klasse TListe.

Glaubst du, daß außer dir noch jemand diese Klasse TListe kennt? Richtig: Ich glaube das auch nicht. Mit anderen Worten: Wieso zeigst du uns nicht erstmal deine Klasse, bevor du fragst, wie du darin eine Speichermethode implementieren kannst?

Zitat:

Zitat von Vaporizor (Beitrag 1236184)
4. Das wusste ich nicht deswegen frage ich ja.

Oben hattest du aber behauptet, du fragst, weil du nicht weißt, wie man irgend was speichert.

Auf den dritten Punkt bist du leider überhaupt nicht eingegangen, und ich ahne auch, weshalb: Du weißt offenbar ziemlich wenig über das Programmieren mit Delphi. Wie wär's damit, erstmal einige Grundlagen-Tutorials durchzuarbeiten, bevor du dich an anspruchsvollere Projekte wagst? Mit der Zeit gewinnst du dabei den Überblick, was alles wie machbar ist. Es erschließen sich dir nach und nach Konzepte und Vorgehensweisen. Wenn du das durch hast, könntest du dir ein erstes eigenes Projekt überlegen. Die zweite oder gar dritte Treppenstufe vor der ersten zu nehmen ist dagegen eine sichere Stolperfalle.

Bjoerk 16. Nov 2013 09:01

AW: TListe als Datei Speichern
 
Zitat:

Zitat von Sir Rufo (Beitrag 1236192)
Es geht doch nicht nur um das Speichern einer Spielkarte, sondern eines ganzen Stapels (evtl. sogar noch Meta-Informationen über die Spielstufe, etc.)

So hatte ich's auch gemeint:
Delphi-Quellcode:
procedure TSpielkartenListe.SaveToFile(const FileName: string);
var
  Stream: TFileStreamEx;
  I: integer;
begin
  Stream := TFileStreamEx.Create(FileName, fmCreate);
  try
    WriteHeader(Stream);
    Stream.WriteInteger(Count);
    for I := 0 to Count - 1 do
      FItems[I].SaveToFileStream(Stream);
  finally
    Stream.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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