Announcement

Collapse
No announcement yet.

In MS-Word auf Textmarken zugreifen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • In MS-Word auf Textmarken zugreifen

    Hallo zusammen,

    Könnte mir vielleicht jemand verraten, wie ich aus dem Borland C++ Builder 5.0 Enterprise auf Textmarken in einem Word-Dokument zugreifen kann (den Cursor bei einer Textmarke setzen) und danach hinter dieser Textmarke einen beliebiegen Text einfügen.

    Vielen Dank schon im Voraus.

    Gruss
    DanyS

  • #2
    Es weiß offenbar noch immer niemand was??

    Kann mir nur eine Lösung über DDE vorstellen.

    Über DDE kann das andere Programm gesteuert werden. Ob allerdings Textmarken dazu gehören weiß ich nicht.

    Christia
    Christian

    Comment


    • #3
      Hi,

      ich habe ein kleines Testprogramm geschrieben, welches deinen Anforderungen genügen könnte. (BCB 5 und Word 2000)

      Ich hatte mir ein *.dot-File mit folgendem Inhalt erstellt

      Hallo wie geht es dir heute ?

      Hinter dem 'Hallo ' habe ich eine Textmarke mit der Bezeichnung 'Name' eingefügt.

      Auf meinem Formular habe ich 3 Buttons sowie eine TWordApplikation- und eine TWordDocument - Komponente.

      Und hier das Progrämmchen:

      <pre>
      //---------------------------------------------------------------------------
      void __fastcall TForm1::ConnectButtonClick(TObject *Sender)
      {
      OleVariant templ = StringToOleStr("bcb.dot");

      WordApplication->Connect();
      WordDocument->ConnectTo(WordApplication->Documents->Add(templ));
      }
      //---------------------------------------------------------------------------
      void __fastcall TForm1::ViewButtonClick(TObject *Sender)
      {
      WordApplication->Visible = true;
      }
      //---------------------------------------------------------------------------
      void __fastcall TForm1::ChangeButtonClick(TObject *Sender)
      {
      OleVariant bmName = StringToOleStr("Name");

      WordDocument->Bookmarks->Item(bmName)->Range->Text = StringToOleStr("DanyS");
      }
      //---------------------------------------------------------------------------

      </pre>

      Viel Erfolg

      Heik

      Comment


      • #4
        Vielen Dank Heiko für deine Lösung!!!

        Du hast meine Vordiplomarbeit gerettet. Ich suche eine solche Lösung sicherlich seit ca. 2 Monaten und niemand konnte mir weiter helfen. Ich bin dir für diese Lösung sehr dankbar!!!

        Ich hoffe dass du wieder einmal in dieses Forumthema reinschaust und mir bei meinen zukünftigen Problemen weiterhin hilfst.

        Könntest du mir vielleicht ein Borland-Buch vorschlagen, dass sich mit diesem Thema (Word; Excel; Powerpoint; Access) befasst und in dem erklärt wie man auf die einzelnen Programme zugreift? Wenn ja, meine Email-Adresse währe: [email protected]

        Nochmals vielen Dank

        Dany

        Comment


        • #5
          Hi,

          ich wäre damals (Diplomarbeit mit Borland C++ 4.0 -> nicht C++ Builder) froh gewesen wenn es irgend jemand gegeben hätte, der mir hätte helfen können. Daher habe ich mir gesagt, anderen sollte es nicht unbedingt genauso gehen. Wenn du noch fragen hast, dann stelle sie hier, so haben alle anderen auch noch was davon.

          Als Bücher zu Deinem Thema kann ich dir die Kombination von

          COM/DCOM/COM+ mit Delphi von Andreas Kosch S&S-Verlag und

          Office 2000 Developer Edition vom Markt und Technik verlag empfehlen.

          Die Bücher beziehen sich zwar auf Delphi bzw. VBA, aber ich denke das Wissen kannst du auf den C++Builder transformieren.

          Weiterhin viel Erfolg

          Heik

          Comment


          • #6
            Hallo Heiko,

            Ich möchte die Textmarken von oben nach unten durchlaufen und in einer Switch Case- Abfrage, den Namen Abfragen und dem entsprechen im Case den entsprechenden Text hinter der Textmarke einfügen.

            Hier noch ein VB-Code Verständnis halber:

            dim intBookmark As Integer

            For intBookmark = 1 To dav.gwrdDokument.Bookmarks.Count

            'Dokument wird mit Daten abgefüllt
            '*********************************

            strName = dav.gwrdDokument.Bookmarks(intBookmark).name

            Select Case dav.gwrdDokument.Bookmarks(intBookmark).name
            Case "str1001_TitleSuffix"
            dav.gwrdDokument.Bookmarks("str1001_TitleSuffix"). Select
            Selection.TypeText Text:="Herr"
            Case "str1002_MAILING"
            dav.gwrdDokument.Bookmarks("str1002_MAILING").Sele ct
            Selection.TypeText Text:="Fritz Muster"
            Case usw.
            End Select
            Next intBookmark

            Ich bitte dich mir, wenn's dir nicht ausmacht, ein kleines Beispiel analog dem VB-Beispiel zu schreiben.

            Vielen Dank im Voraus

            Gruss
            Dany

            Comment


            • #7
              Hi,

              eine elegante Lösung wäre, wenn die Textmarken nach ihrem Auftreten im Text sortiert wären, das einfache iterieren über die Liste und der Zugriff mit dem Index. Aber leider sind die Textmarken immer nach dem Namen sortiert, obwohl ich das DefaultSorting auf 'wdSortByLocation' gesetzt hatte.

              Also hier das Programm.

              //---------------------------------------------------------------------------
              void __fastcall TForm1::ChangeButtonClick(TObject *Sender)
              {
              AnsiString name;
              OleVariant bmIndex;

              //WordDocument->Bookmarks->DefaultSorting = wdSortByLocation;
              //WordDocument->Bookmarks->DefaultSorting = wdSortByName;
              for(int i = 1; i <= WordDocument->Bookmarks->Count; i++) {
              bmIndex = OleVariant(i);
              /*
              switch(i) {
              case 1:
              WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Hans");
              break;
              case 2:
              WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Mustermann");
              break;
              }
              */
              name = WordDocument->Bookmarks->Item(bmIndex)->Name;
              if(name == "vorname") {
              WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Hans");
              }
              else if(name == "nachname") {
              WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Mustermann");
              }
              }
              }
              //---------------------------------------------------------------------------

              Ich hatte das DefaultSorting auch in der Vorlage gesetzt, hat aber nichts genutzt. Vielleicht kennt ja einer unserer Mitstreiter hier im Forum eine Lösung dafür. Würde mich auch interessieren.

              Viel Spass,

              Heik

              Comment


              • #8
                Hallo,

                den Sourcecode hier nochmal leserlich (hoffentlich).

                <pre>
                //---------------------------------------------------------------------------
                void __fastcall TForm1::ChangeButtonClick(TObject *Sender)
                {
                AnsiString name;
                OleVariant bmIndex;

                //WordDocument->Bookmarks->DefaultSorting = wdSortByLocation;
                //WordDocument->Bookmarks->DefaultSorting = wdSortByName;
                for(int i = 1; i <= WordDocument->Bookmarks->Count; i++) {
                bmIndex = OleVariant(i);
                /*
                switch(i) {
                case 1:
                WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Heiko");
                break;
                case 2:
                WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Bayer");
                break;
                }
                */
                name = WordDocument->Bookmarks->Item(bmIndex)->Name;
                if(name == "vorname") {
                WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Heiko");
                }
                else if(name == "nachname") {
                WordDocument->Bookmarks->Item(bmIndex)->Range->Text = StringToOleStr("Bayer");
                }
                }
                }
                //---------------------------------------------------------------------------
                </pre>

                Bis dann

                Heik

                Comment


                • #9
                  Vielen Dank Heiko,

                  Ich habe es ausprobiert und es funktioniert wunderbar. Im Moment habe ich es soweit im Griff. Ich werde mich dan wieder in diesem Forumthema melden, wen mir etwas nicht klar ist.

                  Ich hoffe du schaust wieder rein.

                  Vielen Dank nochmals

                  Gruss

                  Dany

                  Comment

                  Working...
                  X