#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;
Комментариев нет:
Отправить комментарий