При открытии документа (уже существующего) из Delphi 6 в Open...

Автор ForumOOo (бот), 1 ноября 2011, 16:14

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

RFJ

Цитата: RFJ от  3 ноября 2011, 10:15
А в Basic'е на ООо 3.0.0 правильно открывается?
А на этот вопрос будет ответ?

То есть, если открывать документ из макроса на Basice в ООо 3.0.0, с заданными параметрами (false/true), он правильно открывается?


RFJ

#16
OOo pro 3.0.0 portable
OOO300m9 (Build:9358)

Такой макрос работает безупречно.
Sub Main2
Dim Doc As Object
Dim FileProperties(0) As New com.sun.star.beans.PropertyValue
Dim Url As String

Url = "file:///C:/001/61.ods"

FileProperties(0).Name = "ReadOnly"
FileProperties(0).Value =false
'FileProperties(0).Value =true

Document = StarDesktop.loadComponentFromURL(Url, "_blank", 0, FileProperties())

Sheet= Document.getSheets.getByIndex(0)

MsgBox Sheet.Name

End Sub


JohnSUN

Ну, пока вижу три варианта обхода ошибки.

1. Как уже предлагал, переименовать заготовку накладной из odt в ott. Тогда при обычном открытии без параметров, офис будет создавать новый документ на основе этого шаблона. И, по идее, обязан открывать его на запись...
2. Проверять версию офиса перед формированием накладной (или прямо при запуске программы) и требовать обновить офис. Например, как-то так:

function OOOVersion: string;
var sProvider, sAccess: string;
var oConfigProvider, oSet, oParm: Variant;
begin
  sProvider := 'com.sun.star.configuration.ConfigurationProvider';
  sAccess := 'com.sun.star.configuration.ConfigurationAccess';
  oConfigProvider := createUnoService(sProvider);
  oParm := CreateProperties(['nodepath', '/org.openoffice.Setup/Product']);
  oSet := oConfigProvider.createInstanceWithArguments(sAccess, oParm);
  Result := oSet.getByName('ooSetupVersion');
end;

и перед открытием torg16 что-то вроде
...
  ConnectOpenOffice;
  if OOOVersion() = '3.3' then
  begin
    MessageDlg('Документ не может быть сформирован в этой версии офиса', mtError, [mbAbort], 0);
    Exit;
  end;
...

3. Можно воспользоваться подходом, который использовался в Ананасе: шаблон разархивируется во временную папку, все необходимые действия выполняются прямо с content.xml, а затем пользователю предъявляется уже готовый документ со всеми подставленными значениями... Но это, пожалуй, самый сложный из вариантов.

Кстати, Наташа, обратите внимание на синтаксис во втором варианте. Это последствия использования Delphi_OOo_v12en.zip. Очень рекомендую! Ваш код сразу почистится от ненужных уже     StarDesktop := StarOffice.createInstance('com.sun.star.frame.Desktop');
конструкции вида
    Ar:=VarArrayCreate([0,-1],varVariant);
    VarArrayRedim(Ar,VarArrayHighBound(Ar,1)+1);
    Ar[VarArrayHighBound(Ar,1)]:=StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
    Ar[VarArrayHighBound(Ar,1)].Name:='ReadOnly';...

заменятся простыми
  oParm := CreateProperties(['ReadOnly',True]);
а "пустой массив" даже создавать не надо, просто пишете dummyArray и всё. В общем, хорошие модули написал Bernard Marcelly.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Наташа

Цитата: RFJ от  7 ноября 2011, 12:40Такой макрос работает безупречно.
у меня выдает ошибку basic runtime error. object variable not set на строчку
Document = StarDesktop.loadComponentFromURL(Url, "_blank", 0, FileProperties(0))


JohnSUN, спасибо вам за советы, обязательно попробую)


RFJ

Цитата: Наташа от  7 ноября 2011, 23:12
у меня выдает ошибку basic runtime error. object variable not set на строчку
Document = StarDesktop.loadComponentFromURL(Url, "_blank", 0, FileProperties(0))

Этого не должно быть!

"У вас какой-то неправильный... ООо 3.0.0" (из мультфильма)

JohnSUN

Почему не должно? Всё правильно. Ведь последним параметром передается не массив FileProperties(), а первый (то бишь - нулевой) его элемент FileProperties(0)...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RFJ

Цитата: JohnSUN от  8 ноября 2011, 10:14
Почему не должно? Всё правильно. Ведь последним параметром передается не массив FileProperties(), а первый (то бишь - нулевой) его элемент FileProperties(0)...
Точно, не заметил ошибку у Наташи.
Должно быть FileProperties(), как у меня.
А у нее FileProperties(0), и это выдает ошибку.

Наташа

#22
исправила ошибку в макросе, заработал... странно как-то получается... почему же не работает из программы, там же по сути тоже самое пишу.

Сохранила файл в формат ots, новый документ формируется на запись. Как вариант, пока так, наверно, оставлю. Но до истины докопаться все равно хочется, почему не открывается на запись в формате ods.

JohnSUN

Цитата: Наташа от 14 ноября 2011, 10:46исправила ошибку в макросе, заработал... странно как-то получается... почему же не работает из программы, там же по сути тоже самое пишу.
Как утверждал один очень грамотный специалист - "Электроника штука тёмная... Но чудес в ней не бывает"
Цитата: Наташа от 14 ноября 2011, 10:46Сохранила файл в формат ots, новый документ формируется на запись. Как вариант, пока так, наверно, оставлю.
Это, между прочим, далеко не худший вариант. Шаблон, получается, постоянно защищен от зловредного влияния "продвинутых пользователей" - сформированный документ правьте как хотите, а следующий все-равно сформируется так, как задумано. Читай - "как положено"
Цитата: Наташа от 14 ноября 2011, 10:46Но до истины докопаться все равно хочется, почему не открывается на запись в формате ods.
А может, да ну его? Заработало и ладно... А через три-четыре месяца этот глюк и вообще забудется в связи с постепенным обновлением офисов на местах...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

neft

Вряд ли забудется.
Такого "динозавра" как OOo 3.0.0 ещё поискать надо.
С каких же это пор он не обновлялся?

Рыбка Рио

Цитата: Наташа от 14 ноября 2011, 09:46Сохранила файл в формат ots, новый документ формируется на запись.
Можно наверное и ods открывать как шаблон, нужно задать такие параметры открытия файла:
FileProperties(0).Name = "AsTemplate"
FileProperties(0).Value =true
ubuntu 12.04 + LibO3.6.0