Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск и замена текста в колонтитуле

2.0K
11 сентября 2004 года
laifik
37 / / 23.10.2003
Господа, уже кричу о помощи!
Никак не получается замена текста в нижнем колонтитуле документа Ворд. Испробовала все что можно. Представлю три варианта:
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
5.4K
15 сентября 2004 года
SergKO
29 / / 24.02.2004
Вот кусок рабочего кода, м.б. поможет.
Дело в том, что документ разбит на секции, каждая из которых имеет свои колонтитулы.

Код:
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;
}
38K
27 марта 2008 года
serge_ak
1 / / 27.03.2008
Большое спасибо SergKO за разбор полетов, долго мучился и не мог понять как это делается с описания VBA. Но возник еще вопрос, как отредактировать надписи в колонтитулах опрятных в автофигурах (штампах)? Может кто делал?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог