Hvis du laver et lidt større program, får du hurtigt brug for at gemme brugerens valg til næste gang programmet startes. Det er faktisk ikke så svært. I mit lille eksempel har vi et Edit felt og en Checkbox. Det ser således ud:
Når du har bygget formen op som min, skal du huske at tilføje ordet "Registry" til din uses (den der står øverst). Min uses ser i eksemplet sådan ud:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Registry;
På den måde kan vi få lov af Delphi, til at bruge Registreringsdatabasen. Nu skal vi lige hvae puttet nogen funktioner ind i vores to knapper. Først laver vi Gem knappen. Den tager og skriver Edit feltets tekst ind under nøglen "Test", under værdien EditFelt. Jeg vil foreslå at du starter det lille program "Regedit", så du kan se om der sker noget. Gå ned i Start menuen og vælg Kør. Skriv "regedit" og tryk på Enter. Nu ser du så registreringsdatabasen. Den har en rimelig stor rolle i dit systems velbefindende, så slet ikke alt for meget :-). Åbn HKEY_LOCAL_MACHINE og lad den stå der. Nu skal vi lige have skrevet de funktioner ind. Dobbeltklik på Gem knappen. Dens onClick event skal nu se således ud:
procedure TForm1.GemButtonClick(Sender: TObject);
var
Registry: TRegistry;
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
If Registry.OpenKey('Test',True) then
begin
Registry.WriteString('EditFelt', Edit1.Text);
Registry.WriteBool('CheckBox', CheckBox1.Checked);
Registry.Free;
end;
end;
Lidt forklaring: Vi sætter RootKey til HKEY_LOCAL_MACHINE for at fortælle programmet, at det er den rodnøgle vi arbejder med. Derefter beder vi programmet om at åbne nøglen "Test". Grunden til at der står et True på samme linie, er for at fortælle programmet, at hvis ikke nøglen Test allerede findes, skal den oprettes. Så skriver vi teksten fra Edit1 ind i nøglen EditFelt. Det er sådan set ganske simpelt. Næste linie er måske lidt sværre at forstå. I stedet for at skrive en String (tekst) ind, skriver vi en boolsk værdi ind, altså True eller False. Så hvis CheckBox1 er Checked, så skrives der True, ellers False, eller det vil sige, den skriver talværdierne. 1 betyder ckecked og 0 betyder unchecked. Derefter Free'er vi Registry, fordi i
vi createde den i starten. Du kan nu starte dit program, skrive noget i Edit feltet, og fx afkrydse din CheckBox, og så klikke på Gem. Gå så tilbage til Regedit, tryk på F5. I HKEY_LOCAL_MACHINE vil du nu se en nøgle der hedder Test, og i den vil du se vores 2 værdier, EditFelt og CheckBox. Du kan dog ikke bruge dem til så meget, før du har sat programmet til at kunne modtage disse værdier. Det gør vi med følgende kode i Hent knappen:
procedure TForm1.HentButtonClick(Sender: TObject);
var
Registry: TRegistry;
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
If Registry.OpenKey('Test',True) then
Edit1.Text := Registry.ReadString('EditFelt');
CheckBox1.Checked := Registry.ReadBool('CheckBox');
Registry.Free;
end;
Denne kode er ganske simpel. Vi gør præcis det samme, bortset fra 2 linier. Edit1.Text henter vi via ReadString fra Regdatabasen fra værdien EditFelt (det var jo der vi gemte den), og CheckBox1.Checked får sin True eller False værdi fra værdien CheckBox. Hvis du gjorde som jeg sagde før, ligger der allerede nogen gemte værdier i Regdatabasen, og du kan derfor bare compile dit program og trykke på Hent. Nu skulle de værider du før gemte, meget gerne hentes ind i Edit feltet og CheckBoxen. Hvis det ikke virker, så prøv lige at gå artiklen igennem igen, og se om du har gjort som jeg siger :-). Ellers så spørg i Delphi forum'et.
Dette er jo bare princippet i at bruge Registreringsdatabasen. Din bruger gider sikkert ikke at trykke gem og hent hver gang programmet bruges, så disse 2 funktioner skal naturligvis skjules ind i fx onCreate og onClose på formen. Men nu ved du hvordan det kan gøres.
Kommentarer (10)
Jeg har prøvet ovenstående, men får beskeden.
(failed to get data for checkbox).
hvad har jeg overset.
Venligst
R.Tabel
Fantasstisk.
Virker fint.
Men fyller mappen test enlig ikke en smugle?
Burde jeg ikke slette mappen igen???????
Og hvordan gør jeg det i koder?
får samme fejl som Rene Tabel, og i min Regedit kan jeg slet ikke se at mappen test er under HKEY_LOCAL_MACHINE
Ja, jeg får altså samme fejl som de 2 andre.. Der sker ikke noget hvis jeg gemmer værdierne, og jeg får samme fejl, hvis jeg prøver at hente det som den lige sendte (eller ikke sendte..)
når jeg vil køre programmet komer der nogle fejl
[Error] Unit1.pas(43): Statement expected but 'PROCEDURE' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Jeg kan fint køre programmet, men den ligger bare ikke noget ind i HKEY_LOCAL_MACHINE
hvad kan der være galt?
Jeg får ikke nogle fejl, men til gengæld sker der absolut intet...
Hvis du kører XP er HKEY_LOCAL_MACHINE beskyttet. Brug istedet HKEY_CURRENT_USER. Så virker det.
Jeg er enig i Shafh, mapperne må jo fylde lidt... Men det er så lidt, at det stort set kan være lige meget... Nogle bytes vel
![:) :)](/images/smileys/smiley.gif)
Men kan de fjernes vha. kode?
Du skal være
logget ind for at skrive en kommentar.