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

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

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

ForumOOo (бот)

Компонент: Calc
Версия продукта: 3.0
Сборка:
ОС: WinXp

При открытии документа (уже существующего) из Delphi 6 в OpenOffice 3.0.0 файл открывается только для чтения, хотя
параметр readonly=false. Во всех остальных версиях, и ниже и выше, открывается нормально, для записи. В чем может быть
дело? Гугл не знает:(

--
Подпись: Наташа

JohnSUN

Добро пожаловать, Наташа!
Хотелось бы увидеть текст процедуры - вполне может быть, что глюк связан с обычной опиской. Так часто бывает - не видишь очевидную ошибку, пока кому-то не пожалуешься...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Наташа

#2
вот кусок кода
function TOpenOffice.Connect: boolean;
begin
  if VarIsEmpty(StarOffice) then
     StarOffice := CreateOleObject('com.sun.star.ServiceManager');
  Result := not (VarIsEmpty(StarOffice) or VarIsNull(StarOffice));
end;  

function TOpenOffice.OpenDocument(const FileName:string):boolean;
 var
  StarDesktop: Variant;
  Ar: Variant;
 begin
   StarDesktop := StarOffice.createInstance('com.sun.star.frame.Desktop');
 Document := StarDesktop.LoadComponentFromURL(FileName, '_blank', 0,VarArrayCreate([0, -1], varVariant));
  Result := not (VarIsEmpty(Document) or VarIsNull(Document));
  Sheet := Document.getSheets.getByIndex(0);

 end;




вызов:
try
OO := TOpenOffice.Create;
if not OO.Connect then
  begin
    Application.MessageBox('Ошибка вызова OpenOffice.', 'Ошибка', MB_OK);
    Screen.Cursor:=crDefault;
    EXIT;
  end;
if not OO.OpenDocument('file:///'+ExtractFilePath(paramstr(0))+'template\torg16.ods')
 then
  begin
    Application.MessageBox('Ошибка открытия документа.', 'Ошибка', MB_OK);
    OO.Disconnect;
    OO.Free;
    Screen.Cursor:=crDefault;
    EXIT;
  end;
except  on E:exception do begin
 Screen.Cursor:=crDefault;
 MessageDlg('Ошибка вызова '+#13+E.Message, mtError,[mbOk],0);
    OO.Disconnect;
    OO.Free;
 Screen.Cursor:=crDefault;
 EXIT;
end; end;

RFJ

А где задается последний параметр varVariant?
Document := StarDesktop.LoadComponentFromURL(FileName, '_blank', 0,VarArrayCreate([0, -1], varVariant));

Как тут (loadComponentFromURL Method Options):
http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide/StarDesktop

JohnSUN

Да нет... varVariant это просто символическая константа Дельфи ($000C), подтверждает, что массив будет с элементами типа вариант... Просто синтаксис такой... Эта конструкция все-равно что в бэйсике вызвать Array() без параметров, просто пустой массив вариант...

Так-то в коде явных глюков не вижу. Значит, придется копать "ширшее"...

Наташа, будьте добры, еще немного подробнее о проблеме: код отлажен, приложение эту самую Торг-16 формирует и на машине разработчика и на нескольких других, а на чьей-то одной - не может впихнуть данные в шаблон потому что тот открывается readonly? И именно на этой машине установлена 3.3.0?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RFJ

#5
Пусть явно задаст
FileProperties(0).Name = "ReadOnly"
FileProperties(0).Value =-1
(FileProperties(0).Value =False)

JohnSUN

Да есть у меня подозрение, что не в коде собака-то порылась... Тут же всяко бывает: папку шаблонов всем копировали, допустим, с флэшки или почтой кинули, а на одну машину - самую старую и слабую, которую обычно людям предпенсионного возраста спихивают - пришлось с сидюка писать. И при перезаписи шаблонов они и прописались "только для чтения"... Или сетевая папка для всех расшарена полностью, а именно для этого пользователя - зажата по-максимуму, чтоб вирусы на сервак не пихал... Меня немного смутил слэш, а не бэкслэш перед именем шаблона. Но ведь и так работает. В смысле, файл-то находит, открывает неправильно...

Напрашивается обходной путь: переименовать шаблон в ott и работать с создавшимся на его основе новым документом - уж он-то откроется на запись...
Но это лучше оставить на крайний случай, если с причиной глюка разобраться не получится...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Наташа

Код отлажен, работает правильно на всех компьютерах, на которых установлена версия, отличная от 3.0.0. Как только ставлю версию 3.0.0 -файл открывается только для чтения, данные не заносятся.  пробовала задавать в явном виде, все равно только для чтения открывает:
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';
      Ar[VarArrayHighBound(Ar,1)].Value:=false;

Конечно, можно бы просто обновить ОО на всех машинах, и все заработает - но этот вариант не подходит, т.к. компьютеров много и многие удаленные.

RFJ

#8
Смущает последний параметр.
ЦитироватьDocument := StarDesktop.LoadComponentFromURL(FileName, '_blank', 0, VarArrayCreate([0, -1], varVariant));

Можно в процессе отладки Delphi (под отладчиком) при установленной версии ООо 3.0.0 поставить после/перед этой команды точку останова и прочитать значения этого последнего параметра. И посмотреть в каком режиме открылся документ ООо в этот момент.


А в Basic'е на ООо 3.0.0 правильно открывается?

bormant

Боюсь показаться неоригинальным, но если этот документ/шаблон просто в 3.3.0 открыть, он откроется только для чтения или нормально?

Смутно помнится подобный косячок при переходе между версиями OOo -- документы начинали открываться только для чтения в новой, но продолжали нормально открываться в предыдущей версии. А между какими версиями имел место этот казус, точно уже не вспомню. Из-за подобных сюрпризов до сих пор пользую 3.1.1, чего и вам желаю.
Автору на яд. Поддержать форум.

JohnSUN

Цитата: Наташа от  3 ноября 2011, 09:53
Как только ставлю версию 3.0.0 -файл открывается только для чтения, данные не заносятся.
То есть даже для "свежеустановленной" 3.0.0 глюк проявляется? Жаль... Только собрался предложить снести профиль пользователя... Хотя, почему бы не попробовать? Ясен день, что это чистой воды шаманство и пляски с бубном, но по тону Ваших сообщений догадываюсь, что этот затык уже достал по самое некуда, хочется сделать хоть что-нибудь...
Цитата: Наташа от  3 ноября 2011, 09:53
Конечно, можно бы просто обновить ОО на всех машинах, и все заработает - но этот вариант не подходит, т.к. компьютеров много и многие удаленные.
А насколько удаленные? Работают с локальными копиями программы или дотягиваются до общего ресурса? Я к чему клоню: не могла таким образом проявиться "совместная работа с электронной таблицей"? К сожалению, у меня 3.0.0 уже давно нет, а ради эксперимента вытаскивать из архива просто не хочется.

О! Пока набирал текст и обдумывал формулировку "А просто при открытии как Торг-16 себя ведет?", bormant уже и сформулировал  :beer:
(Даже удивительно, почему у нас Клуб Телепатов так вяло работает  ;D )
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RFJ

Цитата: JohnSUN от  3 ноября 2011, 09:39(Даже удивительно, почему у нас Клуб Телепатов так вяло работает)
Да это просто, уж если человек программирует на Delphi, то, казалось бы, такие тривиальные вещи уже должен был проверить.

JohnSUN

Да если бы "просто"... Помнится, я часов шесть бодался с функцией - дата последнего рабочего дня в месяце. Ну, с учетом выходных и праздников... Всё считает правильно, в Result присваивает правильное значение, а после выхода из функции в переменную засылается какое-то дикое значение, которое на дату ну ни разу не похоже... Шесть часов в двух десятках строк кода! Крыша уже съезжала... А переделал функцию в процедуру (вернул результат через параметр) - и всё заработало. И что это было - до сих пор не знаю. Скорее всего, просто чего-то не заметил. Если глаз уже "замылился" - сам ошибку ни за что не найдешь, какой бы тривиальной она ни была
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RFJ

Вообще-то, да. Там могут быть разные варианты.
Например, на всех компьютерах с ООо 3.0.0 глючит, или только на некоторых.
На том компьютере, где собирается дельфийская программа, стоит ООо 3.0.0, или нет, и глючит или нет?
Ну и т.д.

Наташа

Если открывать непосредственно из ОО 3.0.0 (не из программы), файл открывается нормально,для записи.
Подобный глюк на всех компьютерах с ОО 3.0.0. Как только ставлю другую версию -все работает, накладная формируется.
Вот еще интересная деталь: когда задаю параметры в явном виде, и ставлю    Ar[VarArrayHighBound(Ar,1)].Value:=false; то программа выдает ошибку при открытии документа : Variant does not reference an automation object на строчку    Sheet := Document.getSheets.getByIndex(0); (насколько я понимаю, программе не удается открыть файл с параметрами, которые я задаю). Как только ставлю Ar[VarArrayHighBound(Ar,1)].Value:=true; все открывается, но разумеется опять только на чтение. Сношу ОО 3.0.0, ставлю 3.3.0. Тестю и с true, и с false - все отрабатывает правильно и без ошибок.
  function TOpenOffice.OpenDocument(const FileName:string):boolean;
  var
   StarDesktop: Variant;
   Ar: Variant;
  begin
    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';
      Ar[VarArrayHighBound(Ar,1)].Value:=false;
       Document:=StarDesktop.LoadComponentFromURL(FileName,'_blank',0,Ar);

   Result := not (VarIsEmpty(Document) or VarIsNull(Document));
   Sheet := Document.getSheets.getByIndex(0);   

  end;