/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Gemme objekter i fil?
Fra : Thomas Holmgren


Dato : 09-03-04 13:07

Hej Alle!

Hvordan gemmer man - i Delphi - en håndfuld objekter i en flad fil på en
effektiv måde?
Jeg har en TList med en stribe objekter, og jeg vil gerne ku skrive dem til
disk (og læse dem igen).

Jeg har gjort dette flere gange i java - her er det blot at implementere
interfacet Serializable, så er det problem ude af verden. Men i delphi??

Håber I har en god ide! :)


--
Mange hilsner
Thomas Holmgren



 
 
Nicolai Hansen (10-03-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 10-03-04 08:58

> Hej Alle!
>
> Hvordan gemmer man - i Delphi - en håndfuld objekter i en flad fil på en
> effektiv måde?
> Jeg har en TList med en stribe objekter, og jeg vil gerne ku skrive dem til
> disk (og læse dem igen).
>
> Jeg har gjort dette flere gange i java - her er det blot at implementere
> interfacet Serializable, så er det problem ude af verden. Men i delphi??
>
> Håber I har en god ide! :)

Hej Thomas,

Du ka lave en file of XXX hvor XXX er dit object.

var
f: File of TNameObject;
X: TNameObject;
begin
AssignFile(f, 'c:\objtest');
Rewrite(f);
X:=TNameObject.Create;
write(f,X);
CloseFile(f);
end;

Thomas Holmgren (10-03-2004)
Kommentar
Fra : Thomas Holmgren


Dato : 10-03-04 10:32

Hej Nicolaj
Nicolai Hansen wrote:

> Du ka lave en file of XXX hvor XXX er dit object.
>
> var
> f: File of TNameObject;
> X: TNameObject;
> begin
> AssignFile(f, 'c:\objtest');
> Rewrite(f);
> X:=TNameObject.Create;
> write(f,X);
> CloseFile(f);
> end;

Det har jeg skam også prøvet :) ..Og jeg får ogeå gemt en fin
pointerreference til mit objekt. Desværre kan man i Delphi kun lave
"file of" af fixed-size typer. Hjælpen skriver: "... Pointer
types--whether implicit or explicit--are not allowed, so a file cannot
contain dynamic arrays, long strings, classes, objects, pointers, ..."

Øv :)

Findes der virkelig ikke en måde i Delphi til at skrive et vilkårligt
objekt til disk? Det er da en så almindelig opgave at man kunne forvente
Borland-folkene havde lavet en snild måde at gøre det på..!


--
Mvh.
Thomas Holmgren

David Konrad (10-03-2004)
Kommentar
Fra : David Konrad


Dato : 10-03-04 16:39

"Thomas Holmgren" <thm@regnecentralen.dk> wrote in message
news:c2mna3$1st$1@news.cybercity.dk...

> Det har jeg skam også prøvet :) ..Og jeg får ogeå gemt en fin
> pointerreference til mit objekt. Desværre kan man i Delphi kun lave
> "file of" af fixed-size typer. Hjælpen skriver: "... Pointer
> types--whether implicit or explicit--are not allowed, so a file cannot
> contain dynamic arrays, long strings, classes, objects, pointers, ..."
>
> Øv :)
>
> Findes der virkelig ikke en måde i Delphi til at skrive et vilkårligt
> objekt til disk?

Selvfølgelig - RTFM! Husk at serializable i java betyder, at du får en hel
masse forærende gennem et on-the-fly interface - og at det kun er muligt med
serialiserbare klasser - det er ikke (i den her sammenhæng) "muligt" i
Delphi, da ikke alt i Delphi er objektorienteret, og ikke alt i objekter kan
findes via reflection (i Delphi RTTI). Det kan lade sig gøre i java, fordi
alt som udgangspunkt er objekter (eg J2EE). MAO : Den funktionalitet du
"bare" kan få i Java, kan du også få i Delphi - men naturligvis kun når de
samme betingelser er opfyldt.

> Det er da en så almindelig opgave at man kunne forvente
> Borland-folkene havde lavet en snild måde at gøre det på..!

Naturligvis. Modificer klassen vi efterhånden kender så godt til (det her er
blot én ud af en række forskellige måder at gøre det på) til følgende :

TNameObject = class(TPersistent)
private
FOwner: TControl;
FXProperty:string;
procedure SetXProperty(const Value: string);
public
constructor create(AOwner:TControl);reintroduce;virtual;
procedure SaveToStream(writer : TWriter); virtual;
procedure LoadFromStream(writer : TWriter); virtual;
property XProperty:string read FXProperty write SetXProperty;
end;

Det er nødvendigt, at den arver fra TPersistent og ikke TObject - der er
ikke den store forskel (ingen overhead) - TPersistent introducerer blot den
basale funktionalitet der skal til, for at lagre objekter (i en hvilken som
helst kontekst). Alle visuelle properties skal f.eks som udgangspunkt være
at typen TPersistent eller efterkommere...Også hvis du ønsker at bruge RTTI
*skal* din klasse arve fra TPersistent...

Højreklik, lad Delphi rette koden for dig, og udfyld dernæst f.eks
SaveToStream til

procedure TNameObject.SaveToStream(writer: TWriter);
begin
with writer do
begin
WriteString(XProperty);
end;
end;

Jeg sætter nu en knap på formen og foretager et gemme-eksempel

procedure TForm1.Button4Click(Sender: TObject);
var stream : TFileStream;
writer : TWriter;
X : TNameObject;
begin
X:=items[0];
X.FXProperty:='dette en en prøve - vi skal være sikre på at noget gemmes';
try
stream := TFileStream.Create('test.dat', fmCreate or fmOpenWrite);
writer := TWriter.Create(stream, $ff);
writer.WriteSignature;
X.SaveToStream(writer);
writer.FlushBuffer;
finally
stream.free;
end;
end;

Løsningen er ikke køn, men den virker. Når du vil hente objekter gemt i en
fil gentager du proceduren blot omvendt. Fordelen er, at du kan gemme mange
forskellige typer objekter i samme fil - eller "stream", datastrøm. Det
klassiske eksempel er f.eks et grafikprogram med TTrekant, TFirkant,
TPolygon etc - ved brug af polymorfisme er det kun de helt særlige
egenskaber ved hver enkelt objekt man skal koncentrere sig om, så det
programmeringsmæssige overhead er til at overse. I dit hiearki sørger du for
at grundklasserne indeholder den basale funktionalitet, hvorefter du blot
overrider metoderne.

Personligt foretrækker jeg at bruge RTTI - jeg traverserer slet og ret
gennem et vilkårligt objects properties og gemmer dem ned - på den måde kan
jeg bruge samme kode uanset om jeg vil gemme i fil, i XML eller
registreringsdatabasen, men det er langt fra mindre simpelt.



David Konrad (10-03-2004)
Kommentar
Fra : David Konrad


Dato : 10-03-04 16:39

"Nicolai Hansen" <nic@aub.dk> wrote in message
news:d96764ff.0403092357.56be9d30@posting.google.com...

> Du ka lave en file of XXX hvor XXX er dit object.



Har du prøvet?



Nicolai Hansen (11-03-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 11-03-04 08:42

"David Konrad" <david_konrad@hotmail.com> wrote in message news:<c2ncs0$j1r$2@sunsite.dk>...
> "Nicolai Hansen" <nic@aub.dk> wrote in message
> news:d96764ff.0403092357.56be9d30@posting.google.com...
>
> > Du ka lave en file of XXX hvor XXX er dit object.
>
>
>
> Har du prøvet?

Faktisk ikke, og jeg ka godt se det kun virker med records ;)

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste