gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:23 25 4
gpt4 key购买 nike

我有一个代码片段,它循环遍历超链接(文件链接)对象(成员 anchordestination)并将它们插入到选定的 Word 文档中。我可以搜索 Word 文档并在找到目标( anchor )字符串时插入超链接。我现在想遍历 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。看来我只缺少类限定符引用。

最佳答案

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

关于c++ - 使用 Embarcadero C++ (Builder) 从 Word OLE 中检索和循环故事范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com