−トップへ−

電卓を作る
その2 基本的な考え方

Labelコンポーネントの不具合について

 今回はまずLabelコンポーネントを右詰めにすると生じる不具合について述べます。 

 右詰めにしたLabelコンポーネントに「123.」と入力してみると左図のように,なぜか小数点が左に来てしまいます。この現象はEditコンポーネントやMemoコンポーネントでも右詰めにすると生じる現象です。


 
 試しに「123.4」と入力すると,右図のように正常に表示されます。そこで小数点の右にスペースを付けてみたり他の目立たないマークなどを付けてみたりして試してみましたが,数字以外のものを小数点の右につけても不具合は解消されないことがわかりました。



 この解決方法をいろいろ考えてみたのですが,その方法としてLabelコンポーネントに数字を入力する際は,数字の最後に「1」をつけて表示するようにして,計算するときは最後の「1」を外して計算することにしました。そしてLabelコンポーネントの右端を新しく作ったPanelコンポーネントで隠すこととしました。(最初はLabelコンポーネントで隠してみたのですが,数字を入力するとちらつきが出てしまうため,Panelコンポーネントで隠すことにしました。)
 
 このようにすることで,左図のように,見た目は正しく表示されているように見えます。
 (本当は右端に1があるのですが,Panelコンポーネントで隠れています。)
 このために,プログラムが多少わかりにくいものになってしまいました。




基本的な考え方

 次にどのような考え方でプログラムを作成するか述べていきます。
 
 「その1」でフォームにボタンを18個作りましたが,その1つ1つにプログラムを書くとわかりづらくなるので,数字の表示や計算などは1つの手続き(procedure)にまとめて書いていきます。
 
 数字が入力されていない状態で「+」などが押されたときに無効にするように,電卓の入力状況を変数で下記のように表すことにします。
  0…数字が何も押されていないとき
  1…数字キーが押されたとき
  2…小数点が押されたとき
  3…「+」「−」「×」「÷」の記号が押されたとき
  4…記号キーが押された後,数字キーが押されたとき
  5…記号キーが押された後,小数点が押されたとき
  6…「=」キーが押されたとき
 
 小数点が押されたかどうかはLabelコンポーネントに入力された文字列を検索する「Pos」関数などがあるのですが,ここでは小数点が入力されたかどうかを上記のような方法で確認することにしました。


 また,記号キーで「+」「−」「×」「÷」のどれが押されたかを表すために,コンポーネントに用意されている「tag」プロパティに数字を書き込んでみたいと思います。このコンポーネントに用意されている「tag」プロパティは整数型の変数として使用することができます。

  「+」のとき,「tag」プロパティの値を1にする。
  「−」のとき,「tag」プロパティの値を2にする。
  「×」のとき,「tag」プロパティの値を3にする。
  「÷」のとき,「tag」プロパティの値を4にする。


 次に入力された数字を保存するための変数を2個宣言します。ここではLabelコンポーネントの不具合に対処するため,変数は文字列型で宣言します。


 ここまでのことをまとめてみます。

 type
  TForm1 = class(TForm)
  Label1: TLabel;
  Button1: TButton;
  Button2: TButton;
  Button3: TButton;
  Button4: TButton;
  Button5: TButton;
  utton6: TButton;
  Button7: TButton;
  Button8: TButton;
  Button9: TButton;
  Button10: TButton;
  Button11: TButton;
  Button12: TButton;
  Button13: TButton;
  Button14: TButton;
  Button15: TButton;
  Button16: TButton;
  Button17: TButton;
  Button18: TButton;
  procedure syori(ch:char); //この行にセルを置き,[Shift]+[Ctrl]+[C]を押すと,新しいprocedureが作成されます
   {カッコ内の ch:char は,chをchar型の変数に宣言したことを表しています。
   このように記述することでカッコ内に文字を入れると,その文字をchの値として使用できます}
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure Button3Click(Sender: TObject);
  procedure Button4Click(Sender: TObject);
  procedure Button5Click(Sender: TObject);
  procedure Button6Click(Sender: TObject);
  procedure Button7Click(Sender: TObject);
  procedure Button8Click(Sender: TObject);
  procedure Button9Click(Sender: TObject);
  procedure Button10Click(Sender: TObject);
  procedure Button11Click(Sender: TObject);
  procedure Button12Click(Sender: TObject);
  procedure Button13Click(Sender: TObject);
  procedure Button14Click(Sender: TObject);
  procedure Button15Click(Sender: TObject);
  procedure Button16Click(Sender: TObject);
  procedure Button17Click(Sender: TObject);
  procedure Button18Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
 private
  { Private 宣言 }
  value1,value2:string; //2つの文字列型の変数を宣言します。
  st:integer; //stは電卓の入力状況を管理するため
 public
  { Public 宣言 }
 end;
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 { TForm1 }
 
 procedure TForm1.Button10Click(Sender: TObject);
 begin
  syori('0'); //Button10をクリックしたときに,chに'0'を代入してsyoriを実行します。以下同様です。
 end;
 
 procedure TForm1.Button11Click(Sender: TObject);
 begin
  syori('.');
 end;
 
 procedure TForm1.Button12Click(Sender: TObject);
 begin
  Label1.tag:=1; //Label1のタグを1にする
  syori('p');
 end;
 
 procedure TForm1.Button13Click(Sender: TObject);
 begin
  Label1.tag:=2;
  syori('p');
 end;
 
 procedure TForm1.Button14Click(Sender: TObject);
 begin
  Label1.tag:=3;
  syori('p');
 end;
 
 procedure TForm1.Button15Click(Sender: TObject);
 begin
  Label1.tag:=4;
  syori('p');
 end;
 
 procedure TForm1.Button16Click(Sender: TObject);
 begin
  syori('A');
 end;
 
 procedure TForm1.Button17Click(Sender: TObject);
 begin
  syori('C');
 end;
 
 procedure TForm1.Button18Click(Sender: TObject);
 begin
  syori('=');
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
  syori('1');
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
  syori('2');
 end;
 
 procedure TForm1.Button3Click(Sender: TObject);
 begin
  syori('3');
 end;
 
 procedure TForm1.Button4Click(Sender: TObject);
 begin
  syori('4');
 end;
 
 procedure TForm1.Button5Click(Sender: TObject);
 begin
  syori('5');
 end;
 
 procedure TForm1.Button6Click(Sender: TObject);
 begin
  syori('6');
 end;
 
 procedure TForm1.Button7Click(Sender: TObject);
 begin
  syori('7');
 end;
 
 procedure TForm1.Button8Click(Sender: TObject);
 begin
  syori('8');
 end;
 
 procedure TForm1.Button9Click(Sender: TObject);
 begin
  syori('9');
 end;
 
 //FormCreateイベントを呼び出し以下のソースを記述
 procedure TForm1.FormCreate(Sender: TObject);
 begin
  label1.Caption:='01';
  st:=0;
 end;
 
 procedure TForm1.syori(ch: char);
 begin
 
 end;
 
 end.

−トップへ−