visual-c++ - component - ole ocx



Rechercher et remplacer dans l'automatisation OLE Word-comment couvrir l'en-tête et le pied de page? (1)

Voici une fonction Delphi qui recherche et remplace dans l'en-tête. Je sais que c'est une question C ++, mais vous pouvez voir à partir des fonctions ce que vous devez faire.

Je trouve toujours que la façon la plus simple de faire quelque chose dans le travail est d'utiliser MacroRecorder et de voir comment le mot le fait, puis d'appeler ce code depuis votre application.

Je plains que tu fasses de la programmation COM en C ++

Procedure Find_ReplaceText(find, ReplaceWith: String; Header : Boolean = false);
var
    tmpText: String;
    spos , epos : Integer;
begin
    {Start on first page.}
    fWordApp.Selection.Goto(wdGoToPage,wdGotoFirst);
    {Extra code is needed if I'm trying to replace text in the header}
    if Header then
    begin
        fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;



        If fWordApp.Selection.HeaderFooter.IsHeader = False Then
        begin
            fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
        end;

        tmpText := fWordApp.ActiveDocument.sections.item(1).Headers.item(wdHeaderFooterPrimary).Range.text;
        spos := pos('[' ,tmptext);
        epos := pos(']' , tmpText);

        tmptext := copy(tmptext,1, spos);
        tmptext := tmptext + ReplaceWith + ']';
        fWordApp.ActiveDocument.sections.item(1).Headers.item(wdHeaderFooterPrimary).Range.text := tmptext;
        fWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
    end
    else
    begin
        fWordApp.Selection.Find.Text := find;
        fWordApp.Selection.Find.Execute;
        fWordApp.Selection.typeText(' ');
        fWordApp.Selection.InsertAfter(ReplaceWith);
    end;

end;

https://ffff65535.com

J'ai une fonction qui fonctionne parfaitement pour trouver et remplacer une variable avec du texte dans les documents Word.

HRESULT CMSWord::FindReplace( CString szVar, CString szText, bool bOnlyOnce/*=false*/ )
{
    if(m_pWApp==NULL || m_pActiveDocument==NULL) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pFind;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"Find", 0);
        pFind=result.pdispVal;
    }
    OLEMethod(DISPATCH_METHOD, NULL, pFind, L"ClearFormatting",0);

    szText.Replace(_T("\r\n"), _T("\v")); 
    COleVariant sVariable(szVar);
    COleVariant sReplaceText(szText);
    COleVariant replace((long)2);
    COleVariant varBoolTrue;
    varBoolTrue.boolVal = true;
    COleVariant varBoolFalse;
    varBoolFalse.boolVal = false;
    COleVariant wdContinue((long)1);
    bool bFound=false;
    IDispatch *pExecute = NULL;
    {
        for(;;) {
            VARIANT result;
            VariantInit(&result);

            if(OLEMethod(DISPATCH_METHOD, &result, pFind, L"Execute", 8, wdContinue, varBoolTrue, varBoolFalse, varBoolFalse, varBoolFalse, varBoolTrue, varBoolFalse, sVariable)==S_OK) {
                pExecute=result.pdispVal;
                if(!pExecute) break;
                bFound = true;
                if(szText.IsEmpty()) DeleteChar(false);         else SetSelectionText(szText);
            }
            else break;
            if(bOnlyOnce) break;
        }
    }
    pDocApp->Release();
    pSelection->Release();
    pFind->Release();
    if(!bFound) return E_FAIL;
    else return S_OK;
}

Le problème est que ce code ne touchera aucun texte dans l'en-tête ou le pied de page.

Peut-être existe-t-il un paramètre pour la méthode d'exécution pFind?

Honnêtement, je regarde ce problème depuis lundi. La plupart de mes résultats de recherche sont la documentation VB, C #, .NET et VBA, mais il y a peu de documentation sur VC ++ OLE, quelques lignes de code, mais rien d'utile. J'ai même commencé à créer et traduire des macros Word, rien ne fonctionne.

Ici, sur Stack Overflow j'ai trouvé beaucoup de questions liées à ce sujet. Certains d'entre eux semblaient prometteurs, mais il semble qu'ils utilisent un cadre que je ne connais pas et les gens n'ont laissé aucune réponse si j'ai demandé un code ou des liens.

Si quelqu'un peut m'aider sur ce sujet ce serait génial et j'apprécierais vraiment les liens vers la documentation et le code sur le sujet général de l'automation OLE Word (en plus de cet article de codeproject).

Merci d'avance!