четверг, 16 мая 2019 г.

Использование VBScript’s в проектах Delphi

Внимание! Проект создавался в среде программирование Delphi 7 и в операционной системе Windows 7 64 bit.

1. Зачем это нужно? Язык VBScript широко используется для администрирования операционных систем семейства Windows. Delphi в этом плане более ограничена.

2. Например, если вы не можете получить какой-нибудь результат или какую-нибудь информацию от Windows средствами Delphi, то возможно это сможет VBScript.

3. Таким образом наша задача состоит в том, чтобы под средством VBScript получить какую-то информацию в виде строки, передать эту строку в приложение Delphi и вывести результат.

4. Что мы будем проектировать? Не будем ничего выдумывать и напишем программу в Delphi, которая складывает два числа, вводимые нами с клавиатуры. В программу в Delphi мы вводим только два складываемых числа, эти числа передаются VBScript-скрипту. Скрипт их суммирует и результат сложения передает назад в приложение Delphi.

5. С постановкой задачи все. Самое важное, что нам необходимо сделать это установить и подключить компонент, который занимается запуском VBScript-скрипта, приемом и передачей параметров в скрипт и из него.

6. Чтобы установить компонент необходима выбрать пункт меню Component -> Import ActiveX Control (Смотрите рисунок 1).

Рисунок 1. Открытие окна выбора компонента для установки

В списке компонентов найти и выбрать компонент «Microsoft Script Control 1.0» и нажать кнопку Install (Смотрите рисунок 2).

Рисунок 2. Выбор компонента для установки

В окне с именем Install нажать кнопку Ok (Смотрите рисунок 3).

Рисунок 3. Выбор пути установки

В окне Package нажать кнопку Install (Смотрите рисунок 4).

Рисунок 4. Установка компонента

После этого проверить, что компонент установился. Для этого выберите палитру компонентов ActiveX (Смотрите рисунок 5).

Рисунок 5. Просмотр установленного компонента

 7. Создайте новый проект. Для этого выберите пункт меню File -> New -> Application (Смотрите рисунок 6). 

Рисунок 6. Создание нового проекта в Delphi

Сохраните проект под именем, например, p16, как у меня. Перетащите на форму с именем Form1 одну кнопку Button1, два поля ввода Edit1 и Edit2, шесть текстовых меток c Label1 по Label6, и один компонент ScriptControl1. Расположите все элементы как у меня (Смотрите рисунок 7).

Рисунок 7. Расстановка элементов на форме

8. Перейдем к написанию кода приложения Delphi и VBScript-скрипта. Создайте в папке проекта с именем p16 под папку c именем vbscripts. Создайте в этой папке VBScript-скрипт файл с именем sum.vbs. Код скрипта будет следующий:

On Error Resume Next
Function Sum(a,b)
 Sum = a + b
End function

Таким образом скрипт состоит из команды On Error Resume Next, которая продолжает выполнять код даже если возникла какая-то ошибка, и функции с именем Sum, которая выполняет суммирование двух переменных и в качестве результата возвращает их сумму:

Function Sum(a,b)
Sum = a + b
End function

9. Теперь напишем код нашего приложения Delphi. Первым делом рассмотрим обработчик создание формы.

procedure TForm1.FormCreate(Sender: TObject);
var
  ScriptFile: TextFile;
  LineScript: String;
begin
  AssignFile(ScriptFile,'vbscripts/sum.vbs');
  Reset(ScriptFile);

  if IOResult <> 0 then
 begin
   MessageBox(0,'File access error.','Error',0);
  exit;
  end;

  while not EOF(ScriptFile) do
  begin
    readln(ScriptFile, LineScript);
    Script := Script + LineScript+#13+#10;
  end;

  CloseFile(ScriptFile);
end;

В представленном коде мы открываем наш скрипт файл sum.vbs, считываем построчно и сохраняем результат считывания в переменную Script типа String.

10. Далее рассмотрим код обработчика нажатия на кнопку Button1. Данный код выполняет передачу значений Edit1 и Edit2 скрипт файлу. Запуск скрипта на выполнение и получение результат выполнения скрипта.

