Hej Monie,
jeg er ved at gå amok ...
Jeg har lige testet med 2 "projekter". Og det virker bare lige helt a h'
til...
Så prøv dette her i stedet for, så er du sikker på, at det virker
Her benytter jeg en fil - C:\Test.dat og ikke PC'ens hukommelse, men dens
virtuelle hukommelse.
Desværre kan jeg ikke få den til at makke ret med Registry
...... et program med to buttons på Form1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Registry, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyRecord = Record
X, Y, Z : Integer;
End;
TaMyRecord = Array[1..1] of TMyRecord;
PaMyRecord = ^TaMyRecord;
Var
Reg : TRegistry;
PMyRecord : PaMyRecord;
AntalPMyRecord : Integer;
S : TMemoryStream;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure ReadFile;
Var
Size, Loop, I : Integer;
Begin
S:=TMemoryStream.Create;
S.LoadFromFile('C:\Test.dat');
AntalPMyRecord:=Integer(S.Size) div SizeOf(PMyRecord);
Size:=SizeOf(PMyRecord)*AntalPMyRecord;
PMyRecord:=VirtualAlloc(Nil,Size,Mem_Commit,Page_ReadWrite);
For Loop:=1 To AntalPMyRecord Do
S.Read(PMyRecord^[Loop],SizeOf(PMyRecord));
For I:=1 To 2 Do
ShowMessage(IntToStr(PMyRecord^[I].X));
VirtualFree(PMyRecord,Size,Mem_Decommit);
S.Free;
End;
Procedure WriteFile;
Var
Loop, Size : Integer;
Begin
S:=TMemoryStream.Create;
AntalPMyRecord:=2;
Size:=SizeOf(PMyRecord)*AntalPMyRecord;
PMyRecord:=VirtualAlloc(Nil,Size,Mem_Commit,Page_ReadWrite);
For Loop:=1 to AntalPMyRecord Do
PMyRecord^[Loop].X:=Loop+2;
For Loop:=1 To AntalPMyRecord Do
S.Write(PMyRecord^[Loop],SizeOf(PMyRecord));
VirtualFree(PMyRecord,Size,Mem_Decommit);
S.SaveToFile('C:\Test.dat');
S.Free;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
ReadFile;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WriteFile;
end;
end.
"Monie Jacobsen" <monie@tdcadsl.dk> wrote in message
news:3d6902a1$0$27660$edfadb0f@dspool01.news.tele.dk...
> Tak Garfield
>
> Jeg vil prøve det du skriver her. Mange tak.
>
> MVH
> Monie
>
>
> "Garfield" <garfield@email.dk> skrev i en meddelelse
> news:akauu9$1gk3$1@news.cybercity.dk...
> > Hej, hvis du vil bruge flere projekter, så bliver det måske lidt mere
> > besværligt, og
> > jeg ville vælge at løse det med Records, som skrives som Data i
Registry -
> > eller
> > i filer.
> >
> > Jeg har lige lavet et eksempel, som viser hvordan det kan gøres i
> Registry -
> > men
> > hold tungen lige i munden - for det bliver noget mere tricky.
> >
> > Uses Registry;
> >
> > Type
> > TMyRecord = Record
> > X, Y, Z : Integer;
> > End;
> >
> > TaMyRecord = Array[1..1] of TMyRecord;
> > PaMyRecord = ^TaMyRecord;
> >
> >
> >
> > Var
> > Reg : TRegistry; //Registreringsdatabasen
> > PMyRecord : PaMyRecord; //Indeholder de data som er angivet under
> > TMyRecord, og kan frit ændres
> > AntalPMyRecord : Integer; //Angiver hvor mange forskellige Records du
> har
> > (antal forskellige projekter - 1 projekt = en PMyRecord)
> >
> > Procedure ReadReg; //Læser data fra Registry.
> > Begin
> > Reg:=TRegistry.Create;
> > Reg.RootKey:=HKey_Current_User;
> > If Reg.OpenKey('Software\Primeware\TestProg',False)=False Then
> > Begin
> > Showmessage('Fejl');
> > Exit;
> > End;
> > AntalPMyRecord:=Reg.ReadInteger('Antal'); //Her henter den antallet
af
> > projekter
> > Getmem(PMyRecord,SizeOf(PMyRecord)*AntalPMyRecord); //Her allokerer
du
> > den nødvendige hukommelse i maskinen
> >
Reg.ReadBinaryData('Data',PMyRecord^,SizeOf(PMyRecord)*AntalPMyRecord);
> > //Her hentes data fra Registry
> > ShowMessage(IntToStr(PMyRecord[1].X)); //Her vises indholdet af
> > PMyRecord[1] - som er projekt nr. 1
> > Freemem(PMyRecord); //Her frigives hukommelsen igen, men dette skal
kun
> > gøres, hvis der ikke skal arbejdes med indholdet.
> > Reg.CloseKey;
> > Reg.Free;
> > End;
> >
> > Procedure WriteReg;
> > Begin
> > AntalPMyRecord:=1; //Her skal du angive, hvor mange projekter der er
> > igang - husk inc(AntalPMyRecord,1) - hvergang et nyt projekt tilføjes.
> > Getmem(PMyRecord,SizeOf(PMyRecord)*AntalPMyRecord); //Her allokeres
igen
> > hukommelse
> > PMyRecord[1].X:=3; //Her sættes Projekt 1 variabel X til 3
> > Reg:=TRegistry.Create;
> > Reg.RootKey:=HKey_Current_User;
> > Reg.OpenKey('Software\Primeware\TestProg',True); //True angiver, at
Key
> > Software osv. bliver oprettet, hvis den ikke eksisterer
> > Reg.WriteInteger('Antal',AntalPMyRecord); //Her skrives antallet af
> > projekter du har gang i
> >
Reg.WriteBinaryData('Data',PMyRecord^,SizeOf(PMyRecord)*AntalPMyRecord);
> > //Her gemmes data som ligger i PMyRecord
> > Reg.CloseKey;
> > Reg.Free;
> > Freemem(PMyRecord); //Hukommelse frigives.
> > End;
> >
> > Se dette gør tingene lidt mere komplicerede, men meget nemmere at
arbejde
> > med. Alternativet til ovenstående er, at gemme hvert projekt
> > som en tekstfil, hvor du skal lave nogle gennemløb for at se antallet af
> > projekter osv.
> >
> > Ellers kan du anvende binærfiler, men der er konceptet næsten det samme,
> > bortset fra, at du kan undgå hukommelses delen.
> > (Smag og behag)
> >
> > Hvorfor har du egentlig inv. i Enterprise, hvis du kun er på
> > begynderstadiet? - Burde du ikke være startet med Pro eller Personal,
> > sådan bare lige indtil du fik noget mere indsigt i Delphi og dets
> univers -
> > virker på mig som en smule overkill ?
> >
> > Garfield_dk
> >
> > "Monie Jacobsen" <monie@tdcadsl.dk> wrote in message
> > news:3d67c17b$0$43966$edfadb0f@dspool01.news.tele.dk...
> > > Hej Garfield
> > > Tak det virkede bare.
> > > Lige et lille spørgsmål.
> > > Kan der bruges GemSom og dermed navngive de enkelte projekter?
> > > Eller har du en bedere måde?
> > >
> > > MVH
> > > Monie
> > >
> > > "Garfield" <garfield@email.dk> skrev i en meddelelse
> > > news:ak7l2i$2nim$1@news.cybercity.dk...
> > > > Hej igen,
> > > >
> > > > vi prøver:
> > > >
> > > > Unit Unit5;
> > > >
> > > > Uses Registry (+en masse andre);
> > > >
> > > > Var
> > > > Vtip, Vn, v, ,np, cp, rho : Float; (Måske Float ikke er den rette
> > type)
> > > > Reg : TRegistry;
> > > >
> > > > Procedure HentTalFraReg;
> > > > Begin
> > > > Reg:=Tregistry.Create;
> > > > Reg.RootKey:=HKey_Current_User;
> > > > If Reg.OpenKey('Software\MitFirma\MitProgramnavn',False)=False
Then
> > > > //Bemærk at MitFirma og MitProgramNavn skal erstattes af rigtige
navne
> > > > Begin
> > > > Showmessage('Fejl - Der er endnu ikke gemt nogle værdier i
Reg.
> > > > Basen');
> > > > Exit;
> > > > End;
> > > > Vtip:=Reg.ReadFloat('Vtip');
> > > > Vn:=Reg.ReadFloat('Vn');
> > > > v:=Reg.ReadFloat('v');
> > > > //osv med np, cp og rho
> > > > //Nu har du hentet værdierne ind i variablerne som kan bruges i
hele
> > > > Unit5, alternativt lægger du variablerne op før Implementation - så
> akn
> > du
> > > > //finde værdierne i hele programmet, hvis du tilføjer Unit5 i dine
> > > > Uses-statements.
> > > > Reg.CloseKey;
> > > > Reg.Free;
> > > > End;
> > > >
> > > > Procedure SkrivTalTilReg;
> > > > Var
> > > > Reg : TRegistry;
> > > >
> > > > Begin
> > > > Reg:=Tregistry.Create;
> > > > Reg.RootKey:=HKey_Current_User;
> > > > If Reg.OpenKey('Software\Firma\Programnavn',False)=False Then
> > > > Reg.CreateKey('Software\Firma\Programnavn');
> > > > Reg.WriteFloat('Vtip',Vtip);
> > > > Reg.WriteFloat('Vn',Vn);
> > > > Reg.WriteFloat('v',v);
> > > > // osv med np, cp, rho
> > > > Reg.CloseKey;
> > > > Reg.Free;
> > > > End;
> > > >
> > > > Nu kan du hente værdierne i reg. basen og skrive dem til reg. basen.
> > > Regner
> > > > med, at du ved, hvordan du kan bruge disse værdier.
> > > >
> > > > tjek
www.icq.com - måske det ville være en god ide
> > > >
> > > > Garfield_dk
> > > > "Monie Jacobsen" <monie@tdcadsl.dk> wrote in message
> > > > news:3d666af9$0$27647$edfadb0f@dspool01.news.tele.dk...
> > > > > Til Garfield
> > > > >
> > > > > >Men har du ICQ, så kan jeg måske hjælpe der lidt nemmere?
> > > > > Jeg er ny bruger af Delphi 6 enterprise, købt i dyre domme.
> > > > > Ved ikke hvad ICQ er! Måske er dette en beder måde?
> > > > > Men at bruge Reg.basen for Gem og Hent data-værdier.
> > > > > Og hente data-værdierne ind og tilføje dem til program.
> > > > > Det må kunne gøres?
> > > > >
> > > > > Med venlig hilsen
> > > > > Monie
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>