Avatar billede lytzen Nybegynder
22. maj 2000 - 00:10 Der er 14 kommentarer og
1 løsning

Persistens

Jeg vil gerne lave mine objekter osv persistente, altså gemme referencerne i en fil. Men jeg kan ikke helt gennemskue hvordan man gør. Findes der et komponent der kan hjælpe, eller kan jeg nedarve fra en klasse med operationer der kan hjælpe mig ?
Avatar billede retep Nybegynder
22. maj 2000 - 00:27 #1
Tjaaa, det er jo ikke nok bare at gemme referencerne i en fil, for det bliver indholdet af dine objekter jo ikke persistente af. Derudover kan du selvfølgelig gemme objektets indhold, og gemme referencen som id, men da du ikke kan være sikker på hvor i hukommelsen objektet bliver oprettet næste gang, er denne løsning heller ikke god. Medmindre du laver en eller anden form for search and replace hvergang du loader.

Der findes objektorienterede databaser, der kan håndtere dette, men de skulle eftersigende ikke være så gode endnu.
Det mest brugte er at omdanne sit objektsystem til en relationel database, ved at give hvert objekt sin entydige nøgle. Dette strider desværre lidt i mod den objektorienterede tankegang, men det må vi nok finde os i indtil de objektorienterede databasesystemer bliver stabile. (Tør ikke garantere at der ikke er objektorienterede databasesystemer, der kan opfylde dine behov, så det er måske værd at undersøge?)

Mvh
Retep
Avatar billede retep Nybegynder
22. maj 2000 - 00:48 #2
Vi lavede forresten et skoleprojekt sidste semester (datamatiker), hvor nogle af lærerne havde strikket en metode sammen til at gøre objekter persistente. Det var noget med at man skulle tilmelde alle objekter i en containerklasse, samt definere i hver af ens egne klasser hvilke attributter man ville have persistente.

En meget besværlig metode, og endnu værre, en langsom og ekstremt begrænset metode. Desuden blev det hele gemt som en stor tekstfil, og jeg tør næsten ikke tænke på hvordan hastigheden ville blive, hvis der kom mange objekter...

For en god ordens skyld skal det lige nævnes at der ikke var nogen, heller ikke dem der havde lavet det, der talte for at man kunne bruge den slags i 'real life' :-)


Avatar billede lrj Nybegynder
22. maj 2000 - 01:00 #3
Nedarver du dine klasser fra TComponent er der en .savetostream metode, som du kan override i dine klasser - der er også en .readfromstream. Med dette kan du lave din egen persistens af dine objekter.

Måske det var noget? Sig endelig til hvis du kan bruge det til noget, for jeg har ikke selv prøvet det :o)
Avatar billede lytzen Nybegynder
22. maj 2000 - 01:25 #4
oh ja retep :o)
Jeg benyttede også den irriterende TPersistens som datamatikerlærerne havde smækket sammen. Men den er alt for besværlig og indskrænket desværre.
Ok, jeg kigger lige på .savefromstream .readfromstream og ser om det er noget..tak
Avatar billede retep Nybegynder
22. maj 2000 - 07:47 #5
He he, ja, den er irriterende!!! Jeg nævnte den egentligt også bare som et eksempel på at der ikke er nogen simpel og ligefrem metode til at gøre objekter persistente.

Lad mig lige vide om du får .savetostream og .readfromstream til at virke, for jeg forsøgte mig også med disse... uden held :-/

Mvh
Retep
Avatar billede lrj Nybegynder
22. maj 2000 - 12:22 #6
Jeg venter spændt (en af mine venner fik det til at køre :o)

/Laust
Avatar billede borrisholt Novice
23. maj 2000 - 19:27 #7
Du kan gemmen en hel form med inhold ved hjælp af det følgende :

Tag en form og placer et memo felt der på og skriv så det følgende kode :

(HUsk at definere diverse events inden du klipper koden ind).

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

const  FileName = 'Form1.xGS';

constructor TForm1.Create(AOwner: TComponent);
begin
  if FileExists(FileName) then
  begin
    inherited CreateNew(AOwner) ;
    ReadComponentResFile(FileName, self) ;
    self.Visible := false;
    FormCreate(self)
  end
  else
    inherited Create(AOwner);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WriteComponentResFile(FileName, self) ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Må ikke slettes
end;

end.

Når du har konpileret programmet så skriv noget i memo feltet og afslut programmet. Når så du åbner programmer igen så står teksten fint og flot i memo feltet.

Jens b



Avatar billede lytzen Nybegynder
24. maj 2000 - 12:02 #8
Hej Jens !
Tak for din løsning. Jeg har prøvet at overføre den til en af mine egne klasser, kaldet TPerson. Men det har jeg problemer med, idet den ikke er et komponent. Jeg har prøvet at laden den nedarve fra TComponent, men jeg kan stadig ikke få det til at virke. Det jeg vil gemme er ikke visuelle komponenter, men f.eks. objekterne created ud fra klasserne TKunde og TAnsat.

Mvh.
Thomas Lytzen Petersen
Avatar billede borrisholt Novice
25. maj 2000 - 12:20 #9
Hej Thomas

Har du overvejet at lave en DATA Base ? Til dine objekter ? ANy way send mig noget kode så vil jeg getne kigge på det ....

Jens B
Avatar billede retep Nybegynder
25. maj 2000 - 13:06 #10
Borrisholt>> Nemlig! Som jeg nævnte er den logiske fremgangsmåde at lave en database! Relationel eller objektorienteret!
Avatar billede lrj Nybegynder
25. maj 2000 - 13:45 #11
Æh, eksperten.dk er nu ikke helt så stabil som det kunne være ønskværdigt den var..

Nå, jeg skriver mit indlæg igen så.

Som demonstreret ovenfor er det ret nemt at streame Delphi's medfølgende objekter til filer, memorystreams, over netværk, etc. Hvad skulle være til hinder for at man kunne lave noget tilsvarende med sine egne objekter? Jeg kan ikke rigtig se problemet.

Desuden er der store problemer med at lave en ordentlig objektorienteret løsning med en database. Jeg siger ikke at streams er løsningen på alt, men databaser er temmelig onde selv at lave objektorienteret...
Avatar billede retep Nybegynder
25. maj 2000 - 18:01 #12
Og hvis du streamer... Er du så ikke nødt til at loade hele objektsystemet af gangen samt gemme det hele på een gang? Dvs. lav grad af persistens?!

Avatar billede lrj Nybegynder
25. maj 2000 - 18:15 #13
Kommer jo an på hvordan du anvender det - det er jo det samme som at strikke en løsning med en database.

Det er jo noget af det ekstra kode/logik du er nødt til at brygge..

Og da der, så vidt jeg ved, ikke findes nogen velfungerende objektorienterede databaser til Delphi, så må man jo selv lave noget...
Avatar billede lrj Nybegynder
25. maj 2000 - 18:16 #14
For dælen da også - det er så anden gang i træk at mit indlæg ikke blev gemt første gang jeg sendte det. Skåmmelt!
Avatar billede lytzen Nybegynder
26. maj 2000 - 01:35 #15
Borrisholt ->>
Jeg har her givet et eksempel på, hvad det er jeg gerne vil. Jeg opretter et objekt med et navn. Det skal gemmes, sådan at man kan det frem igen sammen med det indtastede navn.

unit UPerson;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    EditNytNavn:  TEdit;
    EditGemtNavn: TEdit;
    ButtonGem:    TButton;
    ButtonHent:  TButton;
    Label1:      TLabel;
    Label2:      TLabel;
    procedure ButtonGemClick(Sender: TObject);
    procedure ButtonHentClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Type
    TPerson = Class
    Private
      Navn: String;
    Public
      Constructor Create(n: String);
      Function HentNavn: String;
    end;

var
  Form1:  TForm1;
  Person: TPerson;

implementation

{$R *.DFM}

Constructor TPerson.Create(n: String);
Begin
  Navn:= n;
End;

Function TPerson.HentNavn: String;
Begin
  Result:= Navn;
End;

procedure TForm1.ButtonGemClick(Sender: TObject);
begin
  Person:= TPerson.Create(EditNytNavn.Text);
  // Her skal objektet gemmes til fil, med det nye navn som data !
end;

procedure TForm1.ButtonHentClick(Sender: TObject);
begin
  // Her skal objekter hentes fra fil
  EditGemtNavn.Text:= Person.HentNavn;
end;
end.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester