ナッキーの「Turbo Delphiはじめて奮戦記」 - 第17回 アンケートプログラムでデータベース操作

投稿者: : Hitoshi Fujii

概要: 前回データベース対応したアンケートプログラムですが、データベースを使わなかった第15回のアンケートプログラムの機能を持ちません。追加や削除のボタンを作りながら、データベースのデータを扱う方法を学びます。

Hide image
nacky75

ナッキー

前回のデータベースはやっぱり難しかったな。画面を作るのはすごく簡単だったけど、データベースを扱うのは難しそう。

 

Hide image
takahashi75

高橋先生

まだ、コンポーネントを配置しただけだから、データベースを扱った実感がないのかもしれないね。今回は実際にデータベースをコードで操作してみよう。


    データベースについてもう一度

データベースについて何となくはわかったけど、もう一度聞いておきたいな。教えて、高橋先生!

高橋先生:じゃあもう一度おさらいしながら、データベース操作に必要な説明をしよう。ここに出てくるデータベースは、「リレーショナルデータベース」という種類のデータベースのこと。データベースは、データベース管理システム(DBMS)に管理されたデータの集まりだ。データを表のような形で参照することができる。テーブル(表)やクエリのデータセットは関連するデータの集まりのレコード(行)と、同じ種類の集まりのフィールド(項目)でできている。データを扱うときも、どのレコードのどのフィールドかを知る必要があるよ。

Hide image
01レコードとフィールド

図01 レコードとフィールド

ナッキー:そういえば、レコードとかフィールドってでてきたの覚えてます。

高橋先生:レコードはデータベースを扱うときの単位の1つ。テーブルの中では1度に扱えるレコードは1つだけなんだ。そのレコードのことをカレントレコードと呼ぶよ。内容を参照するにしても、削除するにしても、操作したいレコードの箇所にカレントレコードを移してから作業しなくちゃならない。

ナッキー:カレントレコードしか操作できないんですね。でもカレントレコードを移すってどういう感じだろう?

高橋先生:穴の開いたカードがあるとしよう。1レコード分が見える穴の開いたカードだ。見えているレコードがカレントレコードということだとする。穴の開いた部分を下や上にずらすと、1レコードずつ見ることができる。

Hide image
02カレントレコード

図02 カレントレコード

ただ見るだけではなくて、穴の位置を移動する作業が必要なんだ。前回作ったアンケートプログラムでは表のように見えるTDBGridコンポーネントを使っていたから、マウスでクリックするとカレントレコードの移動ができる。コード上で移動するにはTSimpleDataSetコンポーネントのメソッドを使って移動できるよ。

ナッキー:カレントレコードの移動は、コンポーネントやメソッドを使ってできるのね。コードでレコードの操作するときはTSimpleDataSetコンポーネントのメソッドを使ってするんだ。

高橋先生:レコード操作をするときに気にしてほしいのは、データセットの状態だ。コンポーネントを使うと自動的にデータセットの状態を変化させてくれることがあるけれど、任意で遷移させることもできるよ。まずは閉じている状態。値の参照など何もできない。データセットの設定は閉じている状態で行う。次に開いている状態。これで、データの読み取りができる。それから編集状態。カレントレコードを変更できる。編集状態に似ているのが追加状態。新しいデータを追加することができる。編集状態、追加状態共にデータベースには反映していない。編集状態の時にはデータバッファという作業用の場所に変更がたまっているだけになるよ。データバッファの変更情報をデータベースサーバーに書き込むと、開いている状態に戻る。

任意で状態を変化させるならTSimpleDataSetのメソッドを使うといいね。

状態

できること

メソッド

閉じている状態

テーブルやデータベースの設定ができる

Close

開いている状態

データの読み取りができる

Open

編集状態

データベースの編集ができる

Edit


開いている状態にするのは「Open」メソッドのほかにActiveプロパティをTrueにしても変更できる。データベースサーバーに書き込むには「ApplyUpdates」メソッドを使おう。

ナッキー:編集するのは開くだけじゃダメなのね。作業に適した状態があるんだ。今Activeプロパティは「True」にしてあるから読み取りができる状態ね。


    画面を整える

前回やったことも少しは思い出しました。これからデータベースの操作をするのかな?

高橋先生:まずは現在のプログラムをもう少し整えよう。ラベルが英語のままなので日本語にしよう。項目コンポーネントのラベルにはフィールド名が採用される。データベースのフィールド名には半角の英数字しか使えないことが多いから、全角の名前がつけられない。そこでフィールド名のほかに項目コンポーネントのプロパティを設定しよう。

ナッキー:項目コンポーネントってどんなコンポーネントでしたっけ?

高橋先生:TSimpleDataSetコンポーネントをダブルクリックして表示する項目エディタで登録したコンポーネントだよ。フォームにドラッグしてコンポーネントを配置したよね。

ナッキー:コンポーネントがずらーっと並んで楽しかったです。

