시작은 미미하나 끝은 쥬쥬하리라.

UI 9

[UI] 위젯 상태 의존(Widget as State)과 화면 정리가 깨뜨린 확인 버튼

목차위젯 상태 의존(Widget as State)화면 정리가 건드린 숨은 입력 경로요약1. 위젯 상태 의존(Widget as State)증상HMI 편집기의 주소 입력 창에서 사용자 정의 주소를 목록에서 골라 확인을 누르면 "잘못된 입력 데이터" 에러가 남.- 사용자 정의 주소 : 장치에 실제로 있는 주소가 아니라, 사용자가 이름을 지어 만드는 내부 주소. 처음 쓰는 이름을 입력하면 새로 등록됨.- 새 이름을 직접 입력해서 확인 -> 정상.- 이미 만든 주소를 목록에서 골라 확인 -> 에러.- 이전 버전에서는 정상. 그 사이에 이 입력 창의 UI 일관성 정리 작업이 있었음. 원인 — 확인 버튼이 목록이 아니라 입력란을 보고 있었음주소 입력 창은 주소 종류(장치 주소, 공유 주소, 사용자 정의 주소 ...)..

[UI] 렌더링 경로 전환(Rendering Path Switch)과 마크업 아이콘이 무시하게 만든 줄바꿈 설정

목차렌더링 경로 전환(Rendering Path Switch)마크업을 걷어 낸 대가 — 행에 묶인 아이콘요약1. 렌더링 경로 전환(Rendering Path Switch)증상HMI 편집기의 항목 목록에서 주소를 연결한 항목을 추가했는데 주소 칸에 주소가 보이지 않음.- 주소 칸은 원래 [주소 종류 아이콘] + 주소 문자열 형태로 표시됨.- 문제 항목은 아이콘만 보이고 문자열이 사라짐.- 주소가 짧은 다른 항목은 정상. 길고 공백이 없는 이름형 주소(ex. Line_Pressure_Setpoint)에서만 발생.- 칸 너비를 넓히면 다시 보임. 원인 — 마크업 한 조각이 그리기 경로를 바꿨음주소 칸의 아이콘은 표시 텍스트에 이미지 마크업을 문자열로 붙여 넣는 방식이었음.// 셀을 그리기 직전마다 불리는 표시..

[C++] 저장되는 열거형의 시작 값과 화면 순서를 값으로 쓰지 않기

목차요구사항설계구현기술 배경요약1. 요구사항보고서를 파일로 저장하는 기능이 있음. 지금까지는 표 계산 형식 하나만 지원했음.-> 여기에 PDF 저장을 추가해달라는 요청이 들어옴. 인쇄본을 그대로 남겨야 하는 규정 때문임. 제약이 하나 있었음. 이미 만들어진 화면 파일들이 그대로 열려야 함.-> 저장 형식을 고르는 항목이 없던 시절의 파일이 이미 현장에 많음.-> 그 파일들을 열었을 때 기존과 똑같이 동작해야 함.2. 설계값 하나를 추가하면 되는 일이었음. 다만 같은 값을 두 군데에 넣어야 했음.- 편집 도구가 화면 파일에 저장하는 구조- 장비로 내보낼 때 빌드되는 구조 두 구조는 별개임. 편집 도구가 쓰는 형식과 장비가 읽는 형식이 다르기 때문임.=> 그래서 필드 하나를 추가해도 넣을 자리가 둘이고, 옮..

[C++] 중간 상태 누출(Intermediate State Leak)과 빠진 통지 한 줄

목차증상원인해결기술 배경요약1. 증상주소를 입력하는 화면에는 최근에 쓴 주소를 골라 넣는 기능이 있음. 그리고 같은 화면 아래에 선택한 주소들을 보여주는 표가 함께 있음. 최근 목록에서 주소를 고르면 입력칸에는 고른 주소가 제대로 들어감. 그런데 표에는 엉뚱한 주소가 찍힘. 고른 것과 상관없는 값임. 찍히는 값에 규칙이 있었음. 그 장비 종류의 기본 주소였음.ex) 시스템 영역을 고르면 표에는 언제나 0번지가 들어감. => 입력칸과 표가 같은 값을 보고 있어야 하는데 서로 다른 것을 보여줌. 그리고 저장되는 것은 표 쪽이었음.2. 원인최근 목록으로 주소를 바꾸면 내부에서 초기화 함수가 한 번 불림. 이 함수는 먼저 그 장비의 기본 주소로 맞춰놓고 시작함. - 입력칸은 그 뒤에 고른 주소로 다시 갱신됨...

[C++] 상호 배타 설정(Mutually Exclusive Options)과 감추기는 끄기가 아니다

목차증상원인해결기술 배경요약1. 증상차트 오브젝트에는 계열마다 표시 조건을 걸 수 있음. 조건이 참일 때만 그 계열을 그리는 기능임.그리고 고속 수집 모드가 따로 있음. 짧은 주기로 많은 점을 받아 그리는 모드라, 계열마다 조건을 따지는 여유가 없음.-> 그래서 두 기능은 함께 쓸 수 없음. 사양이 그렇게 정해져 있었음. 고속 모드를 켜면 설정 화면에서 표시 조건 항목이 사라짐. 여기까지는 정상임. 그런데 실행하면 표시 조건이 그대로 동작함. 계열이 조건에 따라 나타났다 사라짐. => 설정 화면에서는 끈 것처럼 보이는데 실제로는 살아 있었음. 사용자는 끌 방법조차 없는 상태였음. 항목이 화면에 없으니까.2. 원인고속 모드를 켤 때 한 일은 화면에서 항목을 감춘 것뿐이었음.-> 각 계열이 들고 있는 "표시..

[C++] 표시 시점의 재초기화와 불리언 인자로 가른 함수(Flag Argument)

목차증상원인해결기술 배경요약1. 증상데이터베이스 질의를 다루는 화면에서, 조회할 항목 목록의 한 줄을 골라 편집을 누르면 편집 창이 뜸.-> 이때 자료형과 크기가 저장해둔 값이 아니라 기본값으로 표시됨.- 이름 같은 다른 항목은 정상적으로 들어와 있음.- 그대로 확인을 누르면 기본값이 저장돼 원래 설정이 날아감. => 사용자는 아무것도 바꾸지 않았는데 값이 바뀜. 편집 창을 열어본 것만으로 설정이 초기화됨.2. 원인편집 창을 띄우는 쪽은 순서대로 이렇게 함. 창을 만들고, 저장돼 있던 값을 채워 넣고, 띄움. 문제는 4번임. 창이 화면에 나타나는 시점에 발생하는 이벤트에서 초기화 함수를 다시 부르고 있었음. void FieldDialog::InitForm(){ edLength->Value ..

[C++] 합성 값의 부분 검증(Partial Validation)과 닫기 직전 가로채기

목차증상원인해결기술 배경요약1. 증상주소를 입력하는 창에는 기준 주소와 오프셋 주소를 함께 지정하는 모드가 있음.-> 실행 중에 오프셋 값만큼 밀린 자리를 가리키게 하는 방식임. 두 값이 합쳐져 하나의 주소로 등록됨. 그런데 오프셋 쪽이 비어 있거나 엉터리여도 등록이 됨.- 기준 주소만 제대로 넣고 확인을 누르면 그대로 통과함.- 반대로 오프셋에만 값을 넣고 기준을 비워도 통과하는 경우가 있었음.-> 등록된 결과는 쓸 수 없는 주소임. 빌드나 실행 단계에 가서야 문제가 드러남. => 입력창은 "정상"이라고 답했는데 실제로는 반쪽만 본 것이었음.2. 원인검사 로직이 기준 주소에만 있었음. 오프셋 주소가 유효한지 묻는 코드가 아예 없었음. 이렇게 된 경위는 짐작할 만함.-> 처음에는 주소가 하나짜리였음. ..

[C++] 상태로 굳은 입력 정책(Stateful Input Policy)과 초기화 생략의 부작용

목차증상원인해결기술 배경요약1. 증상한 프로젝트에 장비가 여러 대 등록될 수 있고, 장비 종류에 따라 주소 표기 규칙이 다름.- 일반 장비 — 주소가 대문자만 씀. ex) D0100- 이름표를 쓰는 장비 — 사용자가 붙인 이름이 들어가므로 대소문자를 섞어 씀. ex) BLK0000.test 재현 순서는 이랬음.(1) 이름표 장비의 주소 BLK0000.test 를 복사함.(2) 다른 탭에서 조건을 하나 추가하고, 장비 선택을 이름표 장비로 바꿈.(3) 주소 칸에 붙여넣음. -> BLK0000.TEST 로 바뀌어 들어감. 소문자가 대문자로 변환됨.-> 그런 이름의 항목은 없으므로 유효하지 않은 주소로 판정됨. 같은 탭에서 처음부터 이름표 장비를 고르고 붙여넣으면 정상임. 장비를 바꾼 경우에만 남.2. 원인..

[C++] 측정 프록시(Measuring Proxy)와 툴팁이라는 파생 상태

목차요구사항설계구현기술 배경요약1. 요구사항HMI 편집기의 주소 입력 패널에는 장비 주소를 적는 입력창이 여럿 있음. 입력창 폭은 패널 레이아웃에 맞춰 고정되어 있음. 주소가 입력창보다 길면 기존 사양은 글꼴을 줄여서 밀어 넣고 있었음.-> 그래도 넘치는 주소가 있음. 이때는 뒷부분이 그냥 잘려 보이지 않음. 입력창을 넓히는 것은 답이 아님. 패널의 다른 항목들과 정렬되어 있고 폭이 고정임. 요구는 이것이었음. 잘린 경우에만 툴팁으로 전문을 보여줄 것. 대상 입력창의 종류가 여럿이었음.- 일반 텍스트 입력창 — 장비 주소, 시스템 주소, 보존 영역 주소, 가상 주소- 콤보박스 — 고정 목록에서 고르는 특수 주소- 목록형 콤보박스 — 이름으로 주소를 대신 가리키는 별칭=> 종류마다 실제로 글자를 그릴 수 ..

반응형