TListView和TIniFile的配合 |
尚未結案
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
想請問一下如果我在TListView中,每增加一個Item進去,會寫入3個資料。(如附圖) 而寫入Item的筆數是沒有限制的(當然INI有64K限制在,暫且不Care) 這樣我該怎樣使用Ini來寫入和讀取,我想應該要使用到迴圈來計算總共的筆數,但不知道該從何下手,謝謝 這是我寫入TListView的程式
void __fastcall TForm1::BitBtn2Click(TObject *Sender) { String sName,sType,sPath; TListItem *xItem; switch(ComboBox1->ItemIndex) { case 0://File Mode if(OpenDialog1->Execute()) { sPath = ExtractFilePath(OpenDialog1->FileName); sName = ExtractFileName(OpenDialog1->FileName); sType = ExtractFileExt(OpenDialog1->FileName); } break; case 1: String DirectoryPath; if (SelectDirectory("選擇目錄", "", DirectoryPath)) { sPath = ExtractFilePath(DirectoryPath); sName = ExtractFileName(DirectoryPath); sType = "資料夾"; } break; } xItem = ListView1->Items->Add(); xItem->Caption = sName; xItem->SubItems->Add(sPath); xItem->SubItems->Add(sType); }發表人 - miki-lion 於 2005/10/23 23:19:20 |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
你可以把一個 item 當做一個 section 寫入 ini file,
簡單的例子如下 (我沒跑過,不確定是否正確,意思上大概就是這樣)
AnsiString section; TListItem *item; for (int i = 0; i < ListView1->Items->Count; i) { section = "Item" IntToStr(i); item = ListView1->Items->Item[i]; ini->WriteString(section, sName, item->Caption); ini->WriteString(section, sPath, item->SubItems->Strings[0]); ini->WriteString(section, sType, item->SubItems->Strings[1]); }至於讀出的時候,你可以先讀出全部的 sections 再一個個處理。 TStringList *sections = new TStringList; AnsiString section; TListItem *xItem; ini->ReadSections(sections); for (int i = 0; i < sections->Count; i) { section = "Item" IntToStr(i); xItem = ListView1->Items->Add(); xItem->Caption = ini->ReadString(section, "sName", ""); xItem->SubItems->Add(ini->ReadString(section, "sPath", "")); xItem->SubItems->Add(ini->ReadString(sectionk, "sType", "")); } delete sections;大概就是這樣吧~不知道有沒有寫錯的 :p -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
耶? 不行嗎? 我試的結果是可以耶。
不過我的程式裡頭有些錯字,我把改正的結果貼出來給妳參考。
#include紅字的部分是我原本打錯的地方。 這樣子就可以在執行程式時載入 ini 檔,在結束程式時儲存結果了。 結果會存在 "執行檔名稱.ini" 裡頭。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
謝謝你,我已經可以編譯了,我發現是我自己之前寫的部份,無法跟你寫的部份合併起來。 所以想問你一下
TIniFile *QueryFile = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ));紅字部分我看不太懂? 其他部分我已經修改配合我的程式碼了,謝謝你的幫忙。 附上我之前的程式碼: void __fastcall TForm1::BitBtn4Click(TObject *Sender)//儲存設定檔 {if (SaveDialog1->Execute()) { TIniFile *QueryFile = new TIniFile(SaveDialog1->FileName); //動作選項 AnsiString QuerySection = "Action-Del"; QueryFile->WriteBool(QuerySection ,"content", RadioButton3->Checked); AnsiString QuerySection1 = "Action-Replace"; QueryFile->WriteBool(QuerySection1 ,"content", RadioButton4->Checked); AnsiString QuerySection2 = "Action-Frontinsert"; QueryFile->WriteBool(QuerySection2 ,"content", RadioButton5->Checked); AnsiString QuerySection3 = "Action-Behindinsert"; QueryFile->WriteBool(QuerySection3 ,"content", RadioButton6->Checked); //大約還有20幾行這樣的程式碼,所以省略 delete QueryFile; QueryFile = NULL; } |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
謝謝你~我剛試出來了,雖然有BUG在,選擇多筆檔案,或是目錄和檔案同時寫入時會錯誤,不過總算有點眉目了~謝謝 附上程式碼:
AnsiString section; TListItem *item; TIniFile *QueryFile = new TIniFile(SaveDialog1->FileName); if (SaveDialog1->Execute()) { for (int i = 0; i < ListView1->Items->Count; i) { section = "Item" IntToStr(i); item = ListView1->Items->Item[i]; QueryFile->WriteString(section, "sName", item->Caption); QueryFile->WriteString(section, "sPath", item->SubItems->Strings[0]); QueryFile->WriteString(section, "sType", item->SubItems->Strings[1]); } //動作選項 AnsiString QuerySection = "Action-Del"; QueryFile->WriteBool(QuerySection ,"content", RadioButton3->Checked); AnsiString QuerySection1 = "Action-Replace"; QueryFile->WriteBool(QuerySection1 ,"content", RadioButton4->Checked); delete QueryFile; QueryFile = NULL; }發表人 - miki-lion 於 2005/10/25 19:40:59 發表人 - miki-lion 於 2005/10/25 19:42:31 發表人 - miki-lion 於 2005/10/25 19:45:28 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
哈哈~我發現哪裡我弄錯了,剛剛為了版面美觀我把宣告
TIniFile *QueryFile = new TIniFile(SaveDialog1->FileName);放到外面去,所以程式可以編譯但是實際上執行會造成錯誤。 所以要放回裡面 AnsiString section; TListItem *item; if (SaveDialog1->Execute()) { TIniFile *QueryFile = new TIniFile(SaveDialog1->FileName); for (int i = 0; i < ListView1->Items->Count; i) { . . . . |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |