Avatar billede lille_my Nybegynder
02. juli 2003 - 07:20 Der er 19 kommentarer og
1 løsning

Config fil eller noget? gemme oplysninger

Ny har jeg gennem nattet arbejdet hårdt på et lille teksbehandlings program, som egentlig var mit eksamens projekt, men nu er der gået sport i at gøre det bedre :D
Nu har jeg bl.a. fået lavet en funktion så den gemmer efter et stykke tid (har brugt Ttimer). Den har jeg gjordt variabel med en trackbar, men når jeg går ud af mit program, og ind i det igen, så har den jo ikke gemt noget. Det vil sige det er standart indstillingerne som er der igen. Hvad kan jeg gøre for at kunne gemme disse indstillinger/oplysninger (trackbar1.posistion), så den kan loade dem næste gang programmet startes?
Avatar billede lille_my Nybegynder
02. juli 2003 - 07:24 #1
Hvis nogle skulle misforstå "så har den jo ikke gemt noget", den har gemt txt filen ikke noget problem der. Det den ikke har gemt er de nye oplysninger om trackbar1, hvilket jeg udemærket godt kan forstå. Ved bare ikke hvad jeg kan gøre for, at den gør det
Avatar billede snowball Novice
02. juli 2003 - 07:58 #2
http://home1.inet.tele.dk/j-cgeert/InifileSample.zip

Her er en lille applikation der henter og gemmer informationer i en ini fil.

Snowball
Avatar billede badass Nybegynder
02. juli 2003 - 08:02 #3
Du kan prøve at gemme instillingerne i en inifil.

// Gem
Procedure Gem;
Var Inifil : TInifil;
begin
  Inifil := TInifil.Create('Config.ini');
  Inifil.WriteInteger('TrackBar', 'Position', TrackBar.Position);
    .
    . Gem øvrige instillinger
    .
end;

// Hent
Procedure Hent;
Var Inifil : TInifil;
begin
  Inifil := TInifil.Create('Config.ini');
  TrackBar.Position := Inifil.ReadInteger('TrackBar', 'Position', 1);
    .
    . Hent øvrige instillinger
    .
end;
Avatar billede arne_v Ekspert
02. juli 2003 - 08:34 #4
Ville det ikke være mere "moderne windowsk" at gemme i registry
fremfor i en INI-fil ?
Avatar billede snowball Novice
02. juli 2003 - 08:39 #5
arne_v: Det er lidt af en smagssag. Nogen vil hellere bruge det ene frem for det andet.

Snowball
Avatar billede lille_my Nybegynder
02. juli 2003 - 09:33 #6
jeg tror jeg holder mig til en ini fil, hvis ellers jeg kan få det til at virke.
jeg er noget så langt at der vidst kun er en fejl tilbage, og den ligger i:

indst.autovalue.Position := iniFile.Readinteger('Autosave','Minut','Not Found1');

"indst" = den form det skal hentes til
"autovalue" = min trackbar

Den kommer med fejlen incompatible types: 'integer' and 'string'
Jeg kan ikke lige få den til at være integer, men den laver filen godt nok. Hvad går det der 'not found1' ud på snowball, eller '1' som står samme sted i badass' indlæg?
Håber i forstår hvad jeg skrive, for jeg gør det snart ikke selv mere. Ellers må i lige skrive hvad i ikke forstår
Avatar billede snowball Novice
02. juli 2003 - 09:36 #7
Den sidste værdi i ReadString/Integer delen, er den default værdi den skal bruge hvis den af en eller anden årsag ikke kan læse værdien fra ini filen.

Mht. incompatible types, så kan du lave en StrToInt for at lave en string værdi om til en integer værdi og IntToStr for at gøre det modsatte.

Snowball
Avatar billede arne_v Ekspert
02. juli 2003 - 09:39 #8
Principielt kan jeg også meget bedre lide INI-fil konceptet end
registry.

