月別: 2014年2月

練習問題1 文字列の表示

練習問題1

  1. ボタンをクリックしたら、メッセージを表示する
  2. プログラムを実行する
  3. プロジェクトファイルとユニットファイルを保存する(名前を付ける)
  4. フォーム名とボタン名を変更する(キャプションも)
  5. フォームのタイトルとボタンのキャプションとアプリケーションのタイトルを表示する

一番最初って、こんなところから始めるのではないでしょうか。
いざ出発!

Delphiを起動し、「ツールパレット」の「Standard」から、「Tbutton」コンポーネントをフォームに貼り付けました。

kiso5

「Button1」をダブルクリックし、表れたコードエディタに、次のように入力しました。(beginとendの間)

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('初めてのプログラミングです');
end;

実行ボタンをクリックし「Button1」ボタンをクリックしました。
ここまで、2番までやっつけましたぞ。威張るほどのものでもないか(^^;
kiso6

名前を付けて保存するには、「ファイル」→「名前を付けて保存」をクリックします。
プロジェクトとユニット別々に名前を付けます。

ren1

キャプションと名前は、オブジェクトインスペクタのプロパティで設定します。

ren2

アプリケーションタイトルは「プロジェクト」-「オプション」で設定します。

ren4

ボタンのイベントプロシージャを次のように書き換えます。

procedure TfrmMain.btnJikkouClick(Sender: TObject);
begin
  ShowMessage(frmMain.Caption);
  ShowMessage(btnJikkou.Caption);
  ShowMessage(Application.Title);
end;

実行結果

「OK」をクリックすると、次のメッセージが表示されます。
この命令では1個ずつです。
簡単なプログラムでも、最初からきちんとやったほうがいいわね。
達成感があります。エラそうに(^^;

ren3

Delphi2006の初期画面

基礎をすっとばして、サンプルプログラミングを写して実行するところから始めました。
プログラミングの実行結果が先に見たかったのです。
ですからまだ何が何やら皆目わかっておりません。

我が家にある本は、一番新しいものでもDelphi5です。Delphi2なんていうのもあるんですよねぇ
ちょっと古すぎる気もしますが、こんなのも参考にしながら、分かる範囲で勉強過程を忘備録していこうと思います。

まず、Delphi2006を開いて、新しいプロジェクトを作成したときの画面をキャプチャーしてみました。
こんな感じです。赤丸をしてあるところは一番使いました。

kiso1

コードエディタです。ここにプログラムを書きます。
コ汚くなりましたがちょっとだけ青い色でメモをしときました。
上のほうはDelphiでほとんど入れてくれるようです。いまのところですが。
私が書いたのは、procedure(手続き)というところだけです。

kiso3

 

印刷テスト

print1

詳しい解説は、Mr.XRAY様のところにあるので省きますが、その通りにやったらプレビューできました。
やったネ!
最初は、Mr.XRAYさんのページにあるようにならなかったので、「は~ん、これは何か足りないんだな」と、過去の過ちからすぐに気づきました。足りなそうな分をパッケージに追加したら、バッチリです。

他の印刷にもチャレンジしてみようと思います。

 

データの印刷

「’plprev.dcu’ が見つかりません」1日私を苦しめた文字です。
「もうやめちゃおうかな」と、ふと思いました。
Delphi2006 って、そのままでは印刷できないんです。
印刷するためには、高い別売りのソフトが必要なようです。
MSAccessとかでDBやっている私には到底信じられません。

捨てる神あれば拾う神あり!
Mr.XRAYというお方が印刷用のコンポーネントをご自身のサイトで公開してくれています。
さっそく下記3つのファイルをダウンロードさせていただき解凍しました。
interbase-29

interbase-30

とりあえず、DBGrid印刷というのをインストールしてみようと、Mr.XRAYさんのコンポーネントの登録方法を読みながらチャレンジしてみました。順番としては次の通り。

  1. パスを通す
  2. 登録用パッケージのインストール

Dドライブのルートにフォルダを作ってパスを通し、そこに「plDBGridPrev.dcr」「plDBGridPrev.pas」を入れました。
しかしパッケージをインストールしようとすると、「’plprev.dcu’ が見つかりません」というメッセージで少しも先に進めません。
ググって調べると、ファイルが見つからないのはパスが通ってないからだというご意見が見つかりました。
でもって「きっとパスが通ってないんだわ」と、固く信じ込んでしまったのです。勝手に思い込み・・・

自分で作ったパスをやめて、最初からある「lib」というパスの通ったフォルダにも入れてみましたが、やっぱり同じエラーでした。
かれこれ丸1日、ああだこうだやってみて、あることに気づきました。
エラーはいつも、usesの「plPrev」いうところが赤くなります。
「パスがちゃんと通っているとしたら、plPrvが必要なのでは?」と思い、解凍した「plPrv」フォルダのファイルを、パスの通った(と思う)フォルダに入れました。
私は、Delphiに関してはほぼ無知です。こんな初歩のところにたどり着くのに1日かかりました。
あとで気づいたことですが、Mr.XRAYさんの「インストール方法」には、「プリンタ設定コンポーネントが必要です」とちゃんと書いてありました。
あまりにも情けないので、少しだけ恥の忘備録しておこうと思います(^^;

パスを通す

  1. Dのルートにフォルダ「XRAYp」を作り、解凍したファイル(pasとdcr)を全部入れました。
  2. Delphiを起動し(念のため管理者権限で)DBのあるプロジェクトファイルを開きました。
  3. 「ツール」-「オプション」をクリックし、「Delphiオプション」の「ライブラリ-Win32」を選択しました。
    ライブラリパスの右側の「・・・」をクリックすると、ライブラリパスの一覧ダイアログボックスが開きます。
    下のテキストボックス右側の「・・・」をクリックして、パスを入れ(フォルダの場所)、「追加」ボタンをクリックしました。
    interbase-31

パッケージのインストール

ここは、Mr.XRAYさんの「登録パッケージのインストール」を参考にさせていただきました。
環境は、Delphi2006です。

  1. 「ファイル」-「開く」をクリックし、下記フォルダから、「dclusr.dpk」を開きました。
    interbase-32
    interbase-33
  2. 画面右の「プロジェクトマネージャー」に、「dclusr.bpl」の名前で表示されました。
    この名前(パッケージ)の上で右クリックし「インストール」をクリックしました。
    interbase-35
    インストールがうまくいったときには、「~がインストールされました」のようにメッセージが出ます。
    苦労した後のこのメッセージには「やった!」と歓喜しましたよ~
    interbase-34
  3. パッケージで右クリックし、「上書き保存」をクリックしました。

コンポーネントを登録する

  1. パッケージで右クリックして「追加」を選択します。
    「参照」をクリックして、必要なファイルを選択します。
    interbase-36
  2. パッケージ名(dclusr.bpl)の上で右クリックし、メニューから「再構築」をクリックします。
    これでインストールが終わりです。

印刷

コンポーネントが追加されたので、いよいよ印刷テストしてみます。
フォームに、TplDBGridPrevコンポーネントを配置します。
interbase-37

ボタンを1つ配置し、このボタンのイベントプロシージャに次のコードを書きました。

procedure TMainForm.Button2Click(Sender: TObject);
begin
  plDBGridPrev1.Preview;
end;

実行結果

interbase-28

「印刷」をクリックしたら、プリンタに印刷できました。
たった1日でしたけれど、長く感じられた1日でした。
最後に、Mr.XRAYさま、ありがとうございました。と、ここで言っても伝わらないか(^^;

SQLを使って文字を検索

SQL・・・昨夜から挑戦していますが、まるで雲をつかむようです。 エラーばかりで全然できませんでしたが、今日なんとか1つだけ成功しました。 どうやら、コーテーションのところで躓いていたようです。 「東京花子」を検索したい場合、WHERE NAME = ‘東京花子’ というのが検索文字になります。 この「’」をDelphiで表すには、シングルコーテーションが2つ追加されます。つまり WHERE NAME = ’’’東京花子’’’ のようになるわけです。 これがわからなかった・・・・

下のコードでは、LIKEの後ろの「”’」は%以降の文字列をくくるシングルコーテーションというわけですね。
で、後ろに4つ並んでいるシングルコーテーションは、「’」を入れるためのもの。な~るへそ

procedure TfrmMain.btnSelectClick(Sender: TObject);
  var
    s : string;
begin

  //SQLを使って文字を選択 (NAME LIKE '%TARO%')
  s := '(NAME LIKE''' + '%' +  edtName.Text + '%' + '''' + ')';

  DataModule2.tblAddress.Active := False;
  DataModule2.tblAddress.DataSet.CommandText :=
   'SELECT * FROM MEIBO WHERE' + s ;

  DataModule2.tblAddress.Active := True;
end;

実行結果

「郎」という文字をテキストボックスに入力し、「選択」をクリックしました。名前に「郎」がつくレコードが選択されました。
複雑な検索をするには、フィルターだけでは無理みたいですね。「~を含む」というのはできなかったもの。
だけど、SQL難しそうです。

interbase-27

レコードの操作

InterBase7.5で作ったデータベースを、Delphiから表示させることができました。
やっと入り口に立てたところかな。

今度はレコードの操作をやってみます。
実は、便利なコンポーネントがあるんですよ。「TDBNavigator」コンポーネントです。
↓こんなボタンの集合体です。

interbase-24

しかし、ここでは勉強なので、ボタンを作って、ボタンをクリックしたときに作業するようにプログラムを書いてみようと思います。
こんな便利なのがあるんだから、実際はこれを使うほうが楽だと思いますが・・・
ボタンを5個配置しました。「TButton」コンポーネントです。

interbase-25

ボタンの上でダブルクリックをすると、イベントプロシジャーが開きますので、それぞれのイベントにコードを書きます。

プログラムのソース

//1つ前のレコードへ移動
procedure TfrmMain.btnAddClick(Sender: TObject);
begin
  //レコードを追加する
  DataModule2.tblAddress.Append;
end;

procedure TfrmMain.btnBackClick(Sender: TObject);
begin
  //1つ前のレコードへ移動
 DataModule2.tblAddress.Prior;
end;

procedure TfrmMain.btnDeleteClick(Sender: TObject);
begin
  if MessageDlg('削除してもいいですか?',mtConfirmation,
    [mbYes,mbNo],0) = mrYes then
    DataModule2.tblAddress.Delete;//レコードの削除
end;

//次のレコードへ移動
procedure TfrmMain.btnNextClick(Sender: TObject);
begin
  DataModule2.tblAddress.Next;
end;

procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
  //データを保存する
  DataModule2.tblAddress.ApplyUpdates(-1);
end;

フィルターをかける

フィルターをかけるというのは、「指定したデータを探して取り出す」ということです。
一番簡単そうなヤツをやってみようと思います。

メインフォームの上のほうに、[TLabel]2つと[TEdit]を1つ[TButton]を2つ配置します。
「選択」「解除」のイベントプロシージャに次のコードを入力します。

  //フィルターを解除する
  DataModule2.tblAddress.Filtered := False;
  //名前でフィルター(選択)する
  DataModule2.tblAddress.Filter := 'NAME=''' + edtName.Text + '''';
  DataModule2.tblAddress.Filtered := True;

実行結果

interbase-26

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