Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi propertys speichern mit filestream.writecomponent (https://www.delphipraxis.net/51710-propertys-speichern-mit-filestream-writecomponent.html)

richard_boderich 17. Aug 2005 14:46


propertys speichern mit filestream.writecomponent
 
hallo,

ich moechte mehrere objecte laden. habe aber ein problem mit filestream. vielleicht mach ich auch einen denkfehler?

tum laden nehm ich folgenden code

Delphi-Quellcode:
var
  FileStream : TFilestream;
  Item: TMapobject;
  Obj : TObject;
  i:integer;
begin
  FileStream:=TFileStream.Create('test',fmOpenRead);

  for i:=filestream.position to filestream.Size-1 do
  begin
    item:=FileStream.ReadComponent(nil) as TMapObject;  //fehler tritt auf. (stream read error)

    item.Create(self,image1.Left+item.MapX,image1.Top+item.mapy,item.einheitentyp,item.status);

    Liste.add(Tobject(item));
  end;
also meine speicherroutine funktioniert. er geht ne objectlist durch und speichert die objecte schoen nacheinander. stehen alle in der datei drin.
mein problem is, das ich beim laden ja noch nicht weis wieviele objecte enthalten sind ich wollt das mit der for next machen ala "until EOF". aber
irgendwie mach ich das entweder einen denkfehler oder aber was anderes. laed readcomponent den den ganzen stream auf einmal oder wie bei readln nur immer einen datensatz?

Gruß richard

Dax 17. Aug 2005 14:49

Re: propertys speichern mit filestream.writecomponent
 
Delphi-Quellcode:
for i:=filestream.position to filestream.Size-1 do
So nicht! :roll:

Delphi-Quellcode:
while filestream.Postition < filestream.Size do
Besser so ;)

richard_boderich 17. Aug 2005 15:14

Re: propertys speichern mit filestream.writecomponent
 
danke dax,

funzt prima! :) kleine frage trotzdem noch. wird nicht in dieser zeile schon das object erstellt?

Delphi-Quellcode:
item:=FileStream.ReadComponent(nil) as TMapObject;  //fehler tritt auf. (stream read error)
warum wird es aber erst sichtbar, wenn ich es nochma ueber den construcktor aufrufe? :gruebel:

Delphi-Quellcode:
    item.Create(self,image1.Left+item.MapX,image1.Top+item.mapy,item.einheitentyp,item.status);

Dax 17. Aug 2005 15:17

Re: propertys speichern mit filestream.writecomponent
 
Ich glaube, du hast da was missverstanden. Das Objekt wird in der Tat beim lesen schon erstellt, alles, was dein nachgeschaltetes Create macht, ist ein paar Properties setzen. Du könntest genausogut mit .Parent, .Width, .Height usw hantieren ;)

richard_boderich 17. Aug 2005 15:24

Re: propertys speichern mit filestream.writecomponent
 
das object existiert also nicht doppelt?

naja das mit .parent hab ich probiert. aber das hatt nicht geklappt.
ich dachte wenn ein object erstellt wird. wird dabei immer der construcktor aufgerufen?
hab es erst versucht mit item.parent:=TWinControl(owner).

Delphi-Freak 20. Aug 2005 18:25

Re: propertys speichern mit filestream.writecomponent
 
Beim hantieren mit Streams sind mir diese Methoden aufgefallen, und da wollte ich sie auch mal ausprobieren. Nur irgendwie funktioniert's bei mir nicht :(
Mein Code:
Delphi-Quellcode:
procedure loadKompo;
var
   Stream: TStream;
begin
   Stream := TFileStream.Create('test.asdf', fmOpenRead or fmShareDenyNone);
   Memo1.Assign(Stream.ReadComponent(nil) as TMemo);
   //bzw.: »Memo1 := Stream.ReadComponent(nil) as TMemo;« - gleicher Fehler
   Stream.Free;
end;

procedure saveKompo;
var
   Stream: TStream;
begin
   Stream := TFileStream.Create('test.asdf', fmCreate or fmShareDenyNone);
   Stream.WriteComponent(Memo1);
   Stream.Free;
end;
Das Speichern funktioniert so weit, nur beim Laden gibt es dann einen Fehler:
»Im Projekt Project1.exe ist eine Exception der Klasse EClassNotFound mit der Meldung 'Klasse TMemo nicht gefunden' aufgetreten.«

Weiß jemand, was ich da machen kann? :gruebel:

LG, ich

Delphi-Freak 21. Aug 2005 11:10

Re: propertys speichern mit filestream.writecomponent
 
Juhuuuuu :lol:
Hab's jetzt herausgefunden:
Delphi-Quellcode:
Stream.ReadComponent(Memo1);
Also nicht der Rückgabewert, sondern der Parameter...
:mrgreen: :mrgreen:

LG


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