使用 Embarcadero C++ (Builder) 从 Word OLE 中检索和循环故事范围

Retrieve and loop through Story Ranges from Word OLE using Embarcadero C++ (Builder)

我有一个代码片段循环遍历 hyperlink(文件 link)对象(成员 anchordestination)并将它们插入到选定的 Word 文档。我可以搜索 Word 文档并在找到目标(定位)字符串时插入 hyperlink。我现在想遍历 Word 文档中的所有 StoryRanges 以确保没有遗漏任何部分。我可以获得故事范围的数量,例如,使用 WordApplication1->ActiveDocument->StoryRanges->Count。但是,我无法以正确的形式传递参数来实际检索我接下来要搜索的故事范围,例如WordApplication1->ActiveDocument->StoryRanges->Item。我有一个数字计数,但 Item 期望作为参数的 VBA 常量具有正确的类型。我错过了什么?

编辑 这是代码。导致问题的行是

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

我之前尝试将参数键入为 int、OleVariant。 OleVariant 的错误消息与预期的参数不匹配。我使用 wdFootnotesStory 试图引用枚举,但结果是未定义。我也尝试了 Int 值。

这是 OLESafe 枚举 - 在 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
};

这是主要代码。
//-------------------------------------------- --------------------------

#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();

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

解决方案:在添加代码的过程中,我想我偶然发现了解决方案 - WdStoryType::wdFootnotesStory。看来我所缺少的只是 class 限定符参考。

解决方案:在添加代码的过程中,我想我偶然发现了解决方案 - WdStoryType::wdFootnotesStory。看来我只缺少 class 限定符参考。