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

TEdit->Text 應如何限制 UnicodeString 之 MaxWidth?

答題得分者是:aftcast
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-29 16:22:30 IP:211.72.xxx.xxx 訂閱
CB2009 開始支援 UnicodeString,
但通常為了 Screen Layout 與 Report Layout 而須限制 TEdit 及 TDBEdit 等之總寬
讓 User Key-in 時不得超過限制的 Width (例如本論壇之文章標題不得超過40個中文字).
以往用 AnsiStrings.Length() 中文 2 Bytes 英文 1 Bytes 便可控制;
如今 UnicodeString.Length() 中文 1 Character 英文 1 Character,
若中英文夾雜, 雖可限制 Character 數, 但卻無法限制 DiaplayWidth.
原擬用 TCanvas->DisplayWidth(UnicodeString) 與 "W" 字寬比較做處理,
但 TEdit TDBEdit 皆無 TCanvas 可用.

請問諸位用過 TNTWare 之先進們, 可有良方賜教?

剛想到一個方法, 於 OnChange() 或 OnExit() 檢查, 或許可行, 程式碼如下:

[code cpp]
String sx1;
sx1 = Edit1->Text;
int ixL,ixE;
ixL = sx1.Length();
ixE = 0;
for (int i = 1; i <= ixL; i) {
if (sx1.SubString(i,1) < L"}") {
ixE;
}
}
ixL = ixL * 2 - ixE;
if (ixL <= MaxByte) return;
// else Cut 掉尾部, 或禁止離開該 TEdit, TDBEdit
[/code]

編輯記錄
herbert2 重新編輯於 2008-10-29 17:51:55, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-30 04:07:00 IP:122.120.xxx.xxx 訂閱
不是很懂你的意思,但
TEdit的MaxLength不是你要的嗎?

若不是,那就黑箱作業的把輸入進來的資料轉成ansistring,然後再用過去你的方法來處理就好!

只是多一個步驟驟而已!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-10-30 04:21:41, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-30 10:47:38 IP:211.72.xxx.xxx 訂閱
抱歉! 語意不夠明確.
小弟是希望解決 BIG5 須造字(堃....等),
又要有例如 "本論壇之文章標題不得超過40個中文字"(中英夾雜寬幅 80 Column)
的限制, 故無法轉到 AnsiString 再轉回 UnicodeString.
MaxLength 對 AnsiString 很合用(中 2 Col, 英 1 Col),
但對 UnicodeString 則中英文都算 1 Character 故不合用.
因對 Unicode 編碼不夠熟悉, 搞不清那個編碼是 2 Column 寬字的最小編碼,
故有困擾. 正在努力瞭解 Unicode 編碼規則.

===================引 用 aftcast 文 章===================
不是很懂你的意思,但
TEdit的MaxLength不是你要的嗎?

若不是,那就黑箱作業的把輸入進來的資料轉成ansistring,然後再用過去你的方法來處理就好!
只是多一個步驟驟而已!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-31 02:26:26 IP:59.115.xxx.xxx 訂閱
完全了解了!

目前看來你的方法應該是很不錯的方式。但建議可再稍改一下讓效能變更好,如下:

for (int i = 1; i <= ixL; i) {
if (sx1[i] < 255) { //用127也是可以,127至255是ascii擴充碼,廣義來說也是1col的寬吧
ixE;
}
}


我沒有2009版,但我猜 [ ] 算符複載應該是存在的。在WideString中是有的。我小試了一下是ok的! 省去function往來與L" "建構時間。
試看看吧,若有想到更好的方式再po上來。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-10-31 02:33:31, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-31 10:27:57 IP:211.72.xxx.xxx 訂閱
謝謝賜教!
尚不夠瞭解 sx1[1] 會得到 char 或 wchr_t, 故先用 SubString() 測.
因尚有許多 1 Column 寬的符號, 不僅只 256 個 AscII 而已,
故要再查一下 Unicode 編碼表做確認.
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-31 12:20:00 IP:60.248.xxx.xxx 訂閱
不客氣,是我向你學到一些東西 ^ _ ^

至於會回傳什麼? 我想肯定wchar_t ,它算是short int,與255比對的話沒有型別的問題。c的好處理就是這樣,可以低階處理。你說是不?


===================引 用 herbert2 文 章===================
謝謝賜教!
尚不夠瞭解 sx1[1] 會得到 char 或 wchr_t, 故先用 SubString() 測.
因尚有許多 1 Column 寬的符號, 不僅只 256 個 AscII 而已,
故要再查一下 Unicode 編碼表做確認.
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-04-27 10:35:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!