首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Embarcadero C++ (Builder)从Word OLE检索并循环通过故事范围

使用Embarcadero C++ (Builder)从Word OLE检索并循环通过故事范围
EN

Stack Overflow用户
提问于 2016-06-29 15:43:11
回答 1查看 641关注 0票数 1

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

编辑这里是代码。造成问题的原因是

代码语言:javascript
运行
复制
wdFootnotesStoryID = WordApplication1->ActiveDocument->StoryRanges->Item(??????)->get_ID();

我以前尝试输入参数,如int,OleVariant。OleVariant的错误消息与预期的参数不匹配。我使用wdFootnotesStory试图引用枚举,但结果显示没有定义它。我也尝试过Int价值观。

下面是在OLESafe中定义的Word_2k.h枚举

代码语言:javascript
运行
复制
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
};

这是主要代码。

代码语言:javascript
运行
复制
 //---------------------------------------------------------------------------
代码语言:javascript
运行
复制
#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。似乎我所缺少的只是类限定符引用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-01 23:35:53

解决方案:在添加代码的过程中,我想我偶然发现了解决方案-- WdStoryType::wdFootnotesStory。似乎我所缺少的只是类限定符引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38104339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档