全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3148
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

以寫入文字檔內的文字如何刪除

尚未結案
Miki-lion
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-01 15:58:59 IP:218.162.xxx.xxx 未訂閱
以下程式就是在特定的"欄位和行數"寫入MaskEdit的內容。    而圖中有一個清除鈕(BitBtn8),按下時可以把MaskEdit內容和寫入RichEdit2的內容一起清掉。    我的方法是將寫入的內容用空白來替代,就可以清除上次寫入的部份。    問題是在RichEdit2寫入的東西,會被不正常的清除,會整行的被清除掉。    不是在我想要的位置開始清除, EX:filename://輸入的內容    結果就是filename://也一起被清掉。無法只留下filename://    
    int col = 39;  // 要處理的欄位數 (Column)
    int row = 27;  // 要處理的行數 (Row)
    if (RichEdit2->Lines->Count < row+1) { // 如果 RichEdit 行數不足 10 行
        for (int i=RichEdit2->Lines->Count; i<10; i++) {
            RichEdit2->Lines->Add("");  // 產生足夠的空行
        }
    }        AnsiString temp = RichEdit2->Lines->Strings[row];  // 設 temp 為 RichEdit1 第 row 行的內容
    AnsiString t1 = MaskEdit5->Text;  // 設 t1 為 MaskEdit1 的內容        int len1 = t1.Length();  // 設 len1 為 MaskEdit1 的字數        if (len1 > 0 ) {
        int len = temp.Length();  // 設 len 為 RichEdit1 第 row 行內容的字數
        if(len < col){  // 如果資料行字元數少於 col 值,則以空白字元補足它
            RichEdit2->Lines->Strings[row] = temp + AnsiString::StringOfChar(' ', col - len);
            temp = RichEdit2->Lines->Strings[row];
        }            if(len1 > 0){  // 如果 MaskEdit1 有內容
            t1 = "#"+t1;  // 在 t1 前加上 % 符號
        }            temp = temp.SubString(1, col-1) + t1 + temp.SubString(col+oldlen, temp.Length()-((col+oldlen)-1));
        oldlen = t1.Length();   // 設定 oldlen 為兩個 MaskEdit 內容的長度 (包含 % 符號在內)
    } else
         {
        temp = temp.SubString(1, col-1) + temp.SubString(col+oldlen, temp.Length()-((col+oldlen)-1));
        oldlen = 0;
    }
    RichEdit2->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行
     if(BitBtn8->OnClick) //如果要清除按下
        {
       RichEdit2->Lines->Strings[row] = "";
       }    
RedSnow
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-01 21:45:15 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:    妳以紅色標示的那三行敘述是錯誤的,以妳的狀況而言,OnClick 是不適合拿來當做判斷值的,因為 BitBtn8->OnClick 指的是一個位置,如果 BitBtn8 沒有設定 OnClick 事件的處理程序,那就會是 NULL (在判斷式裡會是 false),否則就是該事件的位址 (在判斷式裡會是 true),換言之;如果妳有另外設定了 BitBtn8 的 OnClick 事件處理程序,那麼它在判斷式裡的傳回值就會符合 true 的條件,所以會執行到判斷式裡的清除動作。    妳如果要在按下 BitBtn8 時做出清除的動作,那就必須要將清除的動作放在 BitBtn8 的 OnClick 事件裡面,而不是放在其它地方。      7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-01 22:01:11 IP:218.162.xxx.xxx 未訂閱
因為最重要的是要將寫入RichEdit的東西清掉 如果寫在BitBtn的話,因為每個Maskedit裡頭的宣告都是一樣的, 它無法去判斷要刪掉哪裡,我只好再每一個maskEdit裡頭寫看看。 我有想出一個不改原本程式寫入的辦法,就是在BitBtn按下時, 在每個MaskEdit寫入位置上,寫一個Replace用空白來取代。 可是我卡在6個Maskedit可以用"共用事件"來做 但是6個元件的位置宣告都不一樣,我就不知道要怎寫在一起了><
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-02 00:06:00 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    上次不是有跟妳提到,在共用事件中可以透過 Sender 來識別呼叫程序的元件嗎?以判斷式來識別作用中的元件,就可以分別處理不同的資料了。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-02 00:16:52 IP:218.162.xxx.xxx 未訂閱
引言: Miki-lion 妳好: 上次不是有跟妳提到,在共用事件中可以透過 Sender 來識別呼叫程序的元件嗎?以判斷式來識別作用中的元件,就可以分別處理不同的資料了。
有阿我有照著你上次教的做出來,可是後來卡在6個元件的位置宣告都不一樣,就不行了,目前是寫6個程式在裡頭讓他各自跑,不過這樣很沒效率。

