AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
14:選択項目入力
 
簡単計算ソフトを作ってみると、何度も使用する数値などを一覧項目の中から選択したくなる場合があります。こういった場合、Delphiではリストボックス ListBox コンポーネントとコンボボックス ComboBox コンポーネントがあります。ListBoxコンポーネントは、配置したボックス内に一覧が表示されてそのうちのいずれかを選択します。ComboBoxコンポーネントは、配置したボックスは Editコンポーネントと似ていますが右端に[▼]ボタンが表示されており、これをクリックすると一覧が表示され、そのうちのいずれかを選択出来ます。
まずは、フォルダの準備を行います。プログラムを作成して保存・作業を行うフォルダを予めエクスプローラで作成しておきます。Windowsに添付されているファイル管理ツール「エクスプローラ」を動かします。Windowsの「スタート」メニューから、「プログラム」メニューの中、或いは、「プログラム」メニューの中の「アクセサリ」内に「エクスプローラ」はあります。
 
画面左側のツリー表示の中の「マイ コンピュータ」内にある、「ローカル ディスク(C:)」内の「DelphiProgram」フォルダ内の「test」フォルダをクリックして反転表示(選択状態)にします。
 
メニュー「ファイル」→「新規作成」→「フォルダ」をクリックして選択します。

初期状態が「新しいフォルダ」という名前でキー入力編集状態となっています。フォルダ名を「chap14」と決めて入力します。最後に[Enter]キー(改行キー)を押すか、どこかでマウス左クリックして下さい。
 
画面左側のツリー表示の中に、
「ローカル ディスク(C:)」
 →「DelphiProgram」
  →「test」
   →「chap14」
というフォルダが新しく作成されるのを確認して下さい。

Delphi6を起動し、
Delphi6のメニュー「プロジェクト」内の「オプション」をクリックします。

「プロジェクト オプション」画面が表示されます。
「ディレクトリ/条件」ページをクリックし、
「ディレクトリ」内の設定
 「出力ディレクトリ」
 「ユニット出力ディレクトリ」
 「検索パス」
 「デバッグ用ソースパス」
 「BPL出力ディレクトリ」
 「DCP出力ディレクトリ」
の各設定を
「C:\DelphiProgram\test」
から
「C:\DelphiProgram\test\chap14」
に変更して[OK]ボタンをクリックして下さい。

プログラミング作業は何も行っていませんが、最初にまず保存を行っておきます。
 
メニュー「ファイル」→「名前を付けて保存」をクリックして下さい。

「Unit1に名前を付けて保存」画面が表示されます。「保存する場所」には、先に作成したフォルダ「C:\DelphiProgram\test\chap14」を選択します。
ファイル名は「Unit1.pas」のまま[保存]ボタンをクリックして下さい。

メニュー「ファイル」→「プロジェクトに名前を付けて保存」をクリックして下さい。

「Project1 に名前を付けて保存」画面が表示されます。
「保存する場所」は、先で既に「C:\DelphiProgram\test\chap14」を選択していますので、そのままで構いません。
ファイル名は「Project1.dpr」のまま[保存]ボタンをクリックして下さい。
 
これで最初の準備が出来ました。
これからテストプログラムの作成を行っていきます。
 
コンポーネントパレット[Standard]の中にある「ListBox」コンポーネントをクリックして選択します。

フォーム Form1 画面上でクリックして ListBox1 オブジェクトを配置します。
 
同様に Label1、Label2オブジェクトを配置します。

コンポーネントパレット[Standard]の中にある「ComboBox」コンポーネントをクリックして選択します。

フォーム Form1 画面上でクリックして ComboBox1 オブジェクトを配置します。

更にButton1、Edit1オブジェクトを配置し、Label1オブジェクトのCaptionプロパティを「+」に、Button1オブジェクトのCaptionプロパティを「=」に指定して画面レイアウトを整えます。

ListBoxの選択一覧項目は、Itemsプロパティで入力します。
 
オブジェクトインスペクタ画面でListBox1 オブジェクトの Itemsプロパティ欄を選択すると右横に[…]ボタンがありますのでこのボタンをクリックします。

「文字列リストの設定」画面が表示されます。ここに表示させたい選択一覧項目を入力します。
1項目を1行で入力して下さい。入力し終わったら[OK]ボタンをクリックして下さい。

