月別: 2014年2月

名簿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

落書き帳 その2

oekaki1

落書き帳プログラムを少しだけバージョンアップして、「お絵かき帳」に進化しました。
ブラシサイズ2種類と、ブラシの色が変えられるようになりました。
カラーボタンをクリックするとダイアログが表示されます。

ファイルに保存したりできませんので、まだこのお絵かき帳は不完全です。

エラーチェックをしよう

ダンナのPCのデスクトップに、電卓プログラムを貼り付けて、自慢げに「やってみて」と言いました。
がちゃがちゃと入力して、「なにこれ?」と言われちゃいました。ふん!
エラーチェックを作っていませんでした。
そこで次のようなエラーチェックを追加しました。ナッキー様のページを見てですけど(^^;

  • クリアしないでテンキーを押したときの処理
  • 入力ボックスに値がないのに計算ボタンを押してしまったときの処理
  • 最初の入力ボックスだけに値が入っていたときの処理
  • 0で割ることができないので、そのときの処理

イベントハンドラの共有

同じ処理をするときには、この機能は便利です。

  • フォームのオブジェクトインスペクタの「イベント」で、「sbtnClick1」の名前を変更します。
  • 他のスピードボタンを、新しい共有ボタン名に変更します。(テンキーのボタン)
  • sbtun1~sbtun9 までの「その他」のTagプロパティの値を、1~9までに設定します。

実行結果(0を入れて割ろうとした)

dentaku5

プログラム

長くてわかりにくいのですが、エラーチェックした場所にコメントを入れておきました。
同じ処理をあちこちに書いているので、関数を作っておいたほうがよいのでしょうね。
だけどまだ関数作りにはチャレンジしていませんので、後日また変更するかも。


procedure TForm1.btnTasuClick(Sender: TObject);
//演算ボタン[+]が押されたとき
begin
  //エラー処理(値がないのに演算ボタンをクリックしたとき
  if Edit1.Text = '' then
    raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');

  if Edit2.Text <>'' then
    begin
      Edit2.Text := '';
      ShowMessage('値を入力してください');
    end;

  lblEnzan.Caption := '+';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;
//演算ボタン「-」が押されたとき
procedure TForm1.btnHikuClick(Sender: TObject);
begin
   if Edit1.Text = '' then
    raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');

  if Edit2.Text <>'' then
    begin
      Edit2.Text := '';
      ShowMessage('値を入力してください');
    end;

  lblEnzan.Caption := '-';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;
//演算ボタン「×」が押されたとき
procedure TForm1.btnKakeruClick(Sender: TObject);
begin
   if Edit1.Text = '' then
    raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');

  if Edit2.Text <>'' then
    begin
      Edit2.Text := '';
      ShowMessage('値を入力してください');
    end;
  lblEnzan.Caption := '×';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;
//演算ボタン「÷」が押されたとき
procedure TForm1.btnWaruClick(Sender: TObject);
begin
   if Edit1.Text = '' then
    raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');

  if Edit2.Text <>'' then
    begin
      Edit2.Text := '';
      ShowMessage('値を入力してください');
    end;
  lblEnzan.Caption := '÷';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;

//クリアボタンが押されたとき初期化する
procedure TForm1.btnClearClick(Sender: TObject);
begin
  Edit1.Text := '';
  Edit2.Text := '';
  Edit3.Text := '';
  Edit1.Color := clWhite;
  Edit2.Color := clYellow;
  Edit3.Color := clYellow;
  lblEnzan.Caption := '';
  lblEqual.Visible := False;
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btnCopyClick(Sender: TObject);
//コピーボタンを押したとき、計算結果をクリップボードに保存
begin
  Edit3.SelectAll;
  Edit3.CopyToClipboard;
  btnClearClick(Sender);//クリアボタンを呼び出す
  Edit1.PasteFromClipboard;
end;

procedure TForm1.btnKeisanClick(Sender: TObject);
  var
    Num1 : Integer;
    Num2 : Integer;
    Ans  : Double;
//計算ボタンを押したとき
begin

  // StrToIntDefは文字列型から整数型へ変換する関数
  Num1 := StrToIntDef(Edit1.Text,0);
  Num2 := StrToINtDef(Edit2.Text,0);
  //ラベルのキャプションで判断して計算する
  if lblEnzan.Caption = '+' then
      Ans := Num1 + Num2
  else if lblEnzan.Caption = '-' then
      Ans := Num1 - Num2
  else if lblEnzan.Caption = '×' then
      Ans := Num1 * Num2
  else if lblEnzan.Caption = '÷' then
      try
      Ans := Num1 / Num2;
  //例外処理
      except
        Edit2.Text := '';
        ShowMessage('0では割れません。正しい数値を入力してください。');
        Exit;
      end

  else
      Ans := Num1;
      Edit2.Color := clYellow;
      Edit3.Color := clWhite;
      lblEqual.Visible := True;//=を表示する
   // FloatToStr は、実数型から文字列型へ変換する関数
   Edit3.Text := FloatToStr(Ans);
end;

procedure TForm1.sbtn10Click(Sender: TObject);
//数値0のボタンが押されたとき
//演算記号が入ったら右側の入力ボックスに0を入れる
//ヌル(空)の場合は、左側のボックスに0を入れる

begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '0'
  else
     Edit2.Text := Edit2.Text + '0';
end;

procedure TForm1.TenKeyClick(Sender: TObject);
var
  TenKey : TSpeedButton;
  TenKeyNum : string;

//電卓の数値ボタンが押されたとき
//ボタンは共有している
begin
  //=表示されているときは入力ボックスをクリアする
  if lblEqual.Visible then
     btnClearClick(Sender);
     TenKey := Sender as TSpeedButton;
     TenKeyNum := IntToStr(TenKey.Tag);

  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + TenKeyNum
  else
     Edit2.Text := Edit2.Text + TenKeyNum;
end;

procedure TForm1.sbtn2Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '2'
  else
     Edit2.Text := Edit2.Text + '2';
end;

procedure TForm1.sbtn3Click(Sender: TObject);
begin
 if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '3'
  else
     Edit2.Text := Edit2.Text + '3';
end;

procedure TForm1.sbtn4Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '4'
  else
     Edit2.Text := Edit2.Text + '4';
end;

procedure TForm1.sbtn5Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '5'
  else
     Edit2.Text := Edit2.Text + '5';
end;

procedure TForm1.sbtn6Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '6'
  else
     Edit2.Text := Edit2.Text + '6';
end;

procedure TForm1.sbtn7Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '7'
  else
     Edit2.Text := Edit2.Text + '7';
end;

procedure TForm1.sbtn8Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '8'
  else
     Edit2.Text := Edit2.Text + '8';
end;

procedure TForm1.sbtn9Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '9'
  else
     Edit2.Text := Edit2.Text + '9';
end;

電卓プログラム-完成

実行結果

dentaku4

電卓プログラム、動きましたぁ!!
ちょっと手抜きして、Editに名前をつけなかったりはしましたが・・・なんとか動きました。
独力ではありませんが(^^; ナッキーさまのプログラムをマネしてみただけです。

今回はちょいと長かったのですが、2日でやっつけました。
いまのところそんなに難しい部分は出てきませんので、なんとか理解の範囲内です。

プログラム


procedure TForm1.btnTasuClick(Sender: TObject);
//演算ボタン[+]が押されたときラベルに+と表示
//Edit1と2の色を変更する
begin
  lblEnzan.Caption := '+';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;

//クリアボタンが押されたとき初期化する
procedure TForm1.btnClearClick(Sender: TObject);
begin
  Edit1.Text := '';
  Edit2.Text := '';
  Edit3.Text := '';
  Edit1.Color := clWhite;
  Edit2.Color := clYellow;
  Edit3.Color := clYellow;
  lblEnzan.Caption := '';
  lblEqual.Visible := False;
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btnCopyClick(Sender: TObject);
//コピーボタンを押したとき、計算結果をクリップボードに保存
begin
  Edit3.SelectAll;
  Edit3.CopyToClipboard;
  btnClearClick(Sender);//クリアボタンを呼び出す
  Edit1.PasteFromClipboard;
end;

procedure TForm1.btnHikuClick(Sender: TObject);
begin
  lblEnzan.Caption := '-';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;

procedure TForm1.btnKakeruClick(Sender: TObject);
begin
  lblEnzan.Caption := '×';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;

procedure TForm1.btnKeisanClick(Sender: TObject);
  var
    Num1 : Integer;
    Num2 : Integer;
    Ans  : Double;
//計算ボタンを押したとき
begin
  // StrToIntDefは文字列型から整数型へ変換する関数
  Num1 := StrToIntDef(Edit1.Text,0);
  Num2 := StrToINtDef(Edit2.Text,0);
  //ラベルのキャプションで判断して計算する
  if lblEnzan.Caption = '+' then
      Ans := Num1 + Num2
  else if lblEnzan.Caption = '-' then
      Ans := Num1 - Num2
  else if lblEnzan.Caption = '×' then
      Ans := Num1 * Num2
  else if lblEnzan.Caption = '÷' then
      Ans := Num1 / Num2
  else
      Ans := Num1;
      Edit2.Color := clYellow;
      Edit3.Color := clWhite;
   // FloatToStr は、実数型から文字列型へ変換する関数
   Edit3.Text := FloatToStr(Ans);
end;

procedure TForm1.btnWaruClick(Sender: TObject);
begin
  lblEnzan.Caption := '÷';
  Edit1.Color := clYellow;
  Edit2.Color := clWhite;
end;

procedure TForm1.sbtn10Click(Sender: TObject);
//数値0のボタンが押されたとき
//演算記号が入ったら右側の入力ボックスに0を入れる
//ヌル(空)の場合は、左側のボックスに0を入れる

begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '0'
  else
     Edit2.Text := Edit2.Text + '0';
end;

procedure TForm1.sbtn1Click(Sender: TObject);
//数値1のボタンが押されたとき
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '1'
  else
     Edit2.Text := Edit2.Text + '1';
end;

procedure TForm1.sbtn2Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '2'
  else
     Edit2.Text := Edit2.Text + '2';
end;

procedure TForm1.sbtn3Click(Sender: TObject);
begin
 if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '3'
  else
     Edit2.Text := Edit2.Text + '3';
end;

procedure TForm1.sbtn4Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '4'
  else
     Edit2.Text := Edit2.Text + '4';
end;

procedure TForm1.sbtn5Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '5'
  else
     Edit2.Text := Edit2.Text + '5';
end;

procedure TForm1.sbtn6Click(Sender: TObject);
begin
  if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '6'
  else
     Edit2.Text := Edit2.Text + '6';
end;

procedure TForm1.sbtn7Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '7'
  else
     Edit2.Text := Edit2.Text + '7';
end;

procedure TForm1.sbtn8Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '8'
  else
     Edit2.Text := Edit2.Text + '8';
end;

procedure TForm1.sbtn9Click(Sender: TObject);
begin
   if lblEnzan.Caption = '' then
     Edit1.Text := Edit1.Text + '9'
  else
     Edit2.Text := Edit2.Text + '9';
end;

電卓プログラム -準備

コンポーネントの準備

  • ツールパレットの「Standard」から「TPanel」コンポーネントを1つ、フォームに貼り付けます。
    Captionは空白に、レイアウトは「alTop」に設定します。
  • 「Additional」から「TFlowPanel」コンポーネントを貼り付けます。
    Captionは空白に、レイアウトは「alLeft」に設定します。
  • 「Additional」から「TGridPanel」コンポーネントを1つ貼り付けます。
    Captionは空白に、レイアウトは「alClient」に設定します。
    dentaku1
  • 「Additional」から「TSpeedButton」コンポーネントを、FlowPanel1の上に貼り付けます
    そのボタンをコピー&ペーストで全部で10個になるように貼り付けます。
    このボタンのCaptionには、電卓のように1~0までの数値を入れておきます。
  • 「Standard」から「TEdit」コンポーネントを3つ、「Panel」の上に貼り付けます。
    Textプロパティを空白にし、Colorプロパティで任意の色を設定します。
  • 「Standard」から「TLabel」コンポーネントを2つ、「Panel」の上に貼り付けます。
    ラベルの1つ目のCaptionは空白にし、2つ目のCaptionには「=」を設定します。
  • 「Standard]から「TButton」コンポーネントを4つ、「GridPanel1」の上に貼り付けます。
    このキャプションには「+」「-」「×」「÷」を設定します。
    さらに小さいボタンを4つその下に貼り付けます。
    ※「GridPanel1」の上をクリックすると、追加のボタンを貼り付けることができます。
    小さいボタンのキャプションには「クリア」「コピー」「閉じる」「計算」を設定します。
    ※ボタンには名前を付けておくと、分かりやすくなります。(例:btnTasu)
    dentaku2
    こんな感じになりました。
    コンポーネントの準備もたくさんあると、結構しんどいですわ。
    なんとなく電卓っぽくなったですが、プログラミングはこれからです。dentaku3