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.
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.
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)
>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.
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)
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.
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.
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;
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.
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.
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)
Synes godt om
Ny brugerNybegynder
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.