Avatar billede unclebug Nybegynder
11. februar 2001 - 19:49 Der er 27 kommentarer

Record -> .ini fil

Er der nogen der er stødt på en komponent der kan gemme en record i en .ini fil? Recorden indeholder selvfølgelig kun de basale typer som integer, double, string og den slags, altså ingen objekter. (til gengæld skal den også kunne gemme dynamiske arrays af f.ex. strings). Det burde kunne lade sig gøre, eftersom Delphi har en bunke typeinformation tilgængelig runtime.

Jeg er ikke så meget ude efter en måde at lave den selv (selv om den slags kommentarer er meget velkomne). Hvis den findes i forvejen vil jeg ikke spilde tid med at kode det.
Avatar billede microtec Nybegynder
11. februar 2001 - 21:53 #1
Mon ikke det er hurtigere at kode det selv, frem for at lede efter en komponent?
Det er ikke mange linie, der skal til :o)
Avatar billede martinlind Nybegynder
12. februar 2001 - 09:54 #2
Brug Delphi\'s indbyggede streaming. Component.SaveToStream(aStream);


/Martin
Avatar billede microtec Nybegynder
12. februar 2001 - 09:58 #3
martinlind >> Så får du da ikke en en INI-fil, men en Binær-fil. En INI-fil er en formateret ASCII-fil ;o)
Avatar billede martinlind Nybegynder
12. februar 2001 - 10:02 #4
Det er jeg godt klar over, men det er noget nemere i stedet for at ligge og \"opfinde den dybe talerken\" igen.

/Martin
Avatar billede microtec Nybegynder
12. februar 2001 - 10:14 #5
martinlind >> *gg*, med mindre der var en ide med at det skulle være en INI-fil :o)
Avatar billede unclebug Nybegynder
12. februar 2001 - 11:34 #6
Howdy, tak for kommentarerne.

Det skal være en inifil (human readable form) fordi det gør debugging ca. 1000 gange lettere.

>i stedet for at ligge og \"opfinde den dybe talerken\" igen

Det er jo derfor jeg leder efter en komponent ;o)

Iøvrigt tror jeg ikke at Component.SaveToStream kan bruges. Den vil bare gemme en pointer ved strings og dynamiske arrays (går jeg ud fra, har ikke checket det).

Microtec: Mener du kode komponenten selv, eller bare gemme indholdet af recorden selv? Formålet skulle være at jeg ikke skal ændre på mine load/save rutiner når recorden ændres.

Avatar billede martinlind Nybegynder
12. februar 2001 - 11:38 #7
Der er checket, og det virker fint, hvordan tror du delphi gemmer sine form filer !!

/Martin
Avatar billede microtec Nybegynder
12. februar 2001 - 11:52 #8
unclebug >> ...bare gemme indholdet af recorden selv..
Med mindre, det er en kæmpe record, så syntes jeg du sættet temmelig meget i bevægelse for at få gemt din record i en INI-fil :o)
Avatar billede unclebug Nybegynder
12. februar 2001 - 12:00 #9
>Med mindre, det er en kæmpe record, så syntes jeg du sættet temmelig meget i bevægelse for at få gemt din record i en INI-fil :o)

Well, det kan vel diskuteres. Jeg har en load procedure på 30 linier og en save procedure på 30 liner, og jeg skal opdatere dem hver gang jeg laver den mindste ændring i recorden. Hvis jeg fandt en komponent der gjorde det for mig, så ville det da været meget smartere. Desuden er det jo ikke bare i dette projekt, det kunne være rart i mange andre.

Avatar billede microtec Nybegynder
12. februar 2001 - 12:01 #10
unclebug >> Har du for øvrigt overvejet hvordan en evt. komponent, skulle kunne give elementerne i din record nogle fornuftige navne når de gemmes i INI-filen?

En INI-fil med navngivning BYTE1, BYTE2, BYTE3, STRING1, STRING2 og WORD1 er ikke vidre læsbar, hvis formålet var at den skulle være \"human readable\" ;o)
Avatar billede martinlind Nybegynder
12. februar 2001 - 12:12 #11
Soma-sumarom >> Component-streaming er faktikst temmeligt smart, istedet for en record laver du en class med published probs. så vil alle published probs blive savet.

/Martin
Avatar billede microtec Nybegynder
12. februar 2001 - 12:14 #12
martinlind >> Men så kan man ikke manuelt læse og ændre i filen. Det kan jeg godt se at der er en pointe i at man kan. Jeg benytter det ofte selv.
Avatar billede martinlind Nybegynder
12. februar 2001 - 12:17 #13
Til gengæld skal man ikke rette for at tilføje en ny prop, den bliver automatisk gemt når den er tilføjet til class\'en

