黔驴技穷还是柳暗花明?还差一点的Unicode问题,有点郁闷 (150分)

  • 主题发起人 tan_jian
  • 开始时间
T

tan_jian

Unregistered / Unconfirmed
GUEST, unregistred user!
我的机器win2000支持韩文显示,比如如下代码<br>&nbsp; H:=GetForeGroundWindow;<br>&nbsp; GetWindowTextW(H,S,256);<br>&nbsp; SetWindowTextW(FindWindow('Notepad',nil),S); 可以验证的得到的S是正确的<br>&nbsp; Unicode字符串(s中有韩文显示),可是怎么把s的值拷贝到剪贴板呢,直接调用剪贴板类 的AsText显然是不行的,再从剪贴板粘贴到比如Word,就会只显示????了<br><br>&nbsp; &nbsp;该怎么解决这个问题呢,使得剪贴板中的数据和s一样是unicode字符集的,就像在word中拷贝韩文一样粘贴依然不变,难道需要CreateFileMapping这样的处理么,有没更简单的方法,请各位大虾小虾指点一下吧!
 
试下下面方法可不可以解决:<br>1。在Project/Option里选择区域为Korean<br>2.Form字体社为标准韩文字体<br>3。Edit框的IME可以指定为韩文
 
谢谢wtopia,可能没明白我的意思,我是得到正确的字符串了,就想拷贝到剪贴板而已<br><br>Delphi的TEdit控件不能接受这类字符串,比如word里面随意录入两个韩文,在edit进行粘<br><br>贴操作是不行的,TRichEdit则可以,也试图通过SetWindowTextW(文字编辑控件.handle,s)<br><br>依然不行,求救啊!
 
保存到二进制文件中,用Word用远东字符集打开
 
没看懂你要干什么。。。<br>但解决Unicode &nbsp;用Tnt 吧。。。这里下<br>http://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm<br>提供了各种控件的Unicode版本。。。<br>比如 TTntEdit 支持显示韩文 &nbsp;<br>里面有例子 &nbsp;不会用看例子
 
还是不行,郁闷ing,再简单重复我的意思,我得到一个Unciode字符串比如为var widestring str; 现在str的值已经有了,中间有中文韩语的混和表达,(得到的值是正确的,我用 MessageBoxW(Handle,PWideChar(str),'',MB_OK)验证过)我现在怎么样才能<br>正确的拷入剪贴板,然后打开word执行粘贴操作就可以看到正确的表达啊,如果直接用剪贴板类的AsText方法肯定是不行的!!!
 
最近我也遇到了Unicode的问题不过因为没有delphi就先放下了没去研究。<br>看看下面这个网址也许会有帮助<br>http://www.delphi-unicode.net/ &nbsp; &lt;---不错<br>你还可以在Google的Group查找一下。<br>http://www.zeitungsjunge.de/delphi/unicode/<br><br>CIONO1
 
我最近也遇到了有关unicode的问题,也许继承Tnt系列类就可以了
 
向上向上!
 
用TCLIPBORAD类试试
 
天真我最开始都是用的这个啊,你没看清楚呢[:(] 我又用了GlobalAlloc,GlobalLock相关API和剪贴板进行操作,剪贴板数据虽然好像是对的,可word执行paste操作就又变为string乱码而不是widestring字符串了,程序如下: (str是以得到的PWideChar)<br><br>var T: TClipBoard; &nbsp;//这段代码是将str(PwideChar)的值正确写到Clipboard<br>&nbsp; &nbsp; P: Pointer;<br>&nbsp; &nbsp; HH: HWND;<br>&nbsp; &nbsp; Len: integer;<br>begin<br>&nbsp; Len:=Length(WideString(str))*2; &nbsp;// 这样妥否?<br>&nbsp; HH:=GlobalAlloc(GHND,Len); &nbsp; &nbsp; &nbsp;<br>&nbsp; P:=GlobalLock(HH);<br>&nbsp; Move(str^,P^,Len);<br><br>&nbsp; MessageBoxW(Handle,PWideChar(P),'',MB_OK); &nbsp;//检验值是正确的<br>&nbsp; T:=TClipBoard.Create;<br>&nbsp; T.Open;<br>&nbsp; T.SetAsHandle(GS,HH); &nbsp;<br>&nbsp; &nbsp; // &nbsp;GS这里等于CF_TEXT, 没用RegisterClipboardFormat函数返回值是因为如果格式<br>&nbsp; &nbsp; &nbsp; // 不是CF_TEXT,Word不会进行paste操作<br>&nbsp; GlobalUnlock(HH);<br>&nbsp; T.Close;<br>&nbsp; T.Free;<br>end; &nbsp;<br><br>//下面的代码测试也可以正确读出剪贴板的值WideString,可是如果在word执行paste<br>效果就是得到Clipborad.AsText的效果一样了<br><br>var T: TClipBoard;<br>&nbsp; &nbsp; M: Pointer;<br>&nbsp; &nbsp; MM: THandle;<br>begin<br>&nbsp; T:=TClipBoard.Create;<br>&nbsp; T.Open;<br>&nbsp; MM:=T.GetAsHandle(GS); &nbsp;<br>&nbsp; &nbsp;//GS的值同前,如果开始GS=RegisterClipboardFormat(....)这里也可以得到值<br>&nbsp; M:=GlobalLock(MM);<br>&nbsp; MessageBoxW(Handle,PWideChar(M),'',MB_OK);<br>&nbsp; GlobalUnLock(MM);<br>&nbsp; T.Close;<br>&nbsp; T.Free; &nbsp;<br><br>不知道罗嗦这么多大家明白了么,还请大家多多建议!
 
试一下,我测试通过:<br>type<br>&nbsp; TMyClipboard = class(TClipboard);<br>...<br>begin<br>&nbsp; ...<br>&nbsp; TMyClipboard(Clipboard).SetBuffer(CF_UNICODETEXT, str[1], strlen);<br>end
 
谢谢楼上的,看了Delphi源代码,知道错误之处在于Gs!=CF_TEXT,如果是CF_UnicodeText<br><br>就可以了,宽字符串的长度应该<br><br>&nbsp; Len:=Length(WideString(str))*2;<br>&nbsp; HH:=GlobalAlloc(GHND,Len+2);<br>&nbsp; P:=GlobalLock(HH);<br>&nbsp; Move(str^,P^,Len);<br>也谢谢各位热心的兄弟,散分
 
顶部