如何製作像FrontPage一樣的功能 |
尚未結案
|
Miki-lion
中階會員 發表:90 回覆:180 積分:54 註冊:2005-04-24 發送簡訊給我 |
我有一個程式像下面這張圖一樣有很多的MaskEdit和其他元件 要如何讀入這些元件的輸入值,然後在另一個Page上顯示這些值的內容 Ex:例如在Page1裡面的MaskEdit1輸入"ㄅㄆㄇ" 就會在Page2的RichEdit1裡頭出現"ㄅㄆㄇ" 而且Page2是經過我自己所設計過,規定每個元件輸入過來的值要放在哪裡 並且有一些內容是我自已在EditRich1上所固定出現的 像是FrontPage一樣,在設計欄上key上的東西,
會馬上在程式碼的頁面出現,不僅有自己打的內容,還自動加上程式碼
誰說女生不會寫程式,只是寫的比較爛..><
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
引言: 我有一個程式像下面這張圖一樣有很多的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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
雖然程式我還看不大董,不過這行好像有問題
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 發送簡訊給我 |
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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
引言:想請問要改變第幾行的"第幾個"位置,是更改哪裡的數據? 因為原本是說更改第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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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 發送簡訊給我 |
我稍微改點東西~行數要更改,只需改一個地方而已 不過假如輸入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 發送簡訊給我 |
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 發送簡訊給我 |
那個不好意思~~再三的麻煩你~不過結果好像還是一樣會 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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |