Question

J'ai ListView sur mon formulaire contenant des noms et des numéros et je dois fournir un document MSWord à imprimer avec ces données remplies dans les tables de Document. Tout fonctionne bien avec les caractères anglais, mais quand j'essaie d'envoyer des personnages d'Europe orientale ou russes, il est visible dans le document comme "?" ou des "poubelles". De plus, je ne peux pas lire ces personnages du document à l'application.

Mes questions sont:

  1. Comment envoyer des personnages comme "ЉЊĐŠŽČ" au document Word?
  2. Comment lire ces personnages de MSWord à l'application?

En bref, le code ressemble à ceci:

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;

Je peux changer de police name, size et color propriétés mais ne peut pas faire ça avec charset propriété.

N'importe qui?


Logiciel installé:

  • Windows XP professionnel
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition
Était-ce utile?

La solution

Le problème vient du fait que vous appelez Word via l'automatisation OLE en utilisant la liaison tardive.

Alors Range.Text n'est pas connu comme une méthode s'attendant à un contenu plus large (Unicode), mais un texte ASCII simple, sous Delphi 7.

La première solution pourrait être d'utiliser Delphi 2009 et plus tard. Le nouveau string Type a rendu une telle affectation Unicode transparente.

Sous Delphi 7, qu'en est-il de forcer le type de distribution au plus large:

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

ou en utilisant une variable temporaire, comme ceci:

 var tmp: WideString; 

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

Une autre possibilité pourrait être d'utiliser non pas la liaison tardive, mais la déclaration directe de l'interface OLE d'office, l'importation du "Microsoft Word ??? Bibliothèque d'objetsDu menu "Project" de l'IDE.

Vous aurez des types les plus larges dans les interfaces importées, par exemple:

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;

Vous n'aurez donc plus aucun problème avec ANSI CARSSET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top