如何使用RichEdit將多行文字檔寫入 |
尚未結案
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
假設今天我將一斷多行的文字輸入到RichEdit1,然後在RichEdit2裡頭要顯示出來,
問題就是在於只知道他的開頭位置,不知道他的結尾是有多少行數,所以會連帶影響RichEdit下面的編排,
如果只是單行的文字,那就沒有這項問題,直接告知要顯示的行列數就好了。
void__Netcall Find::(TComponent* Owner);//目標字句 { Target *Sender://在這位置輸入多行的話,勢必將下面的Target2 *Sender內容給往下擠 Target2 *Sender://所以無法給予確定的位置 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好: 妳這個問題是卡在各個項目都有預先設好要處理的位置,因此擔心某項目有多行資料時,會影響到其它項目位置的變動,那麼妳不妨考慮建立一個結構資料,結構中可以包含要處理的行、列、輸入資料的長度....等數據,甚至是項目的輸入值,然後再宣告一個前述結構資料的陣列,對應到各個需要處理的項目,當資料有變更時,就記錄到 (或修改) 對應的結構資料中,以妳描述的問題來說,就可以記錄下該項目所輸入的 "資料長度",如果有必要的話,妳也可以多加一項 "行數" 的紀錄 (在 RichEdit1 輸入的資料共佔用多少字元數,或是共佔用了幾行?),如此一來,妳就可以在處理各個項目時,計算出變動後的行、列位置了。 7 天天敲鍵盤 v 時時按滑鼠 8
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我了解前輩的解法,不用在BCB實作上,我就真的無從下手。 我有試著用你教過我的Insert的方法來做,不過因為我需要輸入2個多行文字。 第1個還可以知道他的起始位置,Insert進去後,第2個起始位置就先判斷剛剛Insert文字的行數。 EX:輸入第一串:111111
222222
333333
第二串文字:
第2串被往下推之後的起始位置就是第一串的行數加1,這是我想到的方法 可是要如何判斷他有"幾行",我就不會了,是判斷他有幾個換行嗎? 當慢慢的開始懂程式後,才發覺原來懂得也不是那麼多,越深入難題越多,也越有成就感。
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好:
引言:EX:輸入第一串:111111 222222 333333 第二串文字: 第2串被往下推之後的起始位置就是第一串的行數加1,這是我想到的方法 可是要如何判斷他有"幾行",我就不會了,是判斷他有幾個換行嗎?用檢查 RichEdit1->Lines->Text 中的換行符號,或者是用 RichEdit1->Lines->Count 都應該可以取得 "行數",取得後就將它記錄下來,在輸入第二個字串時,就可以將記錄下的數字 (第一個字串佔用的行數) 取出來運算,以取得第二個字串應該放置的位置,試試看吧。 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我弄了這個將輸入RichEdit2的內容放進RichEdit3的程式 還沒加上判斷行數的部份,我想問一下紅色的部份可以這麼寫嗎?
void __fastcall TForm1::RichEdit3Change(TObject *Sender) { int row = 10; // 要處理的資料行數 (Row) int col = 11; // 要處理的資料行位置 (Column) AnsiString temp = RichEdit2->Lines->Strings[row]; if (RichEdit3->Lines->Text.Length() > 0) { //這樣子對嗎? int len = temp.Length(); if(len < col){ RichEdit2->Lines->Strings[row] = temp AnsiString::StringOfChar(' ', col - len); } temp = temp.SubString(1, col-1) RichEdit3->Lines-> temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = RichEdit3->Lines->Text.Length() 1; } else { temp = temp.SubString(1, col-1) temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = 0; } RichEdit2->Lines->Strings[row] = temp; }當慢慢的開始懂程式後,才發覺原來懂得也不是那麼多,越深入難題越多,也越有成就感。 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好:
引言:前輩你好,冒昧問一下妳那一行敘述中漏了一些部分:引言: temp = temp.SubString(1, col-1) RichEdit3->Lines-> temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = RichEdit3->Lines->Text.Length() 1;我編譯時這一行會出現錯誤碼訊息 錯誤訊息: Member identifier expected 請問是什麼意思呢?要如何來更改? temp = temp.SubString(1, col-1) RichEdit3->Lines-> temp.SubString(col oldlen, temp.Length()-((col oldlen)-1));看到上方以紅色標示出來的部份了嗎?我不清楚妳要達到何種結果?不過依據妳那行敘述來看,應該是要在紅色字樣的後方補上 Strings[row],要不然就是將該句改成 RichEdit3->Text,試試看吧。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/20 18:29:57 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我弄了2天,試過一些方法不過依然都不行,我是想要將2個RichEdit輸入的內容放進另一個RichEdit裡頭。 我想到的比較簡單來判斷的方法是,將2個RichEdit的內容指向同樣的程序。 輸入RichEdit1 3型空行 RichEdit2的內容。大致上是這樣。 所以我使用上次學到的程式
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=75335 不過RichEdit1一旦輸入後就會自行產生空行,我更改了很多次,也都會有其他的錯誤功能在。 我Try了2天只好又上來問,有前輩願意分享解決方式的話,感激不盡。 EX:
Richedit1:輸入的內容
Richedit1:輸入的內容
Richedit1:輸入的內容
Richedit1:輸入的內容 ///////固定的格式分開2個內容/////// Richedit2:輸入的內容
Richedit2:輸入的內容
Richedit2:輸入的內容
Richedit2:輸入的內容
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
就是像以下的圖一樣 先在這2個RichEdit輸入內容
空5行後在第6行放上第2個RichEdit的內容
之所以這樣寫,是因為我想這樣在第2個元件所輸入的內容,就不用去判斷他的起始位置。 空行的部份我是用迴圈去產生,但是我不知道數字要訂多大來記算,所以有點問題在,先分開述敘一下。
產生空行的程式
for(i=0;i<=50;i++) { RichEdit2->Lines->Add(""); } int col = 11; // 要處理的欄位數 (Column) int row = 9; // 要處理的行數 (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 = RichEdit3->Text; // 設 t1 為 RichEdit3的內容 AnsiString t2 = RichEdit4->Text; // 設 t2 為 RichEdit4 的內容 int len1 = t1.Length(); // 設 len1 為 RichEdit3 的字數 int len2 = t2.Length(); // 設 len2 為 RichEdit4 的字數 if (len1 > 0 || len2 > 0) { // 如果 MaskEdit1 或 MaskEdit2 不是空的 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]; } // 將字串組合為:資料行原來 1~col-1 的資料 + RichEdit3 + RichEdit4 + 資料行原來 col temp = temp.SubString(1, col-1) + t1 +/*6行空行+*/ t2 + temp.SubString(col+oldlen, temp.Length()-((col+oldlen)-1)); oldlen = t1.Length() + t2.Length(); // 設定 oldlen 為兩個 RichEdit 內容的長度 (包含 % 符號在內) } 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 行發表人 - miki-lion 於 2005/08/22 23:47:23 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好: 很抱歉,前幾天在忙私事,沒時間做回覆,對於妳這次的問題,我試了一下,感覺不是很好寫 (可能忙自己的事情而有點心不在焉,碰到了盲點),目前我能想到比較簡單的方法是:使用另一個不顯示的 RichEdit 元件 (如果有用到 RichEdit 的一些特性),或是使用其它可以記錄相同內容的物件 (無需用到 RichEdit 的特性) 來儲存目標 RichEdit 的內容 (以下稱 "暫存物件" 以便說明),當妳改變那兩個輸入資料的 RichEdit 內容後,就將輸入的內容與前述那個 "暫存物件" 的內容重新組合一次,然後設給 目標 RichEdit,妳不妨試試看。 如果妳覺得前述方式可行的話,要記得組合資料時,要按照由下而上的順序來處理,也就是先組合 "第二個輸入字串" 到 "暫存物件",然後再組合 "第一個輸入字串" 到 "暫存物件" 去,我舉各簡單的例子如下:
假設條件:
RichEdit1 為輸入 "第一個輸入字串" 的元件。
RichEdit2 為輸入 "第二個輸入字串" 的元件。
RichEditResult 為顯示組合內容的元件。
RichEditTemp 為不顯示的暫存元件。 RichEdit1 及 RichEdit2 的內容有做變更後,就重新組合資料內容:
void __fastcall TForm1::RichEditChange(TObject *Sender) { RichEditResult->Lines->BeginUpdate(); int row1, col1; // 要處理位置的第一個行數 (Row) 與欄位數 (Column) int row2, col2; // 要處理位置的第二個行數 (Row) 與欄位數 (Column) AnsiString temp, t1, t2; // 暫存用的字串變數 // 第一個插入位置 col1 = 22; row1 = 25; // 第二個插入位置 col2 = 20; row2 = 30; RichEditResult->Text = RichEditTemp->Text; // 重新將 RichEditResult 內容設成與 RichEditTemp 相同 // 先處理第二個插入位置 temp = RichEditResult->Lines->Strings[row2]; t1 = temp.SubString(1, col2); // 拆解出插入位置左方資料 t2 = temp.SubString(col2 1, temp.Length()-col2); // 拆解出插入位置右方資料 RichEditResult->Lines->Strings[row2] = t1 RichEdit2->Text t2; // 將 RichEdit2 的內容組合到插入位置 // 再處理第一個插入位置 temp = RichEditResult->Lines->Strings[row1]; t1 = temp.SubString(1, col1-1); // 拆解出插入位置左方資料 t2 = temp.SubString(col1, temp.Length()-(col1-1)); // 拆解出插入位置右方資料 RichEditResult->Lines->Strings[row1] = t1 RichEdit1->Text t2; // 將 RichEdit1 的內容組合到插入位置 RichEditResult->Lines->EndUpdate(); }7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好:
引言:關於這一個: RichEditTemp 為不顯示的暫存元件。 想請問我該如何處理?一樣拉一個元件,然後把他的Visible->false。 這樣就可以了嗎?是的,妳僅需要拉一個 RichEdit 元件到 Form 上,然後將該元件的 Visible 屬性設為 false 即可,但是為了避免資料位置的計算出錯,妳最好將這個隱藏元件與那個目標元件的各個屬性都設為相同 (除了前述的 Visible 屬性之外),尤其是 WordWrap 屬性 (最好都設為 false,也就是文字資料超過 RichEdit 視框寬度時,不做自動換行的動作)。 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
引言:請問一下就算是這樣來做的話,那麼第二個的處理行數從何而來(row2, col2) 它不是不一定的嗎?(會被第一個往下擠)所以我才會在前面提醒妳: 組合資料時,要按照由下而上的順序來處理,也就是先組合 "第二個輸入字串" 到 "暫存物件",然後再組合 "第一個輸入字串" 到 "暫存物件" 去 而且程式碼也是 "先處理第二個插入位置",然後 "再處理第一個插入位置"。 引言:另外我實做後發現它只會顯示RichEditTemp的內容,一旦輸入後文字後就是一片空白。 RichEditResult->Text = RichEditTemp->Text;我是做過測試,確認程式可達到要求後才將程式碼貼上來的,不清楚妳的實際狀況是什麼?無法回答妳這個問題,妳將程式上傳到站上來吧。 引言:另外將RichEdit1和2的OnChange都指向同一個對吧~我怕我又這裡誤解了是的。 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我只有更改了元件名稱符合我的程式而已~
假設條件:
RichEdit3 為輸入 "第一個輸入字串" 的元件。
RichEdit4 為輸入 "第二個輸入字串" 的元件。
RichEdit2 為顯示組合內容的元件。
RichEditTemp 為不顯示的暫存元件。 我測試結果是不管先從哪一個元件輸入,RichEditTemp的Lines內容就會出來 我相信程式是可以的,只是我又笨笨的不知道漏掉哪裡。
void __fastcall TForm1::RichEditChange(TObject *Sender) { RichEdit2->Lines->BeginUpdate(); int row1, col1; // 要處理位置的第一個行數 (Row) 與欄位數 (Column) int row2, col2; // 要處理位置的第二個行數 (Row) 與欄位數 (Column) AnsiString temp, t1, t2; // 暫存用的字串變數 // 第一個插入位置 col1 = 22; row1 = 25; // 第二個插入位置 col2 = 20; row2 = 30; RichEdit2->Text = RichEditTemp->Text; // 重新將 RichEditResult 內容設成與 RichEditTemp 相同 // 先處理第二個插入位置 temp = RichEdit2->Lines->Strings[row2]; t1 = temp.SubString(1, col2); // 拆解出插入位置左方資料 t2 = temp.SubString(col2 1, temp.Length()-col2); // 拆解出插入位置右方資料 RichEdit2->Lines->Strings[row2] = t1 RichEdit4->Text t2; // 將 RichEdit2 的內容組合到插入位置 // 再處理第一個插入位置 temp = RichEdit2->Lines->Strings[row1]; t1 = temp.SubString(1, col1-1); // 拆解出插入位置左方資料 t2 = temp.SubString(col1, temp.Length()-(col1-1)); // 拆解出插入位置右方資料 RichEdit2->Lines->Strings[row1] = t1 RichEdit3->Text t2; // 將 RichEdit1 的內容組合到插入位置 RichEdit2->Lines->EndUpdate(); } |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
順子
一般會員 發表:3 回覆:14 積分:6 註冊:2002-06-25 發送簡訊給我 |
這是我的作法
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include==================================================================== Unit1.cpp #includeBCB新手~~請多多指教
------
Hello!! 我是順子、順子是我 |
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 妳好: 請注意一下我原先的提示:
引言:使用另一個不顯示的 RichEdit 元件 (如果有用到 RichEdit 的一些特性),或是使用其它可以記錄相同內容的物件 (無需用到 RichEdit 的特性) 來儲存目標 RichEdit 的內容 (以下稱 "暫存物件" 以便說明),當妳改變那兩個輸入資料的 RichEdit 內容後,就將輸入的內容與前述那個 "暫存物件" 的內容重新組合一次,然後設給 目標 RichEdit這個意思是說:要預先將 RichEditTemp 的內容與 RichEditResult 設為相同,妳沒有做這樣的設定,因此 RichEditTemp 的內容是空的,所以才會發生妳描述的那個問題,妳僅需要在 Design mode 直接設好 RichEditTemp 的內容,或是在程式啟動時用程式碼來設定 (例如在 Form 的 OnCreate 事件中設定 RichEditTemp->Text = RichEdit2->Text;) 都可以的,試試看吧。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/11 12:00:40 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
引言: 妳僅需要在 Design mode 直接設好 RichEditTemp 的內容,或是在程式啟動時用程式碼來設定 (例如在 Form 的 OnCreate 事件中設定 RichEditTemp->Text = RichEdit2->Text;) 都可以的,試試看吧。1.請問在 Design mode 直接設好 RichEditTemp 的內容 的作法是什麼?我不了解這個意思 2.Form 的 OnCreate 事件中設定 RichEditTemp->Text = RichEdit2->Text;) 指的是新增加一個函式例如: void __fastcall TForm1::FormEdit(TObject *Sender) { RichEditTemp->Text = RichEdit2->Text;) } 再把Form 的 OnCreate指向這邊對嗎? |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好:
引言:1.請問在 Design mode 直接設好 RichEditTemp 的內容 的作法是什麼?我不了解這個意思Design mode 也可稱為 Design-Time 指的是 "設計模式" 或是 "設計時期",也就是在啟動 BCB 之後,可以編修程式碼及調整視覺元件的狀態,我那句話的意思是說妳可以在編輯模式下,先選擇 RichEditTemp 元件,然後在 Object Inspector 視窗中,直接用滑鼠點擊 Lines 屬性項目,然後輸入與 RichEdit2 相同的內容,也就是和妳當初設定 RichEdit2 內容的方式相同。 引言:2.Form 的 OnCreate 事件中設定 RichEditTemp->Text = RichEdit2->Text;) 指的是新增加一個函式例如:妳可以直接在前述的編輯模式下,先選擇 Form1,在 Object Inspector 的事件表找到 Form1 的 OnCreate 項目,然後點擊滑鼠左鍵兩次,BCB 就會自動產生一個空的 FormCreate 模板,妳就將我講的那一行敘述複製到該事件中就可以了。 7 天天敲鍵盤 v 時時按滑鼠 8void __fastcall TForm1::FormEdit(TObject *Sender) { RichEditTemp->Text = RichEdit2->Text;) } 再把Form 的 OnCreate指向這邊對嗎? |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |