![]() |
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. |
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; |
Re: SaveToFile(beliebige Variable);
Zitat:
|
Re: SaveToFile(beliebige Variable);
|
Re: SaveToFile(beliebige Variable);
Was ist denn FileMode in deiner Procedure?
Zitat:
|
Re: SaveToFile(beliebige Variable);
Wird wohl fmCreate, fmOpenReadWrite oder fmOpenWrite sein.
|
Re: SaveToFile(beliebige Variable);
OK,
Die Datei wurde erfolgreich gespeichert. Aber wie kann ich jetzt darauf zugreifen und sie wieder laden? |
Re: SaveToFile(beliebige Variable);
Schau Dir mal TFileStream in der OH an (Create, Seek, Position, Read etc.)
|
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; |
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.
|
Re: SaveToFile(beliebige Variable);
Was wäre denn der Ansatz für den nächsten Schritt?
|
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 |
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; |
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 |
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). |
Re: SaveToFile(beliebige Variable);
Woher soll denn diese universelle Funktion wissen, wie das Objekt aufgebaut ist und wie man es speichert?
|
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.
|
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