以寫入文字檔內的文字如何刪除 |
尚未結案
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
以下程式就是在特定的"欄位和行數"寫入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 發送簡訊給我 |
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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
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 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我想請問一下有關於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 發送簡訊給我 |
引言:我想請問一下有關於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 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我想問一下宣告自定事件是有固定的語法嗎? 因為我在試著將它使用到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 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我自己把錯誤都修正,程式已經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 發送簡訊給我 |
Miki-lion 妳好:
引言:和RadioButton不同的是一次可以寫入很多個,所以在CheckBoxClick裡面我將流程改為: 宣告位置->寫入->如果CheckBox->false->執行ResetCheckBoxBtnStat(); 不過好像在判斷CheckBox->false這裡語法錯誤了,想問一下怎樣改正語法。謝謝Sender 是一個 Object,妳可以拿它來與 CheckBox 做比對,但是妳不能拿 CheckBox->flase 來做比對,況且 CheckBox->false 這個敘述也不正確,妳是要檢查 CheckBox 是否被圈選嗎?那應該用 CheckBox->Checked,而檢查的敘述應該是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(); } } if (CheckBox5->Checked) { // 如果 CheckBox5 被圈選 .... } else { .... }我不清楚妳現在的 ResetCheckBoxBtnStat() 函式內是怎麼寫的?如果函式內的動作也是將全部 CheckBox 的 Checked 都設為 flase 的話,妳那段新增的判斷式會在妳設定那幾個 CheckBox 的任何一個取消圈選狀態時,其它的那幾個 CheckBox 也都一併取消圈選狀態,妳是要這麼處理的嗎? 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
改成這樣的話
if(CheckBox5->Checked) { .... } else { ....它會變成:宣告位置->寫入->CheckBox有被打勾了->刪除 所以結果出來就是沒有東西(寫好的馬上被刪掉):P 我想要的是每一個CheckBox打勾->寫入->再按一次取消->刪除 ResetCheckBoxBtnStat();是照之前的ResetRadioBtnStat()一樣的程式來做 所以按一個清除鈕同時清除4個CheckBox沒有問題 我想到方法是:宣告位置->寫入->判斷CheckBox有被取消了->刪除 所以要這樣if(CheckBox5->Checked->false)//如果被取消了,就執行清除的函式 我這樣想應該對吧,只是程式語法錯..:P |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |