bool __fastcall TWordVariant::FindHeadersRangeForInsert(AnsiString Simple, AnsiString Replace)
{
Variant Rng;
Variant ReplaceType = 2; //wdReplaceAll;
Variant Section, Footers, Headers, vText;
AnsiString str = "";
Variant Sections = Doc.OlePropertyGet("Sections");
int cnt_sections = Sections.OlePropertyGet("Count");
try
{
for ( number_paragraph = 1; number_paragraph <= cnt_sections; number_paragraph++ )
{
int cnt_headers = 0; //верхний колонтитул
Headers = Sections.OleFunction("Item",number_paragraph).OlePropertyGet("Headers");
cnt_headers = Headers.OlePropertyGet("Count");
for ( int number_header = 1; number_header <= cnt_headers; number_header++ )
{
Rng = Headers.OleFunction("Item",number_header).OlePropertyGet("Range");
vText = Rng.OlePropertyGet("Text");
str = OleStrToString(vText);
if ( str.AnsiPos("#") ) //# - я использую для себя
{
try
{
Rng.OlePropertyGet("Find").OleProcedure
("Execute", StringToOleStr(Simple), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr(Replace), ReplaceType);
}
catch (...) {;}
}
}
//нижний колонтитул
int cnt_footers = 0;
Footers = Sections.OleFunction("Item",number_paragraph).OlePropertyGet("Footers");
cnt_footers = Footers.OlePropertyGet("Count");
for ( int number_footer = 1; number_footer <= cnt_footers; number_footer++ )
{
Rng = Footers.OleFunction("Item",number_footer).OlePropertyGet("Range");
vText = Rng.OlePropertyGet("Text");
str = OleStrToString(vText);
if ( str.AnsiPos("#") ) //# - я использую для собственных целей как признак необходимости замены
{
try {
Rng.OlePropertyGet("Find").OleProcedure
("Execute", StringToOleStr(Simple), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr(Replace), ReplaceType);
}
catch (...) {;}
}
}
}
}
catch (...)
{
Application->MessageBox("Ошибка при изменении колонтитулов документа", "Программа",MB_OK+MB_ICONERROR);
return false;
}
return true;
}
Поиск и замена текста в колонтитуле
Никак не получается замена текста в нижнем колонтитуле документа Ворд. Испробовала все что можно. Представлю три варианта:
1)
//Колонитул - активизация
if(WordApp->ActiveWindow->View->SplitSpecial != wdPaneNone)
WordApp->ActiveWindow->Panes->Item(2)->Close();
if ((WordApp->ActiveWindow->ActivePane->View->Type == wdNormalView)
|| (WordApp->ActiveWindow->ActivePane->View->Type == wdOutlineView))
{
WordApp->ActiveWindow->ActivePane->View->Type = wdPrintView;
}
WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageHeader;
if (WordApp->Selection->HeaderFooter->IsHeader == true)
WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageFooter;
else
WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageHeader;
//Поиск и замена текста
OleVariant oldStr, newStr;
oldStr=AnsiString("Dez-nomer");
newStr=AnsiString("ххххх");
OleVariant EmptyPar=False;
OleVariant Yes=True;
OleVariant Replace = wdReplaceAll;
WordApp->Selection->Find->Execute( oldStr, EmptyPar,
EmptyPar, EmptyPar, EmptyPar, EmptyPar,
Yes, wdFindContinue, EmptyPar, EmptyPar, wdReplaceAll, EmptyPar,
EmptyPar, EmptyPar, newStr, Yes);
Этот код активизирует нижний колонтитул, а поиск и замена не выполняется. Хотя функция Execute() прекрасно работает вне колонтитула.
2) На форумах наткнулась на такое предложение:
WordApp->ActiveDocument->Sections->Item(1)-> Footers->Item(wdHeaderFooterFirstPage)->Range->Find->Execute(oldStr,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
newStr,Yes);
Поиск должен осуществляться сразу в колонтитуле без его активизации. Реакция такая же.
3) Наполовину работает такой код. После активизации колонтитула начинает выполняться код:
OleVariant ReplaceWith=False;
WordApp->Selection->Find->ClearFormatting();
WordApp->Selection->Find->Replacement->ClearFormatting();
WordApp->Selection->Find->Execute(oldStr);
WordApp->Selection->Find->get_Replacement()->set_Text(StringToOleStr(ModulePipes->ADODocum->Fields->Fields[2]->AsString));
WordApp->Selection->Find->Replacement->set_Text(Un);
WordApp->Selection->Find->set_MatchCase(false);
WordApp->Selection->Find->set_MatchWholeWord(false);
WordApp->Selection->Find->set_MatchWildcards(false);
WordApp->Selection->Find->set_MatchSoundsLike(false);
WordApp->Selection->Find->set_MatchAllWordForms(false);
WordApp->Selection->Find->set_Forward(true);
WordApp->Selection->Find->set_Wrap(wdFindContinue);
WordApp->Selection->Find->set_Format(false);
WordApp->Selection->Find->Execute(ReplaceWith);
WordApp->Selection->Find->Execute(Replace);
WordApp->Selection->Find->set_MatchKashida(false);
WordApp->Selection->Find->set_MatchDiacritics(false);
WordApp->Selection->Find->set_MatchAlefHamza(false);
WordApp->Selection->Find->set_MatchControl(false);
Здесь происходит поиск текста и его выделение. Замены почему-то не происходит. Аналогичный код я встретила в Интернете на языке VBA. Участник форума тоже взывал о помощи. Так же, как и я, бился с этим вопросом ни один день. Но ответа не добился.
Может быть кто-нибудь знает работающий код? Еще раз акцентирую внимание: обычная функция Execute() с заданными параметрами прекрасно находит и заменяет текст во всем документе, кроме колонтитула. С ним есть какая-то закавыка, но как ее узнать…
И еще. Если участники форума не могут помочь, есть ли инстанция в интернете, куда можно обратиться, где обязательно помогут
:x
Дело в том, что документ разбит на секции, каждая из которых имеет свои колонтитулы.
Код:
Большое спасибо SergKO за разбор полетов, долго мучился и не мог понять как это делается с описания VBA. Но возник еще вопрос, как отредактировать надписи в колонтитулах опрятных в автофигурах (штампах)? Может кто делал?