ボタンイベント — 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 イベント関数 |
|---|---|---|
| Open | BtnOpen | OnOpenClick |
| Add | BtnAdd | OnAddClick |
| Update | BtnUpdate | OnUpdateClick |
| Modify | BtnModify | OnModifyClick |
| Delete | BtnDelete | OnDeleteClick |
| Close | BtnClose | OnCloseClick |
(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) ──► そのまま終了
│
▼
returnGUI.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_OpenModifyDlg が ShowDialog の戻り値で分岐して処理します。ダイアログが自分のビジネスロジックを知らなくてよい構造 — 再利用性に強いです。
4) Init / Mon / Event との関係
サンプルプロジェクトには以下のモジュールも含まれます — DB と直接関係はありませんが、自動化プロジェクトの標準構造として軽く触れておきます。
| モジュール | 種別 | 用途 |
|---|---|---|
Init | Init | 起動時 1 回実行 — データ初期化、タワーランプ設定 |
Mon | Monitor | 周期監視 — Door / IO / 安全 等 |
Event | Event | イベント受信(通信、外部信号) |
Data | Monitor | 本チュートリアルの主役 — DB 関数群 |
Work | Sequence | メインシーケンス(DB と無関係) |
DB 作業を Data モジュールに置くのは、装置シーケンス(Work)と分離 するためです。DB が一時的に切れてもシーケンスは動き続けるべきで、シーケンス側は Data::DB_* 関数を呼ぶだけで済みます。
次の章へ
最後にバックアップと運用 — WAL モード、BackupFolder、自動バックアップオプションを整理します。