Ошибка выполнения скрипта в разных OS

Автор spyAndrey, 26 октября 2016, 20:00

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

spyAndrey

Пробую запускать макрос в windows, libreoffice 5.2.2.2
работает без вопросов.

Если пытаюсь запускать Ubuntu, версия офиса та же, выдаёт ошибку:

Ошибка времени выполнения BASIC.
Свойство или метод не найдены: drawPages.

в вот этой строке:

PageD = Doc.drawPages(0)

Пробовал в другой версии LO 5.1.6.2
Ошибка та же.

я до сих пор въехать в работу с UNO не  могу, а тут такая хрень...
Хорошо хоть в двух ОС работаю и проверил работу макроса в винде, а то сижу... проверяю-перепроверяю, может не правильно написал...
Хотя есть сомнения, что у меня правильно написано, или в работе под Linux есть какие-то, нюансы ??? в общем много разных мыслей (и слов :)) в голову лезет

могу выложить полный файл

JohnSUN

Файл, конечно, штука хорошая - прикладывай, посмотрим...
А вообще-то вопрос по самой процедуре запуска - как запускаешь? Самое важное - из какого окна? Из Basic IDE, с листа Calc'a или - всяко может быть! - из Writer? Или речь идет о презентации или о картинке?..
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

spyAndrey

из базы данных, а создаю рисунок Draw.
Вот начитываясь, я уже тоже понял, что всё зависит "в каком состоянии всё находится", но вот понять как "найти нужный документ" пока понять не могу
а файл вот:

spyAndrey

Форму я вообще сначала на листе в Draw рисовал, но потом решил перенести к базам, и началось... :)

JohnSUN

Сейчас уже время позднее, башка варит не очень... Так что, может быть, сейчас ткну пальцем в небо.
Под WIndows отрабатывает действительно без замечаний.
Вызывает смутные подозрения вот эта комбинация:
Doc = StarDesktop.CurrentComponent
PageD = Doc.drawPages(0)
В зависимости от того, какой документ StarDesktop посчитает на данный момент текущим, зависит где ты будешь искать эти самые drawPages. И фишка в том, что у документа Writer эта drawPage всего одна. Поэтому и методом getDrawPages его не обеспечили. А форма, в которой ты кнопку нажал и есть документ Writer.
Если StarDesktop при создании  LoadEmptyDocument("sdraw") успел на этот новый draw-документ переключить внимание, все будет в порядке. А иначе код макроса продолжает выполняться, а .CurrentComponent все еще текущая форма.
Попробуй в LoadEmptyDocument() перед самым выходом из процедуры поставить Wait() секунд на 10, чтобы наверняка... Если ошибка перестанет появляться, значит Ubuntu слишком медленно создает новый компонент, придется пройтись по всему коду и поисправлять все Doc = StarDesktop.CurrentComponent на использование Doc, полученного параметром функции/процедуры.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

spyAndrey

Спасибо, попробую отпишусь
У Питоньяка всё как то "разлито" по нескольким книгам и страницам (во всяком у меня такое впечатление сложилось), по идее можно же создать функцию поиска страницы с конкретным именем, что то похожее применяется у него всюду...

rami

Цитата: JohnSUN от 26 октября 2016, 19:28Если StarDesktop при создании  LoadEmptyDocument("sdraw") успел на этот новый draw-документ переключить внимание, все будет в порядке.
Там всего, как я понимаю два документа, — форма и новый рисунок Draw, нужно использовать две переменные, например, fDoc — форма и dDoc — рисунок, тогда не надо будет искать текущий компонент.

spyAndrey

самое интересное, что:
wait 1000
помогло!

spyAndrey

Цитата: rami от 26 октября 2016, 19:46нужно использовать две переменные, например, fDoc — форма и dDoc — рисунок, тогда не надо будет искать текущий компонент.
вот с этого места поподробнее, т.е., для формы это будет:
oForm = oEvent.Source.getModel().getParent() ' от источника события
или
Form2 = ThisComponent.Drawpage.Forms.getByName("fNalichnikt") ' форма содержит тип наличника
а для рисунка:
dDoc = вот тут помогите

Yakov

Использовать

Doc = StarDesktop.CurrentComponent

не рекомендуется.
Вместо этого следует использовать

Doc = ThisComponent

https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Documents

rami

Цитата: spyAndrey от 26 октября 2016, 22:20
Цитата: rami от 26 октября 2016, 19:46нужно использовать две переменные, например, fDoc — форма и dDoc — рисунок, тогда не надо будет искать текущий компонент.
вот с этого места поподробнее, т.е., для формы это будет:
oForm = oEvent.Source.getModel().getParent() ' от источника события
или
Form2 = ThisComponent.Drawpage.Forms.getByName("fNalichnikt") ' форма содержит тип наличника
Я имел в виду документ с формами и кнопкой "Нарисовать", — этот документ — ThisComponent или:
fDoc=ThisComponent

Цитата: spyAndrey от 26 октября 2016, 22:20
а для рисунка:
dDoc = вот тут помогите
Переменную рисованного документа oDrawDoc вы определяете в строке 433, но не используете. Если эту переменную определить вне процедуры, то она будет видна во всех макросах. Строку 283:
Dim oDrawDoc  'Temporary draw document.
перенесите из макроса наружу.

spyAndrey

Закрепим, что удалось понять:
ThisComponent - после запуска будет указывать на документ Write в котором находится форма, и меняться он не будет, даже после того как я создал документ Draw.

Dim oDrawDoc - я ставлю первой строкой в макросе, после создания рисунка:

oDrawDoc = LoadEmptyDocument("sdraw")

он будет хранить информацию об этом объекте, и из любого места я его смогу достать, и добавить на рисунок что нужно...

хорошо, попробую

spyAndrey

сработало, в Windows, но правда объявлять надо:
Public oDrawDoc

вечером запущу в Ubuntu, отпишусь

rami

Цитата: spyAndrey от 27 октября 2016, 13:09
Закрепим, что удалось понять:
ThisComponent - после запуска будет указывать на документ Write в котором находится форма, и меняться он не будет, даже после того как я создал документ Draw.
Открепим и закрепим по новой ;D : ThisComponent — это документ в котором записан или запущен макрос (в нашем случае макрос записан в базе, но запускается из формы этой базы)

Цитата: spyAndrey от 27 октября 2016, 13:09
Dim oDrawDoc - я ставлю первой строкой в макросе, после создания рисунка:

oDrawDoc = LoadEmptyDocument("sdraw")
Не первой строкой, а вообще за пределами любого макроса, см. снимок Разные переменные.png
Переменные Page и PageD будут доступны только в макросе Main, а oDrawDoc в любом макросе.

spyAndrey

Цитата: rami от 27 октября 2016, 12:10Открепим и закрепим по новой  : ThisComponent — это документ в котором записан или запущен макрос (в нашем случае макрос записан в базе, но запускается из формы этой базы)
Но, при этом форма лежит на документе Write, если к ней из макроса обращаться? и иконка такая и методы...