■TPrinterを使った印刷

■メタファイルの使い方

■Queryの利用(IB&FB)

■TeeChart

■TExcelApplication

はじめに
Takeは、昔Delphiを教えてもらった人に「データソースは使うな」と教えられました。
参考書を買っても大体データソースをプロパティでつなぐだけの説明で初心者にはそっちの方が簡単に見えたんだけど、実際細かいことをやっていくには、直接Queryでデータを引っ張り出してやるのが一番だとわかりました。
今は教えてくれた先輩や会社とは関わりがありませんが、あのときの指導が今、自分にDelphiを楽しませてくれていると思っています。
ただ、本当にこの類の資料がなくて苦労したので、自分なりのデータベースの使い方を説明します。
サンプルソースは、重要な流れに注目してください。
多分、そのまま走らせてもエラーになるだけです。
コンポーネントの関係(InterBase&FireBird編)
一番オーソドックスな関係で説明します。
IBDatabaseコンポーネント:1個のデータベースファイル全体にアクセスします。
IBTransactionコンポーネント:トランザクション管理を行います。
IBQueryコンポーネント:SQL文の実行を行います。ただし、レコード参照に専念。
IBUpdateSQLコンポーネント:レコードの挿入 ・更新・削除を行います。

それぞれをオブジェクトインスペクタでプロパティを関連づけします。
IBDatabaseでよく使うメソッド
  //データベースとのアクセスを開始したり停止したりします。
IBDatabase.Connected := True;
IBDatabase.Connected := False;
IBTransactionでよく使うメソッド
  //トランザクションを開始します。
IBTransaction.StartTransaction;
//トランザクションが動いているかを調べます。
IBTransaction.InTransaction;
//トランザクションをコミット(処理を確定)します。
IBTransaction.Commit;
//トランザクションをロールバック(一連の処理をすべてキャンセル)します。
IBTransaction.Rollback;
IBQueryでよく使うメソッド
 

//入力したSELECT文でテーブルを開きます。
IBQuery.Open;
//テーブルを閉じます。
IBQuery.Close;
//開いているテーブルの中から検索文字にひっかかるレコードを探します。ついでにカーソルも移動。
IBQuery.Locate(フィールド名,検索文字,[オプション]);
//現在のカーソルから指定した型でデータを読み出したり、書き込んだりします。
IBQuery.FieldByName(フィールド名).AsString;とか

IBUpDateSQLでよく使うメソッド
 

//モードで選択しているSQLに対してパラメーターを渡します。
IBUpdateSQL.Query[モード選択].ParamByName.AsString;
IBUpdateSQL.Query[モード選択].ParamByName.AsInteger;
IBUpdateSQL.Query[モード選択].ParamByName.AsFloat;
IBUpdateSQL.Query[モード選択].ParamByName.AsDateTime;
//渡したパラメータに対して実行します。
IBUpdateSQL.ExecSQL(モード選択) ;
//SQLモード
ukModify//update文に対して実行します。
ukInsert//Insert文に対して実行します。
ukDelete//Delete文に対して実行します。

※上記4項目を覚えてれば大体レコードがいじれます。
データベースの設定
//まず、データベースを開きます。
//先に設計している場合は、パラメータの設定は不要です。
//レジストリとかに情報を入れておいて、起動の度に設定するなら下記の方法でできます。


IBDatabase.DatabaseName := 'c:\TestSystem\Test.gdb';
IBDatabase.Params.Clear;
IBDatabase.Params.Add('user_name = SYSDBA');
IBDatabase.Params.Add('password = masterkey');
IBDatabase.Params.Add('sql_role_name = 3');
IBDatabase.Params.Add('lc_ctype= sjis_0208');
IBDatabase.Connected := True;

※ちなみに ユーザー名「SYSDBA」とパスワード「masterkey」はデフォルト値なので必ず変更しておくこと。
Queryを使ったレコードの読み出し
  //クエリーを使ってテーブルを開きます。
//SQL文が固定の場合は、オブジェクトインスペクタのSQLプロパティで設計します。

//テーブルの名前は「ADDRESS」、キーの名前は「CODE」とします。
IBQuery.Close;
IBQuery.SQL.Clear;
IBQuery.SQL.Add('SELECT * FROM ADDRESS');
IBQuery.SQL.Add('ORDER BY CODE ASC');
IBQuery.SQL.Open;
//任意のレコードを探します。
if Locate('CODE',EditCode.Text,[]) = True then
begin
//もし、レコードが見つかった場合は、フォーム上のコントロールに出力します。
EditZip.Text := IBQuery.FieldByName('Zip').AsString;
EditAddress.Text := IBQuery.FieldByName('Address').AsString;