procedure TForm1.Button1Click(Sender: TObject);
var
  varr, res:Variant;
  pPar:PSafeArray;
  SA : TSafeArrayBound;
  a: Integer;
  b: Integer;
  ValErrorCode: Integer;
begin
  Val(Edit1.Text, a, ValErrorCode);
  Val(Edit2.Text, b, ValErrorCode);

  try
    ScriptControl1.Language := 'VBScript';
    ScriptControl1.AddCode(Script);
    SA.cElements := 2;
    pPar := SafeArrayCreate(varVariant, 1, SA);
    varr := VarArrayCreate([0, 1], varVariant);
    varr[0]:=a;
    varr[1]:=b;
    pPar:=PSafeArray(TVarData(varr).VArray);
    res:=ScriptControl1.Run('Sum',pPar);
    Label5.Caption := VarToStr(res);
  except
    on E: Exception do
      MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
  end;
end;

Далее рассмотрим код более подробно. В этих строчках кода мы берем значения полей ввода Edit1 и Edit2, и сохраняем эти значения в переменных a и b.

Val(Edit1.Text, a, ValErrorCode);
Val(Edit2.Text, b, ValErrorCode);

В следующей строчке кода мы указываем компоненту загрузки и выполнению скрипта, что нужно выполнить скрипт файл типа VBScript. 

ScriptControl1.Language := 'VBScript';

В следующей строчке кода мы указываем откуда загружать скрипт из переменной Script типа String.

ScriptControl1.AddCode(Script); 

Следующими строчками кода мы передаем складываемые значения a и b скрипту, и запускаем скрипт на исполнение, и получаем результат, который мы выводи в текстовую метку Label5.

SA.cElements := 2;
pPar := SafeArrayCreate(varVariant, 1, SA);
varr := VarArrayCreate([0, 1], varVariant);
varr[0]:=a;
varr[1]:=b;
pPar:=PSafeArray(TVarData(varr).VArray);
res:=ScriptControl1.Run('Sum',pPar);
Label5.Caption := VarToStr(res);

11. Вот как бы и все. Теперь можно ознакомится с работой программы (Смотрите рисунок 8).

Рисунок 8. Результат работы программы

Ниже представлен код полностью:

unit p16_unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, MSScriptControl_TLB;

type
  TForm1 = class(TForm)
    ScriptControl1: TScriptControl;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label6: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
var
  Script: String;

implementation

{$R *.dfm}

uses ActiveX;

procedure TForm1.FormCreate(Sender: TObject);
var
  ScriptFile: TextFile;
  LineScript: String;
begin
  AssignFile(ScriptFile,'vbscripts/sum.vbs');
  Reset(ScriptFile);

  if IOResult <> 0 then
 begin
   MessageBox(0,'File access error.','Error',0);
  exit;
  end;

  while not EOF(ScriptFile) do
  begin
    readln(ScriptFile, LineScript);
    Script := Script + LineScript+#13+#10;
  end;

  CloseFile(ScriptFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  varr, res:Variant;
  pPar:PSafeArray;
  SA : TSafeArrayBound;
  a: Integer;
  b: Integer;
  ValErrorCode: Integer;
begin
  Val(Edit1.Text, a, ValErrorCode);
  Val(Edit2.Text, b, ValErrorCode);

  try
    ScriptControl1.Language := 'VBScript';
    ScriptControl1.AddCode(Script);
    SA.cElements := 2;
    pPar := SafeArrayCreate(varVariant, 1, SA);
    varr := VarArrayCreate([0, 1], varVariant);
    varr[0]:=a;
    varr[1]:=b;
    pPar:=PSafeArray(TVarData(varr).VArray);
    res:=ScriptControl1.Run('Sum',pPar);
    Label5.Caption := VarToStr(res);
  except
    on E: Exception do
      MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
  end;
end;

end.

Скрипт sum.vbs:

On Error Resume Next

Function Sum(a,b)
 Sum = a + b
End function

Комментариев нет:

Отправить комментарий