기사 검색

검색어를 입력하세요
스카이 테크 블로그
[MFC] 사설 토토/DDV 주문

[MFC] 사설 토토/DDV 주문

이 섹션에서는 사설 토토 및 DDV 루틴에 대해 설명합니다 특히 DDV 루틴이 사설 토토 루틴 바로 다음에 호출되어야 하는 이유와 해당 순서가 준수되지 않으면 어떤 일이 발생하는지 설명합니다

이번에는 사설 토토 루틴 직후에 DDV 루틴을 호출해야 하는 이유를 설명하겠습니다

MSDN의 단어

사설 토토란 무엇입니까?대화상자 데이터 교환''은 대화 상자 컨트롤을 쉽게 초기화하고 값을 얻을 수 있게 해주는 메커니즘입니다
DDV란 무엇입니까?대화상자 데이터 유효성 검사''은 데이터를 교환할 뿐만 아니라 지정된 규칙에 따라 검증도 수행하는 메커니즘입니다

DDV 루틴은 아래 MSDN에 언급된 대로 사설 토토 루틴입니다직후전화해야 해요

주어진 컨트롤에 대한 DDV 함수를 호출해야 합니다즉시동일한 컨트롤에 대한 사설 토토 함수 뒤에

DDV_ 루틴은 다음과 같아야 합니다즉시해당 필드에 대한 DDX_ 루틴을 따르세요

이 문서에서는 이 “즉시 호출되어야 합니다''

사설 토토/DDV 주문

소개

먼저, 사설 토토 루틴 직후에 DDV 루틴이 호출되지 않으면 어떻게 됩니까?
여기서는 각 편집 상자에 연결된 두 개의 변수를 사용하여 검증하겠습니다

대화상자 클래스가 CWnd 클래스에서 재정의하는 "void DoDataExchange(CDataExchange* pDX)" 함수에서사설 토토 루틴으로서의 DDX_Text 함수 및 DDV 루틴으로서의 DDV_MaxChars 함수글자 수 제한을 유효성 검사 규칙으로 설정합니다
*상속관계는 "Dialog class>CDialogEx>CDialog>CWnd"입니다

유효성 검사는 대화 상자 초기화 프로세스가 끝난 상태를 목표로 합니다
(CDialog::OnInitDialog 함수에서 UpdateData(FALSE)를 호출하여 실행된 DoDataExchange()의 결과 확인)
성공은 ``문자 수가 상한을 초과하면 편집 상자에 입력할 수 없습니다'' 상태


편집 상자 ①
ID: IDC_EDIT_1
 변수: m_strText1(유형은 CString)
입력 제한: 10자

편집 상자 ②
ID:IDC_EDIT_2
 변수: m_strText2(유형은 CString)
입력 제한: 15자

사례⑴: 성공​ (사설 토토①→DDV1→DDX2→DDV②)

코드

DDX_Text(pDX, IDC_EDIT_1, m_strText1);// 사설 토토①
DDV_MaxChars(pDX, m_strText1, 10);// DDV①
DDX_Text(pDX, IDC_EDIT_2, m_strText2);// 사설 토토②
13426_13469// DDV②

결과

각 사설 토토 루틴 직후에 각 DDV 루틴을 호출하는 경우,
편집 상자 ①과 ②는 모두 "글자수 제한을 초과하면 입력할 수 없습니다'' 상태에 도달했습니다

case⑵:실패(DDV①→DDX1→DDV②→사설 토토②)

코드

DDV_MaxChars(pDX, m_strText1, 10);// DDV①
DDX_Text(pDX, IDC_EDIT_1, m_strText1);// 사설 토토①
DDV_MaxChars(pDX, m_strText2, 15);// DDV②
DDX_Text(pDX, IDC_EDIT_2, m_strText2);// 사설 토토②

결과

각 사설 토토 루틴 이전에 DDV 루틴을 호출하는 경우,
편집 상자 ①은 “15자입력 가능", 편집 상자 ②는 "상한값을 초과해도 입력 가능

사례⑶: 실패​(사설 토토Ⅰ→DDX2→DDVⅠ→DDV②)

코드

DDX_Text(pDX, IDC_EDIT_1, m_strText1);// 사설 토토①
DDX_Text(pDX, IDC_EDIT_2, m_strText2);// 사설 토토②
DDV_MaxChars(pDX, m_strText1, 10);// DDV①
14633_14676// DDV②

결과

사설 토토 루틴을 호출한 후 DDV 루틴을 호출하면,
편집 상자 ①은 “상한값을 초과해도 입력 가능” 편집 상자 ②는 "15자만 입력할 수 있는 상태입니다

