画面バインディング
サンプルの画面は 2 つの部分に分かれます。
| 画面 | 役割 | 主なバインディング |
|---|---|---|
| ViewRun | メイン — DataGrid + 6 ボタン | Data::DispData(行配列)・ Data::SelectIndex(選択インデックス) |
| ModifyDlg | レコード編集ダイアログ | Data::EditId · EditOrderNo · EditMenuName · EditEndTime 等 8 個 |
スクリプトはデータ(array DispData[]、int EditWeightG 等)だけを更新し、コントロール側はそれに合わせて自動的に再描画 されます — この配線が本章の核です。
1) ViewRun · XDataGrid バインディング
Data.xms には次の 2 つの変数が宣言されています。
// CSV 1 行 = 1 行 (id,order_no,menu_name,start_time,end_time,weight_g,result,is_error)
array DispData[] = {"",};
// XDataGrid が自動更新する現在の選択行インデックス(-1 = 未選択)
int SelectIndex = -1;XDataGrid の Property Editor で、以下 2 つのプロパティを設定します。
| プロパティ | 値 | 意味 |
|---|---|---|
| ItemsSourceDataName | Data::DispData | データグリッドが表示する行配列 |
| SelectIndexDataName | Data::SelectIndex | ユーザが行を選ぶとこの変数に 0..N-1、未選択は -1 |
CSV 行フォーマット
DispData の 1 要素はカンマで結合された 1 行の文字列です。
"42,O1042,Latte,2026-05-06 09:31:02,2026-05-06 09:31:30,300,Done,0"DB_Refresh() の末尾で GetRowArray(i) の結果をそのままこの形に作って詰めています。
Columns 定義
DataGrid の Columns プロパティに同じ 8 カラムを定義しておけば、CSV の N 番目のトークンが N 番目のカラムに自動マッピングされます。
| インデックス | Header | 推奨 Format / Width |
|---|---|---|
| 0 | id | width 60 |
| 1 | order_no | width 90 |
| 2 | menu_name | width 120 |
| 3 | start_time | width 160 |
| 4 | end_time | width 160 |
| 5 | weight_g | format 0.0、width 80 |
| 6 | result | width 80 |
| 7 | is_error | width 60 |
更新フロー
スクリプトは DispData.Clear() → 繰り返し Add() だけ。DB_Refresh() の 1 行 1 行がそのまま DispData に積まれ、画面が自動で再描画されます。
DispData.Clear();
for( i, 0, rows-1 )
{
array row = DB["local"].GetRowArray(i);
DispData.Add($"{row[0]},{row[1]},{row[2]},{row[3]},{row[4]},{row[5]},{row[6]},{row[7]}");
}2) ModifyDlg — ダイアログ + 双方向バインディング
ModifyDlg は ViewModule type が Dialog の画面です。
編集フィールド 8 個
Data.xms に宣言した変数が、ダイアログの入力コントロールと 1:1 で結びついています。
// Data.xms 抜粋
int EditId = 0; // PK(read-only 表示)
string EditOrderNo = "";
string EditMenuName = "";
string EditStartTime = ""; // read-only 表示
string EditEndTime = "";
double EditWeightG = 0.0;
string EditResult = "";
int EditIsError = 0;ダイアログ上の各 XTextBox / XNumberBox / XCheckBox の DataName プロパティをこの変数名にすれば、ユーザ入力は自動的に Data::Edit* 変数に書き戻されます。
| ダイアログコントロール | DataName | 推奨 readonly |
|---|---|---|
| Id 表示 | Data::EditId | ✓ |
| Order No 入力 | Data::EditOrderNo | |
| Menu 入力 | Data::EditMenuName | |
| Start time | Data::EditStartTime | ✓ |
| End time | Data::EditEndTime | |
| Weight (g) | Data::EditWeightG | |
| Result | Data::EditResult | |
| Error チェックボックス | Data::EditIsError |
ダイアログ呼び出しの流れ
Modify ボタンが呼ぶ DB_OpenModifyDlg() が標準パターン。
FUNCTION DB_OpenModifyDlg()
{
// (ガード省略)
// 1) 選択行の値を編集フィールドへコピー
EditId = DB["local"].GetValueInt(SelectIndex, "id");
EditOrderNo = DB["local"].GetValue (SelectIndex, "order_no");
EditMenuName = DB["local"].GetValue (SelectIndex, "menu_name");
EditStartTime = DB["local"].GetValue (SelectIndex, "start_time");
EditEndTime = DB["local"].GetValue (SelectIndex, "end_time");
EditWeightG = DB["local"].GetValueDouble(SelectIndex, "weight_g");
EditResult = DB["local"].GetValue (SelectIndex, "result");
EditIsError = DB["local"].GetValueInt(SelectIndex, "is_error");
// 2) ダイアログ表示 — ユーザが OK / Cancel するまでブロック
if( GUI.ShowDialog(/*viewModuleName*/"ModifyDlg") == false )
{
Log($"DB_OpenModifyDlg : cancelled by user");
return false;
}
// 3) OK なら編集結果で UPDATE
return DB_UpdateModified();
}3 段階に明確に分かれています。
- DB → Edit フィールド コピー(ダイアログ表示前)
GUI.ShowDialog—true(OK)/false(Cancel)- Edit フィールド → DB UPDATE(
DB_UpdateModified)
GUI.ShowDialog の OK / Cancel
ダイアログ内の 2 つのボタンは DialogResult プロパティを持ちます。
| ボタン | DialogResult | 効果 |
|---|---|---|
| OK | true | ShowDialog が true を返して閉じる |
| Cancel | false | ShowDialog が false を返して閉じる |
この一行の約束で呼び出し側コードがシンプルになります。
3) ステータスラベル — DbStatusText
Data.xms に単純な文字列変数 1 つ:
string DbStatusText = "● CLOSED";ViewRun の右上の XLabel の DataName を Data::DbStatusText にしておけば、DB_Open() で "● OPEN"、DB_Close() で "● CLOSED" に変えるだけで画面が自動更新されます。
まとめ — 「データを更新するだけで画面が追従する」
| 変数 | コントロールプロパティ | 効果 |
|---|---|---|
DispData(array string) | XDataGrid.ItemsSourceDataName | DataGrid 行 |
SelectIndex(int) | XDataGrid.SelectIndexDataName | 選択行 0..N-1 / -1 |
Edit*(8 個) | ダイアログコントロール DataName | ModifyDlg 双方向 |
DbStatusText(string) | XLabel.DataName | ステータステキスト |
スクリプトは 変数を扱うだけ — これが QMachineStudio のデータ優先 GUI パラダイム。次章はこれらすべてを束ねる イベント(ボタンクリック) です。