|
■データモジュールの作成 |
|
|
|
●学習内容
|
|
|
|
|
データアクセスコンポーネントをデータモジュールに追加配置します。フォームにコンポーネントを配置してもよいのですがコードの記述が煩雑になるのでデータモジュールを用いることにすます。データモジュールの作成の手順は次のようにおこないます。 |
|
|
|
|
@コンポーネントの配置
|
|
|
|
|
Aプロパティの設定 |
|
|
|
|
Bコードの記述
|
|
|
|
|
|
|
|
|
|
●コンポーネントの配置 |
|
|
|
|
コンポーネントパレットから以下のコンポーネントを配置します。 |
|
|
|
|
コンポーネント |
 |
TDataSourceコンポーネント |
 |
TQueryコンポーネント |
 |
TUpdateSQLコンポーネント |
|
|
|
|
|
|
|
|
●プロパティの設定
|
|
|
|
|
データモジュール(CinemaDM)に配置したコンポーネントを設定します。以下のコンポーネントのイメージは設定方法にリンクしているのでクリックしてください。 |
|
|
|
|
|
|
|
|
●CinemaDS
|
|
|
|
|
コンポーネント:TDataSource |
プロパティ |
設定値 |
DataSet |
CinemaQuery |
Name |
CinemaDS |
|
|
|
|
|
|
|
|
●CinemaQuery |
|
|
|
|
コンポーネント:TQuery |
プロパティ |
設定値 |
CachedUpdates |
True |
DataBaseName |
作成したエリアス名 |
Name |
CineamQuery |
|
|
SQL
|
SELECT a.*,b.genre_name
FROM cinema.db a,genre.db b
WHERE a.genre_code = b.genre_code |
|
|
UpdateObject
|
UpdateSQL1
|
|
|
|
|
CinemaQueryを設定したあとに項目コンポーネントを作成します。項目コンポーネントに付いては、Delphiアーキテクチャを参考にしてください。 |
|
|
|
|
|
|
|
|
★操作方法 |
|
|
|
@ |
TQueryをダブルクリックする。
|
|
|
|
A |
項目コンポーネント上で、右クリックする。
ポップアップメニューから[すべての項目の追加(F)]を選択します。 |
|
|
|
|
 |