/MArtin
Avatar billede microtec Nybegynder
12. februar 2001 - 12:26 #14
martinlind >> Hvorfor laver du et \"svar\" hver gang du kommer med en \"kommentar\" ;o)
Avatar billede martinlind Nybegynder
12. februar 2001 - 12:31 #15
fordi eller ville du ikke havde noget at spørge om *S*
Avatar billede microtec Nybegynder
12. februar 2001 - 12:42 #16
martinlind >> Godt \"svar\" *gg*

\"point-jagten\" plejer bare ikke at være så intens herinde i Delphi (heldigvis) :o)
Avatar billede shanders Nybegynder
20. februar 2001 - 13:28 #17
Du kunne evt. prøve med følgende :

Procedure SaveRecordToIni( Dataset : TDataset; IniFileName, Section : String );
Var i : integer; Ini: Tinifile;
begin
  Ini := TInifile.Create( IniFileName );
  For i := 0 to Dataset.FieldCount - 1 do
  begin
    Ini.WriteString( Section, DataSet.FieldList.Fields[i].FieldName, DataSet.FieldList.Fields[i].AsString);
  end;
  Ini.Free;
end;

Betydeligt nemmere end at tilføje og modifisere en kmoponent.
Avatar billede microtec Nybegynder
20. februar 2001 - 13:33 #18
shanders >> Det kræver at der er tale om en database application. Det er vist ikke det unclebug mener med en \"record\" :o)
Avatar billede shanders Nybegynder
20. februar 2001 - 14:03 #19
Damm jeg trænger til at komme lidt ud !
Den er slem når man forsøger at optimere indexseringen på kryderrihylden ;)
Avatar billede martinlind Nybegynder
20. februar 2001 - 14:50 #20
shanders >> og ender i salatfadet ( med spinat )
Avatar billede bustermaniac Nybegynder
09. marts 2001 - 14:32 #21
Nedenstående er bare en omskrevet udgave af shanders. Den kræver bare du opretter en record. Nu har jeg ikke lige testet den, men det ser ud til at virke.

Mark

Type
    TMyRec = record
        Navn: String;
        Alder: Integer;
End;

Procedure SaveRecordToIni( Rec: TMyrec; IniFileName, Section : String );
Var
i,Antal : integer;
Ini: Tinifile;

begin

  Ini := TInifile.Create( IniFileName );
    Ini.ReadInteger( \'Main\', \'Antal\', Antal);
    Ini.WriteInteger( \'Main\', \'Antal\', Antal+1);
    Section := Section + \' \' + IntToStr(Antal+1);
    Ini.WriteString( Section , \'Navn\', Rec.Navn);
    Ini.WriteString( Section, \'Alder\', IntToStr(Rec.Alder));
  end;
  Ini.Free;
end;
Avatar billede bustermaniac Nybegynder
09. marts 2001 - 14:34 #22
Måske burdejeg lige nævne at der i ovenstående kode  er mulighed for flere records gemt i samme fil. Der bliver bare skrevet et ekstra tal efternavnet på sektionen.

Mark
Avatar billede microtec Nybegynder
09. marts 2001 - 14:42 #23
bustermaniac >> Du er da nød til at ændre \"SaveRecordToIni\" hvis du ændre din record \"MyRec\".

Du du gør er pærcis det jeg anbefaler \"12/02 2001 11:52:55\".
Avatar billede bustermaniac Nybegynder
12. marts 2001 - 09:09 #24
microtec>> Ok. det glemte jeg vidst at sige, men i mit lille hoved er det da logisk at man ændre i det, så det passer på ens kode.

Altså hvis du ændrer i recorden skal du også tilføje/ændre i:

Ini.WriteString( Section , \'Navn\', Rec.Navn);
    Ini.WriteString( Section, \'Alder\', IntToStr(Rec.Alder));

...så den passer på din kode.

Buster
Avatar billede microtec Nybegynder
12. marts 2001 - 09:23 #25
bustermaniac >> Jammen, jeg ville også selv have løst det på den måde du gør *gg*

unclebug har bare flere gange gjort opmærksom på at det ikke var det han ønskede. Hvis der ændres i recorden, skal der ikke ændres i INI-fil håndteringen.
Avatar billede martinlind Nybegynder
15. marts 2001 - 11:31 #26
Netop derfor skal man bruge RTTI hvis du skal lave noget ordenligt.
Avatar billede microtec Nybegynder
15. marts 2001 - 11:50 #27
martinlind >> Det er skide irreterende at du konsekvent vælger at benytte \"svar\" selv om det kun er en simpel kommentar du kommer med.

Hvis du ikke har opdaget det, så skrives det i den mail der udsendes til spørgsmålets deltagere. Når der står \"svar\" tror man at nu er der kommet noget med kød på.

Jeg tror ikke dine chancer for at få point´s bliver størrer bare fordi du benytter \"svar\" hele tiden ;o)
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