0

我的表单上有包含姓名和数字的 ListView,我必须提供打印 MSWord 文档,并将这些数据填充到文档的表格中。英文字符一切正常,但是当我尝试发送一些东欧或俄语字符时,它在文档中显示为“?” 或一些“垃圾”。我也无法将这些字符从文档读回应用程序。

我的问题是:

  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;

我可以更改字体的name,sizecolor属性,但不能用charset属性来做到这一点。

有人吗?


安装的软件:

  • Windows XP 专业版
  • 微软字 2003
  • Delphi 7 企业版
4

1 回答 1

4

问题来自您使用后期绑定通过 OLE 自动化调用 Word 的事实。

因此Range.Text,在 Delphi 7 下,它不被称为期望 WideString (Unicode) 内容的方法,而是纯 ASCII 文本。

第一个解决方案可能是使用 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 ??? Object library ”。

您将在导入的接口中有宽字符串类型,例如:

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 字符集有任何问题了。

于 2011-06-16T14:14:24.900 回答