diff --git a/src/SheetMe.Designer/Diagnostics/ClearTypeCheck.cs b/src/SheetMe.Designer/Diagnostics/ClearTypeCheck.cs
index a8039cf..80d78ff 100644
--- a/src/SheetMe.Designer/Diagnostics/ClearTypeCheck.cs
+++ b/src/SheetMe.Designer/Diagnostics/ClearTypeCheck.cs
@@ -51,14 +51,34 @@ internal static class ClearTypeCheck
// 위 표본들은 기법이 듣는지를 잰다(합성 도형). 그것이 통과해도
// 실제 창에 기법을 안 걸었으면 글자는 계속 뭉개진다 — 실제로 그랬다.
// 쿼리 편집 창은 카드에 그림자 Effect 가 있어 그 안 글자가 전부 중간 서피스를 탄다.
+ // 카드 제목만 재던 것으로는 부족했다 — 제목은 켜졌는데 SQL 본문은 계속 꺼져 있었다.
+ // 사람이 실제로 들여다보는 표면을 다 재야 한다: 본문·변수 목록·결과 요약.
var real = OpenQueryEditorForClearType();
- if (real.Window is not null && real.Target is not null)
+ if (real is null)
{
- samples.Add(("G(실제 창) 쿼리 편집 카드 안 글자", real.Target, true));
+ Lines.Add("SKIP G~J(실제 창) — 창을 띄우지 못해 판정 불가");
}
else
{
- Lines.Add("SKIP G(실제 창) — 창을 띄우지 못해 판정 불가");
+ foreach (var (label, name) in new[]
+ {
+ ("G(실제 창) 카드 제목", "SQL 편집기"),
+ ("H(실제 창) SQL 본문", "Highlight"),
+ ("I(실제 창) 치환 변수 목록", "VariableList"),
+ })
+ {
+ var target = name == "SQL 편집기"
+ ? FindTextBlock(real, name)
+ : real.FindName(name) as FrameworkElement;
+ if (target is { ActualWidth: > 0 })
+ {
+ samples.Add((label, target, true));
+ }
+ else
+ {
+ Lines.Add($"SKIP {label} — 대상을 찾지 못해 판정 불가");
+ }
+ }
}
// 창이 보이는 것과 합성기가 그려 낸 것은 다르다 — Loaded 직후 찍으면 빈 화면을 잰다.
@@ -106,11 +126,12 @@ internal static class ClearTypeCheck
/// 창은 화면 안(0,0)에 띄운다. BitBlt 는 화면에 실제로 그려진 픽셀만 읽으므로
/// 화면 밖(-10000)에 두면 아무것도 못 잰다.
///
- private static (Window? Window, FrameworkElement? Target) OpenQueryEditorForClearType()
+ private static Window? OpenQueryEditorForClearType()
{
try
{
- var editor = new Views.QueryEditorWindow("MDataTable1", "select 1 from dual")
+ var editor = new Views.QueryEditorWindow("MDataTable1",
+ "select PatChtNum, PatNam from P_PatInf where ROWNUM <= 1")
{
Left = 0,
Top = 0,
@@ -118,14 +139,12 @@ internal static class ClearTypeCheck
};
editor.Show();
editor.UpdateLayout();
- // 카드 제목은 13.5px SemiBold — 뭉개짐이 가장 먼저 보이는 자리다
- var target = FindTextBlock(editor, "SQL 편집기");
- return (editor, target);
+ return editor;
}
catch (Exception ex)
{
- Lines.Add($"SKIP G(실제 창) — {ex.GetType().Name}: {ex.Message}");
- return (null, null);
+ Lines.Add($"SKIP G~I(실제 창) — {ex.GetType().Name}: {ex.Message}");
+ return null;
}
}
diff --git a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml
index 710957a..93c92a9 100644
--- a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml
+++ b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml
@@ -317,7 +317,9 @@
-
+
@@ -338,8 +340,13 @@
본문 사이 구분선까지 함께 휘어 보인다. -->
+
+ BorderBrush="{DynamicResource B.Line2}" Background="{DynamicResource B.Surface}"
+ RenderOptions.ClearTypeHint="Enabled">
@@ -455,6 +462,19 @@
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
AutomationProperties.Name="치환 변수 목록">
+
+
+
+
+
+
diff --git a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml.cs b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml.cs
index a76b5f1..f187029 100644
--- a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml.cs
+++ b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml.cs
@@ -560,11 +560,12 @@ public partial class QueryEditorWindow : Window
}
TrialPane.Visibility = Visibility.Visible;
- // 무엇으로 돌렸는지 먼저 말한다 — 실제 값인지 자리표시인지에 따라 결과의 의미가 완전히 다르다.
- // 이 한 줄이 없으면 0행을 보고 "이 환자에게 자료가 없다"로 잘못 읽는다.
- var basis = variables is not null
- ? $"환자 {Services.PatientSession.Label} 의 실제 값으로 실행"
- : "환자를 고르지 않아 변수를 NULL 로 두고 구문만 검사";
+ // 무엇으로 돌렸는지는 말해야 하지만 환자를 두 번 적지 않는다 —
+ // 아래 버튼이 이미 "환자 해제 — 강한(0001381872) · 외래 …" 를 그대로 보여 준다.
+ // 같은 정보를 두 군데 적으면 요약이 두 줄로 늘어 결과 표를 밀어내고,
+ // 화면에 환자 이름이 필요 이상으로 여러 번 남는다.
+ // 환자가 있을 때 필요한 말은 이미 버튼이 하고 있으므로 여기서는 침묵한다.
+ var basis = variables is not null ? string.Empty : "변수 NULL — 구문만 검사";
var notes = new List();
// 환자를 안 골랐으면 모든 변수가 Unknown 이다 — 그것을 "아직 옮기지 않았다"고 적으면
// 거짓이 된다(ChtNum 은 옮겨져 있다). 그 사유는 위 basis 줄이 이미 말한다.
@@ -597,7 +598,9 @@ public partial class QueryEditorWindow : Window
? " — 구문은 정상입니다(변수가 NULL 이라 조건에 걸리는 행이 없습니다)."
: " — 구문은 정상이고, 이 환자에게 해당하는 행이 없습니다.")
: result.Summary;
- TrialSummary.Text = string.Join(" · ", new[] { head, basis }.Concat(notes));
+ // 빈 조각은 버린다 — 안 버리면 "성공 · · 경고" 처럼 가운뎃점이 떠 있는다
+ TrialSummary.Text = string.Join(" · ",
+ new[] { head, basis }.Concat(notes).Where(s => s.Length > 0));
TrialGrid.ItemsSource = ToGridRows(result);
TrialGrid.Visibility = result.Rows.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
}
@@ -605,7 +608,7 @@ public partial class QueryEditorWindow : Window
{
TrialSummary.Foreground = (System.Windows.Media.Brush)FindResource("B.Danger");
TrialSummary.Text = string.Join(" · ",
- new[] { "실패 — " + result.Error, basis }.Concat(notes));
+ new[] { "실패 — " + result.Error, basis }.Concat(notes).Where(s => s.Length > 0));
TrialGrid.ItemsSource = null;
TrialGrid.Visibility = Visibility.Collapsed;
}