フォーム Form1 画面上のListBox1に入力した内容が反映されます。表示枠に入りきらない場合は右横にスクロールバーが自動的に表示されます。

ComboBoxの選択一覧項目も同じく、Itemsプロパティで入力します。
 
オブジェクトインスペクタ画面でComboBox1 オブジェクトの Itemsプロパティ欄を選択すると右横に[…]ボタンがありますのでこのボタンをクリックします。

「文字列リストの設定」画面が表示されます。ここに表示させたい選択一覧項目を入力します。
1項目を1行で入力して下さい。入力し終わったら[OK]ボタンをクリックして下さい。

この状態で ListBox と ComboBox の動きを見て確認するため、作成したプログラムを一旦保存します。
 
メニュー「ファイル」→「すべて保存」をクリックして下さい。

プログラムのコンパイルを行います。
メニュー「プロジェクト」→「Project1 を再構築」をクリックして下さい。
 
プログラムのコンパイル(再構築)を行うと、その経過・結果を示す画面が表示されます。[OK]ボタンをクリックして下さい。
もしエラーがある場合にはその旨を表示しコンパイルは完了しません。

コンパイル(再構築)が正常終了したら、出来上がったアプリケーション・プログラムを実行してみて下さい。
メニュー「実行」→「実行」をクリックして下さい。

作成したテストプログラムが実行されます。
 
ListBoxやComboBoxの表示の仕方等を確認して下さい。ComboBox右横の[▼]をクリックすると選択一覧項目が表示されます。
 
画面の右上にある[×]ボタンをクリックすると終了されます。

まずは、ListBox1の選択一覧項目内からクリックして選択をすると上に配置したLabel1にその内容を表示するようにしてみます。
 
ListBox1をクリックした時、という事で、オブジェクトインスペクタ画面で ListBox1 オブジェクトの OnClickイベント欄でダブルクリックすると「ListBox1Click」という文字が入ります。
 
コードエディタ画面に
procedure TForm1.ListBox1Click(Sender: TObject);
begin
 
end;
というプログラムコードが追加されます。これを下記のように記述します。
// ListBox1クリック時
procedure TForm1.ListBox1Click(Sender: TObject);
var
 i : integer ;
begin
 i := ListBox1.ItemIndex ;
 if (i >= 0) then
  Label1.Caption := ListBox1.Items[i] ;
end;
ListBox内でどの項目を選択しているのかを知るには、ItemIndexプロパティを利用します。この値が「-1」の場合には「未選択」で、「0」の場合は1番目、「1」の場合は2番目・・・と 0 から順番に1ずつ増えていきます。
その項目内容を知るには、Items[○]プロパティ(文字列値)を利用します。○は0から始まるインデックス番号で、ItemIndexの値がそのまま利用出来ます。但し、-1値や最大値を越えるとエラーしますので注意が必要です。最大値は、ListBox1.Items.Count というように、Itemsプロパティの Count プロパティを利用出来ます。
 
[=]ボタンを押したとき、つまり、Button1 をクリックした時に計算を行う、という事は、Button1 オブジェクトの OnClickイベント内で計算・結果表示を行うプログラミングを施します。
 
オブジェクトインスペクタ画面でButton1 オブジェクトの OnClickイベント欄でダブルクリックすると「Button1Click」という文字が入ります。
 
コードエディタ画面に
procedure TForm1.Button1Click(Sender: TObject);
begin
 
end;
というプログラムコードが追加されます。これを下記のように記述します。
// 文字列から整数へ変換
function IVal(S:String) : Integer ;
var
 a, Code : Integer ;
begin
 Val(S, a , Code);
 Result := a ;
end;
 
// [=]クリック時
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
begin
 a := IVal(Label1.Caption) ;
 b := IVal(ComboBox1.Text) ;
 c := a + b ;
 Edit1.Text := IntToStr(c) ;
end;
文字列値から整数値への変換は、先に作成した自作関数 IValを利用します。ListBox1オブジェクトで選択した内容は、Label1.Captionに表示させていますのでこれを利用し、ComboBox1で入力、又は、一覧から選択した内容は ComboBox1オブジェクトの Textプロパティで取得出来ますのでこれを利用します。そして、足し算の結果を Edit1オブジェクトに表示させています。
 
