2016-06-29 4 views
1

Abrufen und Schleife durch Story-Bereiche Ich habe ein Code-Snippet, das eine Liste von Hyperlink (Dateiverknüpfungs) -Objekten durchläuft (Mitglieder anchor und destination) und fügt sie in einem ausgewählten Worddokument ein. Ich kann das Word-Dokument durchsuchen und den Hyperlink einfügen, wenn die Zielzeichenfolge (Anker) gefunden wird. Ich möchte nun alle StoryRanges im Word-Dokument durchlaufen, um sicherzustellen, dass keine Abschnitte übersehen wird. Ich kann die Anzahl der Geschichtenbereiche erhalten, z. B. unter Verwendung von WordApplication1->ActiveDocument->StoryRanges->Count. Jedoch kann ich den Parameter nicht in der richtigen Form übergeben, um den Story-Bereich, den ich als nächstes suchen möchte, z.B. WordApplication1->ActiveDocument->StoryRanges->Item. Ich habe eine numerische Zahl, aber Item erwartet als Parameter eine VBA-Konstante mit dem richtigen Typ. Was vermisse ich?Abrufen von Storybereichen aus Word OLE mithilfe von Embarcadero C++ (Builder)

Bearbeiten Hier ist der Code. Die Zeile, die das Problem verursacht, ist

wdFootnotesStoryID = WordApplication1->ActiveDocument->StoryRanges->Item(??????)->get_ID(); 

Ich habe zuvor versucht, Parameter wie Int, OleVariant eingeben. Die Fehlermeldung für OleVariant wurde nicht mit dem erwarteten Parameter übereinstimmen. Ich habe wdFootnotesStory verwendet, um auf die Enumeration zu verweisen, aber diese wurde als nicht definiert angezeigt. Ich habe auch Int-Werte ausprobiert. Hier

ist die OLESafe Enum - definiert in Word_2k.h

enum class WdStoryType 
{ 
    wdMainTextStory = 1, 
    wdFootnotesStory = 2, 
    wdEndnotesStory = 3, 
    wdCommentsStory = 4, 
    wdTextFrameStory = 5, 
    wdEvenPagesHeaderStory = 6, 
    wdPrimaryHeaderStory = 7, 
    wdEvenPagesFooterStory = 8, 
    wdPrimaryFooterStory = 9, 
    wdFirstPageHeaderStory = 10, 
    wdFirstPageFooterStory = 11 
}; 

Hier ist der Hauptcode ist.
// ---------------------------------------------- -----------------------------

#include <vcl.h> 
#pragma hdrstop 

#include "Main.h" 

//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma link "Word_2K_SRVR" 
#pragma resource "*.dfm" 

struct THyperLink 
{ 
    String Anchor; 
    String FilePath; 
}; 

TList* linkList = new TList; 

TForm1 *Form1; 


//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
{ 
    THyperLink* link = new THyperLink; 
    link->Anchor = "ABC.0001.0002.0003"; 
    link->FilePath = "S:\\Development\\WordLinking\\Test\\ABC.0001.0002.0003.pdf"; 
    linkList->Add(link); 

    THyperLink* link2 = new THyperLink; 
    link2->Anchor = "ABC.0001.0002.0004"; 
    link2->FilePath = "S:\\Development\\WordLinking\\Test\\ABC.0001.0002.0004.pdf"; 
    linkList->Add(link2); 
} 

