Database マニュアル · Chapter 8

ボタンイベント — ViewRun ハンドラ

サンプルのユーザ操作はすべて ViewRun.xms の 6 つのクリックハンドラ から始まります。各ハンドラは Data:: モジュール関数を呼ぶだけの 1 行レイヤで、ビジネスロジックと UI イベントが綺麗に分離されています。

ViewRun(UI イベント)            Data(DB ビジネスロジック)
─────────────────────────      ──────────────────────────
OnOpenClick    ───►           DB_Open()
OnAddClick     ───►           DB_InsertSample()
OnUpdateClick  ───►           DB_UpdateSelected()
OnModifyClick  ───►           DB_OpenModifyDlg() ──► GUI.ShowDialog → DB_UpdateModified()
OnDeleteClick  ───►           DB_DeleteSelected()
OnCloseClick   ───►           DB_Close()

1) ハンドラ標準シグネチャ

QMachineStudio のクリックハンドラはすべて同じシグネチャ。

FUNCTION OnXxxClick(string sender, int tag, array params)
{
   // sender : ボタンコントロール名
   // tag    : ボタンの Tag プロパティ値(分岐用)
   // params : 追加引数(ほぼ未使用)
 
   Data::DB_Xxx();
}

サンプルの 6 つのハンドラはすべて Data:: 関数を呼ぶ 1 行 wrapper。

FUNCTION OnOpenClick   (string sender, int tag, array params) { Data::DB_Open();             }
FUNCTION OnAddClick    (string sender, int tag, array params) { Data::DB_InsertSample();     }
FUNCTION OnUpdateClick (string sender, int tag, array params) { Data::DB_UpdateSelected();   }
FUNCTION OnModifyClick (string sender, int tag, array params) { Data::DB_OpenModifyDlg();    }
FUNCTION OnDeleteClick (string sender, int tag, array params) { Data::DB_DeleteSelected();   }
FUNCTION OnCloseClick  (string sender, int tag, array params) { Data::DB_Close();            }

この分離が生む効果:

  • DB 関数だけで単体テスト が可能 — UI なしでも検証できる。
  • 同じ関数を別画面(ViewMain)やシーケンスでもそのまま再利用可能。
  • デバッグ時、問題がイベント側か DB 側か即座に切り分けられる。

2) ボタンとハンドラの紐付け

ViewRun のデザインモードで、各ボタンの Click イベント → Function 名 を以下のように指定します。

ボタン(Caption)コントロール名Click イベント関数
OpenBtnOpenOnOpenClick
AddBtnAddOnAddClick
UpdateBtnUpdateOnUpdateClick
ModifyBtnModifyOnModifyClick
DeleteBtnDeleteOnDeleteClick
CloseBtnCloseOnCloseClick

(sender, tag, params) の引数は受け取るだけで本文では無視して構いません。複数ボタンが同じハンドラを共有して tag で分岐するときだけ意味が出ます。


3) ModifyDlg フロー — 2 段階呼び出し

Modify ボタンは他のハンドラと違って モーダルダイアログ呼び出し + 結果分岐 が入ります。実際の分岐は Data::DB_OpenModifyDlg() の内部にあるため、ViewRun 側は依然として 1 行です。

[Modify クリック]


ViewRun.OnModifyClick


Data.DB_OpenModifyDlg

       ├─ 1. 選択行 SELECT → Edit* フィールドへコピー
       ├─ 2. GUI.ShowDialog("ModifyDlg")
       │      │
       │      ├─ true  (OK)     ──► DB_UpdateModified() → DB_Refresh()
       │      └─ false (Cancel) ──► そのまま終了


    return

GUI.ShowDialog呼び出し点でブロック するため、ダイアログが閉じるまで次の行は実行されません。つまり OnModifyClick の 1 行呼び出しが終わるのは ユーザが OK か Cancel を押したあと です。

ダイアログ内部のイベント

ModifyDlg.xms 自体にはビジネスロジックはありません — 診断ログのみです。

FUNCTION OnShow()
{
   // 表示直前 - 編集フィールドは呼び出し側で既に埋め済み
   Log($"ModifyDlg OnShow : id={Data::EditId} order_no={Data::EditOrderNo}");
}
 
FUNCTION OnHide()
{
   // ダイアログ終了直後
}

OK / Cancel の 2 ボタンは DialogResult を設定するだけで、実際の UPDATE は呼び出し側 DB_OpenModifyDlgShowDialog の戻り値で分岐して処理します。ダイアログが自分のビジネスロジックを知らなくてよい構造 — 再利用性に強いです。


4) Init / Mon / Event との関係

サンプルプロジェクトには以下のモジュールも含まれます — DB と直接関係はありませんが、自動化プロジェクトの標準構造として軽く触れておきます。

モジュール種別用途
InitInit起動時 1 回実行 — データ初期化、タワーランプ設定
MonMonitor周期監視 — Door / IO / 安全 等
EventEventイベント受信(通信、外部信号)
DataMonitor本チュートリアルの主役 — DB 関数群
WorkSequenceメインシーケンス(DB と無関係)

DB 作業を Data モジュールに置くのは、装置シーケンス(Work)と分離 するためです。DB が一時的に切れてもシーケンスは動き続けるべきで、シーケンス側は Data::DB_* 関数を呼ぶだけで済みます。

次の章へ

最後にバックアップと運用 — WAL モード、BackupFolder、自動バックアップオプションを整理します。