Delphi 02

Object Pascalの基本
初級プログラミング
基本コンポーネント
サンプルプロジェクト1−6
問題:標準体重を計算するプログラム
人の身長が与えられると標準体重と理想体重を表示するソフトウェアを作成する。
塚越一雄「はじめてのDelphi」技術評論社、第3章を参照
  1. 問題分析

    • 身長のデータはcm単位でキーボードから入力する。編集箱に表示しておく。
    • 標準体重
      標準体重(Kg単位) = 22 × 身長(m単位)の2乗
    • 理想体重
      理想体重 = 標準体重の前後5%以内

  2. フォームの設計
                             
    オブジェクト名Nameプロパティ役割
    フォーム1Form1プログラム専用の窓
    ラベル1Label1"あなたの身長(cm)?"を表示
    ラベル2Label2"理想体重(Kg)"を表示
    ラベル3Label3"〜"を表示
    ラベル4Label4"標準体重(Kg)"を表示
    編集箱1Edit1身長(cm)を入力する
    編集箱2Edit2理想体重(Kg)の下限を表示
    編集箱3Edit3理想体重の上限を表示
    編集箱4Edit4標準体重(Kg)を表示
    ボタン1Button1体重の計算をスタートする
    ボタン2Button2結果の表示をクリア

  3. プロパティの設定
      注:
    • 編集箱を表示専用として使う工夫:
      ユーザからの入力が必要なときに編集箱を使用し、表示専用にはラベルを使うのが本来の使い方である。
      編集箱を表示専用として使うにはユーザからのフォーカスを禁止するためには、編集箱2〜4のように、いくつかのプロパティを設定する必要がある。
    • デフォルトボタン:
      DefaultプロパティがTrueに設定されているボタンをデフォルトボタンという。 このボタン以外のコンポーネントが選択されている時、ユーザが〔Enter〕キーを押すと、デフォルトボタンが押された事になり、そのボタンのOnClickイベントが起動する。 このプログラムでは、ユーザが身長を入力して〔Enter〕キーを押した時、計算がスタートすることになる。
                         
    オブジェクトプロパティ備考
    フォーム1Captionあなたの理想体重窓のタイトル
    ラベル1Captionあなたの身長(cm)?キーボード入力のガイド
    ラベル2Caption理想体重(Kg)結果のガイド
    ラベル3Caption範囲を示すガイド
    ラベル4Caption標準体重(Kg)結果のガイド
    編集箱1Text0.0身長の初期値として表示
    MaxLength6入力可能な文字数を最大6に制限
    編集箱2Text空白初期値はなし
    ReadOnlyTrueこの編集箱を表示専用にする
    TabStopFalseここにはTabキーでフォーカスを移動できなくする
    EnableFalseここにはマウスでフォーカスを移動できなくする
    編集箱3同上編集箱2と同じ編集箱2と同じ
    編集箱4同上編集箱2と同じ編集箱2と同じ
    ボタン1Caption計算スタートイベント未定義
    DefaultTrueデフォルトボタンにする
    ボタン2Captionクリアイベント未定義

  4. 計算スタートボタンButton1のプログラム
       
    • 身長データを参照するには?
         
      • 身長データは編集箱Edit1のTextプロパティに文字列として保持されている。  
      • 身長の変数 Height (実数型)を導入する、宣言が必要  
      • 文字列から実数への型変換をする   
        Height := StrToFloat(Edit1.Text);
       
    • 文字列と実数の型変換をする関数   
      StrToFloat(文字列); 文字列を実数に変換する   
      FloatToStr(実数); 実数を文字列に変換する。15桁の有効数字をもつ数値形式に変換表示する。   
      FloatToStrF(実数, 表示形式, 変換の有効桁数, 桁数); 実数を文字列に変換する。表示する桁数などを指定する。
         
      • 例外エラーの防止:この関数は、編集箱1に数値がないと例外エラーを発生する。その対策として初期値に" 0.0"を入力してある。
       
    • 標準体重と理想体重の計算   
          
      • 標準体重の変数 Best (実数型)を導入する、宣言が必要   
      • 理想体重は表示するだけなので、Best から必要なときに計算して使う。   
      • それぞれ次の式を使って計算することができる。
        標準体重: Best = 22 * Sqr(Height/100) (注:身長をcm単位からm単位に変換している)
        理想体重の上限: = Best * 1.05
        理想体重の下限: = Best * 0.95
      • 二乗を計算するには、関数 Sqr( x1 ) を利用するか、 x1 * x1 と書く、ここで、x1 は変数または数値
       
    • 編集箱に実数の結果を表示するには文字列に変換   
          
      • 結果の数値を文字列に変えて編集箱のTextプロパティに代入すればよい。   
      • ここでは FloatToStrF 関数を用い表示形式を"ffFixed"に指定して変換する。実数がReal型の場合の有効桁数は"11"と指定する。 桁数の指定は、"ffFixed"を指定した場合は、表示する小数部分の桁数である。
      • 例えば、理想体重の下限と上限を小数1桁数で表示するには
        Edit2.Text := FloatToStrF( Best * 0.95, ffFixed, 11, 1);
        Edit3.Text := FloatToStrF( Best * 1.05, ffFixed, 11, 1);
       
    • カウントボタンを起動して(ダブルクリック)次のようにプログラムを記述する。
        procedure TForm1.Button1Click(Sender: TObject);
        var
             Height, Best : Real;
        begin
                  Height := StrToFloat( Edit1.Text );
                  Best := 22 * Sqr(Height / 100);
      
                  Edit2.Text := FloatToStrF( Best * 0.95, ffFixed, 11, 1);
                  Edit3.Text := FloatToStrF( Best * 1.05, ffFixed, 11, 1);
                  Edit4.Text := FloatToStrF( Best, ffFixed, 11, 1);
      
                  Edit1.SetFocus;
        end;
      
       
    • 変数の宣言   
      変数Height, Bestの参照はこのButton1手続き内に限られるのでここで行なう。

    • フォ−カスの設定
      • 実行時にフォ−カスのあるコンポーネントは1つのフォ−ムに一度に1つだけです。ユ−ザが実行時にコンポーネント間を[Tab]キ−で移動すると、フォーカスは移動先のコンポーネントに移る。設計時のフォーカス設定もあるがこの例では使用していない。
      • 特定のコンポーネントにフォーカスを与えることを指定するには、対応するイベントハンドラに"SetFocusメソッド"を使う。この例では、プログラムを起動すると、タブ順の最初にあるコンポーネントEdit1にフォーカスされる。
      • Edit1.SetFocus;
        その後も、上の文があるので、Button1で"OnClickイベント"を受け取る度に、Edit1にフォーカスが移りそこにカーソルが配置される。

  5. クリアボタンButton2のプログラム

    • クリアするとは空白文字を代入すること、 例えば理想体重をクリアするには
        Edit4.Text := '';

    • クリアボタンを起動して、次のようにプログラムを記述する。
        procedure TForm1.Button2Click(Sender: TObject);
        begin
                Edit1.Text := '0.0';
                Edit2.Text := '';
                Edit3.Text := '';
                Edit4.Text := '';
        end;
      

  6. プロジェクトの新規保存
       
    1. Delphiの開発環境の確認  
    2. とりあえず、プロジェクト名"Sample 1-6"、ユニット名"Sample 1-6un"で保存しよう。

  7. プロジェクトのコンパイルと実行

  8. Nameプロパティ:
    • このButton1プログラムの記述では、編集箱が4つもあって例えば標準体重の上限が何番目の編集箱か混乱する。この様な時は、そのコンポーネントのNameプロパティのデフォルトの名前をこのコンポーネントの機能を表す名前に変更しておくと分かりやすい。
    • すべてのフォームやコンポーネントはNameプロパティを持つ。 Nameプロパティはプログラムの中でそれらを指定したり参照するのに使われる特別なものである。
    • 編集箱3のNameプロパティ(Edit3)をedtBestMaxに変更すると、その変更が自動的にプログラムに反映される。その結果、Button1の手続きの一部は次のようになる。
                  Edit2.Text := FloatToStrF( Best * 0.95, ffFixed, 11, 1);
                  edtBestMax.Text := FloatToStrF( Best * 1.05, ffFixed, 11, 1);
                  Edit4.Text := FloatToStrF( Best, ffFixed, 11, 1);
      
    • Button2についても同様に変更される。
    • Button1やButton2などイベントを定義したいオブジェクトのNameプロパティの変更は、必ずイベントを定義する前に行なうこと。 イベントを定義した後からNameを変更した場合は、Nameプロパティの変更のプログラムへの反映は自分で記述した箇所には及ばないので、自分で捜して訂正するはめに陥る。

  9. 発展問題: ソフトウェアの改良

    • 問1: Button1の手続きの中で、"Edit1.MaxLength := 6" を設定した目的を考えてみよう。
    • 問2: 編集箱1〜4のNameプロパティをそれぞれ、edtHeight, edtBestMin, edtBestMax, edtBest, に変更してこのプログラムの可読性を良くしなさい。
    • 問3: このプログラムSample 1-6では編集箱1〜4に表示される数字が左寄せになっていて見づらい。少し右に寄せて表示したり、文字を大きくするなどの工夫をしてこのソフトウェアの改良版を作成しなさい。

1998/05/14 T.Katayama