//--------------------------------------------------------------------------- 
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 

    OleVariant Template = EmptyParam(); 
    OleVariant NewTemplate = False; 
    OleVariant ItemIndex = 1; 
    OleVariant strToInsert = "Insert String"; 
    OleVariant endOfLine = "TEST"; 
    OleVariant wdStory = 6; 
    //OleVariant wdMove = 0; 
    OleVariant rng; 

    OleVariant strSearch;// = "ABC.0001.0002.0003"; 
    OleVariant strLink; // = "S:Development\\WordLinking\\Test\\ABC.0001.0002.0003.pdf"; 
    OleVariant lnkDoc = "S:\\Development\\WordLinking\\Test\\ZZZ.0001.0002.0003.docx"; 

    OleVariant wdCharacter = "wdCharacter"; 
    OleVariant cChars = 18; 
    OleVariant wdMove = "wdMove"; 
    OleVariant wdTrue = true; 

    OleVariant wrdStoryRangeCount; 
    OleVariant wdFootnotesStoryID; 
    OleVariant rangeStory; 
    OleVariant wrdDoc; 

    WdStoryType wdFootnotesStory = 2; 


    try 
    { 
     WordApplication1->Connect(); 

    } 
    catch (...) 
    { 
     ShowMessage("Microsoft word is not installed"); 
    } 



    //Make application visible 
    WordApplication1->GetDefaultInterface()->Visible = True; 

    //Open document to be linked 
    WordApplication1->Documents->Open(lnkDoc); 

    //Open new document - add to document collection in application 
    //WordApplication1->Documents->Add(Template, NewTemplate); 

    //go to top of the document 
    WordApplication1->Selection->HomeKey(wdStory); 

    for (int index = 0; index <= linkList->Count-1; index++) 
    { 
     //Retrieve hyperlink object 
     THyperLink* link = reinterpret_cast<THyperLink*>(linkList->Items[index]); 
     strSearch = (OleVariant)link->Anchor; 
     strLink = (OleVariant)link->FilePath; 

     // 
     wrdStoryRangeCount = WordApplication1->ActiveDocument->StoryRanges->Count; 

     //WordApplication1->ActiveDocument->StoryRanges->Item(1); 

     wdFootnotesStoryID = WordApplication1->ActiveDocument->StoryRanges->Item(??????)->get_ID(); 
     ShowMessage ("wdFootnotesStory ID: " + wdFootnotesStoryID); 

     //WordApplication1->ActiveDocument->get_ 

     while (WordApplication1->Selection->Find->Execute(strSearch,Template,Template,Template,Template,Template,wdTrue)) 
     //while (WordApplication1->ActiveDocument->StoryRanges->Item(wdFootnotesStory)->Find->Execute(strSearch,Template,Template,Template,Template,Template,wdTrue)) 
     { 
      WordApplication1->Selection->Hyperlinks->Add(WordApplication1->Selection->Range,strLink,Template,Template,strSearch,Template); 
     } 

     //go back to top of Word document 
     WordApplication1->Selection->HomeKey(wdStory); 
    } 

    //Disconnect from word 
    WordApplication1->Disconnect(); 

} 
//--------------------------------------------------------------------------- 

Lösung: im Zuge der Code des Hinzufügens, ich denke, Ich bin über die Lösung gestolpert - WdStoryType::wdFootnotesStory. Es scheint, dass alles, was mir fehlte, die Klassenqualifikationsreferenz war.

+0

Dies ist nicht Embarcadero-spezifische --- es ist fast so viel Schmerz in VBA! Siehe [dieser MVP Artikel] (http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm). (PS - Willkommen auf der Website!) – cxw

+0

Vielen Dank CXWfür die Antwort und willkommen. Ich habe diesen Artikel und ich schätze, dass es eine Reise sein wird. Ich denke, meine eigentliche Frage atm ist - Wie übergebe ich einen WdStoryType Index-Parameter als Teil des WordApplication1-> ActiveDocument-> StoryRanges-> Item() Aufruf von C++ in Embarcadero. Es ist unglücklich mit einem OleVariant. Ich bin eindeutig nicht vollständig erhalten Parameter in OLE-Aufrufe übergeben. – DMG

+0

Dies ist frühe Bindung und WdStoryType ist eine Enum in Word_2K.h deklariert. Für den Moment möchte ich nur den Wert wdFootnotesStory = 2 übergeben. Ich habe eine Reihe von Variationen mit einem OleVariant-Wrapper versucht, aber es kann nicht funktionieren. Ich bekomme eindeutig nicht, wie Enum-Parameter in OLE-Aufrufe übergeben werden. Prost. – DMG

Antwort

0

Lösung: Im Laufe des Hinzufügens des Codes, ich denke, ich stolperte über die Lösung - WdStoryType :: wdFootnotesStory. Es scheint, dass alles, was mir fehlte, die Klassenqualifikationsreferenz war.

Verwandte Themen