在Delphi组件(以TEdit、TRichEdit为例)中如何支持Unicode?高分求解。(200分)

  • 主题发起人 主题发起人 grhunter
  • 开始时间 开始时间
G

grhunter

Unregistered / Unconfirmed
GUEST, unregistred user!
标准的Delphi组件对Unicode支持不够。别和我争论这个问题——在TEdit输入中文没有问题。不过其它许多语言却无法支持,比如Unicode越南语。
Delphi组件不能完美支持Unicode是肯定的。谁能告诉我如何使其支持Unicode?
要求做到:在TEdit中正常显示以下文字:Đây là chữ tiếng Việt。
这是一句Unicode编码的越南语。在标准的TEdit中无法正常显示。
 
思考、、、
 
下个RichEdit98来看看吧
它就可以支持!
 
xianjun:我不想用其它控件。最好是能在TEdit中直接支持。退而求其次,也要在自己实现的继承自TEdit的控件中实现。
 
分数不够可以继续加。能解决这个问题,分数上不封顶。我现在有3000多分。各位,努力啊!
 
其实我的原意也是要你去看看RichEdit98的源码,看它是怎么实现的。
它是从TCustomRichEdit继承下来的,它可以实现,应该从TEdit继承下来也是一样的道理
只不过有几千行源码,我没那么多时间是细细研究它了。[:(]
 
delphi标准的VCL控件不支持UNICODE吗。请参考以下网站,内容非常丰富:

http://www.delphi-unicode.net/
 
这个地方看过了。TRichEdit98和TEdit不一样。是实现RichEdit2.0的。
 
http://www.lingscape.com/ 等他的控件吧。我都等了一年了!
 
分数不够再加。3000分加完为止。务求解决问题!!!
 
我知道有个人写了套unicode的vcl.比较常用的几个。要注册$149。我试验过几个。
pwunicomp.zip http://www.torry.net/quicksearch.php 上用unicode做关键字查。

看样子是中国人写的。Unicode components for Windows2000/XP v.1.00
hoi9@21cn.com
 
这个控件组我知道。有没有自己实现的方法?我是想学方法。
 
grhunter,你在哪儿?怎么也要处理越南字?能否联系我?kan@freetrend.com.vn
对于这个问题,我也觉得麻烦,不过我现在没时间去研究,但我想可以看看源码,看看RichEdit
与Edit之间关于字体处理方面有什么不同?另外,等Delphi的下一版,应该会考虑解决这一个
问题了.呵呵...
 
今天时间太晚了,明天一定告诉你!
 
参考以下代码(Windows.pas):
... ...
function DrawTextA(hDC: HDC; lpString: PAnsiChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawTextW}
function DrawTextW(hDC: HDC; lpString: PWideChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawText}
function DrawText(hDC: HDC; lpString: PChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
... ...
function DrawTextA; external user32 name 'DrawTextA';
function DrawTextW; external user32 name 'DrawTextW';
function DrawText; external user32 name 'DrawTextA';
... ...
Windows系统对每个与字符处理有关的函数都提供两个实现版本,
其中处理ANSI字符的后辍为A,处理Unicode的后辍为W。Delphi中
同时支持两个版本,但是缺省支持的不带A、W后辍的版本实际上
却是ANSI的版本。也就是说,你调用DrawText实际上调用的是
DrawTextA,ANSI版本。

解决的办法……,你把Windows.pas中所有字符处理函数的缺省
设置指向支持Unicode的函数,例:
... ...
function DrawTextA(hDC: HDC; lpString: PAnsiChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawTextW}
function DrawTextW(hDC: HDC; lpString: PWideChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawText}
function DrawText(hDC: HDC; lpString: PWideChar; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
... ...
function DrawTextA; external user32 name 'DrawTextA';
function DrawTextW; external user32 name 'DrawTextW';
function DrawText; external user32 name 'DrawTextW';
... ...

然后重新编译Windows.pas,并将生成的windows.dcu放到你的项目
源码目录中(为了保险起见,可以把该windows.dcu加入到你的项
目中)。然后重新编译你的项目。
要注意的是,不仅是系统函数需要重新指定,有些数据结构也分
A、W版本的,同要需要重新设定……。

工作量比较大,Windows.pas可是个大文件,只能写个程序进行转换了……。

不过以上办法可能不会能完全解决你的问题,因为Delphi的某些字符串处理
函数同样是按ANSI方式操作的。没试过,不能确定,只好求上帝保佑啦:)。

另一个解决办法就是自己编写相关的控件,控件代码中显式调用W系列函数。
这个办法应该解决得比较彻底,但是工作量同样也不小:)。
 
捕捉TEDIT KEYPRESS事件用TRUE-TYPE字体画
Đây là chữ tiếng Việt
我觉得应该可以啊

 
后退
顶部