Страница 3 из 3

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 10:50:54
Nadin
В своей программе заполняю файл-скрипт 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

Может где-то нужно расширение прописать, чтоб файл выполнялся?

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 11:14:46
скалогрыз
Process можно использовать для запуска исполняемых файлов. ".exe"

В данном случае файл не исполняемый а скриптовый. Чтобы система сама распознала как нужно запускать скриптовый файл, под винду следует использовать функцию 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;

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 11:43:10
Nadin
Спасибо огромное! А то я уже мозг сломала! :) Так и думала, что какой-то малости не хватает.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 12:14:52
Nashev
Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 12:33:31
Nadin
Код: Выделить всё
  Process1.CommandLine:='cmd spis.vbs';

Такая команда запускает только саму командную строку и ждёт ввода. Как передать туда программно имя скрипта?

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 13:33:19
скалогрыз
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 секцию.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 19:47:11
alexs
скалогрыз писал(а):очень грустно, что cmd не воспринимает параметры командной строки.

Насколько мне память не изменяет - надо так:
Код: Выделить всё
cmd /c bla-bla-bla

Re: FreePascal и OpenOffice

СообщениеДобавлено: 03.08.2009 21:40:28
Padre_Mortius
VB-скрипты выполняются при помощи
Код: Выделить всё
cscript.exe spis.vbs

Re: FreePascal и OpenOffice

СообщениеДобавлено: 04.08.2009 06:10:29
Andrew
Nashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.

Да неплохой модуль, я на его основе сделал небольшую dll (по типу word dll) и использую в лазаре, эх под линукс бы её откомпилить

Re: FreePascal и OpenOffice

СообщениеДобавлено: 04.08.2009 13:00:40
Nadin
Спасибо, alexs и Padre_Mortius! И так, и так работает! Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново. Так-то, конечно, проще через OLE обращаться.
Ссылка "Delphi & OpenOffice - Заполним пробел" тоже полезная в плане работы с объектами OO. Я привыкла к ОО обращаться из Basica, так что скрипты делать проще и быстрее.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 04.08.2009 13:16:24
скалогрыз
Nadin писал(а):Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново

O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?

Re: FreePascal и OpenOffice

СообщениеДобавлено: 11.08.2009 18:57:32
Nadin
скалогрыз писал(а):O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?


Я переделала алгоритм работы с ОО. VBS скрипты - это то же OLE и в Linux-е работать не будут. Поэтому я пишу в текстовый файл, а потом запускаю из командной строки шаблон ОО Calc, в котором подключенный к нему макрос при создании документа заполняет шаблон данными из текстового файла.
В Linux-е есть команда fpexec, которая тоже запускает командную строку. А макросы ОО Calc там тоже должны работать.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 06.02.2010 22:09:08
dunin
Nashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.

Кто-нибудь может этот юнит под Lazarus портрировать?

Re: FreePascal и OpenOffice

СообщениеДобавлено: 07.02.2010 12:50:21
WindOfPain
если кому будет интересно:

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;



Вообщем, если будет интересно и возникнут вопросы - спрашивайте.