Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi SaveToFile(beliebige Variable); (https://www.delphipraxis.net/94527-savetofile-beliebige-variable-%3B.html)

Flo.Hoe 22. Jun 2007 18:20


SaveToFile(beliebige Variable);
 
Hi,
Wie kann man mit Delphi eine Variable X:TX in einem beliebigen Verzeichnis speichern?
Bis jetzt habe ich x immer aufgespalten und die einzelnen Zahlenwerte (x.a , x.b ...) in einer Textdatei gespeichert.
Auf Dauer ist dieses Verfahren aber zu umständlich.

SirThornberry 22. Jun 2007 18:22

Re: SaveToFile(beliebige Variable);
 
eigentlich recht einfach (gibt da aber sicher noch mehr varianten):
Delphi-Quellcode:
var
  lStream: TStream;
begin
  lStream := TFileStream.Create(YourFileName, YourFileMode);
  try
    lStream.write(YourVar, SizeOf(YourVar));
  finally
    lStream.Free;
  end;

DeddyH 22. Jun 2007 18:25

Re: SaveToFile(beliebige Variable);
 
Zitat:

Zitat von SirThornberry
(gibt da aber sicher noch mehr varianten)

"file of" fällt mir da spontan ein.

fwsp 22. Jun 2007 18:28

Re: SaveToFile(beliebige Variable);
 
http://dsdt.info/tutorials/typdateien/

Flo.Hoe 22. Jun 2007 18:51

Re: SaveToFile(beliebige Variable);
 
Was ist denn FileMode in deiner Procedure?

Zitat:

Delphi-Quellcode:
  lStream := TFileStream.Create(YourFileName, YourFileMode);


DeddyH 22. Jun 2007 18:54

Re: SaveToFile(beliebige Variable);
 
Wird wohl fmCreate, fmOpenReadWrite oder fmOpenWrite sein.

Flo.Hoe 22. Jun 2007 19:10

Re: SaveToFile(beliebige Variable);
 
OK,
Die Datei wurde erfolgreich gespeichert.
Aber wie kann ich jetzt darauf zugreifen und sie wieder laden?

DeddyH 22. Jun 2007 19:15

Re: SaveToFile(beliebige Variable);
 
Schau Dir mal TFileStream in der OH an (Create, Seek, Position, Read etc.)

Flo.Hoe 22. Jun 2007 19:58

Re: SaveToFile(beliebige Variable);
 
Damit klappt es irgendwie nicht.
Außerdem ist die gespeicherte Datei sehr klein - 4Byte: Das kann nicht sein ,denn da sind viele ganze Zahlen und eine Bitmap drin.


Delphi-Quellcode:
  var
  lStream: TStream;
begin
  lStream := TFileStream.Create('C:\Programme\...\Save', fmOpenWrite);
  try
    lStream.Read(MyFileName, SizeOf(MyFileName));
  finally
    lStream.Free;
  end;
end;

OldGrumpy 22. Jun 2007 20:15

Re: SaveToFile(beliebige Variable);
 
Klar, gespeichert wurde nur der Pointer auf das Objekt, der hat vier Bytes. Um den Objektinhalt abzuspeichern ist IMHO mehr Aufwand notwendig.

Flo.Hoe 22. Jun 2007 20:21

Re: SaveToFile(beliebige Variable);
 
Was wäre denn der Ansatz für den nächsten Schritt?

marabu 22. Jun 2007 20:21

Re: SaveToFile(beliebige Variable);
 
Hallo Florian,

du musst auch darauf achten, dass der FileMode zu deiner I/O-Methode passt - fmOpenWrite harmoniert eher mit LStream.Write. Und das beim Schreiben wirklich nur 48 Byte verfügbar waren kannst du mit SizeOf(DeineStruktur) überprüfen. Zeige am besten mal den Record, den du speicherst.

Grüße vom marabu

Flo.Hoe 22. Jun 2007 20:31

Re: SaveToFile(beliebige Variable);
 
Delphi-Quellcode:
Type THeld = class(Tobject)

  Procedure Anfangswerte;

  procedure ausrichten(Richtung:integer);
  Procedure links_drehen (A,R:integer);
  Procedure Zufall_drehen(A,R:Integer);
  Procedure rechts_drehen(A,R:integer);
 
  Procedure laufen;

  Procedure SchrittRechtsGehen(z:integer);
  Procedure Bewegungsperiode_rechts;
  Procedure Abschluss_rechts;

  Procedure SchrittLinksGehen(z:integer);
  Procedure Bewegungsperiode_links;
  Procedure Abschluss_links;

  Procedure Schrittzurueckgehen(z:integer);
  Procedure Bewegungsperiode_zurueckgehen;
  procedure SchrittVorGehen(z:integer);
  Procedure Bewegungsperiode_Vor;




  function ScheinH(Entfernung:Real):Real;
  function Scheinb(Entfernung:Real):Real;
  function ScheinV(Entfernung:Real):Integer;
  function getSchrittlaengeX(Entfernung:Real):Integer;
  function getSchrittlaengeY(Entfernung:Real;R:Integer):Integer;
  function getBmpUY(Entfernung:Real):Real;

  Function Frei(R:integer):Boolean;

  Procedure save;            // Held soll gespeichert werden
  Procedure load;            // Held soll durch die gespeicherte Datei ersetzt werden

  private
     { Private declarations }
  public

     
    Bild: TBitmap;
    Frame,Ausgang,NBXPeriode,NBYPeriode:integer;
    xPos,yPos,zPos,Bildnummer,Breite,Hoehe,v,sBezug,ScheinHoehe,HBVerhaeltnis,Sicht: real;
    rechts,links,unten,oben,weiter,Prozess,XBewegung:boolean;
    Pfad:String;

     { Public declarations }
  end;

var Held : THeld;

marabu 22. Jun 2007 20:50

Re: SaveToFile(beliebige Variable);
 
Hallo Florian,

die Methode Save() deiner Klasse THeld kann nur elementare Datentypen (Integer, Boolean, Char, u.ä.) problemlos speichern und wieder laden. Bei speziellen Typen wie string muss man sich schon etwas Gedanken machen und bei Arrays, Objekten und Records noch mehr. Auf jeden Fall ist es unnütz den Wert eines Zeigers zu speichern, denn in der Regel wird dieser Wert ungültig, bis du ihn wieder einliest.

Bei deinen Daten ist TBitmap ein solcher Zeiger. Es wäre zu überlegen, ob du nicht einfach einen Namen für das Bild als string speicherst. Wenn ich deine Klasse THeld so sehe und deinen Kenntnisstand richtig einschätze, dann möchte ich dir die Speicherung in einer INI-Datei nahelegen.

Freundliche Grüße

Flo.Hoe 23. Jun 2007 00:50

Re: SaveToFile(beliebige Variable);
 
Die Speicherung in einer ini-Datei hat hervorragend geklappt, aber schon bei einigen meiner anderen variablen funktioniert das nicht mehr.
Sie bestehen nämlich selbst aus mehreren Objekten,sodass es mir unmöglich erscheint sie in elementare Teile zu zerlegen.

Warum gibt es Keinen Befehl, der ein Objekt:... im Verzeichnis:... speichert (um welches Objekt es sich auch handeln möge).

Luckie 23. Jun 2007 03:14

Re: SaveToFile(beliebige Variable);
 
Woher soll denn diese universelle Funktion wissen, wie das Objekt aufgebaut ist und wie man es speichert?

Flo.Hoe 23. Jun 2007 11:50

Re: SaveToFile(beliebige Variable);
 
Jedes Objekt wird zur Laufzeit Temporär gespeichert. Daher muss es doch auch möglich sein, es ohne große Umstände auf die Festplatte zu schreiben.

DGL-luke 23. Jun 2007 12:01

Re: SaveToFile(beliebige Variable);
 
Hallo,

da solltest du mit der Typinfo und den DFM-Sachen arbeiten. Da gabs doch mal was... Stichwort [dp]Serialisier* RTTI[/dp].


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