TWordApplication - zu wenig Arbeitsspeicher
-
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.