マイナー イベントを処理するコードを作成する(dbExpress チュートリアル)

提供: RAD Studio
移動先: 案内検索

チュートリアル:アプリケーションで dbExpress を使用してデータベースを表示および更新する への移動

次に、残りのイベントのハンドラを作成します。

[Open]チェック ボックスのクリック

TCheckBox コンポーネントを選択した状態で、[オブジェクト インスペクタ][イベント]タブの[OnClick]イベントをダブルクリックします。 以下のコードを追加します。

Delphi の場合

 
 procedure TForm2.CheckBoxActiveClick(Sender: TObject);
 begin
   // チェックされている場合、クライアント データ セットを有効化。チェックされてなければ、無効化する。
   ClientDataSet1.Active := CheckBoxActive.Checked
 end;

C++

 
 void __fastcall TForm1::CheckBoxActiveClick(TObject *Sender)
 {
   // チェックされている場合、クライアント データ セットを有効化。チェックされてなければ、無効化する。
   ClientDataSet1->Active = CheckBoxActive->Checked;
 }

TClientDataSet を有効化すると、SQL: とラベルの付いた TEdit 内の SQL コマンドが実行されます。さらなる情報については、以下の「SQL コマンドの変更セクションを参照してください。

TClientDataSet のクローズ

このイベントが発生するのは、TClientDataSet が閉じる直前です(別のテーブルを選択すると閉じます)。

テーブル セルをクリックすると、テーブル セルのデータが MemoForm というフォーム(TFormCurrentField オブジェクト)に表示されます。 TFormCurrentField は、「セル表示フォームを追加する」で定義します。このイベント ハンドラでは、その TFormCurrentField を破棄します。

TClientDataSet コンポーネントの[BeforeClose]イベントをダブルクリックして、いつものようにイベント ハンドラ スタブを生成します。

Delphi の場合

 
 procedure TForm2.ClientDataSet1BeforeClose(DataSet: TDataSet);
 begin
   // テーブルのセルの内容を表示するフォームが存在する場合、それを破壊する。
   if Assigned(MemoForm) then
   begin
     MemoForm.DBMemoCurrentField.DataField := '';
     if MemoForm.Visible then
       MemoForm.Close;
   end;
 end;

C++

 
 void __fastcall TForm1::ClientDataSet1BeforeClose(TDataSet *DataSet)
 {
   // テーブルのセルの内容を表示するフォームが存在する場合、それを破壊する。
   if (MemoForm)
   {
 	MemoForm->DBMemoCurrentField->DataField = "";
 	if (MemoForm->Visible)
       MemoForm->Close();
   }
 }

[Apply Updates]ボタンのクリック

[Apply Updates] TButton をクリックすると、データベースに対する更新が適用されます。つまり、変更されたレコードがデータベースに書き込まれます。 ここでの更新は TClientDataSet.ApplyUpdates を呼び出して行っていますが、実際の更新は、TDataSetProvider がデータ セットに代わって行います。TDataSetProvider についての「データベース コンポーネントの追加」コメントを参照してください。

[Apply Updates]TButton[OnClick]イベントをダブルクリックし、生成されたコード スケルトンに次のコードを追加します。

