JCLのJvInterpreterを使うと、Delphi/C++Builderアプリケーションに簡易Pascal言語を組み込むことができます。
コードを実行して返値を取得する
フォームにTJvInterpreterProgramコンポーネントを配置します。
JvInterpreterProgram1のPasプロパティに、実行するプログラムのコードを設定します。
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;
プログラムを実行してボタンを押すと、コードの実行結果が表示されます。
定義された関数を実行する
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;
プログラムを実行してボタンを押すと、コードの実行結果が表示されます。
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;
プログラムを実行してボタンを押すと、コードの実行結果が表示されます。
コードからコンポーネントのプロパティを変更する
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;
プログラムを実行してボタンを押すと、ボタンのキャプションが変更されます。