Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Меняю цвет заголовков и оглавления, но когда в Word нажимаю “обновить оглавление”, цвет сбрасывается

#delphi #delphi_7 #com #ms_word


У меня есть кнопка, при нажатии на которую создаются пара заголовков, а потом, на
их основе создается оглавление. Я меняю цвет заголовков, и меняю цвет оглавления, но
потом, когда в файле Word нажимаю "обновить оглавление", установленный цвет оглавления
сбрасывается. Как сделать так, чтобы цвет оглавления не сбрасывался, а оставался?

procedure TForm1.Button1Click(Sender: TObject);
var
  wrd:OleVariant;
  StartRange, tableOfContentsRange: Variant;
  tableOfContents: Variant;
begin
  wrd:=CoWordApplication.Create;
  wrd.Visible:=true;
  wrd.documents.add(EmptyParam,EmptyParam, EmptyParam,EmptyParam);
  wrd.Selection.Style := 'Заголовок 1';
  wrd.Selection.Font.Color := RGB(255,0,0);
  wrd.Selection.Text:='Первый Заголовок';
  wrd.Selection.MoveDown;
  wrd.Selection.TypeParagraph;
  wrd.Selection.Style := 'Заголовок 1';
  wrd.Selection.Font.Color := RGB(255,0,0);
  wrd.Selection.Text:='Второй заголовок';
  wrd.Selection.MoveDown;
  wrd.Selection.TypeParagraph;

  StartRange := wrd.ActiveDocument.Range(0, 0);
  StartRange.Font.Color:=RGB(0,255,0);
  tableOfContents := wrd.ActiveDocument.TablesOfContents.Add(StartRange);
  tableOfContentsRange := tableOfContents.Range;
  tableOfContentsRange.Collapse;
  tableOfContentsRange.Select;
  wrd.Selection.TypeText('Оглавление' + #13);
  tableOfContents.Update;
end;

    


Ответы

Ответ 1



Все изменения, которые представлены в Вашем коде, применяются непосредственно к тексту. В вашем случае нужно изменять данные непосредственно у стилей, которым предстоит отображать оглавление (поскольку обновление оглавления практически "создает" его заново). Обратите внимание, что стили оглавления и стили основного текста - это разные вещи (хоть и могут ссылаться друг на друга), поэтому изменение одного скорее всего ни коим образом не повлияет на другое. Ниже - переделанный метод с достаточно подробными комментариями: procedure TForm8.btn1Click(Sender: TObject); var wrd, Document: OleVariant; Selection: Variant; tableOfContents: Variant; TOC1Style: OleVariant; begin // общий принцип - при работе с Word и другими приложениями из MS Office, // если какой-либо объект используется более 1 раза, то лучше // завести для него отдельную переменную и работать уже с ней. // иначе конструкции типа // wrd.ActiveDocument.ActiveWindow.Selection.блабла1 // wrd.ActiveDocument.ActiveWindow.Selection.блабла2 // будут приводить к тому, что КАЖДЫЙ раз сперва будет вызываться wrd на предмет получения ActiveDocument, // потом ActiveDocument чтобы получить ActiveWindow ... ну и так далее. // Всё это, получаемое многократно, может замедлить и без того не быструю работу с MS Office. // Помимо прочего это в некоторой степени ограждает от действий пользователя // к примеру, пока работает ваша программа, пользователь может клацнуть по другому документу // соответственно wrd.ActiveDocument будет уже указывать не на нужный нам документ. wrd := CoWordApplication.Create; wrd.Visible := true; Document := wrd.documents.add; Selection := Document.ActiveWindow.Selection; Selection.Style := wdStyleHeading1; // для установки стилей лучше использовать // вот такие встроенные константы. Иначе есть риск напороться на иноязычный // Office, в котором "верхний" стиль будет называться к примеру 'Header 1' Selection.Font.Color := wdColorRed; Selection.Text := 'Первый Заголовок'; Selection.MoveDown; Selection.TypeParagraph; Selection.Style := wdStyleHeading1; Selection.Font.Color := wdColorRed; Selection.Text := 'Второй заголовок'; Selection.MoveDown; Selection.TypeParagraph; // меняем стиль "Оглавление 1". В этом случае также лучше пользоваться константами. TOC1Style := Document.Styles.Item(wdStyleTOC1); TOC1Style.AutomaticallyUpdate := true; TOC1Style.Font.Color := wdColorGreen; // хочу зелененькое :) TOC1Style.Font.Italic := true; TOC1Style.Font.Bold := true; // создаем содержание tableOfContents := Document.TablesOfContents.add( Range := Document.Range(0, 0), RightAlignPageNumbers := true, UseHeadingStyles := true, UpperHeadingLevel := 1, // применяя стили заголовков от 1 (изменен нами) LowerHeadingLevel := 3, // до 3 IncludePageNumbers := true, AddedStyles := '', UseHyperlinks := true, HidePageNumbersInWeb := true, UseOutlineLevels := true); Document.Range(0, 0).Select; Selection.TypeText('Оглавление' + #13#10); Selection.Move(wdStory, 1); tableOfContents.Update; // это излишне, содержание после создания // обновляется автоматически. Вот если бы мы после его создания // изменили основное содержимое, тогда да, обновить содержание не помешает. end;

Комментариев нет:

Отправить комментарий