FreePascal и OpenOffice
Модератор: Модераторы
В своей программе заполняю файл-скрипт spis.vbs для вывода в Open Calc. После закрываю его и вызываю поток, чтобы выполнить его из командной строки:
Process1.Create(nil);
Process1.CommandLine:='spis.vbs';
Process1.Options := Process1.Options + [poWaitOnExit];
Process1.Execute;
Process1.Free;
Из командной строки Windows файл прекрасно запускается и выполняет все требуемые действия. А вот из Лазаруса выдаёт ошибку:
Failed to execute spis.vbs : 193 и не выполняет скрипт.
Lazarus v.0.9.27
fpc 2.3.1
Может где-то нужно расширение прописать, чтоб файл выполнялся?
Process1.Create(nil);
Process1.CommandLine:='spis.vbs';
Process1.Options := Process1.Options + [poWaitOnExit];
Process1.Execute;
Process1.Free;
Из командной строки Windows файл прекрасно запускается и выполняет все требуемые действия. А вот из Лазаруса выдаёт ошибку:
Failed to execute spis.vbs : 193 и не выполняет скрипт.
Lazarus v.0.9.27
fpc 2.3.1
Может где-то нужно расширение прописать, чтоб файл выполнялся?
Process можно использовать для запуска исполняемых файлов. ".exe"
В данном случае файл не исполняемый а скриптовый. Чтобы система сама распознала как нужно запускать скриптовый файл, под винду следует использовать функцию ShellExecute (модуль Windows)
http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
либо через командную строку (ыыы в которой всё работает):
В данном случае файл не исполняемый а скриптовый. Чтобы система сама распознала как нужно запускать скриптовый файл, под винду следует использовать функцию ShellExecute (модуль Windows)
http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
либо через командную строку (ыыы в которой всё работает):
Код: Выделить всё
Process1.Create(nil);
Process1.CommandLine:='cmd spis.vbs';
Process1.Options := Process1.Options + [poWaitOnExit];
Process1.Execute;
Process1.Free;
Спасибо огромное! А то я уже мозг сломала!
Так и думала, что какой-то малости не хватает.
Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.
Код: Выделить всё
Process1.CommandLine:='cmd spis.vbs';
Такая команда запускает только саму командную строку и ждёт ввода. Как передать туда программно имя скрипта?
Nadin писал(а):Код: Выделить всё
Process1.CommandLine:='cmd spis.vbs';
Такая команда запускает только саму командную строку и ждёт ввода. Как передать туда программно имя скрипта?
очень грустно, что cmd не воспринимает параметры командной строки.
тогда забей на использование process. делай так:
Код: Выделить всё
if ShellExecute(0, 'open', 'spis.vbs', nil, SW_SHOW) <= 32 then begin
// не смог запустить скрипт :(
end;
напомню, что ShellExecute описан в модуле Windows, так что добавь Windows в uses секцию.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
скалогрыз писал(а):очень грустно, что cmd не воспринимает параметры командной строки.
Насколько мне память не изменяет - надо так:
Код: Выделить всё
cmd /c bla-bla-bla-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
VB-скрипты выполняются при помощи
Код: Выделить всё
cscript.exe spis.vbsNashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.
Да неплохой модуль, я на его основе сделал небольшую dll (по типу word dll) и использую в лазаре, эх под линукс бы её откомпилить
Спасибо, alexs и Padre_Mortius! И так, и так работает! Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново. Так-то, конечно, проще через OLE обращаться.
Ссылка "Delphi & OpenOffice - Заполним пробел" тоже полезная в плане работы с объектами OO. Я привыкла к ОО обращаться из Basica, так что скрипты делать проще и быстрее.
Ссылка "Delphi & OpenOffice - Заполним пробел" тоже полезная в плане работы с объектами OO. Я привыкла к ОО обращаться из Basica, так что скрипты делать проще и быстрее.
Nadin писал(а):Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново
O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?
скалогрыз писал(а):O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?
Я переделала алгоритм работы с ОО. VBS скрипты - это то же OLE и в Linux-е работать не будут. Поэтому я пишу в текстовый файл, а потом запускаю из командной строки шаблон ОО Calc, в котором подключенный к нему макрос при создании документа заполняет шаблон данными из текстового файла.
В Linux-е есть команда fpexec, которая тоже запускает командную строку. А макросы ОО Calc там тоже должны работать.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Nashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.
Кто-нибудь может этот юнит под Lazarus портрировать?
- WindOfPain
- новенький
- Сообщения: 33
- Зарегистрирован: 01.09.2009 21:18:23
- Откуда: Санкт-Петербург
если кому будет интересно:
http://ifolder.ru/16292010
По работе в свое время писал модуль для Delphi 7 для построения отчетов в Open Office Calc. Вчера, ради интереса, подправил модуль для работы в Lazarus. Конечно, не идеал, но идеологию "допилить напильником" ни кто не отменял)) Модуль использует OLE. Формат файлов xls и xlt(так как нужна была полная совместимость с MS Excel). Прилагается, маленький пример. Ну, и местами, есть комментарии.
Заставил методом "научного тыка" работать колонтитулы:
Вообщем, если будет интересно и возникнут вопросы - спрашивайте.
http://ifolder.ru/16292010
По работе в свое время писал модуль для Delphi 7 для построения отчетов в Open Office Calc. Вчера, ради интереса, подправил модуль для работы в Lazarus. Конечно, не идеал, но идеологию "допилить напильником" ни кто не отменял)) Модуль использует OLE. Формат файлов xls и xlt(так как нужна была полная совместимость с MS Excel). Прилагается, маленький пример. Ну, и местами, есть комментарии.
Заставил методом "научного тыка" работать колонтитулы:
Код: Выделить всё
procedure SetLeftColontitul(top:boolean;s:widestring);
procedure SetRightColontitul(top:boolean;s:widestring);
procedure SetCenterColontitul(top:boolean;s:widestring);
Код: Выделить всё
procedure TOpenCalc.SetCenterColontitul(top: boolean; s: UTF8String);
var
oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
oHeaderText:variant;
d:unicodestring;
begin
oStyleFamilies:=document.getStyleFamilies;
oPageFamilies:=oStyleFamilies.getByName('PageStyles');
sPageStyle:=Sheet.PageStyle;
oPageStyle:=oPageFamilies.getByName(sPageStyle);
oPageStyle.HeaderOn:=true;
oPageStyle.HeaderIsShared:=true;
case top of
true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
end;
oHeaderText:=oHeaderLeft.getCenterText;
d:=utf8decode(s);
oHeaderText.SetString(variant(d));
case top of
true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
end;
oStyleFamilies:=Unassigned;
oPageFamilies:=Unassigned;
sPageStyle:=Unassigned;
oPageStyle:=Unassigned;
oHeaderLeft:=Unassigned;
oHeaderText:=Unassigned;
end;
procedure TOpenCalc.SetLeftColontitul(top: boolean; s: utf8string);
var
oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
oHeaderText:variant;
d:unicodestring;
begin
oStyleFamilies:=document.getStyleFamilies;
oPageFamilies:=oStyleFamilies.getByName('PageStyles');
sPageStyle:=Sheet.PageStyle;
oPageStyle:=oPageFamilies.getByName(sPageStyle);
oPageStyle.HeaderOn:=true;
oPageStyle.HeaderIsShared:=true;
case top of
true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
end;
oHeaderText:=oHeaderLeft.getLeftText;
d:=utf8decode(s);
oHeaderText.SetString(variant(d));
case top of
true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
end;
oStyleFamilies:=Unassigned;
oPageFamilies:=Unassigned;
sPageStyle:=Unassigned;
oPageStyle:=Unassigned;
oHeaderLeft:=Unassigned;
oHeaderText:=Unassigned;
end;
procedure TOpenCalc.SetRightColontitul(top: boolean; s: utf8string);
var
oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
oHeaderText:variant;
d:unicodestring;
begin
oStyleFamilies:=document.getStyleFamilies;
oPageFamilies:=oStyleFamilies.getByName('PageStyles');
sPageStyle:=Sheet.PageStyle;
oPageStyle:=oPageFamilies.getByName(sPageStyle);
oPageStyle.HeaderOn:=true;
oPageStyle.HeaderIsShared:=true;
case top of
true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
end;
oHeaderText:=oHeaderLeft.getRightText;
d:=utf8decode(s);
oHeaderText.SetString(variant(d));
case top of
true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
end;
oStyleFamilies:=Unassigned;
oPageFamilies:=Unassigned;
sPageStyle:=Unassigned;
oPageStyle:=Unassigned;
oHeaderLeft:=Unassigned;
oHeaderText:=Unassigned;
end;
Вообщем, если будет интересно и возникнут вопросы - спрашивайте.