if(MaskEdit1->Text.Length() > 0)
{
    int row = 6;//更改這裏寫6個程式
    int col = 12;
     AnsiString temp = RichEdit1->Lines->Strings[row];        if (((TMaskEdit *)Sender)->Text.Length() > 0) {
        int len = temp.Length();
        if(len < col){
            RichEdit1->Lines->Strings[row] = temp   AnsiString::StringOfChar('_', col - len);
            temp = RichEdit1->Lines->Strings[row];
        }
        temp = temp.SubString(1, col-1)   "%" ((TMaskEdit *)Sender)->Text   temp.SubString(col oldlen, temp.Length()-((col oldlen)-1));
        oldlen = ((TMaskEdit *)Sender)->Text.Length()   1;
    } else {
        temp = temp.SubString(1, col-1)   temp.SubString(col oldlen, temp.Length()-((col oldlen)-1));
        oldlen = 0;
    }
    RichEdit1->Lines->Strings[row] = "";//空字串代替
發表人 - miki-lion 於 2005/08/02 00:20:04
RedSnow
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-02 01:08:57 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    參考一下下列的寫法:
if ((TMaskEdit *)Sender)->Text.Length() > 0) {
    int col;
    int row;
    if (Sender == MaskEdit1) {
        col = 11;
        row = 9;
    } else if(Sender == MaskEdit2) {
        col = 12;
        row = 20;
    }
    ......
} else {
    ......
}
7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-02 11:20:39 IP:218.162.xxx.xxx 未訂閱
    
 
void __fastcall TForm1::BitBtn8Click(TObject *Sender)
{
 MaskEdit4->Text ="";
 MaskEdit5->Text ="";
 MaskEdit6->Text ="";        if ((TMaskEdit *)Sender)->Text.Length() > 0) {]//他說這行有錯誤在,我有把下面同樣的判斷給註解掉了,但還是不行,如果元件內的Text長度大於0就開始做,這樣沒錯啊,我想不出來了
    int col;
    int row;
    if (Sender == MaskEdit4) {
        col = 11;
        row = 10;
    } else if(Sender == MaskEdit5) {
        col = 12;
        row = 20;
    }
      else if(Sender == MaskEdit6) {
        col = 13;
        row = 30;
    }        AnsiString temp = RichEdit1->Lines->Strings[row];        //if (((TMaskEdit *)Sender)->Text.Length() > 0) {
        int len = temp.Length();
        if(len < col){
            RichEdit1->Lines->Strings[row] = temp   AnsiString::StringOfChar('_', col - len);
            temp = RichEdit1->Lines->Strings[row];
        }
        temp = temp.SubString(1, col-1)   ((TMaskEdit *)Sender)->Text   temp.SubString(col oldlen, temp.Length()-((col oldlen)-1));
        oldlen = ((TMaskEdit *)Sender)->Text.Length()   1;
    } else {
        temp = temp.SubString(1, col-1)   temp.SubString(col oldlen, temp.Length()-((col oldlen)-1));
        oldlen = 0;
    }
    RichEdit1->Lines->Strings[row] = ""; //空字串代替
   }
}
發表人 - miki-lion 於 2005/08/02 11:26:24
RedSnow
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-02 12:24:07 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:    我寫的那一段是放在 MaskEdit 使用的共用事件裡的,不是放在 BitBtn 的事件中使用的,我看妳還是將相關動作的完整程式貼上來,或者將整個程式打包上傳好了,記得再舉例說明一下妳的操作步驟,與應該要有的結果。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-02 12:58:05 IP:218.162.xxx.xxx 未訂閱
ok 程式已經上傳了 http://www.cyut.edu.tw/~s9127073/test.rar 設定檔編輯Page1裡的元件在做動作時,會把相關內容寫入在設定檔預覽Page3裡頭的RichEdit2。    動作   1.Maskedit一但有內容輸入時,就會在RichEdit2固定的位置寫上所輸入的內容。      2.CheckBox元件一旦被勾選,就會在RichEdit2固定的位置寫上true      3.RadioButton也是同上。      4.每種類型動作用GroupBox分類起來,可以用一個清除鈕清除輸入/選取的內容。      問題:   於3種元件已經可以正確寫入到位置上,但是3種元件一旦寫入後,就無法在Page2設定檔編輯裡做刪除。     我想要在每一個清除紐按下後,除了元件內容變成未輸入/選取狀態外,寫入RichEdit2的內容一並刪除。    3個元件也可以自己做刪除動作 EX:    1.MaskEdit用Backspace時,RichEdit2內容一併會刪掉        2.CheckBox選取打勾即寫入RichEdit2,在按一次呈未選取狀態時,剛寫入的內容也不見        3.RadioButton在做切換時,寫入的內容也會一並切換。    我寫出來的相當沒有效率,只是在同樣的地方在寫入相同的空字串蓋過去,所以只好再尋求前輩的幫忙,感激不盡
RedSnow
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-02 21:07:14 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    請按下列程序來修改妳現在的程式: 1. 新增一個自定函式 ResetRadioBtnStat(),作為清除 RichEdit 內對應於 RadioButton 項目的 &true 字樣之用。 2. 新增一個自定的 OnClick 事件處理程序 RadioButtonClick (給那四個 RadioButton 用的)。 3. 將那四個 RadioButton 的 OnClick 事件全部指向前述的 RadioButtonClick 處理程序。(原先的那四個 OnClick 事件處理程序已經派不上用場,可以刪除掉了) 4. 在原有的 BitBtn6Click 處理程序內加上 ResetRadioBtnStat() 敘述,以清除 RichEdit 內對應的 &true 字樣。 新增與需要修改的程式敘述如下:
// 於 Unit1.h 檔案內:
__published:        // IDE-managed Components
    void __fastcall RadioButtonClick(TObject *Sender);    private:        // User declarations
        void __fastcall ResetRadioBtnStat();    // 於 Unit1.cpp 檔案內:
