Avatar billede js_delphi Nybegynder
16. januar 2005 - 21:27 Der er 28 kommentarer og
1 løsning

Hvordan gemmes en CheckBox's indstilling?

Goddag,

i et hvilket som helst progam er det som regel muligt at välge forskellige funktioner ved at "vinge af" i en CheckBox eller ved at välge en RadioButton.
Hvordan gemmes den seneste indstilling af f.eks. en CheckBox (vinget af eller ej?), när programmet lukkes ned, sä programmet starter op med samme indstilling?

Pä forhänd tak for hjälpen.
Avatar billede stone Forsker
16. januar 2005 - 21:40 #1
du kan gemme den i en ini file
husk inifiles i uses
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i : Integer;
begin
ini := TIniFile.Create('c:\temp\MyIniFile.ini');

for i := 0 to ComponentCount-1 do
  if (Components[i] is TCheckbox) then
  ini.WriteBool('Indstillinger',components[i].Name,(Components[i] as TCheckbox).Checked);
ini.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
ini := TIniFile.Create('c:\temp\MyIniFile.ini');

for i := 0 to ComponentCount-1 do
  if (Components[i] is TCheckbox) then
    (Components[i] as TCheckbox).Checked := ini.ReadBool('Indstillinger',components[i].Name,false);
  ini.Free;
end;
Avatar billede stone Forsker
16. januar 2005 - 23:04 #2
hov..glemte lige en vaiabel

ini : Tinifile;
Avatar billede js_delphi Nybegynder
17. januar 2005 - 07:43 #3
Er det samme metode, när det gälder RadioButtons?
Jeg tester det af senere i dag.
Avatar billede kfz Nybegynder
17. januar 2005 - 08:02 #4
i stedet for at bruge radiobuttons, ville det være mere overskueligt at lave en radiogroup.

og når du skal gemme indstillingen fra den skal du bare gemme itemindex, evt med inttostr.
Avatar billede stone Forsker
17. januar 2005 - 09:43 #5
Ja det er samme metode du bytter bare TCheckbox ud med TRadiobutton.
Avatar billede stone Forsker
17. januar 2005 - 13:11 #6
iøvrigt en radiogroup kan der kun vælges en knap af gangen, kan bruges til hvis der skal vælges en radiobuttons af gangen, f.eks i en dag specification:

mandag
tirsdag
onsdag
torsdag
Fredag
osv....
Avatar billede kfz Nybegynder
18. januar 2005 - 07:21 #7
man kan også kun vælge 1 indstilling med radiobutton, det giver mere fleksibilitet mht. GUI, men giver også noget mere kode, så ville personligt vælge radiogroup og så bare gemme itemindex, muligvis som string
Avatar billede js_delphi Nybegynder
18. januar 2005 - 16:55 #8
Jeg har nu fäet det til at virke med et testprogram (en form med en CheckBox).
När jeg fletter det ind i mit forhenvärende program, sker der intet. Ingen compiler fejl eller andet. Der oprettes ganske enkelt ingen INI fil.
Jeg bövler videre i aften.
Avatar billede stone Forsker
18. januar 2005 - 17:03 #9
så er det fordi stien til ini filen ikke er korrekt
Avatar billede js_delphi Nybegynder
18. januar 2005 - 17:22 #10
Copy/Paste - sä den burde väre OK.
Jeg finder ud af det til i morgen.
Avatar billede stone Forsker
18. januar 2005 - 17:26 #11
nej ikke hvis det er ren copy/paste for du har ikke oprettet et bibliotek c:\temp
som mit eksempel skriver til.
Avatar billede kfz Nybegynder
18. januar 2005 - 17:35 #12
brug ini := TIniFile.Create(ExtractFilepath(Application.Exename) + 'MyIniFile.ini');
i stedet for....
Avatar billede stone Forsker
18. januar 2005 - 18:21 #13
god ide.... kfz så bliver ini filen gemt i biblioteket hvor exe filen ligger.
Avatar billede kfz Nybegynder
18. januar 2005 - 19:51 #14
og så risikerer man ikke umiddelbart at et andet program overskriver den....
bruger det altid selv, så er det også nemmere at tage backup af dem hvis man skal formatere
Avatar billede js_delphi Nybegynder
19. januar 2005 - 08:46 #15
Sä fik jeg det til at virke med CheckBox og Radiobutton. Af en eller anden grund skulle formen OnClose event aktiveres igen, selvom den er brugt i mit program i forvejen. Hvordan virker det sä med en TEdit's indstilling? Jeg har prövet fölgende:

I OnClose
ini.WriteString('Indstillinger',components[i].Name,(Components[i] as
TEdit).Text); 

