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

有關抓取Edit內容長度的問題

尚未結案
Miki-lion
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-21 00:15:15 IP:61.217.xxx.xxx 未訂閱
以下的程式是在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-21 00:21:26 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-21 03:00:38 IP:221.169.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-21 18:16:56 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-21 18:41:57 IP:61.217.xxx.xxx 未訂閱
謝謝~ 我把新的程式個別的貼在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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-21 21:18:14 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-21 22:02:32 IP:61.217.xxx.xxx 未訂閱
恩恩~已經可以了~我只想一值挑戰看看~想到甚麼加甚麼~    我剛在寫如果要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 行    
系統時間:2024-05-12 20:53:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!