Delphiで使えるスクリプト言語は?

解決


vram  2024-01-09 08:05:43  No: 151354  IP: 192.*.*.*

昔PPAっていうDelphi内でPascalスクリプトが使えるのがあったのですがかなり古いので
同じようにDelphi内で使えるスクリプトって何かありますか?

返り値だけでなくスクリプト内でDelphiプロパティに干渉できるようなのが良いのですが

DelphiXE5以降で動けばと思います

編集 削除
igy  2024-01-09 11:59:24  No: 151355  IP: 192.*.*.*

FastReportには、FastScriptが搭載されているようです。(ただし、Standard Edition以上)
なお、FastScript単体でも発売されては、いるみたいですね。

FastScript を使用してアプリにスクリプト機能を実装 - Mr.XRAY<
http://mrxray.on.coocan.jp/Delphi/Others/FastScript.htm

編集 削除
vram  2024-01-09 23:40:31  No: 151356  IP: 192.*.*.*

情報ありがとうございます

使用しているDelphiがProfessionalエディションなので
残念ながらFastScriptは入っていませんでした

フリーソフト用なので何かを購入して対応というのは厳しいです
ループと条件分岐と変数管理を自作したとしても
せめて1行分の計算式を実行して値を得る方法があればいいかなと思います

編集 削除
igy  2024-01-10 00:02:53  No: 151357  IP: 192.*.*.*

検索してみたところ、RemObjects Pascal Script というのもあるみたいですね。
(使ったことはないのですが・・)

Windows 7 の環境で Delphi 2010 に RemObjects Pascal Script をインストールしてみる 
https://blog.dreamhive.co.jp/yama/3439.html

RemObjects PascalScriptを試す
https://tokibito.hatenablog.com/entry/20100111/1263151508

編集 削除
mam  URL  2024-01-10 00:14:53  No: 151358  IP: 192.*.*.*

1行の計算式(eval)であれば、Jun HOSOKAWA様のサイトに解説がありますね。
https://qiita.com/pik/items/e888e52b4fa2f70a419f
外していたらすいません。


uses System.Bindings.Helper,System.Bindings.Expression;

procedure TForm1.Button1Click(Sender: TObject);
var be : TBindingExpression;
begin
  Edit1.Text:='24*3+1';
  be := TBindings.CreateExpression([], Edit1.Text);
  try
    Memo1.Lines.Add(be.Evaluate.GetValue.AsExtended.ToString);
  finally
    be.Free;
  end;
end;

編集 削除
vram  2024-01-10 00:22:48  No: 151359  IP: 192.*.*.*

igy 様
初耳でしたがInno Setupのスクリプトエンジンに使われているのなら使いやすそうですね

実行時に中間ファイルのようなものを作成するので
管理者権限に引っかかるという情報もありますが

※Inno Setupでも似たような現象は発生している

mam 様
これはすばらしい情報をありがとうございます!
式をオブジェクトにバインドできるので理想通りです

頂いた情報でいろいろ試したいと思います
それにしても情報少ないですね・・・

編集 削除
au  2024-01-10 02:20:23  No: 151360  IP: 192.*.*.*

用途に合うのか不明ですがこんなのもあるようです
https://www.delphitools.info/dwscript/

編集 削除
vram  2024-01-10 04:06:56  No: 151361  IP: 192.*.*.*

au様ありがとうございます、これも使えそうですね

言葉足らずでしたが 「情報が少ない」は
教えていただいたライブラリを検索したときの結果のことです

それぞれ使ってみて使えそうなら採用させていただきたいと思います

編集 削除
うぉれす  2024-01-10 04:20:50  No: 151362  IP: 192.*.*.*

Microsoft ScriptControl でも式評価できます。sin,log,expなども使えるようです。
---------------------
uses  comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
  SC: OleVariant;
begin
  try
    SC := CreateOleObject('ScriptControl');
  except
    on EOleSysError do
    begin
      Messagedlg('ScriptControlを起動できませんでした.', mterror, [mbok], 0);
      Exit;
    end ;
  end ;
  try
    SC.Language := 'VBScript';
    SC.AllowUI := False;
    Label1.Caption := SC.Eval(Edit1.Text);     //label= -1+2.0*sin(3.141592/3)+log(0.5)+exp(0.2)
    SC.Reset;
  finally
    SC := Unassigned;
  end ;
end;

編集 削除
vram  2024-01-10 05:06:28  No: 151363  IP: 192.*.*.*

うぉれす様 ありがとうございます
試しに実行したところ何もインストールしていない状態でも
Microsoft ScriptControl を呼び出せているようです

インストールなしで式評価が出来るならこれが最有力候補になりそうです

編集 削除
ウォレス  2024-01-11 00:43:39  No: 151364  IP: 192.*.*.*

EXCEL入っているならEXCELオブジェクトに計算させる。
EXCELで使える関数は何でも使えるのが利点。
---
uses ComObj は要るかも。。
var
  ExcelApp, WorkSheet: Variant;
//--------------
function CalculateFormula(AFormula: string): Variant;
begin
  WorkSheet.Cells[1, 1].Formula := AFormula;
  Result := WorkSheet.Cells[1, 1].Value;
end; 
procedure TForm1.Button1Click(Sender: TObject);
var
  res: Variant;
begin
  res := CalculateFormula('=2*ln(2.718281828)+pi()/2 + Fact(10)');
  Memo1.Lines.Add(res);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  ExcelApp := CreateOLEObject('Excel.Application');
  ExcelApp.DisplayAlerts := False;
  ExcelApp.WorkBooks.Add;
  WorkSheet := ExcelApp.ActiveWorkBook.ActiveSheet;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ExcelApp.Quit;
end;

編集 削除