以下のように計算式を文字列としてあらわすことはできるのでしょうか?
a:=1;
b:=2
c:=a+b これをエディットボックス等で①のように表示
↓
①c:=1+2
Edit1.Text := 'c:=' + IntToStr(a) + '+' + IntToStr(b)
で、いかがですか?
一つ一つの変数を文字列化し、表示するしかないでしょうか?
一発で表示することはできないでしょうか?
こんなことかな
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;
置換ですか!なるほど!ですが、結局、a、bはそれぞれ何らかのアクションを行い
式と表さざるおえないですね。何か、メソッドで式をc=1+2に置き換えるものは
無いでしょうか?(うーん、自前で関数作るしか無いかな・・・)
今、スクリプトコントロールを使用し計算を行っており、結果だけではなく計算途中の代入式も画面に表示したいと思っています。
> 何か、メソッドで式をc=1+2に置き換えるものは無いでしょうか?
ご質問の意味がわかりませんです。
表示するには文字列にするほかなく、また、動的に計算するにはインタプリタ
みたいなものをつくるほかありません。
すみません、少し質問の意図が違っていました。
いろいろやっていてコンガラガッテいました。すみません。
以下の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))
質問の内容がよくわかっていませんが、、、
数式解析コンポーネントを上手く利用すると出来るのではないでしょうか?
例えば、藤巻晴行氏のTMathsParserとかは如何でしょう?
すみません、以下の部分は
>Edit1.Text := siki;
>とすると、
>c=1+2に変換される。
Edit1.Text := siki;
とすると、
Edit1.Textにc=1+2と変換されて表示
です。
再度確認の為に内容を整理して、
文字列の計算式に値を代入(スクリプトコントロールで可能)。
その計算式を、値代入した形で文字列として表示したいです。
a='1'
b='2'
c='a+b' ←文字列式への値代入はスクリプトコントロールで可能
以下のように値を代入した状態の式を表示したい。
c=1+2←計算過程を表示したいため。
しまった。何となくわかってしまった--;
こーいうことでないの?
動作検証目的意外にそのまま使うべからず。
#使っても良いけど、無駄多いし、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.
#ボタン押しちゃった...
つまり、@っしーさんの
> 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" と表示される
・・・で、どう?
bob様
そうです!私の説明が下手で申し訳ありませんでした。
計算処理があり計算途中を帳票等に表示する仕様でして、計算がたくさん
あるので、一つ一つ分解する処理も大変ですので、何かコンポーネントが
無いのかお尋ねしました。
ソースを参考にさせていただきます。
ツイート | ![]() |