화면 바인딩
샘플의 화면은 두 부분으로 나뉩니다.
| 화면 | 역할 | 핵심 바인딩 |
|---|---|---|
| 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 에서 두 속성을 다음과 같이 지정합니다.
| 속성 | 값 | 의미 |
|---|---|---|
| ItemsSourceDataName | Data::DispData | 데이터 그리드가 표시할 행 배열 |
| SelectIndexDataName | Data::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 번째 컬럼에 자동 매핑됩니다.
| 인덱스 | 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() 의 한 줄 한 줄이 그대로 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 / 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();
}세 단계가 명확히 분리되어 있습니다.
- DB → Edit 필드 복사 (다이얼로그 표시 전)
GUI.ShowDialog—true(OK) /false(Cancel)- Edit 필드 → DB UPDATE (
DB_UpdateModified)
GUI.ShowDialog 의 OK / Cancel 결정
다이얼로그 안의 두 버튼은 DialogResult 속성을 갖습니다.
| 버튼 | DialogResult | 효과 |
|---|---|---|
| OK | true | ShowDialog 가 true 반환 후 닫힘 |
| Cancel | false | ShowDialog 가 false 반환 후 닫힘 |
이 한 줄짜리 약속이 호출 측 코드를 단순하게 만듭니다.
3) 상태 라벨 — DbStatusText
Data.xms 에 단순 문자열 변수 한 개:
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 패러다임입니다. 다음 챕터는 이 모든 흐름을 묶어 주는 이벤트(버튼 클릭) 입니다.