Как читать / писать локальные символы из / в MSWord 2003, используя Delphi 7? - PullRequest
0 голосов
/ 16 июня 2011

В моей форме есть 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, size и color шрифта, но не могу сделать это с помощью свойства charset.

Любой


Установленное программное обеспечение:

  • Windows XP Professional
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition

1 Ответ

4 голосов
/ 16 июня 2011

Проблема связана с тем, что вы вызываете Word с помощью OLE-автоматизации с использованием позднего связывания.

Так что Range.Text не известен как метод, ожидающий содержимое WideString (Unicode), но простой текст ASCII, под Delphi 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; 

Другой возможностью может быть использование не позднего связывания, а прямое объявление интерфейса OLE Office, импортирование « Microsoft Word ??? Object library » из меню «Проект» в IDE ,

В импортируемых интерфейсах будут самые широкие типы, например:

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.

...