OLE -- Bitte um Hilfe



  • Hallo zusammen,
    ich möchte von meiner Anwendung aus, einen Text in ein Formular-Textfeld einer Word-Datei schreiben.

    Der Makro-Code sieht folgendermaßen aus:
    ActiveDocument.FormFields("Text1").Result = "das ist der Text"

    Mein C++ - Code lautet:
    my_word = CreateOleObject("Word.Application");
    my_word.OlePropertySet("Visible", 1);
    documents = my_word.OlePropertyGet("Documents");
    documents.OleProcedure("Open", "c:\\test.doc");
    my_doc = my_word.OlePropertyGet("ActiveDocument");
    fields = my_doc.OlePropertyGet("FormFields");
    item = fields.OlePropertyGet("Item", "Text1");

    Jedoch fliege ich in der letzten Zeil mit der Meldung "Ausnahmefehler" raus.
    Kann mir jemand sagen, was ich falsch mache??

    Vorab besten Dank



  • Hast du schonmal probiert statt mit FormFields mit Shapes und darüber mit Item auf die jeweilige Textbox zuzugreifen? (Grammatik 5, setzen *G*)

    fields = my_doc.OlePropertyGet("Shapes");
    item = fields.OlePropertyGet("Item", "Text1");

    Ich hoffe ich meine auch das gleiche Item...



  • Ja, hab ich.
    Geht leider auch nicht. Ich bin hier langsam am Verzweifeln!
    Mit Excel hab ich schon ähnliche Sache gemacht. Da hat alles funktioniert.
    Hab mir immer ein Makro erstellt und das dann in C++ umgesetzt. Ging immer.
    Nur bei dem sch... Word stellt sich alles quer.



  • Hmm.. ich hab mir mal die Objekte angeschaut...

    bei mir sind das Funktionen

    Function Item(Index) As FormField
    Function Item(Index) As Shape

    ... was macht er denn wenn du OleFunction statt OlePropertyGet aufrufst?

    *planlos vorm Code sitz*



  • Ich fass es nicht, so gehts!!!

    TVariant v(static_cast<String>("Text1"));

    my_doc = my_word.OlePropertyGet("ActiveDocument");
    fields = my_doc.OlePropertyGet("FormFields");
    item = fields.OleFunction("Item", &v);
    item.OlePropertySet("Result", "Dieser Text steht drin");

    Ich kann dir nicht sagen, wie lang ich mir da dran schon die Zähne ausgebissen hab. Das mit der Function war der Knackpunkt.

    Also, besten Dank für deine Hilfe.

    mfg Aconda



  • @ Mike:

    Hättest du evtl. noch auf die Schnelle einen Tip, wie man die Kopf / Fußzeilen auf diesem Weg bestücken kann?



  • ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    Selection.TypeText Text:="Kopfzeile1"
    Selection.TypeParagraph
    Selection.TypeText Text:="Kopfzeile2"
    Selection.TypeParagraph
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument

    Naja das is ja nur VBA.. den Weg wie du dahinkommst weisst du ja.
    Die Variablennamen sind ja gleich.
    😃
    *geht jetzt ins Wochenende*



  • Besten Dank.
    Habs aber über einen etwas anderen Weg hinbekommen.
    Dadurch hab ich aber jetzt schon wieder das nächste Problem.

    Das funktioniert nur, wenn das Word-Formular nicht geschützt ist.
    Über das SUB Unprotect lässt sich dieser Schutz aufheben,
    jedoch hab ich keine Ahnung, wie man ein SUB von außen anstoßen kann.

    Hast du da eine Idee?



  • jedoch hab ich keine Ahnung, wie man ein SUB von außen anstoßen kann.

    mit OLE



  • @Jan:
    Dann sag mir mal wie!



  • überreicht Jan den goldenen "Dieses-Posting-war-ziemlich-unnötig"-Pokal

    😉

    Hast du es mal probiert das Ding als Funktion über Ole aufzurufen?
    Ich kenn mich bei VB geschweige den VBA nicht aus.. deswegen weiss ich jetzt nicht was der Unterschied zwischen Function und Sub ist.
    Vielleicht gibts ja garkeinen Unterschied. *g*
    Laut Objektkatalog ist es einfach ein Funktionsaufruf mit einem optionalen Parameter Passwort.

    Viel Glück 🙂



  • Habs über einen einfachen Funktionsaufruf hinbekommen.
    Also: my_document.OleFunction("Unprotect");

    Jedoch müsste das Ganze universell funktionieren, da manche Formulare passwortgeschützt sind und manche nicht.
    Wenn ich zB als Parameter das Passwort mitschicke, obwohl keines vergeben ist oder umgekehrt, flieg ich mit einer OLE-SYS-Fehlermeldung raus, die sich blöderweise nicht mit try - catch abfangen lässt. Warum auch immer.


Anmelden zum Antworten