Pregunta

Tengo listView en mi formulario que contiene nombres y números y tengo que proporcionar un documento de impresión de MSWord con los datos completados en las tablas del documento. Todo funciona bien con los personajes ingleses, pero cuando trato de enviar algunos personajes de Europa del Este o de Rusia es visible en el documento como "?" o algo de "basura". También no puedo leer esos personajes de documento de regreso a aplicación.

Mis preguntas son:

  1. Cómo enviar personajes como "ЉЊĐŠŽČ" ¿Documento a Word?
  2. ¿Cómo leer estos personajes de msword de regreso a la aplicación?

En resumen, el código se ve así:

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;

Puedo cambiar de fuente name, size y color propiedades pero no puede hacer eso con charset propiedad.

¿Cualquiera?


Software instalado:

  • Profesional de Windows XP
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition
¿Fue útil?

Solución

El problema proviene del hecho de que está llamando a Word a través de OLE Automation utilizando la vinculación tardía.

Asi que Range.Text no se conoce como un método que espera un contenido de Widestring (unicode), sino texto ASCII simple, bajo Delphi 7.

La primera solución podría ser usar Delphi 2009 y más tarde. El nuevo string Tipo hecho de tal asignación unicode transparente.

Bajo Delphi 7, ¿qué hay de forzar el tipo de lanzamiento a Widestring:

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

o usando una variable temporal, como esta:

 var tmp: WideString; 

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

Otra posibilidad podría ser utilizar no de unión tardía, sino una declaración directa de la interfaz OLE de Office, importando el "Microsoft Word ??? Biblioteca de objetos"Desde el menú" Proyecto "del IDE.

Tendrá tipos de Widestring en las interfaces importadas, por ejemplo:

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;

Por lo tanto, ya no tendrá ningún problema con ANSI Charset.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top