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

txt一行一行讀檔

答題得分者是:RedSnow
andygiga
一般會員


發表:3
回覆:4
積分:1
註冊:2005-03-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-13 01:34:15 IP:203.72.xxx.xxx 未訂閱
請問一下我要怎麼把txt一行一行的數字顯示在Edit格子裡面 txt的格式如下 123 kkk 456 jjj 789 lll 我只要讀入前面的數字,後面的英文就跳過繼續讀下一行 我是使用opendialog的讀檔方法
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-13 01:50:15 IP:203.204.xxx.xxx 未訂閱
您好: 不太曉得您要如何表示,所以提供相關的函數給您參考. 1.利用TStringList的LoadFromFile將檔案讀進來. 2.設立回圈將StringList.Strins[i],利用下面這各函數切割.
Procedure zCutStr(Src:String;var Target1,Target2:String;Key:String);overload;//將Src中有Key關鍵字的分割成兩個字串至Target1,Target2
Procedure zCutStr(Src:String;var Target1,Target2:String;Key:String);overload;
var
 Len,iEnd:Integer;
begin
Len:=Length(Src);
if (Pos(Key,Src)>0) then
 begin
  iEnd:=Pos(Key,Src);
  Target1:=Copy(Src,0,iEnd-1);
  Target2:=Copy(Src,iEnd Length(Key),Len);
 end;
end;
3.切割完S1填入Edit中,如: zCutStr('123 kkk',S1,S2,' ');
RedSnow
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-13 02:18:51 IP:218.19.xxx.xxx 未訂閱
andygiga 您好:    試試下列的作法:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *slRow = new TStringList;
    TStringList *slCol = new TStringList;
    int tmp;        if (OpenDialog1->Execute()) {
        slRow->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; iCount; i  ) {
            slCol->CommaText = slRow->Strings[i];
            tmp = StrToInt(slCol->Strings[0]);
            // tmp 就是每行的前面一組數字
            // 此處作相關的處理即可,下列是將數字加到 Memo 裡的範例
            Memo1->Lines->Add(tmp);
        }
    }
    delete slCol;
    delete slRow;
}
發表人 - RedSnow 於 2005/06/13 02:23:22
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-13 02:47:25 IP:218.19.xxx.xxx 未訂閱
重改一個範例並加註部分解說,下列寫法是將讀取到的數字填入對應的 Edit 欄位內:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *slRow = new TStringList;
    TStringList *slCol = new TStringList;
    int tmp;        if (OpenDialog1->Execute()) {
        slRow->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; iCount; i  ) {  // slRow->Count 為讀入的資料行數量
            slCol->CommaText = slRow->Strings[i];  // 拆解資料行為兩個欄位
            tmp = StrToInt(slCol->Strings[0]);  // 截取第一個欄位的資料,並轉為整數的數字型態
            switch(i){
                case 0: Edit2->Text = tmp; break;
                case 1: Edit3->Text = tmp; break;
                case 2: Edit4->Text = tmp; break;
//                .... 若有其它的 Edit 欄位就比照上方的 case 敘述辦理 ......
            }
        }
        delete slCol;
        delete slRow;
    }
}
andygiga
一般會員


發表:3
回覆:4
積分:1
註冊:2005-03-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-13 10:37:21 IP:140.123.xxx.xxx 未訂閱
引言: 重改一個範例並加註部分解說,下列寫法是將讀取到的數字填入對應的 Edit 欄位內:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *slRow = new TStringList;
    TStringList *slCol = new TStringList;
    int tmp;        if (OpenDialog1->Execute()) {
        slRow->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; iCount; i  ) {  // slRow->Count 為讀入的資料行數量
            slCol->CommaText = slRow->Strings[i];  // 拆解資料行為兩個欄位
            tmp = StrToInt(slCol->Strings[0]);  // 截取第一個欄位的資料,並轉為整數的數字型態
            switch(i){
                case 0: Edit2->Text = tmp; break;
                case 1: Edit3->Text = tmp; break;
                case 2: Edit4->Text = tmp; break;
//                .... 若有其它的 Edit 欄位就比照上方的 case 敘述辦理 ......
            }
        }
        delete slCol;
        delete slRow;
    }
}
謝謝大大的解答,我想在請問一下, 若是我的行數很多 switch的case數也變的很多, 有可以寫成迴圈的辦法嗎? 另外,我還是不太懂這一行的意思 slCol->CommaText = slRow->Strings[i]; 拆解資料行為兩個欄位 事什麼意思ㄋ..若要拆解為三個欄位以上ㄋ?? 發表人 - andygiga 於 2005/06/13 10:47:47
RedSnow
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-13 11:17:11 IP:219.137.xxx.xxx 未訂閱
andygiga 您好:    如果您有很多的 Edit 物件要同時做這項設定的話,您確實可以考慮改用迴圈,或者是將那些物件做成陣列來處理,但是 BCB 也提供了一些更好用的方式,如果您的 Edit 物件命名方式有一定的規則,那麼您可以將整段的 switch case 刪掉改成下列的敘述:
((TEdit *)FindComponent("Edit" IntToStr(i 1)))->Text = tmp;
另外您問到 CommaText 的問題,那是 TStringList 提供的功能,當您將一個帶有以空白、逗號....之類的字元來分隔的字串設給它的時候,它就會將字串拆解成個別的 TStrings,若字串中有五組以空白字元分隔的資料,就會拆解成五組資料,這樣子我們就可以個別存取那些分隔的資料了,詳細說明可以參考 BCB Help 或者搜尋站上的相關討論。 發表人 - RedSnow 於 2005/06/13 11:22:51
andygiga
一般會員


