データセットの更新
ここまでで、データ対応コントロール内の変更により、フィールドのデータ リンク クラス内の値が変わりました。データ編集コントロールの作成の最終段階は、データセットを新しい値で更新することです。それが行われるのは、データ対応コントロール内の値を変更したユーザーがコントロールの外をクリックするか Tab キーを押してコントロールを終了した後です。
メモ: VCL アプリケーションでは、コントロール操作用のメッセージ制御 ID を定義します。たとえば、ユーザーがコントロールを終了すると、そのコントロールに CM_EXIT メッセージが送信されます。そのメッセージに応答するメッセージ ハンドラを記述できます。この場合、ユーザーがコントロールを終了すると、CMExit のメッセージ ハンドラである CM_EXIT メソッドがそれに応答して、データセット内のレコードをフィールドのデータ リンク クラス内の変更値で更新します。メッセージ ハンドラの詳細については、「Windows API メッセージング ソリューションの使用」を参照してください。
メッセージ ハンドラ内でデータセットを更新するには、次の手順に従います。
- TDBCalendar コンポーネントにメッセージ ハンドラを追加します。
type TDBCalendar = class(TSampleCalendar); private procedure CMExit(var Message: TWMNoParams); message CM_EXIT; . . . end; class PACKAGE TDBCalendar : public TSampleCalendar { private: void __fastcall CMExit(TWMNoParams Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CM_EXIT, TWMNoParams, CMExit) END_MESSAGE_MAP };
CMExit メソッドを次のように実装します。
procedure TDBCalendar.CMExit(var Message: TWMNoParams); begin try FDataLink.UpdateRecord; { データベースを更新するようにデータ リンクに通知 } except on Exception do SetFocus; { 失敗した場合は、フォーカスが移動しないようにする } end; inherited; end; void __fastcall TDBCalendar::CMExit(TWMNoParams &Message) { try { FDataLink.UpdateRecord(); // データベースを更新するようにデータ リンクに通知 } catch(...) { SetFocus(); // 失敗した場合は、フォーカスが移動しないようにする throw; } }
ユーザーがコントロールを終了したときにデータセットを更新するには、次の手順に従います。
- TDBCalendar コンポーネントに DoExit メソッドのオーバーライドを追加します。
type TDBCalendar = class(TSampleCalendar); private procedure DoExit; override; . . . end; class PACKAGE TDBCalendar : public TSampleCalendar { private: DYNAMIC void __fastcall DoExit(void); . . . };
DoExit メソッドを次のように実装します。
procedure TDBCalendar.CMExit(var Message: TWMNoParams); begin try FDataLink.UpdateRecord; { データベースを更新するようにデータ リンクに通知 } except on Exception do SetFocus; { 失敗した場合は、フォーカスが移動しないようにする } end; inherited; { 継承したメソッドに OnExit イベントを発生させる } end; void __fastcall TDBCalendar::DoExit(void) { try { FDataLink.UpdateRecord(); // データベースを更新するようにデータ リンクに通知 } catch(...) { SetFocus(); // 失敗した場合は、フォーカスが移動しないようにする throw; } TCustomGrid::DoExit(); // 継承したメソッドに OnExit イベントを発生させる }