Delphi - *.ini - Ako zistím počet kľúčov v sekcii?
Ťažko hľadať v helpe v Delphi, keď presne neviem, čo hľadať. Je nejaká funkcie v Delphi pre načítanie všetkých kľúčov z *.ini súboru z určitej sekcie? Tiež potrebujem aj ich počet. Ide o to, aby som nemusel mať v súbore ešte aj informáciou o počte takýchto kľúčov v sekcii. Takže znovu. Mám v *.ini sekciu a v nej mám kľúč oznamujúci počet klúčov v tej sekcii. Kľúče sú s rovnakým názvom, len na konci názvu obsahujú ešte poradové číslo. No a tieto kľúče načítam. Je možnosť zostiť počet týchto kľúčov v sekccii aj bez toho, aby som musel mať kľúč oznamujúci ich počet? Určite sa to dá cez TValueListEditor, ale to je vizuálna komponenta a je to zbytočné mrhanie prostriedkami. Moja predstava je takáto:
pocetklucov := Ini.KeyCount('Sekcia');
Možná pomocí ReadSectionValues uložit do Listboxu nebo Memo a spočítat...?
Jsem zvědav, kdo dřív mě dřív s tímhle řešením pošle do háje, jestli JaFi nebo Rce...
Ja.
Teraz vážne.
Premýšľal som o tom. Dá sa to pomocou cyklu repeat until a postupným zvyšovaním poradového čísla klúča. Podmienkou na ukončenie cyklu je neexistujúci klúč s práve aktuálnym v cykle sa zvyšujúcim poradovým číslom. Takto načítam vštky kľúče a viem aj ich počet.
Vizuálne komponenty som zámerne nechcel použiť, aj keď možno je možné načítať to do StringList (to nie je vizuálna komponenta, len obyčajný zoznam reťazcov), ale neviem ako. Preto nie vizuálne, lebo je to ako kkúpiť televízor a pozerať ho so zavretými očami. Prebytočnosť.
Ale ďakujem za vynaloženú námahu.
Použij objekt TIniFile, speciálně TIniFile.ReadSectionValues (...(parametry najdeš v helpu)...). Všechny klíče nacpe do TStrings kde TStrings.Count ti dá přímo jejich počet.
PS: Visuální komponenty jdou používat též "nevisuálně", když si je vyrobíš za běhu na vlastní triko - někdy to ani jinak nejde .
//Edit: Nebylo by to lepší nacpat do registru, než do INI?
Ee, register oblúkom vynechám. Okrem toho do tohto INI budem pristupovať často aj ručne. BTW, že visuálne komponenty idú aj nevizuálne to viem, len sa mi to vidí ako zbytočný prepych.
Proc by to nebylo pouzitelny , treba takto: (ber jen jako priklad)
Pokud mas potrebu vice klicu pouzij Tstrings misto string (jmeno,heslo...) promennych.
Mozna to neni uplne nejlepsi zpusob.
BTW TIniFile a TStrings zrovna nejsou visuální komponenty... A klidně bych je použil. Jsou docela krátké a efektivní, líp to nenaprogramuješ - teda pokud ti extra nezáleží na superrychlosti jako třeba u toho OnFilterRecord .
Pozor nie TStrings. TStrings je abstratná trieda. Zrejme sa myslí TStringList. Už som mal dosť trápenia s TStrings až mi Jan Fiala vysvetlil, že ako samostatná trieda je to použiteľné len ako "predok". Preto v úzodzovkách, lebo sa to dá použiť aj ako člen triedy, ak sa nadefinujú niektoré abstrakné virtuálne metódy v TStrings.
Ano, TStrings je abstraktní třída a můžeš z toho TIniFile to narvat do všeho, co je na této třídě postavené. Třeba do THashedStringList, TStringList, atd. Tak hluboce jsem tě nepodceňoval, že to nevíš.
Ja som to myslel ako na hotovo, čiže načítať priamo do použiteľného objektu, ale vlastne to je pravda, že TStrings je podstata. Mne skôr išlo o to, aby sa nestalo, že o týždeň niekto napíše, že s tými textami nievie v TStrings pracovať. Ozaj, V TStrings nefunguje Count, pretože je to abstraktná metóda, ako je to upravené v Memo, kde je vlastnosť Lines postavená na základe TStrings a teda Count musí byť naprogramovaný? Ide mi o to, že ako sa dá naprogramovať metóda, ak nie je objekt zdedený v potomkovi, ale priamo je v triede (TMemo) definovaný objekt (TStrings) a metóda Count tu už funguje.
No pokud to treba zadas takto
Tak ti to pujde opicarna.count
Speciálně u TMemo je vlastnost Lines: TStrings implementována jako TMemoStrings, která všechny abstraktní třídy definuje.
//Edit: Prostě přistupuje se k tomu jako k TStrings a jak je to konkrétně implementováno, je před uživatelem (programátorem) skryto páč je to nepodstatné.