全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1346
推到 Plurk!
推到 Facebook!

如何製作像FrontPage一樣的功能

尚未結案
Miki-lion
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-16 21:24:03 IP:218.162.xxx.xxx 未訂閱
我有一個程式像下面這張圖一樣有很多的MaskEdit和其他元件    要如何讀入這些元件的輸入值,然後在另一個Page上顯示這些值的內容    Ex:例如在Page1裡面的MaskEdit1輸入"ㄅㄆㄇ"       就會在Page2的RichEdit1裡頭出現"ㄅㄆㄇ"       而且Page2是經過我自己所設計過,規定每個元件輸入過來的值要放在哪裡       並且有一些內容是我自已在EditRich1上所固定出現的       像是FrontPage一樣,在設計欄上key上的東西,       會馬上在程式碼的頁面出現,不僅有自己打的內容,還自動加上程式碼 誰說女生不會寫程式,只是寫的比較爛..><
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-17 06:56:39 IP:211.74.xxx.xxx 未訂閱
引言: 我有一個程式像下面這張圖一樣有很多的MaskEdit和其他元件 要如何讀入這些元件的輸入值,然後在另一個Page上顯示這些值的內容 Ex:例如在Page1裡面的MaskEdit1輸入"ㄅㄆㄇ" 就會在Page2的RichEdit1裡頭出現"ㄅㄆㄇ" 而且Page2是經過我自己所設計過,規定每個元件輸入過來的值要放在哪裡 並且有一些內容是我自已在EditRich1上所固定出現的 像是FrontPage一樣,在設計欄上key上的東西, 會馬上在程式碼的頁面出現,不僅有自己打的內容,還自動加上程式碼 誰說女生不會寫程式,只是寫的比較爛..><
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
  RichEdit1->Text = MaskEdit1->Text;
}
//================================================================    如果您要寫像FrontPage一樣,
那應該是要先把這些程式碼寫入到RichEdit1->Lines裡面!然後在MaskEdit1Change事件中,搜尋RichEdit1裡面那一行是<body>,
然後在<body>的下一行加入您的MaskEdit1->Text;
<html>    <head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>新增網頁1</title>
</head>    <body>    </body>    </html>    例:在第9行找到<body>,那應該要在第10行寫入:
RichEdit1->Lines->Add(MaskEdit1->Text);
舉例一下!請多包含! 發表人 - cashyy 於 2005/07/17 07:41:35 發表人 - cashyy 於 2005/07/17 07:42:30
Miki-lion
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-17 10:41:33 IP:218.162.xxx.xxx 未訂閱
這個我知道了~謝謝 不過要怎樣限定MaskEdit出現在我想要的RichEdit位置上 並且在前面加上一字元 EX~MaskEdit1=123 RichEdit1的第10行出現3 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-18 00:16:56 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:要怎樣限定MaskEdit出現在我想要的RichEdit位置上 並且在前面加上一字元 EX~MaskEdit1=123 RichEdit1的第10行出現3
給妳一個範例如下,看看是不是妳需要的?
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
    // 如果 RichEdit 行數不足 10 行,則先產生足夠的空行
    if (RichEdit1->Lines->Count < 10) {
        for (int i=RichEdit1->Lines->Count; i<10; i  ) {
            RichEdit1->Lines->Add("");
        }
    }        // 如果 MaskEdit 不是空的
    if (MaskEdit1->Text.Length() > 0) {
        // 在 RichEdit 第 10 行顯示 % 符號與 MaskEdit 內容
        RichEdit1->Lines->Strings[9] = "%" MaskEdit1->Text;
    } else {
        // 如果 MaskEdit 是空的,則不顯示資料
        RichEdit1->Lines->Strings[9] = "";
    }
}
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/18 00:30:00
Miki-lion
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-19 16:13:59 IP:61.217.xxx.xxx 未訂閱
 