void __fastcall TForm1::ResetRadioBtnStat()
{
    int col[4];  // 要處理的欄位數陣列 (Column)
    int row[4];  // 要處理的行數陣列 (Row)        col[0] = 36;
    row[0] = 47;        col[1] = 37;
    row[1] = 48;        col[2] = 41;
    row[2] = 49;        col[3] = 42;
    row[3] = 50;        AnsiString temp;
    // 清除所有 RadioButton 對應於 RichEdit 內的 "&true" 字樣
    for(int i=0; i<4; i  ){
        temp = RichEdit2->Lines->Strings[row[i]];  // 設 temp 為 RichEdit1 第 row 行的內容
        if(temp.SubString(col[i], 5) == "&true"){ // 如果對應的位置是 "&true" 字樣,則予以清除掉
            temp = temp.SubString(1, col[i]-1)   temp.SubString(col[i] 5, temp.Length()-((col[i] 5)-1));
            RichEdit2->Lines->Strings[row[i]] = temp; // 將去除掉 "&true" 字樣的字串設回給 RichEdit 第 row 行
        }
    }
}    void __fastcall TForm1::RadioButtonClick(TObject *Sender)
{
    int col;  // 要處理的欄位數 (Column)
    int row;  // 要處理的行數 (Row)        if(Sender == RadioButton3){
        col = 36;
        row = 47;
    }else if(Sender == RadioButton4){
        col = 37;
        row = 48;
    }else if(Sender == RadioButton5){
        col = 41;
        row = 49;
    }else if(Sender == RadioButton6){
        col = 42;
        row = 50;
    }        // 先清除所有 RadioButton 對應於 RichEdit 內的資料
    ResetRadioBtnStat();        AnsiString temp = RichEdit2->Lines->Strings[row];  // 設 temp 為 RichEdit1 第 row 行的內容
    temp = temp.SubString(1, col-1)   "&true"  temp.SubString(col 5, temp.Length()-((col 5)-1));
    RichEdit2->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行
}    void __fastcall TForm1::BitBtn6Click(TObject *Sender)
{
    RadioButton3->Checked = false;
    RadioButton4->Checked = false;
    RadioButton5->Checked = false;
    RadioButton6->Checked = false;        ResetRadioBtnStat();
}
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/02 21:11:58
Miki-lion
中階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-02 21:28:46 IP:218.162.xxx.xxx 未訂閱
引言: 3. 將那四個 RadioButton 的 OnClick 事件全部指向前述的 RadioButtonClick 處理程序。
對不起我太笨了,請問怎樣將RadioButton 的 OnClick 事件,全部指向前述的 RadioButtonClick 處理程序
RedSnow
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-02 22:42:29 IP:61.230.xxx.xxx 未訂閱
在 BCB 編輯環境中 (Design mode),先用滑鼠點選欲設定的 RadioButton 物件,然後在屬性表視窗 (Object Inspector) 點選 Events 頁籤,然後在 OnClick 事件欄位處用滑鼠點一下,該欄位會在右方顯示一個向下的箭頭符號,用滑鼠點擊那個箭頭符號後,會展開一個下拉式的項目選框,用捲動的方式來找尋我說的那個事件,找到後就點選它,這樣子就可以了。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-02 22:45:01 IP:218.162.xxx.xxx 未訂閱
引言: 3. 將那四個 RadioButton 的 OnClick 事件全部指向前述的 RadioButtonClick 處理程序。
就是在元件屬性Events->OnClick加上RadioButtonClick這樣對吧,剛才想到了。 還有在// 於 Unit1.h 檔案內: /--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TMainMenu *MainMenu1; TMenuItem *N1; . . . 略 void __fastcall RadioButtonClick(TObject *Sender);//這行出現了問題 private: // User declarations void __fastcall ResetRadioBtnStat();//加這行 public: // User declarations __fastcall TForm1(TComponent* Owner); }; 我這樣加沒錯吧~ 發表人 -
Miki-lion
中階會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-08-02 22:47:28 IP:218.162.xxx.xxx 未訂閱
真是太巧~~我剛弄出來這部份了>< 謝謝~我正在試Unit1.h 檔案的問題~ 謝謝^^
Miki-lion
中階會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-08-03 14:50:06 IP:218.162.xxx.xxx 未訂閱
不好意思那個Unit1.h 的問題我還是找不出原因錯在哪裡? 真的是好懊惱~~>< 附上完整的檔案 >> >> >
RedSnow
版主


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-08-03 16:37:44 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:    那行宣告重覆了,刪掉其中一行就好了。      7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-08-03 16:57:53 IP:218.162.xxx.xxx 未訂閱
已經可以了,謝謝 RadioButton3/4/5/6~程式碼都會直接跳到RadioButtonClick 我是進去程式碼裡頭一行一行看再把原先的程式刪掉 不過RadioButton3的程式碼卻不見了~~>< 剛看了Unit1.h檔案內,竟然沒有RadioButton3在 他一開始就是RadioButton而以,因為我在做的時候發現身已經有宣告過 RadioButton了,好神奇>< 發表人 - miki-lion 於 2005/08/03 17:08:18
RedSnow
版主


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-08-03 17:08:08 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:不過RadioButton3的程式碼卻不見了
妳大概是無意中將 RadioButton3Click 改成 RadioButtonClick 了,因此 RadioButton3 不見了,而 RadioButtonClick 的宣告卻多了一個出來。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-08-03 17:11:49 IP:218.162.xxx.xxx 未訂閱
引言: Miki-lion 妳好:
引言:不過RadioButton3的程式碼卻不見了
妳大概是無意中將 RadioButton3Click 改成 RadioButtonClick 了,因此 RadioButton3 不見了,而 RadioButtonClick 的宣告卻多了一個出來。
剛好我將回文修改了,你真是料事如神,因為還真的多一個RadioButton出來 不過我是看Unit.h檔案才發現的沒有RadioButton3的,可能無意改掉了吧 謝謝你的幫忙^^
Miki-lion
中階會員


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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-08-03 17:52:51 IP:218.162.xxx.xxx 未訂閱
我想請問一下有關於ResetRadioBtnStat();部分    如果我不是單只做4個RadioButton,那需要修改哪些地方
 
int col[4];  
int row[4]; 宣告增加    for(int i=0; i<4; i  ){//迴圈數是要更改成幾個按鈕就多少嗎?    if(temp.SubString(col[i], 5) == "&true")當中的5指的是&true5個字元嗎?
除了這幾個地方還有需要更改的嗎? 發表人 - miki-lion 於 2005/08/03 17:57:07
RedSnow
版主


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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-08-03 18:13:11 IP:59.115.xxx.xxx 未訂閱
引言:我想請問一下有關於ResetRadioBtnStat();部分 如果我不是單只做4個RadioButton,那需要修改哪些地方 int col[4]; int row[4]; 宣告增加 for(int i=0; i<4; i ){//迴圈數是要更改成幾個按鈕就多少嗎? if(temp.SubString(col[i], 5) == "&true")當中的5指的是&true5個字元嗎? 除了這幾個地方還有需要更改的嗎?
還有設定增加的 col[n] 與 row[n] 的值,同時 RadioButtonClick() 內的判斷是也要相對增加,當然啦~BitBtn6Click() 內也一樣不要忘記囉。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-08-03 19:11:29 IP:218.162.xxx.xxx 未訂閱
我修改好了才發現說,因為我還需要增加2個RadioButton, 但是是需要在另一個功能上面的,不能跟這4個鈕一起動作,否則6個鈕只能有 一個被寫入到RichEdit,我想到的解決辦法是: 新增一個自定函式 ResetRadioBtnStat2()和RadioButtonClick2, 其他都是照樣的做,可是好像是不行的,是我函式不能這樣設定嗎?
Miki-lion
中階會員


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

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-08-03 20:07:13 IP:218.162.xxx.xxx 未訂閱
我已經將這問題解決了~    不過新增加的2個RadioButton元件寫入後,竟然會跑到CheckBox的位置填上,    我會繼續努力把它完成的~
Miki-lion
中階會員


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

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-08-03 20:30:55 IP:218.162.xxx.xxx 未訂閱
我已經弄出來了,增加2個函式後就可以了,之前好像是在BCB下他會自己幫你增加一些東西,會去衝突到,所以我用記事本把程式碼加進去就Ok了。    不過很奇怪的是新增加的兩個按紐有個小BUG,第一次點選時,切換後剛寫入的&true還是沒有被刪掉,在重覆點選就正常了,只有一開始會這樣,就先這樣處理就好了沒關係,謝謝你
RedSnow
版主


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

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-08-03 21:33:31 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:    看妳前幾篇連續的 "報導",就知道妳進步很多了,相信那個需要重覆點選才會刪除的問題也會解決的,加油~      7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-08-04 01:26:04 IP:218.162.xxx.xxx 未訂閱
我想問一下宣告自定事件是有固定的語法嗎? 因為我在試著將它使用到CheckBox元件上 我宣告這2個 void __fastcall CheckBoxClick(TObject *Sender); void __fastcall ResetCheckBoxBtnStat();//這行錯誤 錯誤訊息為,他說我宣告錯誤耶..>< [C Error] Unit1.cpp(1314): E2333 Class member '_fastcall TForm1::ResetCheckBoxBtnStat()' declared outside its class [C Error] Unit1.cpp(1315): E2040 Declaration terminated incorrectly
RedSnow
版主


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

發送簡訊給我
#27 引用回覆 回覆 發表時間:2005-08-04 02:32:24 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    注意一下 BCB 在 .h 檔內各區段後方加上的註解:
__published:    // IDE-managed Components    private:        // User declarations    public:         // User declarations
自定函式僅能放在 private 或是 public 區段內,元件的事件處理程序則必須放在 __published 區段內,妳檢查看看是否都放對地方了? 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#28 引用回覆 回覆 發表時間:2005-08-04 11:58:37 IP:218.162.xxx.xxx 未訂閱
我自己把錯誤都修正,程式已經OK了    然後我發現因為CheckBox是點選後,還要點選第2次才能夠將RichEdit的東西清掉,    和RadioButton不同的是一次可以寫入很多個,所以在CheckBoxClick裡面我將流程改為:    宣告位置->寫入->如果CheckBox->false->執行ResetCheckBoxBtnStat();    不過好像在判斷CheckBox->false這裡語法錯誤了,想問一下怎樣改正語法。謝謝    
 void __fastcall TForm1::CheckBoxClick(TObject *Sender)
{
    int col;  // 要處理的欄位數 (Column)
    int row;  // 要處理的行數 (Row)        if(Sender == CheckBox5){
        col = 39;
        row = 59;
    }else if(Sender == CheckBox6){
        col = 37;
        row = 60;
    }else if(Sender == CheckBox7){
        col = 42;
        row = 61;
    }else if(Sender == CheckBox8){
        col = 45;
        row = 62;
    }        //ResetCheckBoxBtnStat();        AnsiString temp = RichEdit2->Lines->Strings[row];  // 設 temp 為 RichEdit1 第 row 行的內容
    temp = temp.SubString(1, col-1)   "&true"  temp.SubString(col 5, temp.Length()-((col 5)-1));
    RichEdit2->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行
//增加的語法
    if(Sender == CheckBox5->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox6->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox7->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox8->false){
      ResetCheckBoxBtnStat();
    }
}
RedSnow
版主


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

發送簡訊給我
#29 引用回覆 回覆 發表時間:2005-08-04 13:28:00 IP:59.115.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:和RadioButton不同的是一次可以寫入很多個,所以在CheckBoxClick裡面我將流程改為: 宣告位置->寫入->如果CheckBox->false->執行ResetCheckBoxBtnStat(); 不過好像在判斷CheckBox->false這裡語法錯誤了,想問一下怎樣改正語法。謝謝
 void __fastcall TForm1::CheckBoxClick(TObject *Sender)
{
    int col;  // 要處理的欄位數 (Column)
    int row;  // 要處理的行數 (Row)        if(Sender == CheckBox5){
        col = 39;
        row = 59;
    }else if(Sender == CheckBox6){
        col = 37;
        row = 60;
    }else if(Sender == CheckBox7){
        col = 42;
        row = 61;
    }else if(Sender == CheckBox8){
        col = 45;
        row = 62;
    }        //ResetCheckBoxBtnStat();        AnsiString temp = RichEdit2->Lines->Strings[row];  // 設 temp 為 RichEdit1 第 row 行的內容
    temp = temp.SubString(1, col-1)   "&true"  temp.SubString(col 5, temp.Length()-((col 5)-1));
    RichEdit2->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行
//增加的語法
    if(Sender == CheckBox5->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox6->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox7->false){
       ResetCheckBoxBtnStat();
    }else if(Sender == CheckBox8->false){
      ResetCheckBoxBtnStat();
    }
}
Sender 是一個 Object,妳可以拿它來與 CheckBox 做比對,但是妳不能拿 CheckBox->flase 來做比對,況且 CheckBox->false 這個敘述也不正確,妳是要檢查 CheckBox 是否被圈選嗎?那應該用 CheckBox->Checked,而檢查的敘述應該是
if (CheckBox5->Checked) { // 如果 CheckBox5 被圈選
    ....
} else {
    ....
}
我不清楚妳現在的 ResetCheckBoxBtnStat() 函式內是怎麼寫的?如果函式內的動作也是將全部 CheckBox 的 Checked 都設為 flase 的話,妳那段新增的判斷式會在妳設定那幾個 CheckBox 的任何一個取消圈選狀態時,其它的那幾個 CheckBox 也都一併取消圈選狀態,妳是要這麼處理的嗎? 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#30 引用回覆 回覆 發表時間:2005-08-04 15:01:38 IP:218.162.xxx.xxx 未訂閱
改成這樣的話
if(CheckBox5->Checked) { 
    ....
} else {
    ....
它會變成:宣告位置->寫入->CheckBox有被打勾了->刪除 所以結果出來就是沒有東西(寫好的馬上被刪掉):P 我想要的是每一個CheckBox打勾->寫入->再按一次取消->刪除 ResetCheckBoxBtnStat();是照之前的ResetRadioBtnStat()一樣的程式來做 所以按一個清除鈕同時清除4個CheckBox沒有問題 我想到方法是:宣告位置->寫入->判斷CheckBox有被取消了->刪除 所以要這樣if(CheckBox5->Checked->false)//如果被取消了,就執行清除的函式 我這樣想應該對吧,只是程式語法錯..:P
RedSnow
版主


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

發送簡訊給我
#31 引用回覆 回覆 發表時間:2005-08-05 01:25:19 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    如果是這樣子的話,妳的處理方式有點問題,因為 CheckBox 與 RadioButton 的處理概念不一樣,妳不能完全套用原先的方式,妳可以沿用的是 "全部清除" 的那個部份,CheckBox 的 OnClick 事件就要修改一下了,妳參考一下下列的方式看看是不是妳想要的效果?
void __fastcall TForm1::CheckBoxClick(TObject *Sender)
{
    int col;  // 要處理的欄位數 (Column)
    int row;  // 要處理的行數 (Row)        if(Sender == CheckBox5){
        col = 39;
        row = 59;
    }else if(Sender == CheckBox6){
        col = 37;
        row = 60;
    }else if(Sender == CheckBox7){
        col = 42;
        row = 61;
    }else if(Sender == CheckBox8){
        col = 45;
        row = 62;
    }        AnsiString temp = RichEdit2->Lines->Strings[row];  // 設 temp 為 RichEdit1 第 row 行的內容
    if (((TCheckBox *)Sender)->Checked) {  // CheckBox 為圈選狀態時
        temp = temp.SubString(1, col-1)   "&true"  temp.SubString(col 5, temp.Length()-((col 5)-1));
        RichEdit2->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行
    } else {  // CheckBox 為取消圈選狀態時
        if(temp.SubString(col, 5) == "&true"){ // 如果對應的位置是 &true 字樣,則予以清除掉
            temp = temp.SubString(1, col-1)   temp.SubString(col 5, temp.Length()-((col 5)-1));
            RichEdit2->Lines->Strings[row] = temp; // 將去除掉 &true 字樣的字串設回給 RichEdit 第 row 行
        }
    }
}
7 天天敲鍵盤 v 時時按滑鼠 8
[<<] [1] [2] [>>]
系統時間:2024-04-25 22:47:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!