Delphi XE6/C++Builder XE6に対応済みのコンポーネントやツール

使用しているコンポーネントやツールで、Delphi XE6/C++Builder XE6に対応しているもの。

JCL/JVCL

豊富な便利関数やコンポーネントでおなじみのJCL/JVCLはXE6対応済み。

GExperts

IDEに便利なツールを追加するGExpertsはバージョン1.37でXE6に対応済み。

DDevExtensions

IDEの機能を拡張するDDevExtensionsもXE6に対応済み

FastReport VCL 5

Delphi XE6/C++Builder XE6に付属のレポートツールの機能制限なしの有償版。
充実した日本語マニュアルもうれしい。

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

Delphiの定数や関数を使用する

uses句にJvInterpreter_allユニットを追加すると、SystemユニットやSysUtilsユニットなどで定義されている関数や定数を使用できます。

uses JvInterpreter_all; //追加しないとNowが未定義エラー

procedure TForm1.Button1Click(Sender: TObject);
begin
  JvInterpreterProgram1.Pas.Clear;
  JvInterpreterProgram1.Pas.Add('begin');
  JvInterpreterProgram1.Pas.Add('  Result := FormatDateTime(''yyyy/mm/dd'', Now)');
  JvInterpreterProgram1.Pas.Add('end;');

  JvInterpreterProgram1.Run;
  ShowMessage(JvInterpreterProgram1.VResult);
end;

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

コードを検証する

JvInterpreterProgramのCompileメソッドを実行すると、コードに問題があるときにEJvInterpreterError例外が投げられます。

EJvInterpreterErrorのErrCodeプロパティとMessageプロパティで、エラーの内容を取得できます。

JvInterpreterProgramのLastError.ErrCodeプロパティやLastError.Messageでもエラーの内容を取得でき.LastError.ErrPosプロパティでエラーの場所がわかります。

begin
  try
    JvInterpreterProgram1.Compile;
  except
    on E : EJvInterpreterError do
    begin
      ShowMessage(Format('%d:%s', [E.ErrCode, E.Message]));
      if E.ErrPos > -1 then
      begin
        Memo1.Text := JvInterpreterProgram1.Pas.Text;
        Memo1.SelStart := E.ErrPos;
        Memo1.SelLength := 0;
      end;
    end;
    on E: Exception do
    begin
      ShowMessage(Format('%d:%s', [
        JvInterpreterProgram1.LastError.ErrCode,
        JvInterpreterProgram1.LastError.Message]));
      if JvInterpreterProgram1.LastError.ErrPos > -1 then
      begin
        Memo1.Text := JvInterpreterProgram1.Pas.Text;
        Memo1.SelStart := JvInterpreterProgram1.LastError.ErrPos;
        Memo1.SelLength := 0;
      end;
    end;
  end;

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

JvInterpreterにPlus関数を組み込むには、GlobalJvInterpreterAdapterでTJvInterpreterAdapterを取得して、AddFunctionメソッドで登録します。
実行する関数はTJvInterpreterAdapterGetValue型になります。

###JvInterpreterに関数を組み込む

JvInterpreterにPlus関数を組み込みます。

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

unit Unit1;

function Main: Integer;
begin
  Result := Plus(10, 20);
end;

end.

関数を組み込むには、GlobalJvInterpreterAdapterでTJvInterpreterAdapterを取得して、AddFunctionメソッドで登録します。

GlobalJvInterpreterAdapter.AddFunction(
    'Unit1', //ユニット名
    'Plus',  //関数名
    Form1Plus, //実行する関数
    2,  //関数の引数の数
    [varInteger, varInteger], //引数の型
    varInteger //返値の型
);

実行する関数はTJvInterpreterAdapterGetValue型になります。
引数Argsには関数の引数が設定されます。
引数Valueには関数の返値を設定します。

procedure Form1Plus(var Value: Variant; Args: TJvInterpreterArgs);
begin
  Value := Args.Values[0] + Args.Values[1];
end;

ボタンを押したときに登録したコードを実行します。

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  //Plus関数を組み込む
  GlobalJvInterpreterAdapter.AddFunction('Unit1', 'Plus', Form1Plus, 2, [varInteger, varInteger], varInteger);
  I := JvInterpreterProgram1.CallFunction('Main', nil, []);
  Memo1.Text := IntToStr(I);
end;