Работа с uOpenOffice
Модератор: Модераторы
Создаваемый файл теперь всегда имеет название doc.odt и открывается программой по умолчанию.
Патч:
Патч:
Код: Выделить всё
*** odfproc.pas 2011-11-09 21:39:08.522435327 +0300
--- odfproc.pas.1 2011-11-09 21:33:21.000000000 +0300
***************
*** 482,492 ****
exe_path:=ExtractFilePath(Application.ExeName);
{$IFDEF Linux}
! templ_path:=exe_path+'template/';
! GenerateDocument(templ_path,'doc','');
try
Proc:=TProcess.Create(nil);
! Proc.CommandLine:='ooffice -writer '+templ_path+'doc.odt';
Proc.Options:=[poWaitOnExit];
Proc.ShowWindow:=swoShowMaximized;
Proc.Execute;
--- 482,492 ----
exe_path:=ExtractFilePath(Application.ExeName);
{$IFDEF Linux}
! templ_path:=exe_path+'temp/';
! GenerateDocument(templ_path,'doc.odt','');
try
Proc:=TProcess.Create(nil);
! Proc.CommandLine:='xdg-open '+templ_path+'doc.odt';
Proc.Options:=[poWaitOnExit];
Proc.ShowWindow:=swoShowMaximized;
Proc.Execute;
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
volodya25, спасибо за участие, изменения внесены.
новая ревизия файла доступна тут
если есть желание могу добавить вас как разработчика проекта на SF - сможете сами вносить изменения.
для добавления нужен ваш логин на SF.
новая ревизия файла доступна тут
если есть желание могу добавить вас как разработчика проекта на SF - сможете сами вносить изменения.
для добавления нужен ваш логин на SF.
Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
v-t-l писал(а):Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!
Спасибо, добавлено как задание по оптимизации на SF! Рассмотрим!
leo_bsv писал(а):v-t-l писал(а):Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!
Спасибо, добавлено как задание по оптимизации на SF! Рассмотрим!
Всем доброго! Во-первых, еще раз большое спасибо всем за модуль - пользую, не нарадуюсь.
Под себя доработал процедуру ShowDocument для именования выходного файла и указания path для запуска writer (или swriter) - так, на мой взгляд, дешевле, чем использовать программу по умолчанию.
Собственно доработка
Код: Выделить всё
procedure TOdt.ShowDocument(n_path,name_doc:String);//жесткий путь запуска и имя док-та
var exe_path, templ_path, sh: string; //если n_path='' или name_doc='' то запуск или имя по умолчанию
f_name: string = 'doc.odt';
Proc: TProcess;
begin
exe_path:=ExtractFilePath(Application.ExeName);
{$IFDEF Linux}
templ_path:=IncludeTrailingPathDelimiter(exe_path+'temp');
if Trim(name_doc)<>'' then f_name:=name_doc+'.odt';
GenerateDocument(templ_path,f_name,'');
try
Proc:=TProcess.Create(nil);
if Trim(n_path)<>'' then
Proc.CommandLine:=Trim(n_path)+' '+templ_path+f_name
else
Proc.CommandLine:='xdg-open '+templ_path+f_name;
Proc.Options:=[poWaitOnExit];
Proc.ShowWindow:=swoShowMaximized;
Proc.Execute;
finally
sleep(2000);//пару сек ждем - иногда приложение по умолчанию не успевает запуститься
if Proc.WaitOnExit then begin
Proc.CommandLine:='rm '+templ_path+' -r';
Proc.Execute;
Proc.Free;
end;
end;
{$ENDIF}
end;
Последний раз редактировалось Владимир 13.12.2011 15:05:45, всего редактировалось 2 раза.
leo_bsv писал(а):volodya25, спасибо за участие, изменения внесены.
Доброго! У меня не работает вызов Table.AppendRow('Standard'); - ругань на Integer
Код: Выделить всё
procedure TOdtTable.AppendRow(TextStyle: string);
var Root, Node: TDOMNode;
i:integer;
begin
Node:=FDocument.CreateElement('table:table-row');
Root:=RootNode.AppendChild(Node);//Root = table:table-row
for i:=1 to Cols do
begin
Node:=FDocument.CreateElement('table:table-cell');
TDOMElement(Node).SetAttribute('table:style-name',DefoultCellStyle);
TDOMElement(Node).SetAttribute('office:value-type','string');
Root:=Root.AppendChild(Node);//root = table:table-cell
Node:=FDocument.CreateElement('text:p');
if length(TextStyle)>0 then
TDOMElement(Node).SetAttribute('text:style-name',TextStyle)
else
TDOMElement(Node).SetAttribute('text:style-name',DefTextStyle);
Root.AppendChild(Node);
Root:=Root.ParentNode;//Root = table:table-row
end;
end; Похоже, Cols не определена. Также не работает Table.AppendColumn('Standard');
Или я чего не понимаю?
Далее (пробую роль тестера)
Table.RemoveRow; - работает
Table.MultiplyRow(1,1);- работает
Table.Cell[0,2]:='bla-bla';- работает
Чтение Table.Rows;- работает
Чтение Table.Cols;- не работает
Table.RemoveEmptyRow('bla-bla');- не работает (вешает все)
Пока все.
ps. В целом все неплохо, работать можно.
Приложил код доработанной процедуры ShowDocument к своему сообщению от 08.12
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Владимир писал(а):Table.RemoveEmptyRow('bla-bla');- не работает (вешает все)
Да, процедура не доделана, у меня пока не хватает времени... ваши замечания зафиксированы здесь
Спасибо за активнось. Как появится возможность - изменения будут внесены.
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Владимир писал(а):Приложил код доработанной процедуры ShowDocument к своему сообщению от 08.12
ShowDocument сделана перегружаемой, теперь может запускаться как с параметрами, так и без, если не сложно - проведите тестирование.
Файл можно скачать по этой ссылке
ShowDocument сделана перегружаемой, теперь может запускаться как с параметрами, так и без, если не сложно - проведите тестирование.
Не сложно. Запуск без параметров ('','') валит все. Если указывать пробелы, то:
Код: Выделить всё
ODT:=TOdt.Create;
ODT.LoadTemplate('/arch/shop/template/cennik.odt');
ODT.ShowDocument(' ',' ');//ошибка чтения /temp
// ODT.ShowDocument(' ','ddd.odt');//нет запуска по умолчанию
//ODT.ShowDocument('/opt/openoffice.org3/program/swriter','ddd.odt');//работает
//ODT.ShowDocument('/opt/openoffice.org3/program/swriter',' ');//открывает док и валится
Odt.Destroy; Не очень понятно - а зачем перегрузка функции? С точки зрения вызова с параметрами/без и "правильности" - ну, может быть... Зачем усложнять то, что работает и - с непредсказуемым результатом?
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
как-бы для обратной совместимости... у меня например эта функция использовалась без параметров, и изменять лишний раз работающий код не охота 
а если в Ваших примерах в параметрах поставить вместо пробелов пустые строки? Т.е. все проверки корректности параметров производить не внутри процедуры а перед её вызовом?
а если в Ваших примерах в параметрах поставить вместо пробелов пустые строки? Т.е. все проверки корректности параметров производить не внутри процедуры а перед её вызовом?
Понятно. Однако не с того начали - вызов процедуры без параметров даже не компилится - требует параметры.
Что-то не так с overload или я чего не понимаю. Идея доработки в том, чтобы вызывать процедуру как с, так и без параметров?.
Замена пробелов на пустые строки:
Что-то не так с overload или я чего не понимаю. Идея доработки в том, чтобы вызывать процедуру как с, так и без параметров?.
Замена пробелов на пустые строки:
Код: Выделить всё
str_0,str_1:String;
begin
str_0:=' '; str_1:=' ';
ODT:=TOdt.Create;
ODT.LoadTemplate('/arch/shop/template/cennik.odt');
//ODT.ShowDocument; //ERROR
// ODT.ShowDocument(str_0,str_1);//ничего не происходит
//ODT.ShowDocument(str_0,'ddd.odt');/ничего не происходит
//ODT.ShowDocument('/opt/openoffice.org3/program/swriter','ddd.odt');//работает
//ODT.ShowDocument('/opt/openoffice.org3/program/swriter',str_0);//открывает док и валится
Odt.Destroy; - leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Ошибка, связанная с перезагрузкой функции устранена - в данном случае не нужна была перезагрузка, достаточно просто параметров по-умолчанию.
Скорректированный модуль здесь
Пишите ваши наблюдения и мысли. Бум допиливать.
Скорректированный модуль здесь
Пишите ваши наблюдения и мысли. Бум допиливать.
