JvInterpreterでDelphi/C++Builderアプリケーションに簡易Pascal言語を組み込む

JCLのJvInterpreterを使うと、Delphi/C++Builderアプリケーションに簡易Pascal言語を組み込むことができます。

コードを実行して返値を取得する

フォームにTJvInterpreterProgramコンポーネントを配置します。

JvInterpreter01

JvInterpreterProgram1のPasプロパティに、実行するプログラムのコードを設定します。

JvInterpreter02

var
  I: Integer;
begin
  Result := 0;
  for I := 0 to 10 do
    Result := Result + I;
end;

Pasプロパティに記述したコードは、Runメソッドで実行します。
返値はVResultプロパティで取得できます。

フォームにTButtonを配置し、OnClickイベントを追加します。

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  JvInterpreterProgram1.Run;
  I := JvInterpreterProgram1.VResult;
  ShowMessage(IntToStr(I));
end;

プログラムを実行してボタンを押すと、コードの実行結果が表示されます。

JvInterpreter03

定義された関数を実行する

JvInterpreterProgram1のPasプロパティに関数のコードを記述します。

unit JvInterpreterFunctionCall;

function Plus(A, B: Integer): Integer;
begin
  Result := A + B;
end;

end.

定義された関数を実行するにはCallFunctionメソッドを呼び出します。
第1引数に関数名、第3引数に関数の引数を設定します。

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  I := JvInterpreterProgram1.CallFunction('Plus', nil, [100, 20]);
  ShowMessage(IntToStr(I));
end;

プログラムを実行してボタンを押すと、コードの実行結果が表示されます。

JvInterpreter04

Pasプロパティに記述したコードから呼び出される関数を使用する

JvInterpreterProgram1のPasプロパティにAdd関数を呼び出すコードを記述します。

begin
  Result := Add(100, 20, 3);
end;

JvInterpreterProgram1のGetValueイベントを追加します。
引数Identifierには関数名、引数Argsには関数の引数が設定されています。
返値は引数Valueに設定し、引数DoneをTrueにします。

procedure TForm1.JvInterpreterProgram1GetValue(Sender: TObject;
  Identifier: string; var Value: Variant; Args: TJvInterpreterArgs;
  var Done: Boolean);
var
  I: Integer;
begin
  if AnsiSameText(Identifier, 'Add') then
  begin
    Value := 0;
    for I := 0 to Args.Count - 1 do
    begin
      Value := Value + Args.Values[I];
    end;
    Done := True;
  end;
end;

ボタンのOnClickイベントを記述します。

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  JvInterpreterProgram1.Run;
  I := JvInterpreterProgram1.VResult;
  ShowMessage(IntToStr(I));
end;

プログラムを実行してボタンを押すと、コードの実行結果が表示されます。

JvInterpreter05

コードからコンポーネントのプロパティを変更する

JvInterpreterProgram1のPasプロパティにコンポーネントのプロパティを更新するコードを記述します。

begin
  Button1.Caption := 'テスト';
end;

JvInterpreterProgram1のGetValueイベントで要求されたコンポーネントを返します。

procedure TForm1.JvInterpreterProgram1GetValue(Sender: TObject;
  Identifier: string; var Value: Variant; Args: TJvInterpreterArgs;
  var Done: Boolean);
var
  I: Integer;
begin
  for I := 0 to Self.ComponentCount - 1 do
  begin
    if AnsiSameText(Identifier, Self.Components[I].Name) then
    begin
      Value := O2V(Self.Components[I]);
      Done := True;
      Exit;
    end;
  end;
end;

ボタンのOnClickイベントを記述します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  JvInterpreterProgram1.Run;
end;

プログラムを実行してボタンを押すと、ボタンのキャプションが変更されます。

JvInterpreter06

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください