Database マニュアル · Chapter 7

画面バインディング

サンプルの画面は 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 つのプロパティを設定します。

プロパティ意味
ItemsSourceDataNameData::DispDataデータグリッドが表示する行配列
SelectIndexDataNameData::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
0idwidth 60
1order_nowidth 90
2menu_namewidth 120
3start_timewidth 160
4end_timewidth 160
5weight_gformat 0.0、width 80
6resultwidth 80
7is_errorwidth 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 / XCheckBoxDataName プロパティをこの変数名にすれば、ユーザ入力は自動的に Data::Edit* 変数に書き戻されます。

ダイアログコントロールDataName推奨 readonly
Id 表示Data::EditId
Order No 入力Data::EditOrderNo
Menu 入力Data::EditMenuName
Start timeData::EditStartTime
End timeData::EditEndTime
Weight (g)Data::EditWeightG
ResultData::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 段階に明確に分かれています。

  1. DB → Edit フィールド コピー(ダイアログ表示前)
  2. GUI.ShowDialogtrue(OK)/ false(Cancel)
  3. Edit フィールド → DB UPDATE(DB_UpdateModified)

GUI.ShowDialog の OK / Cancel

ダイアログ内の 2 つのボタンは DialogResult プロパティを持ちます。

ボタンDialogResult効果
OKtrueShowDialogtrue を返して閉じる
CancelfalseShowDialogfalse を返して閉じる

この一行の約束で呼び出し側コードがシンプルになります。


3) ステータスラベル — DbStatusText

Data.xms に単純な文字列変数 1 つ:

string DbStatusText = "● CLOSED";

ViewRun の右上の XLabelDataNameData::DbStatusText にしておけば、DB_Open()"● OPEN"DB_Close()"● CLOSED" に変えるだけで画面が自動更新されます。


まとめ — 「データを更新するだけで画面が追従する」

変数コントロールプロパティ効果
DispData(array string)XDataGrid.ItemsSourceDataNameDataGrid 行
SelectIndex(int)XDataGrid.SelectIndexDataName選択行 0..N-1 / -1
Edit*(8 個)ダイアログコントロール DataNameModifyDlg 双方向
DbStatusText(string)XLabel.DataNameステータステキスト

スクリプトは 変数を扱うだけ — これが QMachineStudio のデータ優先 GUI パラダイム。次章はこれらすべてを束ねる イベント(ボタンクリック) です。