end;
UpdateSQLを使った挿入と更新
 

//UpdateSQLのSQL文はあらかじめオブジェクトインスペクタで設定しておきます。
//今回はトランザクションを使います。


if IBQuery.Active = True then
begin
//トランザクションが動いてない場合は、トランザクションスタート
//単純にStartTransactionだけだと、前のトランザクションが終了してないとエラーになります。

//だから動いてないか確認が必要です。
if not IBTransaction.InTransaction then
IBTransaction.StartTransaction;
//更新するか新規挿入するかを判断します。
if IBQuery.Locate('CODE',EditCode,[]) = True then
begin
//すでにレコードがある場合は更新します。
try
IBUpdateSQL.Query[ukModify].ParamByName('Zip').AsString := EditZip.Text;
IBUpdateSQL.Query[ukModify].ParamByName('Address').AsString := EditAddress.Text;
IBUpdateSQL.ExecSQL('ukModify');

;IBTransaction.Commit;
except
raise;
IBTransaction.Rollback;
end;
end else begin
//無かった場合は新規挿入します。
try
IBUpdateSQL.Query[ukInsert].ParamByName('Zip').AsString := EditZip.Text;
IBUpdateSQL.Query[ukInsert].ParamByName('Address').AsString := EditAddress.Text;
IBUpdateSQL.ExecSQL('ukInsert');

;IBTransaction.Commit;
except
IBTransaction.Rollback;
raise;
end;
end;

※SQL文設計通りのパラメータがそろってない場合は、ExecSQLのときにエラーになります。

UpdateSQLを使った削除
  //挿入・更新同様にオブジェクトインスペクタであらかじめSQL文を設定しておきます。

if IBQuery.Active = True then
begin

if not IBTransaction.InTransaction then
IBTransaction.StartTransaction;

try
//削除の際は、パラメーターから直接検索して削除するので、Locateでカーソルをあわせる必要はありません。なかったら例外処理するだけです。
IBUpdateSQL.Query[ukDelete].ParamByName(OLD_CODE).AsString := EditCode.Text;
IBUpdateSQL.ExecSQL(ukDelete);

;IBTransaction.Commit;
except
IBTransaction.Rollback;
raise;
end;

end;
UpdateSQLを使った画像とかBlobの登録
 

//画像とかグリッドの内容をストリーム化したものをBlob型に保存できます。
//例としてJPEG画像でやってみます。
//見やすさを重視して、トランザクションは外します。
//更新場面に注目してますので、動作はしません。


uses Jpeg

var
MS:TMemoryStream;
begin
try
IBUpdateSQL.Query[ukModify].ParamByName('Zip').AsString := EditZip.Text;
IBUpdateSQL.Query[ukModify].ParamByName('Address').AsString := EditAddress.Text;
//↓ここからBlob登録
MS := TMemoryStream.Create;
if Image.Picture.Graphic <> Nil then
begin
//もし,Imageの画像がビットマップとかJPEG以外のときは、Compressしたほうがいいです。

JPEGImage.Picture.Graphic.SaveToStream(MS);
IBUpdateSQL.Query[ukModify].ParamByName('JPEGIMAGE').LoadFromStream(MS,ftBlob);
end
else
IBUpdateSQL.Query[ukModify].ParamByName('JPEGIMAGE').AsBlob := '';//画像が空だった場合

IBUpdateSQL.ExecSQL('ukModify');
MS.Free;
//↑ここまでコミットしたあとにストリームは解放した方がいいかな?
;IBTransaction.Commit;
except
raise;
IBTransaction.Rollback;
end;
end;

Blobに保存した画像の読み出し
 

//必要な分だけ

var
ST:TStream;
JP:TJpegImage;

begin
EditZip.Text := IBQuery.FieldByName('Zip').AsString;
EditAddress.Text := IBQuery.FieldByName('Address').AsString;
//↓ここから画像の読み出し
JP := TJpegImage.Create;
ST := IBQuery.CreateBlobStream(dqryItem.FieldByName('JPEGIMAGE'),bmRead);

JP.LoadFromStream(ST);
if ST.Size > 0 then
Image.Picture.Graphic := JP;
ST.Free;
JP.Free;

//↑ここまで
end;


Copyright 2011 studio-take All Rights Reserved.