發表:3
回覆:4
積分:1
註冊:2005-03-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-13 11:42:18 IP:140.123.xxx.xxx 未訂閱
引言: andygiga 您好: 如果您有很多的 Edit 物件要同時做這項設定的話,您確實可以考慮改用迴圈,或者是將那些物件做成陣列來處理,但是 BCB 也提供了一些更好用的方式,如果您的 Edit 物件命名方式有一定的規則,那麼您可以將整段的 switch case 刪掉改成下列的敘述:
((TEdit *)FindComponent("Edit" IntToStr(i 1)))->Text = tmp;
請問一下,因為我的edit是寫在form2,那我要怎麼表示ㄋ??? 另外您問到 CommaText 的問題,那是 TStringList 提供的功能,當您將一個帶有以空白、逗號....之類的字元來分隔的字串設給它的時候,它就會將字串拆解成個別的 TStrings,若字串中有五組以空白字元分隔的資料,就會拆解成五組資料,這樣子我們就可以個別存取那些分隔的資料了,詳細說明可以參考 BCB Help 或者搜尋站上的相關討論。 發表人 - RedSnow 於 2005/06/13 11:22:51
發表人 - andygiga 於 2005/06/13 11:43:35
RedSnow
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-13 11:47:26 IP:219.137.xxx.xxx 未訂閱
加上 Form2-> 即可:
((TEdit *)FindComponent("Form2->Edit" IntToStr(i 1)))->Text = tmp;
我沒測試,但應該是可以的,您試試看。
andygiga
一般會員


發表:3
回覆:4
積分:1
註冊:2005-03-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-13 12:04:11 IP:140.123.xxx.xxx 未訂閱
引言: 加上 Form2-> 即可:
((TEdit *)FindComponent("Form2->Edit" IntToStr(i 1)))->Text = tmp;
我沒測試,但應該是可以的,您試試看。
不好意思...我發現我的值show不出在edit的格子上 但是我debug時temp卻都有值 不知道是怎麼一回事???
RedSnow
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-13 12:26:17 IP:219.137.xxx.xxx 未訂閱
andygiga 您好: 真是抱歉,前一篇的回覆是我直覺的回覆,沒有做過測試,您可否將該程序寫成自定函式,然後放到 Form2 裡邊去,然後在 Form1 的 Button1Click 事件中,改成呼叫 Form2 的自定函式?
RedSnow
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-13 12:38:43 IP:219.137.xxx.xxx 未訂閱
andygiga 您好:    剛才做了一下測試,請參考下列範例來設定:
Form2 的 .h 檔:
public:        // User declarations
    void __fastcall FillEdits(AnsiString FileName);    Form2 的 .cpp 檔:
void __fastcall TForm2::FillEdits(AnsiString FileName)
{
    TStringList *slRow = new TStringList;
    TStringList *slCol = new TStringList;
    int tmp;
    slRow->LoadFromFile(FileName);
    for (int i=0; iCount; i  ) {
        slCol->CommaText = slRow->Strings[i];
        tmp = StrToInt(slCol->Strings[0]);
        ((TEdit *)FindComponent("Edit" IntToStr(i 1)))->Text=tmp;
    }
    delete slCol;
    delete slRow;    }    Form1 的 .cpp 檔:
#include "Unit2.h"    void __fastcall TForm1::Button12Click(TObject *Sender)
{
    if (OpenDialog1->Execute()) {
        Form2->Show();  // 如果 Form2 已經顯示,就省略本行敘述
        Form2->FillEdits(OpenDialog1->FileName);
    }
}
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-13 12:39:47 IP:210.68.xxx.xxx 未訂閱
來插花,可用 < class="code">Form2->FindComponent()
RedSnow
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-13 12:51:32 IP:219.137.xxx.xxx 未訂閱
taishyang 副站長您好:    多謝您插的花,我真是腦子打結、捨近求遠....(晚睡晚起的後遺症)。    andygiga 您好:    雖然我前一篇貼的方式與 taishyang 副站長說的方式都可行,但是副站長說的方式不用將原先的程式敘述做太大的變動,也就是將原先的敘述改成如下就可以了:
((TEdit *)Form2->FindComponent("Edit" IntToStr(i 1)))->Text = tmp;
發表人 - RedSnow 於 2005/06/13 12:53:57
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-13 13:17:55 IP:210.68.xxx.xxx 未訂閱
RedSnow前輩您好: 我之前也是用您範例的方式,今天剛好看到類似的文章才知道現在這方式< > 順心< >
RedSnow
版主


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-13 13:30:23 IP:219.137.xxx.xxx 未訂閱
taishyang 副站長您好:    在這裡參予討論真的是教學相長,不管所學有幾何?大家都可以藉著參予而更成長,我在 K.Top 可說是收獲好幾牛車呢~
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-06-13 13:59:04 IP:210.68.xxx.xxx 未訂閱
引言:我在 K.Top 可說是收獲好幾牛車呢
我也是
andygiga
一般會員


發表:3
回覆:4
積分:1
註冊:2005-03-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-06-13 14:37:02 IP:140.123.xxx.xxx 未訂閱
謝謝taishyang&RedSnow兩位大大的大力相助 終於弄出來了... 真感動~~真是太感謝你們了~~~
系統時間:2024-06-01 23:55:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!