マイナー イベントを処理するコードを作成する(dbExpress チュートリアル)
チュートリアル:アプリケーションで 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;
}
}