全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4982
推到 Plurk!
推到 Facebook!

處理 ini檔 の 最終奥義

 
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-15 22:46:26 IP:211.76.xxx.xxx 未訂閱
前提:如果你只想單純的從ini檔裡讀/寫幾個選項, 而且誓死不換TIniFile的用法, 那此篇文章您就可以省略不看.    狀況1:我想對ini檔裡面的選項要作排序時, TIniFile可以達到要求嗎? 狀況2:我想對ini檔裡的第Index個字串, 作個別處理時, TiniFile可以作到嗎?    也許有人會說, 那怎麼不自己使用TStringList另外作掉就好?      Good question 說到此, 我先列一下> > 原由: 因為我想要對>> 兩者混用 原來, 你打開 > 寫到此, 看倌應該還看不出兩者混用的最大好處在那. 只知道有 class="code"> String IniFileName=ExtractFilePath(ParamStr(0)) "MyText.ini"; TStringList *FileList=new TStringList(); TMemIniFile *IniMemory=new TMemIniFile(""); // 為什麼不給檔名? 因為給了檔名也Load不進File, 乾脆用空字串, 讓Compiler pass, 而且也不用記檔名 ^^" if (FileExists(IniFileName)) FileList->LoadFormFile(IniFileName); IniMemory->SetStrings(FileList); // 注意: 要把TStringList的內容塞到TMemIniFile, 居然是用SetStrings而不是GetStrings喔, 反之亦同 2) 第1個步聚作完後, 我想, 你想要讀到第Index個ini檔的字串, 你覺得還是個問題嗎? 只要使用FileList->Strings[Index] 就可以搞定了 而且如果你使用> >, 因為真的是在 class="code"> FileList->Clear(); // 是見鬼了喔? 為什麼一定要Clear? // 經過小弟實作的結果...使用IniMemory->SetString(FileList);時, 居然會先自動清掉IniMemory的data, 然後再把TStringList的內容存入TMemIniFile; // 然而, IniMemory->IniMemory->GetString(FileList), 居然不會先清掉TStringList裡的內容, 而是累加上去, 所以如果你要完整呈現TMemIniFile裡的內容, 就先把TStringList的內容清掉 IniMemory->GetString(FileList); ShowMessage(FileList->Text); 4)怎麼寫一個概念中WriteSectionValues的動作呢?
// 假設你在這之前已經把IniMemory和FileList的內容都弄成相同了
TStringList *SortList=new TStringList();
IniMemory->ReadSectionValues("SectionName1", SortList);
.......//處理完你要對自己SectionName1裡整塊選項的字串, 比如說排序....
int Index=FileList->IndexOf("SectionName1");
for (int i=0; iCount; i  )
  FileList->Strings[  Index]=SortList->Strings[i];    // 若是你要再作兩者對齊的動作
IniMemory->SetString(FileList);
5) 當你排完序, 或是處理完所有的data後, 要把內容寫回ini檔時, 可以這樣子作 FileList->SaveToFile(IniFileName); 以上的混用法. 1. 保證HDD只有被access兩次, 第一次在FileList->LoadFromFile, 第二次在FileList->SaveToFile(IniFileName); 假使你是使用TIniFile, 嘿嘿...那HDD絕對被access兩次以上 2. 完全在Memory裡運作, 速度相當的快, 不用為了讀檔/存檔不一致性, 讓程式更有條理, 因為都是在Memory運作 有一點讓我不解的是...用TMemIniFile寫入的字串, 比用TIniFile寫入得字串, 在每個Section的最後面會多一行空白字串 @@~ 只有這點怪怪的< > 以上是小弟的淺見, 如有任何不妥之處, 請不吝賜教< > 經過RaynorPao版主的腦筯激盪....給了TMemIniFile TStringList另外一個重大的任務...那就是===>Ini檔加/解密, 是不是很容易就可以完成啦? 發表人 -
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-16 20:26:38 IP:61.224.xxx.xxx 未訂閱
記得去年我就對 TMemIniFile 很有興趣,參考: ■ 如何更新內建 VCL 元件  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18519    後來因為工作上的需要已完全改寫了 TMemIniFile 。 如果認為 TMemIniFile 的行為異常,可以參考它的 source 會比較了解,當然是 Delphi 的 code 對於 BCB 的用戶較為吃力...    這篇文章似乎是我看過單日點選最多的一篇,才一天不到就有 500 多人次的點閱  <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-16 22:17:40 IP:211.76.xxx.xxx 未訂閱
特別感謝dllee版主的賜教 我是最近要用到
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-23 09:53:31 IP:63.84.xxx.xxx 未訂閱
根據這幾天的study後, 對之前發表的內容作補正: TMemIniFile沒有SaveToFile/LoadFromFile 但是有相同的功能, 如下說明 LoadFromFile: 在你用使new TMemIniFile(FileName); 時 內部Class會去判斷FileName的檔案是否存在, 是的話, 就會自己Load進來 (可參考BCB所附的IniFiles.pas) SaveToFile: 請使用UpdateFile();
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-23 20:39:15 IP:61.224.xxx.xxx 未訂閱
哈哈!K VCL 的 source 感覺如何呢?    我自己的感覺是,挖愈多 VCL 的 source 就愈想學 Delphi  <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-24 11:24:45 IP:63.84.xxx.xxx 未訂閱
引言: 哈哈!K VCL 的 source 感覺如何呢? 我自己的感覺是,挖愈多 VCL 的 source 就愈想學 Delphi <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
粉抱歉, 偏偏我就是怪胎....慢慢懂看得懂 >
circusmonkey
一般會員


發表:6
回覆:10
積分:8
註冊:2004-06-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-10 07:00:49 IP:141.24.xxx.xxx 未訂閱
我不是很同意 TMemIniFile 这个控件。理论上说,一次性读入所有内容,可以 提高性能。但是如果用 TMemIniFile 来替代 TIniFile 还是不行。理由有如下 这些: 1. 由于是内容读写都在内存中进行。如果同时有2个 TMemIniFile 同时打开一 个文件,那么 A实例对文件的改动根本不会被 B实例发现。很容易造成文件 内容的混乱。 2. 如果在运行程序的过程中出现了非法操作,可能所有内容因为尚未保存而随 之丢失。 3. 其实读取单条记录的话,由于 TIniFile 是调用了 API函数,所以速度肯定 比 TMemIniFile 要快。因为后者必须先读取整个文件。我做过测试,可能后 者的速度优势在读取了51条记录后体现。但倘若前者使用 ReadSection/ReadSectionValue 而非 ReadString,那么他的速度与后者相 当。 4. 还有其它很多小问题,比如排版格式,注释行,等等问题,会在 TMemIniFile 中陆续出现。 综上所述,我认为合理使用 TIniFile 是正解。当然目前 TIniFile 没有提供 WriteSection/WriteSectionValue 的确是个性能瓶颈。但这个应该不难解决。 我在选择使用标准的 TIniFile 还是使用 TMemIniFile/TStringList 问题上, 几经周折。如果对我上述发言,有讨论、反对或者补充的,非常欢迎。 發表人 - circusmonkey 於 2004/11/10 07:03:48
系統時間:2024-05-20 20:09:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!