I FormCreate
if (Components[i] is TEdit) then
(Components[i] as TEdit).Text := ini.ReadString('Indstillinger',components[i].Name,false);

Det virker ikke (kan ikke compiles), men kan I hjälpe mig pä rette vej?
Avatar billede stone Forsker
19. januar 2005 - 10:12 #16
skriver til ini
procedure TForm1.BtnWriteClick(Sender: TObject);
var
TheIni: TIniFile;
str: string;
begin
str := ExtractFilePath(Application.ExeName) + 'edit1.ini';
TheIni := TIniFile.Create(str);
TheIni.WriteString('Name', 'Num1', Edit1.Text);
end;


læser fra ini
procedure TForm1.BtnReadClick(Sender: TObject);
var
TheIni: TIniFile;
Str: String;
begin
str := ExtractFilePath(Application.ExeName) + 'edit1.ini';
TheIni := TIniFile.Create(str);
edit1.Text:=  TheIni.ReadString('Name', 'Num1', Edit1.Text);
end;
Avatar billede js_delphi Nybegynder
19. januar 2005 - 10:49 #17
Den gemmer kun en specificeret Edit's text. 
Det smarte ved den förste metode er jo, at den automatisk välger alle CheckBoxe pä formen.
Avatar billede stone Forsker
19. januar 2005 - 11:08 #18
jeg ved det ..men kan ikke huske med flere edit, og jeg har ikke lige tid til for øjeblikket på at eksperimentere.
Avatar billede kfz Nybegynder
19. januar 2005 - 15:56 #19
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }

    sti: string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
ini: tinifile;
i: integer;
begin
sti := ExtractFilepath(Application.Exename) + 'MyIniFile.ini';
if not fileexists(sti) then
  exit;
ini := tinifile.Create(sti);
for i := 0 to form1.ComponentCount -1 do
  if (Components[i].Classname = 'TEdit') then
  (Components[i] as TEdit).Text := ini.ReadString('Indstillinger',components[i].Name,'');
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
ini: tinifile;
i: integer;
begin
ini := tinifile.Create(sti);
canclose := false;
for i := 0 to form1.ComponentCount -1 do
  if (Components[i].ClassName = 'TEdit') then
  ini.writeString('Indstillinger',components[i].Name,(Components[i] as TEdit).Text);
canclose := true;
end;

end.
Avatar billede js_delphi Nybegynder
20. januar 2005 - 08:33 #20
Det virker, hvis jeg bruger Stones förste metode:

ini := TIniFile.Create('c:\temp\MyIniFile.ini');

i stedet for:

sti := ExtractFilepath(Application.Exename) + 'MyIniFile.ini';
ini := tinifile.Create(sti);

Den crasher, när formen lukkes.
Avatar billede js_delphi Nybegynder
20. januar 2005 - 08:34 #21
Jeg har i övrigt tilföget sti : string; som variabel..
Avatar billede kfz Nybegynder
20. januar 2005 - 12:06 #22
hvis du copy/paster den kode jeg har lavet og sætter 6 edits på din form, så virker det....du kan også sætte 10 hvis du har lyst....
Avatar billede kfz Nybegynder
20. januar 2005 - 12:07 #23
ellers hvis du giver mig en mail, kan jeg sende det til dig....
Avatar billede stone Forsker
20. januar 2005 - 12:26 #24
du skal ikke tilføje sti: string som variabel men i "public declarations"

hvis du sætter "sti: string" som variabel får du en fejlmelding ved lukning
Avatar billede js_delphi Nybegynder
20. januar 2005 - 12:48 #25
Oh yes, sä virker det. Hvad er forskellen pä at sätte "sti : string;" under variabler og under public declarations?

Jeg giver de 30 point til Stone, og opretter et nyt spörgsmäl til 30 point til kfz, da det vist er rimeligt.

Tak for hjälpen.
Avatar billede stone Forsker
20. januar 2005 - 12:51 #26
sti: string i public så kan den bruges i alle forme, hvis du sætter den i privat kan den kun bruges i form1.
Avatar billede stone Forsker
20. januar 2005 - 13:00 #27
lige et ps...

når du placerer sti:string i en var er den kun gældene i den unit som den er placeret
Avatar billede js_delphi Nybegynder
20. januar 2005 - 13:11 #28
Hvorfor gav det sä en fejlmeddelse, när jeg lukkede form1? Den var jo kun brugt i form1.
Avatar billede kfz Nybegynder
20. januar 2005 - 18:22 #29
hvis du placerer den under var gælder den kun i den procedure hvor den er deklareret, så derfor hvis der er mere end 1 procedure/function som skal bruge en variabel skal den stå under private eller public
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