Domanda

Ho ListView sul mio modulo contenente nomi e numeri e devo fornire il documento di stampa MSword con quei dati compilati nelle tabelle del documento. Tutto funziona bene con i personaggi inglesi ma quando provo a inviare alcuni personaggi dell'Europa orientale o russa è visibile nel documento come "?" o qualche "spazzatura". Inoltre, non riesco a leggere quei personaggi dal documento di ritorno all'applicazione.

Le mie domande sono:

  1. Come inviare personaggi come "ЉЊĐŠŽČ" al documento Word?
  2. Come leggere questi personaggi da MSpard all'applicazione?

In breve, il codice sembra così:

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;

Posso cambiare il carattere name, size e color proprietà ma non possono farlo con charset proprietà.

Nessuno?


Software installato:

  • Windows XP Professional
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition
È stato utile?

Soluzione

Il problema deriva dal fatto che stai chiamando Word tramite Ole Automation usando l'associazione tardiva.

Così Range.Text non è noto come un metodo in attesa di un contenuto ampi (Unicode), ma di un semplice testo ASCII, sotto Delphi 7.

La prima soluzione potrebbe essere quella di utilizzare Delphi 2009 e successivamente. Il nuovo string Il tipo ha reso tale assegnazione Unicode trasparente.

Sotto Delphi 7, che ne dici di forzare il tipo di cast a widtring:

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

o usando una variabile temporanea, come questa:

 var tmp: WideString; 

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

Un'altra possibilità potrebbe essere quella di utilizzare non in ritardo, ma la dichiarazione diretta dell'interfaccia Ole di Office, importando il "Microsoft Word ??? Libreria di oggetti"Dal menu" Progetto "dell'IDE.

Avrai tipi larghi nelle interfacce importate, ad esempio:

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;

Quindi non avrai più problemi con ANSI Charset.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top