DelphiからDBを表示する

InterBase7.5で作成したデータベースを、Delphi2006で表示してみます。
できればおなぐさみ~
※この方法は、ナッキー様のページを参考にさせていただきました。

コンポーネントの準備

Delphiを起動します。Form1のキャプションに「住所録」と入力し、Nameに「frmMain」としました。
フォームに直接コンポーネントを配置せずに、コンポーネントを一括で管理するために、データモジュールを使うことにします。
「ファイル」→「新規作成」→「その他」から「データモジュール」をクリックし、データモジュールを作成しました。これに「Data.pas」という名前を付けて保存しました。
interbase-19

このデータモジュールールを使うには、フォームから、「ファイル」→「ユニットを使う」をクリックし、目的のユニットを選択します。(ここではData.pas)

データモジュールに、コンポーネントを3つ配置します。
ツールパレットの「dbExpress」から「TSQLConnection」コンポーネントと「TSimpelDataSet」を、「Data Access」から「TDataSource」を配置します。

「SQLConnection1」を右クリックし「接続の設定」を選択します。
「dbExpress接続」ダイアログボックスが表示されるので、「+」をクリックし、新しい接続を設定します。
ドライバ名には、「Interbase」を選択し、接続名を入力し「OK」をクリックします。
ここでは「CUSTOMERDB」と入力しました。

interbase-21
接続名が表示されますので、赤く囲んだところを確認します。
データベースと文字コードです。

interbase-20

配置したコンポーネントにプロパティを設定します。

SQLConnection1の「LoginPrompt」(データベース)をFalseに、Connected(データベース)をTrueに設定します。

SimpleDataSet1の「Connection」(リンク)には「SQLConnection1」を、CommandType(リンク)に「ctTable 」を、CommandTextからテーブル名を入力(選択)します。ここでは「Meibo」を選択しています。ActiveプロパティをTrueにします。

DataSource1のDataSetには「SImpleDataSet1」を入力します。(選択)
Connectionには「SQLConnection1」を入力します。(選択)
Activeを「True」にします。

interbase-17

コンポーネントの準備ができたら、項目の準備です。
interbase-22SimpleDataSet1コンポーネントで右クリックし、「項目の設定」をクリックします。
空白のダイアログボックスが表示されるので、画面の白いところで右クリックをし、コンテキストメニューの「すべての項目の追加」をクリックします。

白いところが項目名で埋まりました。
この場面から新しい項目の作成などもできるようです。

 

 

 

 テーブルの内容を表示する

メインフォームに、「TDBGrid」を配置します。
データベースの「DataSource」プロパティに、「DataModule1.DataSource1」を選択(入力)します。
※DataModuleは1とは限らない。
Visibleを「True」に設定すると、テーブルの内容が表示されます。

実行すると次のように表示されました。
これで、InterBase7.5で作成したデータベースに、Delphiからアクセスすることができました。
やったね!
interbase-23

 

InterBase7.5でデータベース作成

さて、いよいよインターベースでデータベースを作成してみよう。うまくいくかしら?
前項では、サーバーに接続するところまでやってみました。
「IBConsole」が起動して、画面に「LocalServer-gds_db」と出ていますので、これを選択し、「データベース」メニューから「データベースの作成」をクリックします。

interbase-7

「データベースの作成」ダイアログボックスが表示されます。
Filename(s)にデータベース名をパスごと入力します。
「Default Character Set」のコンボボックスから「SJIS_0208」を選択し「OK」をクリックします。

interbase-8

CUSTOMER.DBができて、下側に項目が並びます。
項目から「Tables」を選択し、ウィンドウの右側で右クリックし、「作成」をクリックします。
interbase-9

