TWordApplication - zu wenig Arbeitsspeicher



  • Nein, die fehlt der Namespace des Datenmoduls! Deine Form-Unit kennt ja keine WordApplication, sondern dein Datenmodul kennt das!

    // Anstatt
    WordApp->Connect() ;
    
    // nimmst du
    Datenmodul->WordApp->Connect() ;
    


  • kennzeichnet man Namespaces nicht mit "::" ?
    der Namespace meiner Datei "Word_TLB.h" heißt "Word_tlb". Wie deklariere ich nun richtig:

    Word_tlb::WordApplication* Word1 = new Word_tlb::WordApplication(this);
    

    funktioniert leider nicht, auch nicht mit -> statt "::" :(.



  • Nein, ich habe mich mich schlecht/falsch ausgedrückt! Wie heißt dein Datenmodul?

    Der Name des Datenmoduls kommt dann vor die WordApp!

    Edit:
    Also wenn ich audacia richtig verstanden habe, dann erstellst du die WordKomponente mit **new = ...**ja schon im Datenmodul.

    Und auf diese Komponente greifst du dann aus deinem Formular wie oben beschrieben zu!



  • also ich mache folgendes, in der Datei "wordole.cpp":

    //---------------------------------------------------------------------------
    #pragma hdrstop
    #include "wordole.h"
    #include "Word_TLB.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    

    include ich die "Word_TLB.h". Die Header-Datei von "wordole.cpp" include ich in meine Datei "neuerauftrag.cpp".

    Und in der Datei "neuerauftrag.cpp" versuche ich eine Instanz von TWordApplication zu erstellen mit:

    TWordApplication* Word1 = new TWordApplication(this);
    

    allerdings kommt hier der Fehler:

    [BCC32 Fehler] neuerauftrag.cpp(804): E2451 Undefiniertes Symbol 'TWordApplication'
    

    Ein Datenmodull habe ich nicht verwendet, da ich in der Komponenten-Palette keine TWordApplication drin habe, vll kannst du mir sagen wie ich das mache. Habe es mit Komponenten importieren versucht, aber dort erstellt er mir nur die "Word_TLB.h" Datei in mein Projekt rein...



  • Erstelle dir doch deine Wordkomponente in WordOle.cpp, oder geht das nicht?

    // in wordole.cpp
    TWordApplication* Word1 = new TWordApplication(this);
    

    P.s.: Auch an alle anderen: Wo kommt eigentlich die "Word_TLB.h" her? bei mir habe ich die datei gar nicht. ich habe "word_xp_srvr.h"



  • ok, habe es geschafft die Komponente so zu installieren, das ich sie in der Form einfach nur einfügen muss. Trotzdem danke für euer bemühen!



  • Hast du den C++ Builder 2010 ?



  • ja 2010. Die "Word_TLB.h" wird bei mir erstellt, wenn ich "Microsoft Word 12.0 Object Library" auswähle, diese befindet sich im Ordner "/Programme/Office/Office12"



  • Wo finde ich denn diese Library? Kannst du mir vielleicht mal kruz deine Installationsschritte erklären? 🙂



  • Komponente -> Komponente importieren -> Typbibliothek importieren -> dann nach "Word" suchen und ein Treffer wird angezeigt



  • Gerhard22 schrieb:

    audacia schrieb:

    Die richtige Lösung wäre aber, ein Datenmodul oder ein Unit zu erstellen, das Word_TLB.h in der .cpp-Datei (nicht im Header!) einbindet und den Zugriff auf Word kapselt. Im Form-Unit (oder wo auch immer du auf das Word-Dokument zugreifst) benutzt du dann stattdessen das Datenmodul.

    danke so klappt es! Allerdings kommt jetzt die Fehlermeldung:

    [BCC32 Fehler] neuerauftrag.cpp(803): E2451 Undefiniertes Symbol 'TWordApplication'
      Vollständiger Parser-Kontext
        neuerauftrag.cpp(801): Analyse: void _fastcall TForm4::Button11Click(TObject *)
    

    muss ich noch eine Datei includen für die TWordApplication Komponente ?

    Du solltest im Datenmodul eine Kapselung der Word-Schnittstelle erstellen, und den Code, der auf die WordApplication selbst zugreift, ins Datenmodul auslagern. Angenommen, du wolltest eine Adresse ins Word-Dokument einfügen, so könnte das folgendermaßen aussehen:

    // MyWordInterface.h
    
      // Forward-Deklaration
    namespace Word // <-- Tatsächlichen Namespace ggf. in Word_TLB.h nachschauen
    {
      class TWordApplication;
    }
    
    class TMyWordInterface : public TDataModule
    {
        ...
    private:
        TWordApplication* FWordApp;
    public:
        void createDocumentAndAddAddress (String name, String street, String zip, String city);
    };
    
      // MyWordInterface.cpp
    void TMyWordInterface::createDocumentAndAddAddress (String name, String street, String zip, String city)
    {
        // TODO: mit den Methoden von FWordApp ein neues Dokument erstellen und obige Adresse hinzufügen
    }
    
      // Unit4.cpp
    void __fastcall TForm4::Button11Click(TObject *Sender)
    {
        FMyDataModule->createDocumentAndAddress (/* hier Argumente übergeben */);
    }
    

    Das ist ein großer Unterschied zu dem, was Michel vorschlug; sein Vorschlag hat leider nicht das Geringste mit Kapselung zu tun.



  • // Forward-Deklaration 
    namespace Word // <-- Tatsächlichen Namespace ggf. in Word_TLB.h nachschauen 
    { 
      class TWordApplication; 
    }
    

    hier wird also alles eingetragen, was benötigt wird?



  • Gerhard22 schrieb:

    Komponente -> Komponente importieren -> Typbibliothek importieren -> dann nach "Word" suchen und ein Treffer wird angezeigt

    Super! Soll ich das dann als Unit anlegen, als neues Package installieren, in vorhandenes Package installieren ?? Was ist am Besten?

    @audacia:
    Ja tut mir leid, da habe ich dich völlig missverstanden! So ist es auf jeden Fall viel eleganter!!!

    Aber müsste es nicht heißen:

    MyWordInterface->createDocumentAndAddress (/* hier Argumente übergeben */);
    

    ?

    Edit:
    Das geht auch nicht, da man nicht den gleichen Dateinamen und Datenmodulnamen haben kann!



  • MichelM schrieb:

    Aber müsste es nicht heißen:

    MyWordInterface->createDocumentAndAddress (/* hier Argumente übergeben */);
    

    ?

    Idealerweise erstellst du natürlich keine globale Instanz des Datenmoduls, sondern eine zum Formular gehörende Membervariable vom Typ TMyWordInterface*. Globale Variablen sind, kurz gesagt, böse.


Anmelden zum Antworten