高橋先生:その項目コンポーネントだよ。それぞれに「DisplayLabel」プロパティで名前を入力すると、ラベル名に採用される。たとえばTDBGridコンポーネントのタイトルにも使われるよ。TDBEditコンポーネントについているラベルは変更されない。配置する前にDisplayLabelプロパティが設定されていないと反映しないんだ。だから、TLabelコンポーネントとTDBEditコンポーネントは、削除してもう1度配置してみよう。コンポーネントの幅を調整して見やすくしてね。

ナッキー:えー。せっかく配置したのにもったいないな。でもドラッグするだけだからラベルを全部書き直すよりは楽なのね。


まずはInterBase サービスマネージャーを起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Develper [instance = gds_db]」の「InterBase サービスマネージャー [instance = gds_db]」をクリックします。「ステータス(T)」欄に、「InterBaseをWindowsサービスとして起動する」にチェックが付いていないことを確認します。「InterBaseサーバーは停止中」となっていれば、[起動(S)]ボタンをクリックして起動します。「InterBaseサーバーは稼動中」と変化したのを確認して[閉じる](×)ボタンで終了します。

Hide image
03サービスマネージャー

図03 InterBase サービスマネージャー

次にプロジェクトを開きます。Turbo Delphiを起動して、画面中央の「ホームページ」で「ProfileDB.bdsproj」を選択。もし一覧に表示されていなければ、ツールバーの[プロジェクトを開く(Ctrl+F11)]ボタンをクリックします。「プロジェクトを開く」ダイアログボックスから「ProfileDB.bdsproj」を探します。もしも、プロジェクトを開くとき「dbExpressエラー:[0x0015]:接続失敗」といったエラーメッセージが表示されたら、もう1度InterBase サービスマネージャーを起動してInterBaseサーバーが起動しているか確認してみて欲しいんですって。

Hide image
04エラーメッセージ

図04 エラーメッセージ

画面上部の「FormProfileDB」タブを選択して、画面をフォームデザイナに切り替えます。フォーム上に前回作ったデータが表示されていなければ、「SQLConnection1」コンポーネントを探して「データベース」カテゴリで「Connected」プロパティを「True」にします。さらに「SimpleDataSet1」を選択して、「その他」カテゴリの「Active」プロパティを「True」にしておきます。

データベースに接続できたら、項目エディタを表示します。SimpleDataSet1コンポーネントを探してダブルクリック、もしくは右ボタンクリックして「項目の設定(T)...」を選択します。項目エディタに登録した項目コンポーネントを選択して、DisplayLabelプロパティを変更します。「ID」はそのままにして、以下の表を参考に変更します。

FULLNAME

カテゴリ名

プロパティ名

設定値

ローカライズ対象

DisplayLabel

名前


ADDRESS

カテゴリ名

プロパティ名

設定値

ローカライズ対象

DisplayLabel

住所


BIRTHDAY

カテゴリ名

プロパティ名

設定値

ローカライズ対象

DisplayLabel

誕生日


MALE

カテゴリ名

プロパティ名

設定値

ローカライズ対象

DisplayLabel

性別


PET

カテゴリ名

プロパティ名

設定値

ローカライズ対象

DisplayLabel

ペットの有無


DBGrid1コンポーネントの上部にあるタイトルが変更できたことを確認します。うまく変更できたら、画面上部のTLabelとTDBEditのコンポーネントをすべて削除します。TLabelコンポーネントとTDBEditコンポーネントをすべて選択して、キーボードの[Delete]キーを押します。

Hide image
05コンポーネントの削除

図05 コンポーネントの削除

次に、配置を整えるためにTPanelコンポーネントを配置します。データベース接続のSQLConnection1、SimpleDataSet1、DataSource1と、DBGrid1はそのままでいいので、画面右下のツールパレットから「Standard」カテゴリの「TPanel」をDBGrid1上部に1つ配置します。

Hide image
06TPanelコンポーネントの配

図06 TPanelコンポーネントの配置

ほかのコンポーネントを配置するためにプロパティも設定します。Panel1を選択して、画面左下のオブジェクトインスペクタ、プロパティページで「ローカライズ対象」カテゴリの「Caption」を削除します。「レイアウト」カテゴリの「Align」プロパティを「alTop」にします。

Panel1

カテゴリ名

プロパティ名

設定値

ローカライズ対象

Caption

内容を削除

レイアウト

Align

alTop


さらに高さを広げてDBGrid1の近くまで伸ばします。次にDBGrid1のAlignプロパティも設定します。DBGrid1を選択して、「レイアウト」カテゴリの「Align」プロパティを「alClient」にしておきます。

DBGrid1

カテゴリ名

プロパティ名

設定値

レイアウト

Align

alClient



Hide image
07ベースのレイアウト

図07 ベースのレイアウト

設定ができたら、項目エディタからすべての項目をドラッグしてパネルの左上に配置します。今度はラベルが日本語で表示されます。

Hide image
08項目コンポーネントの配置

図08 項目コンポーネントの配置

次に配置したコンポーネントの幅を調整します。住所などはドラッグで調整しにくいのでDBEdit3コンポーネントを選択して、「Width」プロパティに「150」程度を入力してから幅を整えると操作しやすいです。