if (MaskEdit1->Text.Length() > 0) {
// 在 RichEdit 第 10 行顯示 % 符號與 MaskEdit 內容
RichEdit1->Lines->Strings[9] = "%" MaskEdit1->Text;
} else {
// 如果 MaskEdit 是空的,則不顯示資料
RichEdit1->Lines->Strings[9] = "";
}
我只有需要這邊的,不過不加上前面的程式碼, 只有這樣的話程式無法動作,不懂為何要產生10行空行 另外可以讓它限定在第幾行的"第幾個"位置嗎? EX:Filename:[]; //寫在[]裡頭 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-19 19:40:28 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:.... 我只有需要這邊的,不過不加上前面的程式碼, 只有這樣的話程式無法動作,不懂為何要產生10行空行
因為妳要處理的 RIchEdit 資料行是第 10 行,那麼若是 RichEdit 的資料行並沒有那麼多的話 (少於 10 行),妳要如何將資料寫到第 10 行去呢?因此我們必須先確保 RichEdit 有足夠的資料行。
引言:另外可以讓它限定在第幾行的"第幾個"位置嗎? EX:Filename:[]; //寫在[]裡頭
可以啊~不過妳必須要用拆解、組合字串的方式來處理,同時妳也必須要先決定好是用 Insert 或是 Replace 的方式將字樣寫到指定的位置去?例如:
// Insert 資料到第 6 個 Column 處
// 先確認資料行有足夠數量的長度
AnsiString temp = RichEdit1->Lines->Strings[9];
int len = temp.Length();
if (len < 5) {  // 若資料行少於 5 個字元,則以空白字元補足
    RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar(' ', 5 - len);
}
temp = RichEdit1->Lines->Strings[9];
// 將原資料行的前 5 個字元   要插入的字串   原資料行第 6 個字元之後的資料
temp = temp.SubString(1, 5)   "%" MaskEdit1->Text   temp.SubString(6, temp.Length()-5);
RichEdit1->Lines->Strings[9] = temp;    // Replace 資料到第 6 個 Column 處
// 先確認資料行有足夠數量的長度
AnsiString temp = RichEdit1->Lines->Strings[9];
int len = temp.Length();
if (len < 5) {  // 若資料行少於 5 個字元,則以空白字元補足
    RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar(' ', 5 - len);
}
temp = RichEdit1->Lines->Strings[9];
int no = 1   5   MaskEdit1->Text.Length();
// 將原資料行的前 5 個字元   要插入的字串   原資料行第 6 個字元加上插入字串長度之後的資料
temp = temp.SubString(1, 5)   "%" MaskEdit1->Text   temp.SubString(no   1, temp.Length()-no);
RichEdit1->Lines->Strings[9] = temp;
7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-19 20:07:01 IP:61.217.xxx.xxx 未訂閱
雖然程式我還看不大董,不過這行好像有問題 RichEdit1->Lines->Strings[9] = temp AnsiString::StringOfChar('' '', 5 - len); Insert 或是 Replace 都一樣會有下列錯誤訊息 [C Error] Unit1.cpp(416): E2129 Character constant too long (or empty) [C Error] Unit1.cpp(416): E2129 Character constant too long (or empty) [C Error] Unit1.cpp(416): E2121 Function call missing ) PS:空10行的原因我懂了,謝謝你^^ 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-19 20:13:25 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:    妳貼上來的程式碼與我寫的不一樣喔:
妳貼上來的是:
RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar('' '', 5 - len);    我寫的是:
RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar(' ', 5 - len);
上述以紅色標示的地方應該是 一個單引號、空一格、一個單引號,妳修改一下再試試看。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/19 20:15:50
Miki-lion
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-19 20:38:19 IP:61.217.xxx.xxx 未訂閱
已經OK了~我用Replace的方來做 想請問要改變第幾行的"第幾個"位置,是更改哪裡的數據? 因為原本是說更改第6個Column 不過我嘗試後發現它只空了2個半的空格出來 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-19 21:26:51 IP:61.230.xxx.xxx 未訂閱
引言:想請問要改變第幾行的"第幾個"位置,是更改哪裡的數據? 因為原本是說更改第6個Column 不過我嘗試後發現它只空了2個半的空格出來
妳說的現象應該是 "錯覺",我猜想妳設定的 RichEdit 所使用的並非是 "等寬字型",所以看起來會有妳說的那種情形,事實上則不是那樣的,否則妳直接將滑鼠點到 RichEdit 內,用鍵盤的方向鍵移動一下,算算格數就知道了,妳可以將 RichEdit 的 Font 更改為 Fixedsys 或是 Courier New 這類的等寬字型來試試看,這樣子就不會有錯覺了。 另外關於 Column 值的問題,我將程式修改如下:
int pos = 6;
AnsiString temp = RichEdit1->Lines->Strings[9];
int len = temp.Length();
if(len < pos){
    RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar(' ', pos - len);
}
temp = RichEdit1->Lines->Strings[9];
int no = pos   1   MaskEdit1->Text.Length();
temp = temp.SubString(1, pos-1)   "%" MaskEdit1->Text   temp.SubString(no, temp.Length()-(no-1));
RichEdit1->Lines->Strings[9] = temp;
上述敘述中的 pos 變數就是妳要的 "位置" (Column),妳可以修改變數值來指定位置。 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-19 21:52:12 IP:61.217.xxx.xxx 未訂閱
已經完全可以了,真的是很謝謝你, 還把程式改成讓我比較好修改, 你之前的程式註解裡面有 [加上插入字串長度之後的資料] 不過我實做時發現修改後的程式, 他會把後面的字元給吃掉,這部分又該如何解決呢? EX: Filename:[]; 正確 Filename:[Maskedit1的內容]; 錯誤 Filename:[Maskedit1的內容....... 謝謝你常常幫忙解決我的難題^^ 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-19 22:35:10 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:你之前的程式註解裡面有 [加上插入字串長度之後的資料] 不過我實做時發現修改後的程式, 他會把後面的字元給吃掉,這部分又該如何解決呢? EX: Filename:[]; 正確 Filename:[Maskedit1的內容]; 錯誤 Filename:[Maskedit1的內容.......
因為妳先前寫到 "我用Replace的方來做",所以我再寫範例時,是針對 Replace 的狀態寫的,會覆蓋掉後面的字元是正常的,但是照妳這次所描述的來看,妳想使用的是 Insert 而不是 Replace,我再改一下程式敘述如下:
int pos = 11;
AnsiString temp = RichEdit1->Lines->Strings[9];
int len = temp.Length();
if (len < pos) {
    RichEdit1->Lines->Strings[9] = temp   AnsiString::StringOfChar(' ', pos - len);
}    /* 這一段 (下列三行) 是 Replace 的動作
temp = RichEdit1->Lines->Strings[9];
int no = pos   1   MaskEdit1->Text.Length();
temp = temp.SubString(1, pos-1)   "%" MaskEdit1->Text   temp.SubString(no, temp.Length()-(no-1));
*/    // 下列這一行是 Insert 的動作
temp = temp.SubString(1, pos-1)   "%" MaskEdit1->Text   temp.SubString(pos, temp.Length()-(pos-1));    RichEdit1->Lines->Strings[9] = temp;
試試看這樣是不是妳所要的效果? 7 天天敲鍵盤 v 時時按滑鼠 8
Miki-lion
中階會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-19 23:10:50 IP:61.217.xxx.xxx 未訂閱
我稍微改點東西~行數要更改,只需改一個地方而已 不過假如輸入1234 會變成343%1 不是我改壞掉了吧,好像一開始會這樣? int pos = 12; //列數 int i=11; //行數 AnsiString temp = RichEdit2->Lines->Strings[i]; int len = temp.Length(); if (len < pos) { RichEdit2->Lines->Strings[i] = temp AnsiString::StringOfChar(' ', pos - len); } temp = temp.SubString(1, pos-1) "%" MaskEdit1->Text temp.SubString(pos, temp.Length()-(pos-1)); RichEdit2->Lines->Strings[i] = temp; 這個討論串學到超多有用的語法,超高興的,筆記一下多好多出來^^ 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-19 23:59:53 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:我稍微改點東西~行數要更改,只需改一個地方而已 不過假如輸入1234 會變成343%1 不是我改壞掉了吧,好像一開始會這樣?
這是因為資料行在每次變更時,都會 Insert 新字串,而新增的字串就會變成了資料行的一部份,重覆做 Insert 動作時,就會發生妳所描述的狀況了,如果要避免這種情形的發生,那就得在 Insert 資料之前,先將資料行恢復成原樣 (另外用變數記錄下資料行的原始內容,或是用另一個隱藏的 RichEdit 物件紀錄整個原始內容,在處理插入資料的動作時,先取出原始內容做組合處理,然後再設給 RichEdit 的對應資料行),這樣才能直接使用原先的程式敘述,否則就得再加上一些額外的處理才行,例如:
設一個全域變數:
int oldlen = 0;    然後將原先的敘述修改如下:
int row = 10;  // 要處理的資料行數 (Row)
int col = 11;  // 要處理的資料行位置 (Column)
AnsiString temp = RichEdit1->Lines->Strings[row];    if (MaskEdit1->Text.Length() > 0) {
    int len = temp.Length();
    if(len < col){
        RichEdit1->Lines->Strings[row] = temp   AnsiString::StringOfChar(' ', col - len);
    }
    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;
}    RichEdit1->Lines->Strings[row] = temp;
上述的處理,是用一個變數 oldlen 記錄下前一次代入資料行的字串長度 (包含 % 符號在內),然後在後續的組合動作時,避開前一次代入的資料。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/20 00:08:28
Miki-lion
中階會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-07-20 00:21:48 IP:61.217.xxx.xxx 未訂閱
那個不好意思~~再三的麻煩你~不過結果好像還是一樣會 343%1 int oldlen = 0; 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 = 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; } RichEdit2->Lines->Strings[row] = temp; 誰說女生不會寫程式,只是寫的比較爛..><
RedSnow
版主


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-07-20 00:46:00 IP:61.230.xxx.xxx 未訂閱
Miki-lion 妳好:
引言:那個不好意思~~再三的麻煩你~不過結果好像還是一樣會 343%1 int oldlen = 0; int row = 6; // 要處理的資料行數 (Row) ......
妳有將 oldlen 變數宣告為全域變數嗎?妳不可以將該變數的宣告位置放在那個 OnChange() 事件中喔,妳必須將宣告位置放到 .cpp 檔案的開頭處,也就是在 TForm1 *Form1;__fastcall TForm1::TForm1(TComponent* Owner) 之間的位置。 另外補充一下: 發現前一個程式在修改後漏了一個步驟,如果要處理的資料行是 "空行" 或是字數小於 col 變數所設的數字時,也會發生妳描述的狀況,因此必須要加一行敘述,請加上以紅色粗體字標示的那一行:
.... 前略 ....
if(len < col){
    RichEdit1->Lines->Strings[row] = temp   AnsiString::StringOfChar('_', col - len);
    temp = RichEdit1->Lines->Strings[row];
}
.... 後略 ....
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/20 00:58:55
Miki-lion
中階會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-07-20 01:07:35 IP:61.217.xxx.xxx 未訂閱
恩恩~~我知道在哪裡    TForm1 *Form1; //--------------------------------------------------------------------------- AnsiString FileName = ""; int oldlen = 0;    這樣就沒問題了~今天真是謝謝你的幫忙~    我會把學到東西好好記下來的~謝謝 誰說女生不會寫程式,只是寫的比較爛..><
系統時間:2024-05-18 4:33:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!