計算式を文字列に表記する方法

解決


リュウ  2004-08-28 11:20:10  No: 10649  IP: 192.*.*.*

以下のように計算式を文字列としてあらわすことはできるのでしょうか?

a:=1;
b:=2

c:=a+b  これをエディットボックス等で①のように表示 

①c:=1+2

編集 削除
@っしー  2004-08-28 12:02:47  No: 10650  IP: 192.*.*.*

Edit1.Text := 'c:=' + IntToStr(a) + '+' + IntToStr(b)

で、いかがですか?

編集 削除
リュウ  2004-08-28 12:06:49  No: 10651  IP: 192.*.*.*

一つ一つの変数を文字列化し、表示するしかないでしょうか?
一発で表示することはできないでしょうか?

編集 削除
jok  2004-08-28 12:49:56  No: 10652  IP: 192.*.*.*

こんなことかな

function ToFormula(siki:string;a,b:integer):string;
begin
  siki := StringReplace(siki,'a','%0:d',[rfReplaceAll]);
  siki := StringReplace(siki,'b','%1:d',[rfReplaceAll]);
  result := Format(siki,[a,b]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b:integer;
  siki:string;
begin
  a := 1;
  b := 2;

  siki := 'c = a + b';
  Label1.Caption := ToFormula(siki,a,b);

  siki := 'c = a*a + b*b';
  Label2.Caption := ToFormula(siki,a,b);

  siki := 'c = a*b - a/b +3';
  Label3.Caption := ToFormula(siki,a,b);
end;

編集 削除
リュウ  2004-08-28 13:13:49  No: 10653  IP: 192.*.*.*

置換ですか!なるほど!ですが、結局、a、bはそれぞれ何らかのアクションを行い
式と表さざるおえないですね。何か、メソッドで式をc=1+2に置き換えるものは
無いでしょうか?(うーん、自前で関数作るしか無いかな・・・)

今、スクリプトコントロールを使用し計算を行っており、結果だけではなく計算途中の代入式も画面に表示したいと思っています。

編集 削除
jok  2004-08-28 13:22:50  No: 10654  IP: 192.*.*.*

> 何か、メソッドで式をc=1+2に置き換えるものは無いでしょうか?

ご質問の意味がわかりませんです。
表示するには文字列にするほかなく、また、動的に計算するにはインタプリタ
みたいなものをつくるほかありません。

編集 削除
リュウ  2004-08-28 13:57:46  No: 10655  IP: 192.*.*.*

すみません、少し質問の意図が違っていました。
いろいろやっていてコンガラガッテいました。すみません。
以下のD(例)みたいな動きをするメソッドがDelphiにデフォルトかコンポーネント等でないでしょうか?

Sc.Language := 'VBScript';
Sc.ExecuteStatement('a=1');  ←  a:=1;を先に変える
Sc.ExecuteStatement('b=2');  ←  b:=2;を先に変える

c:='a+b';

siki:=D(c)

Edit1.Text := siki;
とすると、
c=1+2に変換される。

余談ですが、計算は下記で可能----------------------------
Edit2.text:=FloatToStr(Sc.eval(c))

編集 削除
@っしー  2004-08-30 12:24:04  No: 10656  IP: 192.*.*.*

質問の内容がよくわかっていませんが、、、

数式解析コンポーネントを上手く利用すると出来るのではないでしょうか?
例えば、藤巻晴行氏のTMathsParserとかは如何でしょう?

編集 削除
リュウ  2004-08-30 15:19:12  No: 10657  IP: 192.*.*.*

すみません、以下の部分は

>Edit1.Text := siki;
>とすると、
>c=1+2に変換される。

Edit1.Text := siki;
とすると、
Edit1.Textにc=1+2と変換されて表示

です。

再度確認の為に内容を整理して、
文字列の計算式に値を代入(スクリプトコントロールで可能)。
その計算式を、値代入した形で文字列として表示したいです。

a='1'
b='2'
c='a+b' ←文字列式への値代入はスクリプトコントロールで可能

以下のように値を代入した状態の式を表示したい。

c=1+2←計算過程を表示したいため。

編集 削除
bob  2004-09-03 16:18:54  No: 10658  IP: 192.*.*.*

しまった。何となくわかってしまった--;

こーいうことでないの?
動作検証目的意外にそのまま使うべからず。

#使っても良いけど、無駄多いし、TAとかTDとかTAってrecordで十分とか
#メモリ解放とか...もろもろの事ね。

-----
unit Unit1;

interface

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

type
  TA = class
  private
    FStr: String;
    FValue: String;
  public
    property Str: String read FStr write FStr;
    property Value: String read FValue write FValue;
  end;

  TD = class
  private
    FList: TList;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Add(Value: TA);
    function Execute(Str: String): String;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Edit3: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    FD: TD;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TD }

procedure TD.Add(Value: TA);
begin
  FList.Add(Value);
end;

constructor TD.Create;
begin
  FList := TList.Create;
end;

destructor TD.Destroy;
Var
  I: Integer;
begin
  for I:=0 to FList.Count -1 do
    TA(FList.Items[I]).Free;

  FList.Free;
  inherited;
end;

function TD.Execute(Str: String): String;
Var
  I: Integer;
begin
  result := Str;
  for I:=0 to FList.Count -1 do
    result := StringReplace(result, TA(FList.Items[I]).Str, TA(FList.Items[I]).Value, [rfReplaceAll]);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
Var
  A: TA;
begin
  A := TA.Create;
  A.Str := Edit1.Text;
  A.Value := Edit2.Text;
  FD.Add(A);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FD := TD.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FD.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  form1.Caption := FD.Execute(Edit3.Text);
end;

end.

編集 削除
bob  2004-09-03 16:33:02  No: 10659  IP: 192.*.*.*

#ボタン押しちゃった...

つまり、@っしーさんの
> Edit1.Text := 'c:=' + IntToStr(a) + '+' + IntToStr(b)
やjokさんの
> function ToFormula(siki:string;a,b:integer):string;
> begin
>   siki := StringReplace(siki,'a','%0:d',[rfReplaceAll]);
>   siki := StringReplace(siki,'b','%1:d',[rfReplaceAll]);
>   result := Format(siki,[a,b]);
> end;
みたいに、インラインで置換するわけではなく、
検索文字(AやB)と置換文字(1や2)を、動的に何かしらに教えてあげて
メソッドだかコンポーネントだかに、んじゃ置換(D)して式を構築
した様に返してね。ってことのよーな???  ちがう?

P.S.
さっきのソースの話。
1. Edit1にA
2. Edit2に1
3. Button1押下
4. Edit1にB
5. Edit2に2
6. Button1押下
7. Edit3にC=A+B
8. Button2押下

From1.Captionが "C=1+2" と表示される

・・・で、どう?

編集 削除
リュウ  2004-09-03 22:02:32  No: 10660  IP: 192.*.*.*

bob様

そうです!私の説明が下手で申し訳ありませんでした。
計算処理があり計算途中を帳票等に表示する仕様でして、計算がたくさん
あるので、一つ一つ分解する処理も大変ですので、何かコンポーネントが
無いのかお尋ねしました。
ソースを参考にさせていただきます。

編集 削除