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

TWideStrings該怎麼使用?

尚未結案
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-09 00:39:26 IP:59.104.xxx.xxx 未訂閱
請教各位我在宣告 TWideStrings *test; 會出現type name expected 我有 #include "wstring.h" 還是不行 請教各位該如何正確使用呢,謝謝大家
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-09 01:19:06 IP:61.230.xxx.xxx 未訂閱
fbiceo 您好:    您打錯字了,型態宣告不是 TWideStrings 而是 WideString,改一下就好了。      7 天天敲鍵盤 v 時時按滑鼠 8
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-09 12:53:48 IP:210.244.xxx.xxx 未訂閱
Hello RedSnow 您好 感謝您再一次替我解惑,想再一次請教 TStringList 可以這樣做 TStringList *test; test = new TStringList; test->Add("111"); test->Add("222"); test->Add("333"); test->Add("444"); test->Add("555"); test->SaveToFile("c:\\test.txt"); WideString我使用後並沒有Add() 有一個Attach()不過沒有SaveToFile() 是否有辦法讓WideString 有TStringList 一比一比加入資料後儲存成一個檔案呢? 謝謝你的指導
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-09 13:59:20 IP:59.115.xxx.xxx 未訂閱
fbiceo 您好:    不好意思,我正準備出門,我先簡單回覆一下,您先做個參考。    WideString 就如 AnsiString 一樣,都未提供 List 的功能,如果您想要以 StringList 的方式來處理資料,我直覺的認為您或許可以使用 TList 來處理,如果您對 TList 不熟悉,您不妨先查看一下相關說明,同時透過站上的搜尋功能,應該也能找到不少的資料可供參考,您先試試看吧。      7 天天敲鍵盤 v 時時按滑鼠 8
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-10 18:04:33 IP:210.244.xxx.xxx 未訂閱
RedSnow: 不知道您是否方便指導一下,我還是沒有什麼頭緒 謝謝你
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-11 00:36:45 IP:61.230.xxx.xxx 未訂閱
fbiceo 您好:    真是抱歉,我前一篇回覆得太匆忙,忽略了您要做儲存成檔的動作,因此提供的資訊不足以直接完成您要的動作,我今天查閱了一些資料,發現 BCB 的 Help 似乎對於 WideString 著墨不多,相關範例也大多以 AnsiString 為主,WideString 則大多標明函式格式與參數即予以略過,而上網搜尋的結果也不很樂觀。    這兩天我比較忙一點,不過我仍會繼續試著幫您找一些解決方案,目前的概念大致上是透過 TList 來存取各個 WideString 資料,然後透過 TMemoryStream 之類的物件來讀寫檔案,方向是否正確尚不得知,抽空測試後會有結果,希望其他有經驗的先進們也能提供寶貴意見。      7 天天敲鍵盤 v 時時按滑鼠 8
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-11 14:45:01 IP:61.59.xxx.xxx 未訂閱
RedSnow 謝謝你的協助,我目前也還在測試@@" 雖然感覺很無力 使用TntUnicodeControls_2_1_11系列,有點不知道在幹麻
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-11 18:49:55 IP:61.230.xxx.xxx 未訂閱
fbiceo 您好:    以下是我測試後整理出來的程式敘述,有點克難,但是基本上可以達到您所描述處理 WideString 資料的方式,但不知是否能符合您的全部所需?您參考一下吧:
// **************** 儲存的部份 **********************
// 設定測試用的虛擬資料
wchar_t wfn[14] = {'C', ':', '\\', '\\', 0xF6, 0x20, 0xD6, 0x20, 0xE4, 0x20, 0xFC, 0x0D, 0x0A};
WideString wstr = (WideString)wfn;    // 自定設定與比對行尾的符號 (主要是作為拆解資料之用,因此應可設定為其它字元)
wchar_t eol[3] = {'\r','\n',0};    // 使用 TList 以便於處理資料 (TList 實際上僅紀錄著資料的指標而已)
TList *MySList = new TList;  // 可視需要宣告為全域變數    MySList->Add(wstr);  // 添加第一筆資料    WideString wstra = (WideString)"333";
wcscat((wchar_t*)wstra, eol);
MySList->Add(wstra);  // 添加第二筆資料    WideString wstrb = (WideString)"abc";
wcscat((wchar_t*)wstrb, eol);
MySList->Add(wstrb);  // 添加第三筆資料    WideString wstrc = (WideString)"555";
wcscat((wchar_t*)wstrc, eol);
MySList->Add(wstrc);  // 添加第四筆資料    // 透過 TMemoryStream 來儲存檔案資料
TMemoryStream* file = new TMemoryStream();    WideString *wstr2;  // 轉借做儲存之用的變數
int size;
int size2;
for (int i = 0; i < MySList->Count ; i  ){
    wstr2 = (WideString*)MySList->Items[i];  // 取出第 i 個資料
    size = wcslen((wchar_t*)wstr2);  // 取得字數
    size2 = size*sizeof(wchar_t);  // 乘以 2 (WideChar 為 2 個字元的寬度)
    file->Write(wstr2, size2);  // 存放到 TMemoryStream 裡
}
file->Position = 0;  // 將 TMemoryStream 指標指向開頭處
file->SaveToFile("c:\\wstr.bin");  // 將 TMemoryStream 內容儲存到指定的檔案    delete file;
delete MySList;    請注意,以下程式不是直接接續上方的敘述,兩段是不同的處理程序    // **************** 讀取的部份 **********************
// 透過 TMemoryStream 來讀取檔案資料
TMemoryStream* file = new TMemoryStream();
file->LoadFromFile("c:\\wstr.bin");  // 將指定檔案的內容載入至 TMemoryStream
file->Position = 0;  // 將 TMemoryStream 指標指向開頭處    // 使用 TList 處理資料
TList *MySList = new TList;
char buff[4] = {0};  // 存放比對資料,以便比對是否為行尾符號?
char eol[4] = {0x0D, 0x00, 0x0A, 0x00};  // 行尾的識別符號 (配合儲存時的設定)    int size;
int oldPostion = 0;  // 拆解字串時的字串起始位置
int vPos = 0;  // 讀取比對資料時的位置指標
char *wsData;  // 如果要在其它地方處理到讀出的資料時,將本宣告改成 "全域" 性宣告
while (file->Position < file->Size){
    file->Position = vPos;  // 重設指標位置為 "欲讀取比對資料" 的位置
    file->ReadBuffer(buff, 4);  // 每次讀取 4 個字元
    if (strcmp(buff, eol) == 0) {  // 如果是行尾識別符號,就進行拆解動作
        size = file->Position - oldPostion;  // 取得應拆解的字元數量
        file->Position = oldPostion;  // 將指標重新指向應拆解資料的開頭處            // 必須要有實體位置來存放讀出的資料,但是要考慮對應的 delete 動作
        wsData = new char[size];  // 配置足夠空間來存放拆解的資料
        file->Read(wsData, size);  // 拆解出資料
        MySList->Add(wsData);  // 將拆解出的資料存放到 List 裡            vPos = file->Position;  // 重設指標為下一個 "欲讀取比對資料" 的位置
        oldPostion = file->Position;  // 記錄下 "下一個應拆解資料" 的開頭處
    }else{
        vPos  = 2;  // 指向下一個 "欲讀取比對資料" 的位置
    }
}    // 之後即可使用 MySList->Items[i] 來存取第 i 個資料了 (依此類推),
// 下列範例將 List 的所有內容顯示於 Memo 上
// (此處僅做取出動作的驗證示範,不考慮被轉為 AnsiString 後的問題)
Memo1->Lines->Clear();
for (int i = 0; i < MySList->Count ; i  ){
    Memo1->Lines->Add(IntToStr(i) ":" (AnsiString)(wchar_t*)MySList->Items[i]);
}    // 不再使用 List 時,要記得先釋放掉 List 所對應的實體資料佔用空間
for (int i = 0; i < MySList->Count ; i  ){
    wsData = (char*)MySList->Items[i];
    delete wsData;
}    delete file;
delete MySList;
以上程式敘述請依照您的需求,將部份變數的宣告改成 "全域" 性變數,程式片斷也請依這您的需要,自行剪貼組合來使用,同時還得提醒您一下,上述程式可能考慮得不是很全面,如果有問題的話,我們再討論好了。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/11 18:55:59
系統時間:2024-05-09 10:32:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!