お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"計算マクロ"

この発言に対し以下のコメントが寄せられています
#00216 J-OH!     さん 計算マクロバグ ( );

◆説明◆  例えば、数値データ入力用の Edit 2つ、マクロ式入力用の Edit 1つを配置していて、   ・Edit1 には「5」   ・Edit2 には「2」  などと入力されているとします。  で、仮に、   ・Edit3 に「Edit1 + Edit2」(5 + 2)    と入力されている場合には「7」   ・Edit3 に「10 * Edit1 / Edit2」(10 * 5 / 2)    と入力されている場合には「25」  といった結果が得られる、というものです。 ◆注意◆  1: Edit3 に使用される識別子としては "E1"・"E2" などの方が   良いかも知れません。  2: このサンプルでは、本来の演算子の優先順位には対応してお   りません。  3: 更に「()」内優先順位にも対応しておりません。 ( );   (つまり、ただ単に「左から順に計算」しているだけのものです)  4: 計算式には、左から順に  「数値 or 識別子」>「演算子」>「数値 or 識別子」>「演算子」・・・   の順で入力されているという前提のものです。  5: 数値・識別子・演算子の間には、半角スペースが1つ以上あると   いう前提のものです。    例:「Edit1 * 10 + Edit2」          ^ ^ ^ ^ ◆サンプルコード◆ var 全文字数, i: Integer; 式, 1文字, オブジェ, 演算子, data: String; 最初, 計算: Boolean; 結果, 値: Extended; begin // 初期設定 全文字数 := Length(Edit3.Text); 式 := Edit3.Text; i := 1; 最初 := True; 計算 := True; // 実行部分 while i <= 全文字数 do begin 1文字 := Copy(式, i, 1); オブジェ := ''; // 空白をパス 主に2巡目以降のための処理 while (1文字 = ' ') and (i <= 全文字数) do inc(i); // 式 の値を1文字づつ順に読み取り オブジェ に追加代入 // これを次の半角スペースまで繰り返す while (1文字 <> ' ') and (i <= 全文字数) do begin inc(i); オブジェ := オブジェ + 1文字; 1文字 := Copy(式, i, 1); end; //「数値 or 識別子」>「演算子」>「数値 or 識別子」・・・ // の順で繰り返されるという前提の中で、演算子が読み込ま // れるループでの処理 if 計算 = False then begin if (オブジェ <> '+') and (オブジェ <> '-') and (オブジェ <> '*') and (オブジェ <> '/') then begin ShowMessage('演算子が不正です'); Exit; end; 演算子 := オブジェ; end else begin try 値 := StrToFloat(オブジェ); except on EConvertError do begin try if オブジェ = 'Edit1' then begin data := Edit1.Text; 値 := StrToFloat(Edit1.Text); end else if オブジェ = 'Edit2' then begin data := Edit2.Text; 値 := StrToFloat(Edit2.Text); end else begin ShowMessage('"'+オブジェ+'" 未定義の識別子です'); Edit3.SetFocus; Exit; end; except on EConvertError do begin ShowMessage('"'+data+'" 数値以外のデータが入力されています'); Edit1.SetFocus; Exit; end; end; end; end; end; if 最初 = True then begin 結果 := 値; 最初 := False; end else if 計算 = True then begin if 演算子 = '+' then 結果 := 結果 + 値 else if 演算子 = '-' then 結果 := 結果 - 値 else if 演算子 = '*' then 結果 := 結果 * 値 else if 演算子 = '/' then 結果 := 結果 / 値; end; 計算 := not 計算; inc(i); end; Label1.Caption := FloatToStr(結果); end; 97/11/24(月) J-OH!(VEC05267) Original document by J-OH!     氏 ID:(VEC05267)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum