2016-06-29 3 views
1

하이퍼 링크 (파일 링크) 개체 목록 (멤버 anchordestination)을 반복하여 선택한 Word 문서에 삽입하는 코드 조각이 있습니다. 대상 (앵커) 문자열을 찾으면 Word 문서를 검색하고 하이퍼 링크를 삽입 할 수 있습니다. 이제 Word 문서의 모든 StoryRanges을 반복하여 섹션을 놓치지 않도록하고 싶습니다. 스토리 범위의 수는 예를 들어 WordApplication1->ActiveDocument->StoryRanges->Count을 사용하여 얻을 수 있습니다. 그러나 정확한 형식으로 매개 변수를 전달하여 다음 검색하려는 스토리 범위를 실제로 검색 할 수는 없습니다. WordApplication1->ActiveDocument->StoryRanges->Item. 숫자가 있지만 Item은 올바른 유형의 VBA 상수를 매개 변수로 사용합니다. 내가 뭘 놓치고 있니?Embarcadero C++ (작성기)를 사용하여 Word OLE에서 스토리 범위 검색 및 반복

코드는 다음과 같습니다. 문제의 원인이되는 행은 이전에 int, OleVariant로 매개 변수를 입력하려고 시도 했었습니다. OleVariant에 대한 오류 메시지가 예상 한 매개 변수와 일치하지 않습니다. 열거 형을 참조하기 위해 wdFootnotesStory를 사용했지만 정의되지 않은 것으로 나타났습니다. 나는 Int 값도 시도했다. 여기

는 OLESafe 열거입니다 -
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 
}; 

Word_2k.h

에 정의 된 다음의 주요 코드입니다.
// ---------------------------------------------- -----------------------------

#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. 제가 누락 한 것은 클래스 한정어 참조입니다.

+0

이것은 엠바 카데로 관련 사항이 아닙니다. VBA에서 거의 고통 스럽습니다! [이 MVP 기사] (http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm)를 참조하십시오. (추신 - 사이트에 오신 것을 환영합니다!) – cxw

+0

많은 감사와 환영합니다 CXWfor. 나는 그 기사를 가지고 있으며 나는 약간의 여정이 될 것을 감사한다. 내 진짜 질문은 atm 것 같아요 - 엠바 카데로의 C++에서 WordApplication1-> ActiveDocument-> StoryRanges-> Item() 호출의 일부로 WdStoryType 인덱스 매개 변수를 전달하려면 어떻게해야합니까? OleVariant에 만족하지 않습니다. OLE 호출에서 매개 변수를 전달하는 방법을 완전히 알지 못합니다. – DMG

+0

이것은 초기 바인딩이며 WdStoryType은 Word_2K.h에 선언 된 열거 형입니다. 지금은 값 wdFootnotesStory = 2를 전달하려고합니다. OleVariant 래퍼를 사용하여 많은 변형을 시도했지만 작동시키지 못했습니다. OLE 호출에서 enum 매개 변수를 전달하는 방법을 분명히 알지 못합니다. 건배. – DMG

답변

0

솔루션 : 코드를 추가하는 과정에서 솔루션을 발견 한 것 같습니다. - WdStoryType :: wdFootnotesStory. 제가 누락 한 것은 클래스 한정어 참조입니다.