メニュー「ファイル」→「すべて保存」をクリックしてプログラムの保存を行い、メニュー「プロジェクト」→「Project1 を再構築」をクリックしてプログラムのコンパイル(再構築)を行い、正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
ListBox1での項目選択、
ComboBox1での数値入力、
ComboBox1での項目選択、
[=]ボタンをクリックして計算結果の確認、等を実際に行ってみて下さい。

 

 

 

 

 
 
ComboBox1オブジェクトの初期状態が「ComboBox1」となっていますので、最初(インデックス 0)の選択項目を表示させたい場合には、オブジェクトインスペクタ画面でComboBox1 オブジェクトの ItemIndexプロパティの値を「0」にします。選択項目内容ではなく自由な内容にしたい場合には、Textプロパティの内容を指定します。

指定した内容はフォーム Form1 画面に反映されます。

ComboBoxオブジェクトには、手入力と選択項目から選べるタイプ(標準状態)と、手入力が出来ず選択項目から選ぶのみのタイプがあります。
 
オブジェクトインスペクタ画面でComboBox1 オブジェクトの Style プロパティの内容を確認して下さい。右横の[▼]をクリックすると幾つかのタイプから選べるようになっています。初期標準状態は「csDropDown」で、これは手入力と選択項目からの選択の両方が出来るタイプです。そして、「csDropDownList」は手入力が出来ず選択項目から選択するタイプです。それ以外はほとんど利用されませんのでここでは触れません。
※後者のタイプは、Textプロパティを見て内容を取得する事は出来ますがTextプロパティに値を入れるという事は出来ません。

試しに「csDropDownList」を選んでみます。

メニュー「ファイル」→「すべて保存」をクリックしてプログラムの保存を行い、メニュー「プロジェクト」→「Project1 を再構築」をクリックしてプログラムのコンパイル(再構築)を行い、正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
ComboBoxで一覧項目からの選択は出来るけれども、手入力が出来ないというのが確認出来ます。
 
次に、ListBoxやComboBoxオブジェクトの一覧項目内容を実行時に追加したり削除したり出来るようにしてみましょう。Itemsプロパティには色々なプロパティやメソッドが利用出来るようになっており、一覧項目内容を追加する Addメソッド、指定した一覧項目内容を削除する Deleteメソッドなどがあります。
 
Button2、Edit2、Button3 オブジェクトをフォーム Form1 画面に配置し、Button2 オブジェクトの Caption プロパティを「削除」、Button3 オブジェクトの Caption プロパティを「追加」とします。

オブジェクトインスペクタ画面でButton2 オブジェクトの OnClickイベント欄でダブルクリックすると「Button2Click」という文字が入ります。
 
コードエディタ画面に
procedure TForm1.Button2Click(Sender: TObject);
begin
 
end;
というプログラムコードが追加されます。これを下記のように記述します。
// [削除]
procedure TForm1.Button2Click(Sender: TObject);
var
 i : integer ;
begin
 i := ListBox1.Items.Count ;  // リスト数を取得
 if (i = 0) then exit ;     // 空の場合は終了
 
 i := ListBox1.ItemIndex ;   // 選択した項目
 if (i = -1) then exit ;    // 選択していないので終了
 
 ListBox1.Items.Delete(i);   // 項目を削除
end;
ListBox1の一覧項目の最大数を取得し、それが 0 の場合には、「exit;」でこのイベントハンドラを抜け出します。つまり、このイベントハンドラ内の以降の処理は行いません。中身が既に空の場合には、それ以上削除出来ないので、そういうチェックを入れています。
選択した項目を削除したいので、選択した項目のインデックス番号を取得します。もし選択していない場合(値が -1 の場合)は、このイベントハンドラを抜け出します。選択した項目が有効な場合は、 ListBox1 オブジェクトの Items の Delete メソッドを利用して、その項目を削除します。
 
オブジェクトインスペクタ画面でButton3 オブジェクトの OnClickイベント欄でダブルクリックすると「Button3Click」という文字が入ります。
 
コードエディタ画面に
procedure TForm1.Button3Click(Sender: TObject);
begin
 
