線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1512
推到 Plurk!
推到 Facebook!

TListView和TIniFile的配合

尚未結案
Miki-lion
中階會員


發表:90
回覆:180
積分:54
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-23 23:16:09 IP:218.162.xxx.xxx 未訂閱
想請問一下如果我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-25 12:05:25 IP:210.64.xxx.xxx 未訂閱
你可以把一個 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-25 18:14:19 IP:218.162.xxx.xxx 未訂閱
沒關係,謝謝你的幫忙,我已經試著修改錯誤。 雖然還是不行,不過還是謝謝你,我也會繼續試著弄看看。
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-25 18:57:15 IP:203.70.xxx.xxx 未訂閱
耶? 不行嗎? 我試的結果是可以耶。 不過我的程式裡頭有些錯字,我把改正的結果貼出來給妳參考。
 
#include   // 為了要用 SelectDirectory
#include   // 為了要用 INI file    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TStringList *sections = new TStringList;
    AnsiString section;
    TListItem *xItem;
    TIniFile *ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ));
    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(section, "sType", ""));
    }
    delete sections;
    delete ini;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    AnsiString section;
    TListItem *item;
    TIniFile *ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ));
    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]);
    }
    delete ini;
}
紅字的部分是我原本打錯的地方。 這樣子就可以在執行程式時載入 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-25 19:34:39 IP:218.162.xxx.xxx 未訂閱
謝謝你,我已經可以編譯了,我發現是我自己之前寫的部份,無法跟你寫的部份合併起來。    所以想問你一下  
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-25 19:39:29 IP:218.162.xxx.xxx 未訂閱
謝謝你~我剛試出來了,雖然有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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-25 19:51:01 IP:218.162.xxx.xxx 未訂閱
哈哈~我發現哪裡我弄錯了,剛剛為了版面美觀我把宣告  
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)
    {
    .
    .
    .
    .
 
系統時間:2024-04-28 0:35:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!