有關抓取Edit內容長度的問題 |
尚未結案
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
以下的程式是在MaskEdit1內輸入內容後(EX:1234) 會在RichEdit1內的第6行第12列出現(34)
int oldlen = 0;//全域變數 以下為MaskEdit1程式碼 int row = 6; // 要處理的資料行數 (Row) int col = 12; // 要處理的資料行位置 (Column) AnsiString temp = RichEdit2->Lines->Strings[row]; if (MaskEdit1->Text.Length() > 0) { int len = temp.Length(); if(len < col){ RichEdit2->Lines->Strings[row] = temp AnsiString::StringOfChar(' ', col - len); temp = RichEdit1->Lines->Strings[row]; } temp = temp.SubString(1, col-1) "%" MaskEdit1->Text temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = MaskEdit1->Text.Length() 1; } else { temp = temp.SubString(1, col-1) temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = 0; }但是如果今天我如果需要做2個以上的MaskEdit,並把內容放在同一行。 EX:MaskEdit1->1234 MaskEdit2->5678 出來的結果是34V78 我試過在MaskEdit2的行數宣告改成 col = MaskEdit1->Text.Length() 1; 用上一個的長度結尾當第2個MaskEdit2的開頭 也想到用 temp = MaskEdit1->Text.Length temp.SubString(1, pos-1) % MaskEdit2->Text temp.SubString(pos, temp.Length()-(pos-1));在一開始先加上Maskedit1的長度 但都出現錯誤的情況,想請問一下要怎麼辦呢 >< 發表人 - |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
Miki-lion:妳沒說妳要的解答是什麼?而且我發現妳也並不太用功。 MaskEdit1->1234 MaskEdit2->5678 妳要的結果是345678?還是34%5678?其實不管妳要的那一種! 妳都可以先處理再導入! 說明一下妳將RedSnow大大的程式變成副程式裡的"%"先拿掉。 妳的MaskEdit1->Text先加上"%",以AnsiString S傳入運算, 假設副程式名稱為ABC(AnsiString S); 如MaskEdit1->1234; ABC("%"+MaskEdit1->Text); 兩個的話就是ABC("%"+MaskEdit1->Text+"%"+MaskEdit2->Text); 或ABC("%"+MaskEdit1->Text+MaskEdit2->Text); 不就好了! 順便把ABC()也幫妳處理一下! int oldlen = 0;//全域變數 // 執行 ABC(("%"+MaskEdit1->Text,6,12); void __fastcall TForm1::ABC(AnsiString S,int row,int col) { AnsiString temp = RichEdit2->Lines->Strings[row]; if (S.Length() > 0) { int len = temp.Length(); if(len < col){ RichEdit2->Lines->Strings[row] = temp + AnsiString::StringOfChar(' ', col - len); temp = RichEdit1->Lines->Strings[row]; } temp = temp.SubString(1, col-1) + S + temp.SubString(col+oldlen, temp.Length()-((col+oldlen)-1)); oldlen = S.Length() + 1; } else { temp = temp.SubString(1, col-1) + temp.SubString(col+oldlen, temp.Length()-((col+oldlen)-1)); oldlen = 0; } } 請參考! P.S.RichEdit的內容加入處理方式方法還有,妳要加油! 像我就不是用RedSnow大大的方式處理!我會採用 RichEdit1->SelStart; RichEdit1->SelLength; RichEdit1->SelText; 的方式處理! 還有請到 http://delphi.ktop.com.tw/pop_profile.asp?mode=display&id=7474 看看!她很厲害!不是妳所謂的 誰說女生不會寫程式,只是寫的比較爛..><Andy Chang
------
Andy Chang |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好: 妳重新開題啦,我還以為妳會在原題裡繼續討論呢,好吧~妳現在的問題是將兩個 MaskEdit 的 OnChange 事件都指向同一個處理程序嗎?如果是的話,妳將原敘述中的 MaskEdit1 改成 ((TMaskEdit *)Sender) 這樣子來處哩,就應該可以正常運作了,例如:
int row = 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] = temp;請注意,上述程式碼中的 RichEdit 物件名稱為 RichEdit1,妳這次貼上來的程式碼中有出現 RichEdit1 與 RichEdit2,修改程式碼時不要弄亂了喔。 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
謝謝~ 我把新的程式個別的貼在2個MaskEdit內(假如是1.2) 輸入MaskEdit1->1234
MaskEdit2->5678
結果會是V78
1234會被蓋過去
我要的是34V78
而且輸入是不限制字數的,也有可能第一個輸入1234546789這麼多,
所以我想到的是先判斷前一個MaskEdit輸入了甚麼,
讓第2個Edit再去加上前一個的內容。 另外(TMaskEdit *)Sender是讓全部的MaskEdit做同樣的動作嗎
不用再標明1.2.3.4..... 誰說女生不會寫程式,只是寫的比較爛..><
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
Miki-lion 妳好: 如果是這樣子的話,那就再將處理程序修改一下好了:
MaskEdit1 與 MaskEdit2 的 OnChange 程序均使用下列的相同程序,也就是 MaskEdit1 直接按照原先的方式設定 OnChange 事件,而 MaskEdit2 無需另外建立 OnChange 事件,直接在的事件設定表 (Object Inspector) 上的 OnChange 事件設定處,用選擇的方式設定成 MaskEdit1Change 即可。
void __fastcall TForm1::MaskEdit1Change(TObject *Sender) { int col = 11; // 要處理的欄位數 (Column) int row = 9; // 要處理的行數 (Row) if (RichEdit1->Lines->Count < row 1) { // 如果 RichEdit 行數不足 10 行 for (int i=RichEdit1->Lines->Count; i<10; i ) { RichEdit1->Lines->Add(""); // 產生足夠的空行 } } AnsiString temp = RichEdit1->Lines->Strings[row]; // 設 temp 為 RichEdit1 第 row 行的內容 AnsiString t1 = MaskEdit1->Text; // 設 t1 為 MaskEdit1 的內容 AnsiString t2 = MaskEdit2->Text; // 設 t2 為 MaskEdit2 的內容 int len1 = t1.Length(); // 設 len1 為 MaskEdit1 的字數 int len2 = t2.Length(); // 設 len2 為 MaskEdit2 的字數 if (len1 > 0 || len2 > 0) { // 如果 MaskEdit1 或 MaskEdit2 不是空的 int len = temp.Length(); // 設 len 為 RichEdit1 第 row 行內容的字數 if(len < col){ // 如果資料行字元數少於 col 值,則以空白字元補足它 RichEdit1->Lines->Strings[row] = temp AnsiString::StringOfChar(' ', col - len); temp = RichEdit1->Lines->Strings[row]; } if(len1 > 0){ // 如果 MaskEdit1 有內容 t1 = "%" t1; // 在 t1 前加上 % 符號 } if(len2 > 0){ // 如果 MaskEdit2 有內容 t2 = "%" t2; // 在 t2 前加上 % 符號 } // 將字串組合為:資料行原來 1~col-1 的資料 MaskEdit1 MaskEdit2 資料行原來 col 原先 MaskEdit1 與 MaskEdit2 內容長度 之後的資料 temp = temp.SubString(1, col-1) t1 t2 temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = t1.Length() t2.Length(); // 設定 oldlen 為兩個 MaskEdit 內容的長度 (包含 % 符號在內) } else { temp = temp.SubString(1, col-1) temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = 0; } RichEdit1->Lines->Strings[row] = temp; // 將重新組合過的字串設回給 RichEdit 第 row 行 }另外有關(TMaskEdit *)Sender 的問題,妳說的大致正確,這種寫法是用在多個同類型的物件 (在此指 MaskEdit) 使用同一個事件時使用的,以我寫的前一個例子來作說明的話,當 MaskEdit 觸發 OnChange 事件時,事件處理程序的參數 Sender 就是呼叫程序時的 MaskEdit,但因為是兩個 MaskEdit 共用的程序,因此必須要在事件處理程序中識別是那一個 MaskEdit?而 Sender 傳入時是宣告為 TObject 的型態,無法直接使用到 MaskEdit 的一些屬性,所以才要用 (TMaskEdit *)Sender 的方式強制轉型為 MaskEdit,這樣子就可以順利的進行相關處理與設定了。 7 天天敲鍵盤 v 時時按滑鼠 8 |
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
恩恩~已經可以了~我只想一值挑戰看看~想到甚麼加甚麼~ 我剛在寫如果要3個以上的MaskEdit(在我程式裡是4.5.6) 剛把你的程式照本宣科的寫一樣的宣告和判別 結果是可以的,程式如下~
int col = 12; // 要處理的欄位數 (Column) int row = 6; // 要處理的行數 (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 = MaskEdit4->Text; // 設 t1 為 MaskEdit1 的內容 AnsiString t2 = MaskEdit5->Text; // 設 t2 為 MaskEdit2 的內容 AnsiString t3 = MaskEdit6->Text; int len1 = t1.Length(); // 設 len1 為 MaskEdit1 的字數 int len2 = t2.Length(); // 設 len2 為 MaskEdit2 的字數 int len3 = t3.Length(); // 設 len2 為 MaskEdit2 的字數 if (len1 > 0 || len2 > 0 || len3 > 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 前加上 % 符號 } if(len2 > 0){ // 如果 MaskEdit2 有內容 t2 = "%" t2; // 在 t2 前加上 % 符號 } if(len3 > 0){ // 如果 MaskEdit1 有內容 t3 = "%" t3; // 在 t3 前加上 % 符號 } temp = temp.SubString(1, col-1) t1 t2 t3 temp.SubString(col oldlen, temp.Length()-((col oldlen)-1)); oldlen = t1.Length() t2.Length() t3.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 行 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |