22. maj 2000 - 00:10Der 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 ?
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?)
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' :-)
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)
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
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 :-/
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.
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.
Æ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...
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.
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.
Synes godt om
Ny brugerNybegynder
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.