samedi 19 mars 2016

TWordApplication sur XE5 ou XE8 C++ Builder

Suite à beaucoup de temps perdu à comprendre pourquoi les composants apparaissent sous Delphi et pas sous C++ Builder, dans un environnement de développement XE5 ou XE8 Studio, je tiens à partager ma solution.

Vous ne pouvez pas avoir les composants Office 2000 (2k) ou Office XP, de Delphi ou de C++ en même temps :
https://community.embarcadero.com/answers/packages-unchecked

Il suffit de cocher qu'un seul à la fois.
https://www.youtube.com/watch?v=AP3if58B2Ks

Il existe aussi
c:\Program Files (x86)\Embarcadero\Studio\16.0\bin\dcloffice2010220.bpl
qu'on pourrait ajouter si l'on souhaite avoir certaines fonctionnalités d'office 2010 inexistantes dans les version 2013 ou plus mais ces composants n'existent pas pour C++.

En C++ Builder il faut charger Serveurs Office 2000 ou XP du 2ème groupe de composants :


au lieu du premier groupe :

Voilà.
Cependant, y a des incompatibilités dues au passage à UnicodeString 
voici comment contourner les problèmes

Vous pouvez à nouveau compiler vos anciens programmes de C++ Builder.

Exemple :
http://ideone.com/yLnBZo


void __fastcall TForm2::Button1Click(TObject *Sender)
{
OleVariant Template = EmptyParam();
OleVariant  NewTemplate = False;
OleVariant  ItemIndex = 1;
UnicodeString wstr = L"Calendrier";
 try {
  WordApplication1->Connect();
 } catch (...) {
  Application->MessageBox(L"Word non installé", L"Erreur", MB_OK|MB_ICONSTOP);
 }
 
 WordApplication1->Visible=true;
 WordApplication1->Documents->Add( Template, NewTemplate);      // utilise le template
 
 WordApplication1->Selection->ParagraphFormat->Alignment = WdParagraphAlignment::wdAlignParagraphCenter;
 WordApplication1->Selection->Font->Name=StringToOleStr(UnicodeString("Verdana"));
 WordApplication1->Selection->Font->Size=10;
 
 WordApplication1->Selection->TypeText(StringToOleStr(UnicodeString("Calendrier")));
 WordApplication1->Disconnect();
 }
//---------------------------------------------------------------------------