Men det er bare mit indtryk at har Microsoft ment noget andet siden 1995.
Avatar billede snowball Novice
02. juli 2003 - 09:42 #9
arne_v: Det er rigtigt nok at ini filer sådan set er et levn tilbage fra Win3.x tiden, men jeg synes nu stadig det er en ganske udmærket måde at gemme diverse informationer på.

Som der også står i Delphi's hjælp til TIniFile: "TIniFile is a low-level wrapper for the 16-bit Windows 3.x INI file system"

Snowball
Avatar billede lille_my Nybegynder
02. juli 2003 - 09:57 #10
nu har jeg skrevet sådan:
indst.autovalue.Position := iniFile.Readinteger('Autosave','Minut', '5');

så siger den bare incompatible types integer og char. Selv ville jeg gøre sådan:
indst.autovalue.Position := strtoint(iniFile.Readinteger('Autosave','Minut', '5'));
men lige lidt hjælper det. Hvad gør jeg forkert?
Avatar billede lille_my Nybegynder
02. juli 2003 - 10:04 #11
"Project filnavn.exe raised execption class EAccessViolation with message 'access violation at adress 004B7DD5 in module 'filnavn.exe'. Read of adress 00000308'. Process stopped. Use sted or Run to continue"

Den fejl har jeg snart set et par gange, er det dét, som er galt?
Avatar billede snowball Novice
02. juli 2003 - 10:05 #12
Prøv nedenstående:

indst.autovalue.Position := StrToInt(iniFile.ReadString('Autosave','Minut', '5');

Mht. din access violation, så prøv og step dig igennem programmet for at se hvor fejlen opstår.

Snowball
Avatar billede lille_my Nybegynder
02. juli 2003 - 10:24 #13
Fejlen opstår netop i hele den der åbning proces

indst.autovalue.Position := StrToInt(iniFile.ReadString('Autosave','Minut', '5'));
Avatar billede snowball Novice
02. juli 2003 - 10:25 #14
Og formen "indst" er selvfølgelig oprettet når du forsøger at gøre ovenstående !?

Snowball
Avatar billede lille_my Nybegynder
02. juli 2003 - 10:29 #15
Jeg kan få den til at komme ud som en char, når vi skriver readinteger i stedet for readstring. Er der så ikke en char to integer? har prøvet ChrToInt og ChaToInt og CharToInt, men det virker ikke.
Avatar billede snowball Novice
02. juli 2003 - 10:33 #16
Nedenstående virker fint for mig. Godt nok med en Progressbar, men Position værdien for begge komponenter er jo integer, så det burde også virke hos dig.

ProgressBar1.Position := StrToInt(iniFile.ReadString('Main','Value','5'));

Laver du andre ting på "indst" formen i samme klump kode som hvor du prøver at sætte Position ?

Snowball
Avatar billede lille_my Nybegynder
02. juli 2003 - 10:41 #17
"Laver du andre ting på "indst" formen i samme klump kode som hvor du prøver at sætte Position ?" nej ikke endnu. Kan det være fordi formen ikke er åbnet. Jeg har sat koden ind når programmet åbner, men da er formen indst ikke åben
Avatar billede lille_my Nybegynder
02. juli 2003 - 10:45 #18
"Kan det være fordi formen ikke er åbnet", ja det var det så. Efter tre laaaange timer, så for du nu dine point
Avatar billede snowball Novice
02. juli 2003 - 10:51 #19
;)

Tak for point.

Snowball
Avatar billede razersedge Nybegynder
02. juli 2003 - 12:36 #20
Sån lige en detalje, grunden til du har fået incompatible types integer and char, er, at du har sat ReadInteger til at returnere en char som default værdi, ReadInteger returnerer en integer, derfor skal din default værdi også være en integer.
Derfor:
ReadInteger('Main','Value',5); og ikke ReadInteger('Main','Value','5');

Simon
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