Delphi の場合

 
 procedure TForm2.ButtonApplyClick(Sender: TObject);
 var
   X, Y: Integer;
 begin
   // クライアント データ セットは、プロバイダに更新をさせる。
   ClientDataSet1.ApplyUpdates(-1);
   Y := Self.Top + Self.ButtonApply.Top;
   X := Self.Left + Self.ButtonApply.Left;
 
   // グリッド表示におけるデータを更新するかどうか、ユーザーに質問。
   if MessageDlgPos('Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes then
   begin
     ClientDataSet1.Close;
     ClientDataSet1.Open;
   end;
 end;

C++

 
 void __fastcall TForm1::ButtonApplyClick(TObject *Sender)
 {
   int X, Y;
 
   // クライアント データ セットは、プロバイダに更新をさせる。
   ClientDataSet1->ApplyUpdates(-1);
   Y = this->Top + this->ButtonApply->Top;
   X = this->Left + this->ButtonApply->Left;
 
   // グリッド表示におけるデータを更新するかどうか、ユーザーに質問。
   if (MessageDlgPos("Refresh?",mtCustom, mbYesNo, 0, X, Y) == mrYes)
   {
 	ClientDataSet1->Close();
 	ClientDataSet1->Open();
   }
 }


ヒント: このボタンを使用する代わりに、Vcl.DBCtrls.TDBNavigator コントロールの ApplyUpdates および CancelUpdates を使用することもできます。

フィルタ TEditの変更

フィルタを保持する TEdit のテキストが変わると、TListBox 内のテーブルのリストも変わります。PopulateListBox は、現在フィルタが適用されたテーブルを、TListBox にリスト表示するためのユーティリティです。

フィルタ TEdit[OnChange]イベントをダブルクリックしてスタブを作成し、次のコードを追加します。

Delphi の場合

 
 procedure TForm2.EditFilterChange(Sender: TObject);
 begin
   if SQLConnection1.Connected then
     PopulateListBox;  新しいフィルタ テキストに合わせてテーブル リスト ボックスを表示し直す
 end;

C++

 
 void __fastcall TForm1::EditFilterChange(TObject *Sender)
 {
   if (SQLConnection1->Connected)
 	PopulateListBox();  新しいフィルタ テキストに合わせてテーブル リスト ボックスを表示し直す
 }

フィルタ TEdit の開始と終了

[OnEnter]イベントと[OnExit]イベントは、フィルタ テキストを保持する TEdit がアクティブおよび非アクティブになること、つまりフォーカスが当たることと外れることを指します。 これまで説明したように TEdit のイベント ハンドラを作成し、次のコードを追加します。

Delphi の場合

 
 procedure TForm2.EditFilterEnter(Sender: TObject);
 begin
   // フィールドがアクティブになときには、空のテキストを。
   EditFilter.Text := '';
 end;
 
 procedure TForm2.EditFilterExit(Sender: TObject);
 begin
   // フィールドが空で非アクティブの場合、テキストを元のテキストに戻す。
   if EditFilter.Text = '' then
     EditFilter.Text := 'Filter (* as wild)';
 end;

C++

 
 void __fastcall TForm1::EditFilterEnter(TObject *Sender)
 {
   // フィールドがアクティブになときには、空のテキストを。
   EditFilter->Text = "";
 }
 
 void __fastcall TForm1::EditFilterExit(TObject *Sender)
 {
   // フィールドが空で非アクティブの場合、テキストを元のテキストに戻す。
   if (EditFilter->Text == "")
 	EditFilter->Text = "Filter (* as wild)";
 }

SQL コマンドの変更

SQL コマンドを保持する TEdit 内のテキストが変更された場合には、TSQLDataSet コンポーネント用の SQL コマンド テキストを更新する必要があります。 [Open] TCheckBox をオンにすると、TClientDataSet がアクティブになり、その結果、新しい SQL コマンドが実行されてデータベース データが更新されます。 つまり、SQL コマンドを変更して TCheckBox をオンにすると、そのコマンドを実行できます。

SQL コマンド用 TEdit[OnChange]イベントをダブルクリックし、次のコードを追加します。

Delphi の場合

 
 procedure TForm2.EditSQLChange(Sender: TObject);
 begin
   SQLDataSet1.CommandText := EditSQL.Text;
 end;

C++

 
 void __fastcall TForm1::EditSQLChange(TObject *Sender)
 {
   SQLDataSet1->CommandText = EditSQL->Text;
 }

フォームの破棄イベント

アプリケーションが終了するときには、データベース接続を閉じたり、必要でなくなったオブジェクトを解放するなど、クリーンアップの処理を行う必要があります。 フォームを選択し、[オブジェクト インスペクタ][OnDestroy]イベントをダブルクリックします。 このイベントのコードを追加します。

Delphi の場合

 
 procedure TForm2.FormDestroy(Sender: TObject);
 begin
   // 接続を閉じる。
   if SQLConnection1.Connected then
     SQLConnection1.Close;
   // オブジェクトを解放。
   if Assigned(FMetaDataProvider) then
     FreeAndNil(FMetaDataProvider);
   if Assigned(MemoForm) then
     FreeAndNil(MemoForm);
   if Assigned(AllTables) then
     FreeAndNil(AllTables);
 end;

C++

 
 void __fastcall TForm1::FormDestroy(TObject *Sender)
 {
   // 接続を閉じる。
   if (SQLConnection1->Connected)
 	SQLConnection1->Close();
 
   // オブジェクトを解放。
   if (FMetaDataProvider)
   {
 	delete FMetaDataProvider;
 	FMetaDataProvider = NULL;
   }
   if (MemoForm)
   {
 	delete MemoForm;
 	MemoForm = NULL;
   }
   if (AllTables)
   {
 	delete AllTables;
 	AllTables = NULL;
   }
 }

前のチュートリアル

メイン イベントを処理するコードを作成する

次のチュートリアル

ユーティリティ コードを作成する