「テーブルエディター」が表示されます。
ここで、テーブル名とフィールドを設定します。テーブル名は「MEIBO」としました。
英語とローマ字がゴチャゴチャになってます(^^;
N88日本語Basic(古い?)を少しだけ教わったのですが、内山先生は「予約語と間違えるから変数はローマ字でいい」なんてことをおっしゃってましたが、プログラムを書く人って、みなさん項目名や変数名には英語を使いますよね。

interbase-10

「フィールドの追加 」ボタンをクリックします。
次のようなダイアログボックスが表示されるので、項目名を入力し、「データ型の編集」ボタンをクリックし、データのタイプを入力します。文字型の場合は、キャラクタセットから「SJIS_0208」を選択します。
キーになる項目(この場合はCODE)には、左下の「プライマリキー」ボタンをクリックします。※重複しないキー

interbase-11

とりあえず、こんな感じで入力してみました。あとでも変更可能なので。
interbase-12

データの入力

左項目の「Tables」を選択し、右側ウィンドウのテーブル名(MEIBO)をダブルクリックします。
interbase-15

データを入力する画面に切り替わります。
メニューの「データ」をクリックします。次のような画面になりますので、<null>というところにデータを入力します。

interbase-13

こんな感じでダミーのデータを入力してみました。
interbase-14

とりあえずは、データベースを作って、テーブルにデータを入れるところまでできました。
Delphiで表示できるようになるでしょうか?ちと不安・・・かも

Windows7でInterBase7.5 に接続

Delphi2006のCDにInterBase7.5が入っているのに、インストールさえできませんでした。
「この機械の環境にはインストールできません」ってなメッセージを頂戴しました。
何とか方法があるのではないかと、何度目かのインストール時に画面の横のほうに出てきたメッセージ、詳しくは忘れましたが(適切な方法でインストールをやってみますか)みたいなことが書いてありました。
これをクリックしたら、Windows7にインストールができました。
なんせ古いソフトなので、いろいろ使うのに難しいです。

インストールはできたものの、接続できなくてまた一苦労しました。
そこで忘備録しておこうと思います。

InterBase7.5 をサービスとして起動させる

  1. Windowsのコントロールパネルの「管理ツール」から「サービス」を選択し、一覧から「InterBase7.5 gbs_db Guardian」を選択します。
    interbase-1
  2. 右クリックで「プロパティ」を表示し「ログオン」タブをクリックします。
    ここではログイン中のアカウントとパスワード(Windows)を入力し、「OK」をクリックします。
    interbase-2
  3. InterBase7.5 gds_db Server にも同様の操作を行います。

InterBaseを起動する

  1. Windowsのスタートメニューから、「InterBaseサービスマネージャー」をクリックして起動します。
    「InterBaseをWindowsサービスとして起動する」のチェックを外し、「起動」ボタンをクリックします。
    ※InterBaseを使うときには、稼働しておきます。
    interbase-3
    このように変わります。
    interbase-4

サーバーに接続する

  1. スタートメニューから「IBConsole」をクリックします。
    interbase-5
  2. メニューから「サーバー」-「登録」をクリックします。
    interbase-6
    ここで、ユーザー名とパスワードを入力し、「OK」をクリックします。
    ユーザー名が「SYSDBA」パスワードが「masterkey」です。
    実はここで躓きました。いくらやっても接続できなかったのです。
    最初に入れたPWは大文字で入力しました(Webにあった)。
    さらにWebをググってみると、小文字のPWを見つけたので、小文字で入れなおしたらつながりました。
    環境によっても違うのかしら?定かではありません。

    サーバーにつながれば、あとはデータベースの作成です。
    それは別項でやってみます。

 

名簿DB-計算項目

年齢を入力する項目「birth」から、値を取り出して、年齢を計算させてみました。
すぐに忘れる弱頭脳なので、ここも忘備録を書いておきます。

前回、値の参照をやってみましたが、同じような方法で計算した結果を表示させることができます。
「ABSTable1」を右クリックして、「項目の設定」-「項目の新規作成」を選択します。
次のような「AGE」項目を追加しました。ここで「計算項目」にチェックをします。
address7

address8

上画像のDBEdit(歳の前)「DataField」プロパティに、項目名「AGE」を入れます。(選択)

次はいよいよプログラムを書きます。数行ですけど。
ABSTable1を選択し、OnCalcFieldsイベントをダブルクリックします。
address9

イベントには次のようなプログラムを書きます。
日付を分解してくれるという便利な関数があるみたいです。
便利ですねぇ・・・Delphi好きになりそうです(^^;

//計算フィールドの実行
procedure TMainForm.ABSTable1CalcFields(DataSet: TDataSet);
var
  theDateTime: TDateTime; //日付型変数
  theYear, theMonth, theDate: Word;//ワード型変数
  theNowYear: Word;
begin
  //誕生日フィールドの値を取得
  theDateTime := ABSTable1.FieldByName('birth').AsDateTime;
  //指定された日付を年・月・日に分解する関数
  DecodeDate(theDateTime, theYear, theMonth, theDate);
  //今日の日付を分解
  DecodeDate(Now, theNowYear, theMonth, theDate);
  //年齢を計算し、計算項目に結果を代入
  ABSTable1.FieldByName('AGE').AsInteger := theNowYear - theYear;
end;

実行結果

address10

名簿DB-値の参照

簡単な関連付けをやってみました。

  1. DBManagerから、meibo.ABS(データベース)を開き、「kind」項目を削除しました。
    代わりに「kind_code」フィールドを追加しました。2つのテーブルをつなぐキーです。
    (Integer型)
  2. Tableメニューをクリックし、「Create Table」を選択しました。
    英語なのが難点ですが、このぐらいの英語ならばなんとか・・・(^^;
    address2
    次にフィールドを作成します。
    Tableメニューの「Restructure Table」をクリックしたら、フィールドの設定画面らしきものが現れました。ここでフィールド(項目)の、削除や編集ができるようです。
    address3
  3. データベースの準備が整ったので、DBManagerをとじて、Delphiを起動しプロジェクトファイルを開きます。
  4. フォームに、「ABSTable2」「DataSource2」コンポーネントを追加します。
    「ABSTable2」のTablenameには「kind」を設定し、「DataSource2」のDataSetには「ABSTable2」を設定します。
    address1
  5. 「ABSTable2」を右クリックして、「項目の設定」-「項目の新規作成」を選択します。
    address6
    次のように、関連づける項目を設定します。
    address4
    新しい項目「kind」が作られて、同じキーを参照して値を挿入します。
  6. 実行すると、こんなふうに別テーブルのデータを参照してきます。
    address5

名簿DB-SQL

まったくわかりませんでした。
せっかく、AbsoluteDatabaseに接続できたというのに、そこから進めないのです。
日本語のサイトも見つからず、日本語の解説本もありません。

試行錯誤しながら滅茶苦茶やってみても、なかなかうまくいかなかったのですが、一度「TDataSource」コンポーネントを削除してやりなおしたらできました。すごく疲れて途中でやめたくなりましたよ。私のような頭の悪い人間にはプログラムはしんどい・・・

db3

  • 「TABSTable」コンポーネントを削除して、「TABSQuery」コンポーネントを貼り付けました。
    (「TDataSource」は一度削除して、貼り付けなおしました。)

db4

TABSQueryコンポーネントを選択して、Activeプロパティを True に設定しました。
SQLプロパティの(TStrings)をクリックすると、「文字列リストの設定」画面が開きますので、ここにSQLのコードを入力しました。
サンプルは、住所1で並べ変えてみました。
一度 TDataSourceコンポーネントを削除したので、TBGridコントロールやDBEditコントロールのDataSourceプロパティを再設定しました。

実行結果

db5

名簿DB -接続

前回は、データベースに接続ができたところまででした。Delphiに入っているParadoxのファイルを、Absoloteに変換して、Delphiで表示するところまでできました。
今度は自分でデータベースを作ってみようと思います。

最初に、DBmanager(AbsoluteDatabaseの中にある)を起動して、データベースを作りました。
全部英語ですが、フィールドを設定するだけなので、難しくはありません。
とりあえずわかるところだけ(名前と型とサイズ)入れて保存しました。
データベース名は「meibo.ABS」としました。

meibo3

Delphiを立ち上げ新しいプロジェクトを作成し、フォームに、ツールから下記コンポーネントを貼り付けました。
「Absolute DB」から、「ABSDatabase」「ABSTable」ツールパレットの「Data Access」から、「DataSource」、「Data Controls」から「DBNavigator」「DBGrid1」 コントロールです。

meibo2

左上のテキストエディタは、[ABSTable1」を右クリックし、「項目の設定」をクリックすると細長いフォームが出ます。
画面の上で右クリックし「項目の追加」を選び、項目を追加します。
その項目をフォームにドラッグすると、テキストエディタとラベルがフォームに貼り付けられます。
実行すると、1レコード分のデータが表示されます。

さてと、データの表示と追加や削除はこれでできますが、それだけではとてもデータベースとは呼べませんよね。
次からが難題です。SQLを使うのだと思いますが、どうやったらよいのかさっぱりです。
私はDBはMSAccessを使っているので、SQLを自分で書かなくてもクエリは作れるので、ほとんど経験がありません。
Absoluteで検索しても日本語で使い方を教えてくれるページは見つかりませんし、どぉしよ。
明日考えよう(^^;

 

 

アンケートプログラム

いやぁ、ちょっと苦労しちゃいました。
コードそのものは見たままを写しているだけなのですが、プロパティの名前とかを同じにしてなかったり、タイプミスやらでなかなかまともに動きませんでした。
でも、間違えたおかげで覚えることも多いので、いいのかな。

実行結果はこんな感じです。

ankeito1

今回はいろいろなことをやりました。

  • 別のユニットを使いました。メインのフォームに貼り付けた「編集」ボタンをクリックすると、別フォームが出て、ここに入力をして「更新」ボタンを押すと、メインのリストボックスに更新データが表示されるのです。
  • データを入力して「追加」をクリックすると、下のリストボックスにデータが入力されます。
  • 「保存」をクリックすると、指定したファイル名で保存され、「読み込み」では保存データを読み込みます。
  • コンポーネントも、チェックボックスやラジオボタン、コンボボックスなどいろいろ使っています。

さて、ここまでできるとこれを応用してみたくなります。
もう少し項目を増やせばアドレス帳も作れますね。

落書き帳4-ファイル

落書き帳を使って、ファイルの読み書きをやってみます。
せっかく描いたものだからやっぱり保存はしたいものね

フォームに次の2つのダイアログを貼り付けます。(ツールパネルのDialogs)

oekaki5

この2つのコンポーネントの「DefaultExt」プロパティを「bmp」にします。
FIlterプロパティのダイアログボタンをクリックし、表示されるなかから、ビットマップ以外を削除します。

oekaki6

「名前を付けて保存」が選択されたときのイベントハンドラ
OnClickのところをダブルクリックする


oekaki7

procedure TfrmMain.S1Click(Sender: TObject);
begin
  //名前を付けて保存がクリックされたとき
  if SavePictureDialog1.Execute then
  begin
    bmpArea.SaveToFile(SavePictureDialog1.FileName);
    Caption := Application.Title + ' - ' + SavePictureDialog1.FileName;
    S1.Enabled := False;
  end;
end;

こんなダイアログが開きます。
さあて何か保存してみようかなぁ

oekaki8

やった!
ちゃんと保存されてました。ブラシだけで描いているのかなりヒドイですけど

oekaki9

 ファイルを開く

保存したファイルを開くほうもやってみました。
こんな感じです。

oekaki10

もう少しあるんだけど、なんだか疲れちゃったので、落書き帳はここでいったんお休みします。
次の課題をやってみようと思います。

落書き帳その3

今日も落書き帳のバージョンアップです。

優れたお絵かきソフトがあるので、このような稚拙なお絵かきは使いませんが、プログラムのお勉強なのでいろいろとやってみます。N88日本語BasicやQuickBasickなんぞをちょこっと触った身としては、昨今の言語ソフトはなんと便利なのかと感心するばかりです。昨今じゃないか・・・コレ2006だから結構古いんだよね。

何をやったのかというと次の3点です。

  1. マウスカーソルの位置をステータスバーに表示する
  2. メニューバーを作成する
  3. ファイルをとじるときに、メッセージダイアログボックスを開いて確認メッセージを表示する

oekaki3

メニューバーに使ったのは、「Standard」の「TMainMenu」コンポーネントです。
中身(プログラム)はまだ作っていませんので、設定したのはCaptionとショートカットのみです。

oekaki4