Макрос - Вывод на печать документы без логотипа в шапке страницы[РЕШЕНО]

Автор wlad, 17 февраля 2016, 17:17

0 Пользователи и 1 гость просматривают эту тему.

wlad

Sub withoutLogos

Dim vEnum, oShape
vEnum = thisComponent.getDrawPage().createEnumeration()
Do While vEnum.hasMoreElements()
   oShape = vEnum.nextElement()
      If oShape.Name="Shape" Then oShape.Printable=false
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=false
createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(ThisComponent.CurrentController.Frame, ".uno:Print", "", 0, Array()) 
'после печати
oShape.Printable=true
ThisComponent.GraphicObjects.getByName("Grafik").Print=true
End Sub


Так уже пробовал, но почему то на строке oShape.Printable=true выходит ошибка.

JohnSUN

После нахождения нужного Shape и присвоения ему .Printable=false нужно вывалиться из цикла. Иначе Shape будет получать следующее значение пока все MoreElements не закончатся... И что там в нем окажется и как оно заругается на .Printable=true заранее неизвестно
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: wlad от 22 февраля 2016, 16:57Так уже пробовал, но почему то на строке oShape.Printable=true выходит ошибка.
Да, упустил, после нахождения в цикле oShape, нужно выйти из цикла, исправьте в строке:
If oShape.Name="Shape" Then oShape.Printable=false : Exit Do

wlad

Цитата: JohnSUN от 22 февраля 2016, 19:04
После нахождения нужного Shape и присвоения ему .Printable=false нужно вывалиться из цикла. Иначе Shape будет получать следующее значение пока все MoreElements не закончатся... И что там в нем окажется и как оно заругается на .Printable=true заранее неизвестно

Подскажите пожалуйста тогда как можно без операторов - Do While_Loop и If_Then,
Если заранее присвоить имя Shape например.
Вот так пробовал:

Sub PrintWithoutLogos

Dim vEnum, oShape
vEnum = thisComponent.getDrawPage().createEnumeration()
Do While vEnum.hasMoreElements()
   oShape = vEnum.nextElement()
      If oShape.Name="Shape" Then oShape.Printable=false : Exit Do
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=false
createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(ThisComponent.CurrentController.Frame, ".uno:Print", "", 0, Array()) 

oShape.Printable=true
ThisComponent.GraphicObjects.getByName("Grafik").Print=true
End Sub

Выдает ошибку на строке oShape.Printable=true

Вот так работает:

Sub PrintWithoutLogos
Dim vEnum, oShape
vEnum = thisComponent.getDrawPage().createEnumeration()
Do While vEnum.hasMoreElements()
   oShape = vEnum.nextElement()
      If oShape.Name="Shape" Then oShape.Printable=false : Exit Do
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=false
createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(ThisComponent.CurrentController.Frame, ".uno:Print", "", 0, Array()) 
Do While vEnum.hasMoreElements()
   oShape = vEnum.nextElement()
      If oShape.Name="Shape" Then oShape.Printable=true : Exit Do
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=true
End Sub

Но Shape на печать не выводится, то есть значение остается false.

rami

Цитата: wlad от 22 февраля 2016, 17:37Вот так работает:
Второй цикл не нужен. Первый нужен чтобы поймать объект в переменную, как поймали, сразу выходим из цикла, теперь переменная "oShape" до конца макроса будет связана с этим объектом (если не переназначим)

wlad

Спасибо всем за помощь!

Выкладываю рабочий код и тестовый файл с этим кодом

Sub PrintDialog

Dim vEnum, oShape
vEnum = thisComponent.getDrawPage().createEnumeration()
Do While vEnum.hasMoreElements()
  oShape = vEnum.nextElement()
     If oShape.Name="Shape" Then oShape.Printable=false : Exit Do
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=false
createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(ThisComponent.CurrentController.Frame, ".uno:Print", "", 0, Array())  

If oShape.Name="Shape" Then oShape.Printable=true
ThisComponent.GraphicObjects.getByName("Grafik").Print=true
End Sub


Макрос привязан к кнопке "PrintDialog" на панеле инструментов

Всего наилучшего!
wlad

wlad

Цитата: wlad от 23 февраля 2016, 10:46Sub PrintDialog

Dim vEnum, oShape
vEnum = thisComponent.getDrawPage().createEnumeration()
Do While vEnum.hasMoreElements()
   oShape = vEnum.nextElement()
      If oShape.Name="Shape" Then oShape.Printable=false : Exit Do
Loop
ThisComponent.GraphicObjects.getByName("Grafik").Print=false
 createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(ThisComponent.CurrentController.Frame, ".uno:Print", "", 0, Array())  

If oShape.Name="Shape" Then oShape.Printable=true
ThisComponent.GraphicObjects.getByName("Grafik").Print=true
End Sub

Привет всем!
Может кто-нибудь подсказать по регулярным выражением в StarBasic?
Хочу сделать чтобы в коде вместо Grafik, стояло GrafikX где Х - это от 1 до 9
также по анологии и с Shape.
Заранее Спасибо!

С уважением
wlad


JohnSUN

Извини, не понял?.. Зачем для этой задачи такой заумный громоздкий инструмент, как регулярные выражения?
Цифровой индекс от 1 до 9 - это просто переменная коротенького цикла. Так? Например, For ind = 1 To 9

Строковая переменная, которой ты присваиваешь значение выражения "Grafik"+ind внутри этого цикла последовательно примет значения "Grafik1".."Grafik9". Верно?

Останется только убедиться, что такой GraphicObject у тебя есть. Если есть метод .getByName(), то обычно рядом с ним где-то присутствует .hasByName()... Ну, обычно так бывает.

И уж если .hasByName() вернул ИСТИНА, то тут хватаешь этот элемент с помощью .getByName() и делаешь с ним всё что надо...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

wlad

Цитата: JohnSUN от  1 апреля 2016, 13:09
Извини, не понял?.. Зачем для этой задачи такой заумный громоздкий инструмент, как регулярные выражения?
Цифровой индекс от 1 до 9 - это просто переменная коротенького цикла. Так? Например, For ind = 1 To 9

Строковая переменная, которой ты присваиваешь значение выражения "Grafik"+ind внутри этого цикла последовательно примет значения "Grafik1".."Grafik9". Верно?

Останется только убедиться, что такой GraphicObject у тебя есть. Если есть метод .getByName(), то обычно рядом с ним где-то присутствует .hasByName()... Ну, обычно так бывает.

И уж если .hasByName() вернул ИСТИНА, то тут хватаешь этот элемент с помощью .getByName() и делаешь с ним всё что надо...

Спасибо за ответ!
Задумка у меня была изначально усовершенствовать немного макрос, чтобы он искал в документе не один объект Grafik, а несколько Grafik, Grafik1, Grafik2 и т.д до 9.