그러면 왜 이런 행동이 발생합니까?

답변 부분

DDV 루틴이 어떤 제어가 필요한지 파악하는 방법

키는 사설 토토 및 DDV 루틴 모두에 공통된 인수입니다pDX(CDataExchange*유형)
CDataExchange 클래스는 데이터 저장 확인 상태와 상위 창에 대한 포인터를 저장합니다

사설 토토 루틴이 호출되면 내부적으로 "지정된 ID를 가진 컨트롤"에 대한 핸들을 얻습니다
대화상자 데이터 교환은 여기에서 얻은 제어를 위한 데이터를 설정하고 획득함으로써 이루어집니다
또한 핸들을 얻으면 "지정된 ID는 마지막으로 지정된 컨트롤 ID로 CDataExchange 클래스에 보관됩니다
*CDataExchange 클래스의 멤버 변수 "m_idLastControl"에 의해 보유됩니다

반면, DDV 루틴은 이전에 CDataExchange 클래스에 저장된 ``마지막으로 지정된 컨트롤 ID''를 사용하여 컨트롤을 검색합니다

이러한 방식으로 DDV 루틴은 사설 토토에서 업데이트된 CDataExchange 클래스의 정보를 기반으로 합니다, 데이터를 검증하세요
따라서 DDV 루틴은 사설 토토 루틴 직후에 호출되어야 합니다

사설 토토/DDV 주문 확인 결과 이유

위의 확인을 통해 우리는 사설 토토/DDV의 순서에 대해 다음을 알고 있습니다

케이스⑵

사설 토토①에서는 IDC_EDIT_1이 "마지막으로 지정된 컨트롤 ID"로 유지되며, DDV②에서는 해당 정보를 기반으로 문자 수의 상한이 "15자"로 설정됩니다

케이스⑶

DDV① 및 DDV②를 호출할 때 IDC_EDIT_2는 알림을 받을 컨트롤로 처리됩니다
따라서 편집 상자②에 대해 DDV① 및 DDV②가 확인되었음을 알 수 있습니다
DDV_MaxChars의 문자 수 상한 설정 방법은 SendMessage 함수를 사용하여 문자 수 상한을 알리는 것이므로 편집 상자 ②의 문자 수 상한이 "10 자"에서 "15 자"로 업데이트되었습니다

뒤를 돌아보며

⑶의 경우 초기화가 완료된 후 편집 상자 ①에 10자 이상 입력 후 UpdateData(TRUE)를 호출하면 다음과 같은 메시지 상자가 표시됩니다

DDV_MaxChars 함수의 조건에 따라 메시지 상자가 표시되기 때문에 발생하며 UpdateData(TRUE) 함수에서 DoDataExchange()가 실행될 때 이 조건이 충족됩니다

그러나 MSDN을 제대로 읽지 않고 내부 처리를 이해하지 못한다면 갑자기 나타나는 메시지 상자에 놀랄 수도 있습니다(제가 가지고 있습니다)

MSDN의 "이것을 하지 마세요"라는 말을 함부로 받아들이지 말고 왜 하면 안되는지 이해하십시오이렇게하지 말아야 할 일을 실수로 할 가능성이 줄어듭니다

또한내부 처리를 이해하면 확장 및 활용이 가능합니다

내 작업에 사용된 코드에는 전임자들이 축적한 유용한 메커니즘이 많이 있으므로 반드시 필수 사항을 이해하여 반드시 사용하고 활용할 수 있도록 하고 싶습니다

사설 토토/DDV의 순서에 관한 모든 것입니다

마지막으로

이번에는 사설 토토/DDV의 순서가 왜 동일해야 하는지 확인했습니다
이것은 대화 데이터 교환을 다룰 때 기본적인 사항이지만 제공된 코드를 따르면 대화 데이터 교환의 본질을 이해하는 데 더 가까워진 것 같습니다

또한 기본이 모든 것의 핵심이기 때문에 앞으로도 기본을 뒷받침하는데 중점을 두고 싶습니다

그렇습니다
끝까지 읽어주셔서 감사합니다


\공유해주세요! /
  • X
  • 페이스북
  • LINE

입사 후 기술을 향상시키고 싶은 젊은 사람이든, 다양한 분야에서 자신의 경험을 활용하고 싶은 베테랑이든, 우리는 각 개인의 경험에 맞는 중견 채용을 제공합니다

스카이코퍼레이션의 소프트웨어 개발, 제품, 채용에 관한 문의사항은 아래 링크를 확인해주세요
문의하기