재설계 1단계 계속. <b>메인 셸이 게이트에 아예 없었다.</b> 사용자가 하루 종일 보는 화면만 자동 검증 밖이었다. 넣고 나서 글자 31개만 검사되는 것을 보고 빈 껍데기를 찍고 있다는 것을 알았다 — 컨트롤을 놓고 하나를 골라 인스펙터·레이어를 채우니 81~95개가 된다. 세 크기·탭으로 찍는다: 기본 1440x920, 현장 최대화 1920x1032, 도구 상자 탭. Loaded 커맨드(서식 목록 DB 조회)는 진단 모드에서 돌지 않게 막았다 — 게이트 결과가 접속 상태에 따라 달라지면 안 된다. <b>게이트가 게이트의 오류를 잡았다.</b> 메인 화면을 넣자 세로잘림 30건이 떴는데 전부 오탐이었다. DesiredSize 는 Margin 을 포함하고 RenderSize 는 포함하지 않아서, 세로 Margin 이 있는 TextBlock 이 예외 없이 걸린 것이다(도구 상자 그룹 머리가 "필요 27 > 실제 14" 였고 그 13 이 Margin). Margin 을 빼고 비교하도록 고쳤다. 이 검사기에서 측정이 나를 정정한 세 번째다. <b>--maxrect 가 최소 크기를 베껴 두고 있었다.</b> ProbeMinWidth=940 / ProbeMinHeight=640 / ProbeBorder=6 은 MainView.xaml 의 복사본이라, 최소 크기를 바꾸면 이 검사가 <b>옛 값을 계속 검사하며 계속 통과한다</b>. 실제 MainView 를 만들어 XAML 이 정한 값을 읽는다. <b>창 크기·위치·상태·두 패널 폭을 기억한다.</b> UserPrefs 가 Dictionary<string,bool> 이라 숫자를 못 담던 것이 원인이었다. JsonElement 로 바꿔 이미 깔린 prefs.json 이 살아남게 했다 — string 이나 double 로 바꾸면 역직렬화가 터져 기존 취향이 통째로 초기화된다. 복원값은 반드시 클램프한다. 이 앱은 WindowStyle=None 이라 제목 표시줄을 직접 그리므로, 저장된 위치가 지금 화면에 없으면(회사에서 두 번째 모니터, 집에서 노트북) 메뉴·저장·닫기가 전부 손에 닿지 않고 마우스로 되돌릴 방법이 없다. 기본 크기로는 이 문제가 안 나지만, 저장을 시작하는 순간 복원되는 것은 사용자가 만든 값이다. 닫기를 물렀을 때는 저장하지 않는다 — 조작하지 않은 값이 남는다. 게이트: 테스트 277/277, --dialog-shots 대조군 4/4 · 글자 2,465개 검사 · 넘침 0건, --maxrect 0실패(MainView 실측 940x640 테두리 6), --cleartype 11/11, --edit-smoke 0실패, --modal-check 0실패, 빌드 경고 0, --db-smoke 1271건 diff 0, --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 동일. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
47 lines
2.5 KiB
C#
47 lines
2.5 KiB
C#
namespace SheetMe.Designer.Services;
|
|
|
|
/// <summary>HIS 기동 인자 — 레거시 규약 <c>"UidCod,ComNum,ShtCod"</c> (콤마 구분 단일 argv)</summary>
|
|
/// <param name="UidCod">HIS 사용자 코드 — 감사 컬럼의 출처</param>
|
|
/// <param name="ComNum">내원번호 — 레거시에서도 선언·대입만 있고 사용처가 없는 죽은 인자. 형상 보존용</param>
|
|
/// <param name="ShtCod">기동 시 자동으로 열 서식 코드</param>
|
|
/// <param name="Raw">원문 — 단일 인스턴스 포워딩에 그대로 전달</param>
|
|
public sealed record HisLaunch(string UidCod, int? ComNum, string ShtCod, string Raw);
|
|
|
|
/// <summary>
|
|
/// 기동 인자 파싱. 레거시 frmSheetDesigner.vb:877 의 관용 파싱
|
|
/// (<c>(Command() & "".PadRight(10, ",")).Split(",")</c>)을 이식했다 —
|
|
/// 필드가 모자라도 인덱스가 보장되므로 인자 형상이 변해도 깨지지 않는다.
|
|
/// </summary>
|
|
public static class StartupArguments
|
|
{
|
|
#region Methods
|
|
/// <summary>진단 플래그 기동인지 — 첫 인자가 "--" 로 시작</summary>
|
|
/// <summary>
|
|
/// 이번 실행이 진단 모드인가. App 이 기동 때 한 번 정하고, 화면 쪽에서 읽는다.
|
|
///
|
|
/// 화면이 이것을 봐야 하는 이유: 게이트가 MainView 를 띄울 때 Loaded 커맨드가 DB 를 치면
|
|
/// 검사 결과가 접속 상태에 따라 달라진다. 게이트는 DB 없이 같은 답을 내야 한다.
|
|
/// </summary>
|
|
public static bool DiagnosticMode { get; set; }
|
|
|
|
public static bool IsDiagnostic(string[] args)
|
|
=> args.Length > 0 && args[0].StartsWith("--", StringComparison.Ordinal);
|
|
|
|
/// <summary>HIS 기동 인자 — 진단 모드이거나 인자가 없으면 null</summary>
|
|
public static HisLaunch? Parse(string[] args)
|
|
=> IsDiagnostic(args) || args.Length == 0 ? null : ParseRaw(string.Join(" ", args));
|
|
|
|
/// <summary>
|
|
/// 원문 파싱 — 단일 인스턴스 포워딩 수신부와 공용.
|
|
/// ComNum 은 레거시가 CInt 로 변환하다 비숫자에서 예외를 냈지만, 죽은 값 때문에 기동이
|
|
/// 실패하면 안 되므로 여기서는 TryParse 로 관용 처리한다.
|
|
/// </summary>
|
|
public static HisLaunch ParseRaw(string raw)
|
|
{
|
|
var parts = ((raw ?? string.Empty) + new string(',', 10)).Split(',');
|
|
var comNum = int.TryParse(parts[1].Trim(), out var n) ? n : (int?)null;
|
|
return new HisLaunch(parts[0].Trim(), comNum, parts[2].Trim(), raw ?? string.Empty);
|
|
}
|
|
#endregion
|
|
}
|