word und borland c++ builder 6 pro



  • hallo,

    vielleicht kann mir jemand helfen, ich habe da ein problem mit dem zugriff auf word. ich möchte ein programm schreiben, daß einen serienbrief in word vervollständigt. das problem ist mit bcb 5 geht das ganze, aber mit dem bcb 6 bekomme ich die fehlermeldung OLE-Error: Typkonflikt. hat jemand eine idee? 😕

    mfg
    andreas



  • HI,

    hellesehen können wir nicht. WIe hast du es denn bisher Versucht. Gib mal Quellcode.



  • Sorry hatte ich vergessen anzuhängen!

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "FormMain.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TfrmMain *frmMain;
    //---------------------------------------------------------------------------
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
    {
    }
    
    //---------------------------------------------------------------------------
    // Initialisierung des Word OLE-Servers
    //---------------------------------------------------------------------------
    bool __fastcall TfrmMain::InitOleServer(Variant &vOLEWord)
    {
      vOLEWord = Unassigned;
      try
      {
        // vielleicht läuft Word ja bereits (wenn nicht, wird hier
        // eine Exception generiert - aber die ist ja behandelt :)
        vOLEWord = GetActiveOleObject("Word.Application");
        return false;
      }
      catch(...)
      {
         try
         {
           // vielleicht läuft Word ja bereits...
           vOLEWord = CreateOleObject("Word.Application");
           return true;
         }
         catch(Exception& e)
         {
            // Wahrscheinlich kein Word auf dem Rechner...
            Application->MessageBox(e.Message.c_str(),"OLE-Error",MB_ICONERROR);
            vOLEWord = Unassigned;
         }
      }
      return true;
    }
    
    //---------------------------------------------------------------------------
    // Beenden des Word OLE-Servers
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::TerminateOleServer(Variant &vOLEWord)
    {
      // Word OLE-Server beenden:
      if(!vOLEWord.IsEmpty())
      {
        vOLEWord.OlePropertyGet("Application").OleProcedure("Quit");
        vOLEWord = Unassigned;
      }
    }
    
    //---------------------------------------------------------------------------
    // Word-Dokument erzeugen, ggf. speichern und/oder drucken
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::CreateDocument(Variant &vOLEWord,
      AnsiString slTemplateFile, AnsiString slSaveFile, bool blPrint)
    {
      try
      {
        // falls Word-Fenster sichtbar sein soll,
        // muss folgende Zeile aktiviert werden:
        // vOLEWord.OlePropertySet("Visible", true);
    
        // Falls die Vorlagen-Datei nicht existiert, schimpfen und beenden:
        if(!FileExists(slTemplateFile))
        {
          Application->MessageBox("Vorlagendatei nicht gefunden !",
            "Abbruch",MB_ICONERROR);
          return;
        }
    
        // Referenz auf die "Documents"-Eigenschaft besorgen
        Variant vDokuments = vOLEWord.OlePropertyGet("Documents");
        // neues Dokument mit slTemplateFile als Dokumentenvorlage erzeugen:
        vDokuments.Exec(Procedure("Add") << slTemplateFile << 0);
    
        //--------------------------------------------------
        // Formular-Felder ausfüllen
        //--------------------------------------------------
    
        // Referenz auf die "Selection"-Eigenschaft besorgen
        Variant vSelection = vOLEWord.OlePropertyGet("Selection");
    
        // Zu Textmarke "Empfaenger" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Empfaenger");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editEmpfaenger->Text.c_str()));
    
        // Zu Textmarke "Anschrift" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Anschrift");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editAnschrift->Text.c_str()));
    
        // Zu Textmarke "PLZ_Ort" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "PLZ_Ort");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editPLZ_Ort->Text.c_str()));
    
        // Zu Textmarke "Betreff" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Betreff");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
         ((Variant)editBetreff->Text.c_str()));
    
        // Zu Textmarke "Anrede" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Anrede");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editAnrede->Text.c_str()));
    
        // Zu Textmarke "Text" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Text");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)memoText->Lines->Text.c_str()));
    
        // Zu Textmarke "Ersteller" gehen:
        vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark <<
           0 << 0 << "Ersteller");
        // den Text aus dem Eingabefeld eintragen:
        vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editErsteller->Text.c_str()));
    
        // ggf. drucken:
        if(blPrint)
          vOLEWord.OlePropertyGet("Application").OleProcedure("PrintOut");
    
        // ggf. speichern:
        Variant vActiveDocument = vOLEWord.OlePropertyGet("ActiveDocument");
        if(slSaveFile != EmptyStr)
          vActiveDocument.Exec(Procedure("SaveAs") << slSaveFile << 0 << 0
            << "" << 1 << "" << 0 << 0 << 0 << 0 << 0 );
    
        // "gespeichert"-Flag in Word setzen, damit keine Nachfragen kommen
        vActiveDocument.OlePropertySet("Saved", true);
    
        // Datei schließen:
        vActiveDocument.Exec(Procedure("Close"));
      }
      catch(Exception& e)
      {
        Application->MessageBox( e.Message.c_str(),"OLE-Error",MB_ICONERROR);
      }
    }
    
    //---------------------------------------------------------------------------
    // Dokument erzeugen und speichern
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::btnCreateAndSaveDocClick(TObject *Sender)
    {
      // OLE-Server initialisieren, die Variable blWordStarted
      // wird auf true gesetzt falls Word nicht bereits aktiv war
      Variant vOLEWord;
      bool blWordStarted = InitOleServer(vOLEWord);
    
      // Falls die Initialisierung des OLE-Servers erfolgreich,
      // Dokument erzeugen und speichern:
      if(!vOLEWord.IsEmpty())
        CreateDocument(vOLEWord, ExtractFilePath(ParamStr(0))+"vorlage.doc",
          ExtractFilePath(ParamStr(0))+"Brief.doc", false);
    
      // Word nur beenden, wenn es von uns zuvor gestartet wurde:
      if(blWordStarted) TerminateOleServer(vOLEWord);
    }
    
    //---------------------------------------------------------------------------
    // Dokument erzeugen und drucken
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::btnCreateAndPrintDocClick(TObject *Sender)
    {
      // OLE-Server initialisieren, die Variable blWordStarted
      // wird auf true gesetzt falls Word nicht bereits aktiv war
      Variant vOLEWord;
      bool blWordStarted = InitOleServer(vOLEWord);
    
      // Falls die Initialisierung des OLE-Servers erfolgreich,
      // Dokument erzeugen und drucken:
      if(!vOLEWord.IsEmpty())
        CreateDocument(vOLEWord, ExtractFilePath(ParamStr(0))+"vorlage.doc",
          EmptyStr, true);
      // Word nur beenden, wenn es von uns zuvor gestartet wurde:
      if(blWordStarted) TerminateOleServer(vOLEWord);
    }
    //---------------------------------------------------------------------------
    

    😕



  • Hi,

    kann zur Zeit nicht compilieren. 🙄

    setzt mal Haltepunkte. So kannst du feststellen wo das Problem liegt.

    Ich schätzte die Fehler entstehen durch das Casten der Werte.

    vSelection.OleProcedure("TypeText",(VARIANT)
          ((Variant)editEmpfaenger->Text.c_str()));
    

    warum hier 2 mal nach Variant casten. Warum überhaupt casten ?

    versuchs mal so:

    vSelection.OleProcedure("TypeText",editEmpfaenger->Text.c_str());
    

    Wenn das nicht weiterhilft so poste mal, wo der Fehler auftritt.

    Andreas



  • Nur sone Idee:
    Beim BCB5 gab es unterschiedliche Komponenten für Office97 (bcb97axserver50.bpl) und Office2000 (bcb92kaxserver50.bpl). Die waren miteinander nicht kompatibel. Vielleicht hast du so ein ähnliches Problem, da es ja in BCB5 funktioniert.



  • Hast Du das WordApplication-Objekt auch auf Deinem Form abgelegt?


Anmelden zum Antworten