■データモジュールの作成  
   

●学習内容

 
       データアクセスコンポーネントをデータモジュールに追加配置します。フォームにコンポーネントを配置してもよいのですがコードの記述が煩雑になるのでデータモジュールを用いることにすます。データモジュールの作成の手順は次のようにおこないます。  
      @コンポーネントの配置  
      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;