0

我有我的表单上包含名称和数字的ListView,我必须提供打印MSWord文档与这些数据填充到文档的表。一切工作正常与英文字符,但当我尝试发送一些东欧或俄罗斯字符时,它可以在文档中看到“?”或一些“垃圾”。此外,我无法从文档中将这些字符读回应用程序。如何使用Delphi 7从MSWord 2003读取/写入本地字符?

我的问题是:

  1. 如何发送的字符,如"ЉЊĐŠŽČ"到Word文档?
  2. 如何从MSWord中将这些字符读回应用程序?

总之,代码如下:

word := CreateOleObject('Word.Application'); 
word.Visible := true; 
doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc'); 

table := word.ActiveDocument.Tables.Item(1); 
table.Cell(1,2).Range.Text := 'MY TEXT'; 

word.ActiveDocument.Close; 
word.Quit; 
word := UnAssigned; 
doc := UnAssigned; 
table := UnAssigned; 

我可以改变字体的namesizecolor属性,但不能做到这一点与charset财产。

有人吗?安装


软件:

  • Windows XP专业版
  • 的Microsoft Word 2003
  • 德尔福7企业版

回答

4

问题来自于一个事实,即你使用后期绑定通过OLE自动化调用Word。

所以Range.Text不是号称的方法期待一个WideString的(Unicode)的内容,但ASCII纯文本,德尔福在7

首先解决办法是使用Delphi 2009及更高版本。新的string类型使这种Unicode分配变得透明。

在Delphi 7中,什么有关强制类型转换到WideString的:

table.Cell(1,2).Range.Text := WideString('MY TEXT'); 

,或者使用一个临时变量,就像这样:

var tmp: WideString; 

    tmp := 'ЉЊĐŠŽČ' 
    table.Cell(1,2).Range.Text := tmp; 

另一种可能是使用没有后期绑定,而是直接声明Office的OLE接口,从IDE的“项目”菜单中导入“Microsoft Word ???对象库”。

你已经WideString的在导入的接口类型,e.g:

Range = interface(IDispatch) 
    ['{0002095E-0000-0000-C000-000000000046}'] 
    function Get_Text: WideString; safecall; 
    procedure Set_Text(const prop: WideString); safecall; 
    (...) 
    property Text: WideString read Get_Text write Set_Text; 

所以你不会有ANSI任何问题字符集了。

+0

嗯,有趣的,从来没有想过WideString,但...线'tmp:='ЉЊĐŠŽČ';'不能存储在.pas文件(“ЉЊĐ”变成“?”,“ŠŽ”都可以,“Č “变成”C(“),我试过保存。pas文件为UTF-8或Unicode但它不起作用:(谢谢你的努力 – Wh1T3h4Ck5 2011-06-16 17:50:11

+0

关于这样的常量,Delphi 7 IDE只使用当前的系统代码页AFAIK。所以你可能可以输入这样的字符if你的系统当前代码页能够处理这些字符,对于这样的常量,你必须通过#$ 005f#$ 20A1语法等来转换Unicode字符,你最好使用一个包含所有需要的字符串的外部unicode文件,然后在程序启动时加载它。 – 2011-06-17 05:12:24

+0

正是!非常感谢! – Wh1T3h4Ck5 2011-06-18 10:10:11

相关问题