end;
というプログラムコードが追加されます。これを下記のように記述します。
// [追加]
procedure TForm1.Button3Click(Sender: TObject);
var
 s : string ;
begin
 s := Edit2.Text ;
 if (s <> '') then
  ListBox1.Items.Add(s);  // 項目を追加
end;
すぐ上に配置した Edit2 オブジェクトに入力した内容を一覧項目に追加しますので、文字列変数 s に Edit2 オブジェクトの Text プロパティ内容を代入し、それが空でなければ、ListBox1 オブジェクトの Items の Add メソッドを利用して、その項目追加を行います。
 
メニュー「ファイル」→「すべて保存」をクリックしてプログラムの保存を行い、メニュー「プロジェクト」→「Project1 を再構築」をクリックしてプログラムのコンパイル(再構築)を行い、正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
例えば、選択一覧項目のうち「200」をクリックして[削除]ボタンをクリックすると、その項目が無くなるのが確認出来ます。
 
また、「2000」と入力して[追加]ボタンをクリックすると、選択一覧項目に「2000」が追加されるのが確認出来ます。


 


 
次に、ComboBox1 の選択一覧項目ですが、これは[=]ボタンをクリックした時に、手入力した内容を登録するようにします。また、入力した内容が既に選択一覧項目にある場合には登録しないようにします。同じ内容が何個もあっても不要ですので。その前に、ComboBox1 オブジェクトの Style プロパティを「csDropDown」に戻して手入力出来るようにしておいて下さい。
 
オブジェクトインスペクタ画面でButton1 オブジェクトの OnClickイベント欄でダブルクリックするか、コードエディタ画面で「procedure TForm1.Button1Click(〜」のある箇所へ画面スクロールさせて移動して下さい。
 
コードエディタ画面に
// [=]クリック時
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
begin
 a := IVal(Label1.Caption) ;
 b := IVal(ComboBox1.Text) ;
 c := a + b ;
 Edit1.Text := IntToStr(c) ;
end;
というプログラムコードを下記のように追加記述します。
// [=]クリック時
procedure TForm1.Button1Click(Sender: TObject);
var
 a , b , c : integer ;
 s : string ;
begin
 a := IVal(Label1.Caption) ;
 b := IVal(ComboBox1.Text) ;
 c := a + b ;
 Edit1.Text := IntToStr(c) ;
 // ComboBox追加
 s := ComboBox1.Text ;
 if (ComboBox1.Items.IndexOf(s) = -1) then
  ComboBox1.Items.Add(s);
end;
変数 s に、ComboBox1オブジェクトで入力/選択した内容を代入します。その内容が既に選択一覧項目内にあるのかどうかを調べるため、ComboBox1 オブジェクトの Items プロパティの IndexOf メソッドを利用します。引数で渡した文字列があるかどうかを検索し、あった場合にはそのインデックス番号(0〜)を返し、無かった場合には -1値を返します。ですので、「if (ComboBox1.Items.IndexOf(s) = -1) then 〜」というのは、入力した内容が見つからなかった場合には、という事になります。そして、見つからなかった場合、ListBox1の場合と同様に、ComboBox1 オブジェクトの Items の Add メソッドを利用して、その項目追加を行います。
 
メニュー「ファイル」→「すべて保存」をクリックしてプログラムの保存を行い、メニュー「プロジェクト」→「Project1 を再構築」をクリックしてプログラムのコンパイル(再構築)を行い、正常終了したら、メニュー「実行」→「実行」をクリックして下さい。
 
ComboBox1 オブジェクトで「1000」と入力し[=]ボタンをクリックして計算を行った後、ComboBox1 オブジェクトの選択一覧項目を確認すると、先程入力した「1000」が追加されるのが確認出来ます。
 
また、「2000」と入力し[=]ボタンをクリックして計算を行った後、ComboBox1 オブジェクトの選択一覧項目を確認すると、先程入力した「2000」が追加されるのが確認出来ます。
 
しかし、「500」と入力し[=]ボタンをクリックして計算を行った後、「500」は既に選択一覧項目内にありますので、追加されていないのが確認出来ます。


 


 


 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
 01 02 03 04
 05 06 07 08
 09 10 11 12
 13 14 15 16
 17 18 19 20
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.