|
|
|
|
|
各項目のプロパティは以下のとおりです。 |
|
|
|
|
項目コンポーネント名 |
プロパティ名 |
設定値 |
cinema_name |
DisplayLabel |
映画名 |
w_day |
DisplayLabel |
登録日 |
genre_name |
DisplayLabel |
ジャンル |
|
|
|
|
|
|
|
|
●GenreDS |
|
|
|
|
コンポーネント:TDataSource |
プロパティ |
設定値 |
Name |
GenreDS |
DataSet |
GenreQuery |
|
|
|
|
|
|
|
|
●GenreQuery |
|
|
|
|
コンポーネント:TQuery |
プロパティ |
設定値 |
DatabaseName |
作成したエリアス名 |
Name |
GenreQuery |
|
|
SQL
|
SELECT *
FROM genre.db
ORDER BY genre_name |
|
|
|
|
|
|
|
|
|
|
●UpdateSQL1 |
|
|
|
★操作方法 |
|
|
|
@ |
UpdateSQL1をダブルクリックするか、右クリックによるポップアップメニューから[UpdateSQLの設定(U)]を選択します。 |
|
|
|
A |
キー項目には「cinema_code」選択し、更新する項目には「cinema_code」「genre_name」以外の項目を選択し、「SQL文を生成(G)」ボタンを押します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
●コードの記述 |
|
|
|
■イベントハンドラ |
|
|
|
|
コンポーネント:CinemaDM |
イベント |
発生タイミング |
|
OnCreat |
データモジュール作成時 |
GO |
OnDestroy |
データモジュール廃棄時 |
GO |
|
|
|
|
|
|
コンポーネント:CienamaQuery |
イベント |
発生タイミング |
|
AfterCancel |
キャンセルした後 |
GO |
AfterDelete |
削除後 |
GO |
AfterInsert |
挿入後 |
GO |
AfterPost |
データセットに書き込んだ後 |
GO |
AfterScroll |
レコードがスクロールした後 |
GO |
BeforeInsert |
挿入直前 |
GO |
BeforePost |
データセットに書き込む前 |
GO |
OnUpDateRecord |
キャッシュアップデートがレコードに適用された時 |
GO |
|
項目コンポーネント:CinemaQueryCinema_name |
イベント |
発生タイミング |
|
OnValidate |
項目の編集終了時 |
GO |
|
項目コンポーネント:CinemaQueryGenre_code |
イベント |
発生タイミング |
|
OnValidate |
項目の編集終了時 |
GO |
|
|
|
|
|
|
|
|
|
|
■フィールド |
|
|
|
|
可視属性 |
名称 |
型 |
Private |
DefaultSQL |
TStringList |
|
|
|
|
|
|
|
|
|
|
■メソッド |
|
|
|
|
可視属性 |
宣言 |
|
Public |
procedure CinemaQueryPost; |
GO |
|
procedure SetSearchSQL(WhereString:String); |
GO |
|
procedure ReSetSQLCinemaQuery; |
GO |
|
|
|
|
|
|
|
|
|
|
■CinemaDM.OnCreatイベント |
|
|
|
|
procedure
TCinemaDM.DataModuleCreate(Sender: TObject);
//全データセットをOpen
var ii : Integer;
begin
for ii := 0 to ComponentCount -1 do
begin
if Components[ii] is TDataset then
(Components[ii] as TDataset).Open;
end;
DefaultSQL := TStringList.Create; //テンプレート用にDefaultSQLを作成
DefaultSQL.Assign(CinemaQuery.SQL);
end; |
|
|
|
|
|
|
|
|
|
■CinemaDM.OnDestroyイベント |
|
|
|
|
procedure
TCinemaDM.DataModuleDestroy(Sender: TObject);
begin
DefaultSQL.Free;
//DefaultSQLを解放する
end; |
|
|
|
|
|
|
|
|
|
■CinemaQuery.AfterCancelイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQueryAfterDelete(DataSet: TDataSet);
begin
CinemaQueryPost;
end; |
|
|
|
|
|
|
|
|
|
■CineamQuery.AfterDeleteイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQueryAfterDelete(DataSet: TDataSet);
//CinemaQueryDelete時のイベント
begin
CinemaDM.CinemaQueryPost;
end; |
|
|
|
|
|
|
|
|
|
■CinemaQuery.AfterInsertイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQueryAfterInsert(DataSet: TDataSet);
begin
Form1.DBEdit3.text := DateTimeToStr(Now);
//登録日を自動的に挿入する
end; |
|
|
|
|
|
|
|
|
|
■CinemaQuery.AfterPostイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQueryAfterPost(DataSet: TDataSet);
var ii: String;
begin
ii:= Form1.DBEdit3.Text;
CinemaQueryPost;
With CinemaQuery do //登録していた場所に登録日を利用して戻るための操作
begin
DisableControls; //検索中に画面がちらつくのを防ぐ
CinemaQuery.Locate('w_day',StrTodatetime(ii),[locaseinsensitive]);
EnableControls; //検索が終わったら終わらせる
end;
Form1.SpeedButton1.Enabled := True;
end; |
|
|
|
|
|
|
|
|
|
■CinemaQuery.AfterScrollイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQueryAfterScroll(DataSet: TDataSet);
var
JPG: TJPEGImage;
BlobStream: TBlobStream;
begin
// BLOB項目から読み込む
if not CinemaQuery.FieldByName('image').IsNull then
begin
JPG := TJPEGImage.Create;
// BLOBストリームを作成して画像を読み込む
BlobStream := TBlobStream.Create(TBlobField(CinemaQuery. FieldByName('image')),bmRead);
try
// BLOBストリームからJPEGデータを読み込む
JPG.LoadFromStream(BlobStream);
// Image1に画像を表示する
Form1.Image1.Picture.Assign(JPG);
finally
BlobStream.Free;
JPG.Free;
end;
end
else
Form1.Image1.Picture.Assign(Nil);
end; |
|
|
|
|
ここで注意してもらいたいのは、JPEGを扱うためにUnitファイルのinterface部uses句でJPEGと宣言しておいてください。そうする事でJPEGイメージを扱えるようになります。 |
|
|
|
|
|
|
|
|
|
■CinemaQuery.BeforeInsert |
|
|
|
|
procedure
TCinemaDM.CinemaQueryBeforeInsert(DataSet: TDataSet);
begin
Form1.SpeedButton1.Enabled := False;
//必須入力項目を登録する前に画像を挿入させない
end; |
|
|
|
|
|
|
|
|
|
■CinemaQuery.BeforePost |
|
|
|
|
procedure TCinemaDM.CinemaQueryBeforePost(DataSet:
TDataSet);
var ii:Integer;
//必須項目のチェックを行うためにOnValidateイベントを呼び出す
begin
for ii := 0 to DataSet.FieldCount -1 do
begin
if Assigned(DataSet.Fields[ii].OnValidate) then
DataSet.Fields[ii].OnValidate(DataSet.Fields[ii]);
end;
end;
|
|
|
|
|
|
|
|
|
|
■CinemaQueryCinema_name.OnValidateイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQuerycinema_nameValidate(Sender: TField);
//cienam_nameのチェックをする
begin
if Sender.AsString = '' then
begin
Application.MessageBox('必須入力です','警告',MB_OK + MB_ICONEXCLAMATION);
Sender.FocusControl;
Abort;
end;
end; |
|
|
|
|
|
|
|
|
|
■CinemaQueryGenre_code.OnValidateイベント |
|
|
|
|
procedure
TCinemaDM.CinemaQuerygenre_codeValidate(Sender: TField);
//cinema_codeのチェックをする
begin
if Sender.AsInteger = 0 then
begin
Application.MessageBox('必須入力です','警告',MB_OK + MB_ICONEXCLAMATION);
Sender.FocusControl;
Abort;
end;
end; |
|
|
|
|
|
|
|
|
|
■CinemaDM.CinemaQueryPostメソッド |
|
|
|
|
procedure
TCinemaDM.CinemaQueryPost;
begin
with cinemaQuery do
begin
ApplyUpdates; // OnUpdateRecordイベントを呼び出す
CommitUpdates; //キャッシュアップデートバッファをクリアにする
Close; //読み出し専用結果セットの更新はこの様に行う
Open;
end;
end; |
|
|
|
|
詳細についてはキャッシュアップデートを参考にしてください。 |
|
|
|
|
|
|
|
|
|
■CinemaQuery.UpdateRecord |
|
|
|
|
procedure
TCinemaDM.CinemaQueryUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
UpdateSQL1.Apply(UpdateKind); //UpdateSQLのSQL文を実行する
UpdateAction := uaApplied;
end; |
|
|
|
|
詳細についてはキャッシュアップデートを参考にしてください。 |
|
|
|
|
|
|
|
|
|
■CienmaDM.SetSearchSQLメソッド |
|
|
|
|
procedure
TCinemaDM.SetSearchSQL(WhereString:String);
begin
With cinemaQuery do
begin
close;
SQL.Text := CinemaQuery.SQL.Text + WhereString;
//SQL文に検索条件を追加
open;
end;
end; |
|
|
|
|
|
|
|
|
|
■CienmaDM.ReSetSQLCinemaQueryメソッド |
|
|
|
|
procedure
TCinemaDM.ReSetSQLCinemaQuery;
begin
With CinemaQuery do
begin
Close ;
SQL.Assign(DefaultSQL); //もとのSQL文に戻す
Open;
end;
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|