DBGrid1コンポーネントの項目の幅も調整します。こちらも住所が調整しにくいのでプロパティを使います。プロパティを使うためには「カラムエディタ」を使用します。DBGrid1コンポーネントをダブルクリックするか、右ボタンクリックして「カラムエディタ(L)...」を選択します。

Hide image
09カラムエディタ

図09 カラムエディタ

ツールバーの左から3番目[すべての項目の追加]ボタンをクリックして項目を追加します。「ADDRESS」を選択してWidthプロパティを「100」程度にします。

Hide image
10幅の調整

図10 幅の調整

ドラッグですべての項目がDBGrid1コンポーネントに表示できるように幅を調整します。設定できたらカラムエディタは閉じておきます。

Hide image
11配置完了

図11 配置完了

高橋先生:性別やペットの有無は、「True」や「False」では、どちらが何を示しているかがわかりにくいね。わかりやすくするために、項目コンポーネントの「DisplayValues」プロパティに、「Trueのときの値;Falseのときの値」をセットしよう。「MALE」の場合は「男性;女性」、「PET」の場合は「有;無」とする。

ナッキー:そうすると、表の中に「男性」とか「無」と表示されるんですね。

高橋先生:ただし、この設定はTDBGridコンポーネントしか反映しないんだ。TDBCheckBoxコンポーネントは変化がないよ。


Boolean型のデータを、値に置き換えて表示できるようにします。項目エディタで「MALE」を選択します。プロパティページの「ローカライズ対象」カテゴリで「DisplayValues」プロパティに、「男性;女性」と入力します。「;」(セミコロン)は半角で入力します。同様にして項目エディタで「PET」を選択します。「DisplayValues」プロパティで「有;無」と入力します。DBGrid1を確認します。正しく設定できたら、性別欄は「男性」か「女性」ペット欄は「有」か「無」となります。

Hide image
12DisplayValuesの設定

図12 DisplayValuesの設定

高橋先生:もうちょっと、設定をしよう。日付の入力は西暦、年、月の順で間に「/」を入れるんだ。記述の方法がそろっていないとうまくいかないから項目コンポーネントの「EditMask」プロパティを設定する。ここで「!9999/99/00;1;_」と入力すると入力しやすくなる。ダイアログボックスを使って設定してもいいよ。

ナッキー:どんなふうに入力しやすいか、よくわからないんですけど。

高橋先生:設定用のダイアログボックスの中に「テスト」欄があるので試してみるといいよ。


じゃあ、設定してみます。項目エディタで「BIRTHDAY」を選択します。プロパティページの「ローカライズ対象」カテゴリで「EditMask」を探します。クリックすると「…」ダイアログボタンが表示されますので、それをクリックします。「入力マスクの設定」ダイアログボックスが表示されます。

Hide image
13入力マスクの設定

図13 入力マスクの設定

右側の「例(S):」から「日付」を選択します。「入力マスク(I):」に「!99/99/00;1;_」と表示されますので、「99」を付け足して「!9999/99/00;1;_」とします。これで西暦を2桁ではなく、4桁で表示することができるんですって。「テスト(T):」欄で試してみることができるんですって。半角数字で入力してみます。「/」は入力しなくてもいいのね。確認できたら[OK]ボタンをクリックします。

このあとコードを記述するので、コンポーネントのNameプロパティを設定します。ついでにフォームのCaptionプロパティも設定します。

※ 手順によってはフォーム名が異なる場合があります。

Form1(フォーム)

カテゴリ名

プロパティ名

設定値

その他

Name

frmProfileDB

ローカライズ対象

Caption

アンケート


DBEdit1(ID)

カテゴリ名

プロパティ名

設定値

その他

Name

dbedtID


DBEdit2(FULLNAME)

カテゴリ名

プロパティ名

設定値

その他

Name

dbedtFullName


DBEdit3(ADDRESS)

カテゴリ名

プロパティ名

設定値

その他

Name

dbedtAddress


DBEdit4(BIRTHDAY)

カテゴリ名

プロパティ名

設定値

その他

Name

dbedtBirthday


DBCheckBox1(MALE)

カテゴリ名

プロパティ名

設定値

その他

Name

dbcbxMale


DBCheckBox2(PET)

カテゴリ名

プロパティ名

設定値

その他

Name

dbcbxPet


DBGrid1

カテゴリ名

プロパティ名

設定値

その他

Name

dbgrdProfile


SimpleDataSet1

カテゴリ名

プロパティ名

設定値

その他

Name

sdsProfile


できたら保存しておきます。ツールバーの[すべて保存]ボタンをクリックします。sdsProfileコンポーネントの項目エディタも使わないので閉じてしまいます。

    追加・削除ボタンを作る

フォームの調整はできましたね。次はデータベースを使って何かするって言ってたけど、何をどうするのかな?教えて、高橋先生!

高橋先生:いよいよ、データベースを操作するボタンを作ろう。まず、作ってもらうのは[追加(A)]ボタンと[削除(D)]ボタンだ。新しいデータの追加と、既存のデータの削除ができるようにする。