Database 매뉴얼 · Chapter 7

화면 바인딩

샘플의 화면은 두 부분으로 나뉩니다.

화면역할핵심 바인딩
ViewRun메인 — DataGrid + 6 버튼Data::DispData (행 배열) · Data::SelectIndex (선택 인덱스)
ModifyDlg레코드 수정 다이얼로그Data::EditId · EditOrderNo · EditMenuName · EditEndTime 등 8 개

스크립트는 데이터(array DispData[], int EditWeightG 등) 만 갱신하고, 컨트롤은 알아서 그것을 따라 그립니다 — 이 배선이 이번 챕터의 핵심입니다.


1) ViewRun · XDataGrid 바인딩

Data.xms 에 다음 두 변수가 선언되어 있습니다.

// CSV 한 줄 = 한 행 (id,order_no,menu_name,start_time,end_time,weight_g,result,is_error)
array DispData[] = {"",};
 
// XDataGrid 가 자동 갱신해 주는 현재 선택 행 인덱스 (-1 = 미선택)
int SelectIndex = -1;

XDataGrid 컨트롤의 Property Editor 에서 두 속성을 다음과 같이 지정합니다.

속성의미
ItemsSourceDataNameData::DispData데이터 그리드가 표시할 행 배열
SelectIndexDataNameData::SelectIndex사용자가 행을 선택하면 이 변수에 0..N-1 기록, 미선택은 -1

CSV 행 포맷

DispData 의 한 원소는 콤마로 결합된 한 줄 문자열입니다.

"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 번째 컬럼에 자동 매핑됩니다.

인덱스HeaderFormat / 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() 의 한 줄 한 줄이 그대로 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 display)
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();
}

세 단계가 명확히 분리되어 있습니다.

  1. DB → Edit 필드 복사 (다이얼로그 표시 전)
  2. GUI.ShowDialogtrue(OK) / false(Cancel)
  3. Edit 필드 → DB UPDATE (DB_UpdateModified)

GUI.ShowDialog 의 OK / Cancel 결정

다이얼로그 안의 두 버튼은 DialogResult 속성을 갖습니다.

버튼DialogResult효과
OKtrueShowDialogtrue 반환 후 닫힘
CancelfalseShowDialogfalse 반환 후 닫힘

이 한 줄짜리 약속이 호출 측 코드를 단순하게 만듭니다.


3) 상태 라벨 — DbStatusText

Data.xms 에 단순 문자열 변수 한 개:

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 패러다임입니다. 다음 챕터는 이 모든 흐름을 묶어 주는 이벤트(버튼 클릭) 입니다.