다음을 통해 공유


TN026: DDX 및 DDV 루틴

[!참고]

이 처음 온라인 설명서에 포함 되었습니다 이후 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대 한 검색 하는 것이 좋습니다.

이 참고가 대화 상자 데이터 교환 (DDX) 및 대화 상자 데이터 유효성 검사 (DDV) 아키텍처에 설명합니다.또한 DDX_ 또는 DDV_ 프로시저를 작성 하는 방법 및 루틴을 사용 하는 클래스를 확장 하는 방법을 설명 합니다.

대화 상자 데이터 교환 개요

모든 대화 데이터 함수가 c + + 코드로 이루어집니다.매직 매크로 없거나 특수 리소스입니다.메커니즘의 핵심에는 대화 상자 데이터 교환 하지는 모든 대화 상자 클래스에서 재정의 되는 가상 함수 및 유효성 검사입니다.항상이 형태로 찾을 수 있습니다.

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    // call base class

    //{{AFX_DATA_MAP(CMyDialog)
        <data_exchange_function_call>
        <data_validation_function_call>
    //}}AFX_DATA_MAP
}

AFX 특수 형식 주석을 클래스 마법사를이 함수 내의 코드를 편집할 수 있습니다.특수 한 형식 주석 외부 클래스 마법사와 호환 되지 않는 코드를 넣어야 합니다.

위의 예에서, <data_exchange_function_call> 형식입니다.

    DDX_Custom(pDX, nIDC, field);

및 <data_validation_function_call> 며 형식입니다.

    DDV_Custom(pDX, field, ...);

둘 이상의 DDX_/DDV_ 쌍 각각에 포함 된 DoDataExchange 함수입니다.

'Afxdd_.h' 대화 상자 데이터 교환 루틴 및 MFC와 함께 제공 된 대화 상자 데이터 유효성 검사 루틴 목록을 참조 하십시오.

대화 상자 데이터는 단지: 멤버 데이터에는 CMyDialog 클래스입니다.구조체 또는 비슷한 아무 것도 저장 되지 않습니다.

참고

우리가 "대화 데이터" 호출 되지만 모든 기능에서 파생 된 클래스에서 사용할 수 있는 CWnd 하 고만 대화 상자에 제한 되지 않습니다.

초기값의 데이터 블록을 일반적으로 표준 c + + 생성자에서 설정 됩니다 //{{AFX_DATA_INIT 및 //}}AFX_DATA_INIT 설명 합니다.

CWnd::UpdateData초기화 및 오류 처리 호출을 해결 하지 작업 DoDataExchange.

호출할 수 있는 CWnd::UpdateData 언제 든 지 데이터 교환 및 유효성 검사를 수행 합니다.기본적으로 UpdateData호출에서 기본값 (TRUE) CDialog::OnOK 처리기 및 UpdateData(FALSE) 호출에서는 기본적으로 CDialog::OnInitDialog.

DDV_ 루틴은 즉시 DDX_ 루틴을 따라야 필드.

어떻게 작동 합니까?

대화 상자 데이터를 사용 하려면 다음을 이해 하지 않아도 됩니다.그러나이 내부적으로 작동 방식을 이해 하면 exchange 또는 유효성 검사 프로시저를 직접 작성 하는 데 도움이 됩니다.

DoDataExchange 멤버 함수를 것 처럼의 Serialize 멤버 함수-가 가져오는 설정/데이터를 양식 외부에서 담당 (이 경우 컨트롤 대화 상자) / 클래스에서 멤버 데이터에서.pDX 매개 변수 데이터 교환 작업을 수행 하는 것과 유사에서 CArchive 매개 변수를 CObject::Serialize.pDX (는 CDataExchange 개체) 같은 많은 플래그는 방향이 되었습니다 CArchive 방향 플래그가 있습니다:

  • 경우 ! m_bSaveAndValidate, 다음 데이터 상태를 컨트롤에 로드 합니다.

  • 경우 m_bSaveAndValidate, 다음에서 컨트롤의 데이터 상태를 설정 합니다.

유효성 검사에만 발생 하면 m_bSaveAndValidate 설정 됩니다.값을 m_bSaveAndValidate BOOL 매개 변수에 의해 결정 됩니다 CWnd::UpdateData.

세 가지 다른 흥미로운 CDataExchange 멤버:

  • m_pDlgWnd: 컨트롤이 포함 된 창 (일반적으로: 대화 상자)입니다.따라서 DDX_ 및 DDV_ 전역 함수의 호출자 'this'를 전달 하는 것 모든 DDX/DDV 루틴을 것입니다.

  • PrepareCtrlPrepareEditCtrl: 대화 상자 컨트롤에 대 한 데이터 교환 준비 합니다.유효성 검사에 실패할 경우 포커스 설정에 대 한 해당 컨트롤의 핸들을 저장 합니다.PrepareCtrlnonedit 컨트롤을 사용 하 고 PrepareEditCtrl 편집 컨트롤에 사용 됩니다.

  • 실패: 사용자 입력된 오류를 알리는 메시지 상자를 가져온 후에 호출 됩니다.이 루틴의 마지막 컨트롤에 포커스를 복원 합니다 (마지막 호출 PrepareCtrl/PrepareEditCtrl) 하 고 예외를 throw 합니다.DDV_와 DDX_ 루틴에서이 멤버 함수를 호출할 수 있습니다.

사용자 확장

기본 DDX/DDV 메커니즘을 확장 하는 방법은 여러 가지가 있습니다.다음과 같은 작업을 수행할 수 있습니다.

  • 새 데이터 형식을 추가 합니다.

    CTime
    
  • 새 exchange 절차 (DDX_???)를 추가 합니다.

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • 새 유효성 검사 절차 (DDV_???)를 추가 합니다.

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • 임의의 식 유효성 검사 프로시저에 전달 합니다.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    [!참고]

    이러한 임의 식 클래스 마법사에서 편집할 수 없습니다, 따라서 특수 형식 주석 외부에서 이동 해야 (/ / {{AFX_DATA_MAP(CMyClass)).

DoDialogExchange 멤버 함수를 포함 하면 조건 또는 다른 유효한 c + + 문 혼합 교환 및 유효성 검사 함수를 호출 합니다.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check(pDX, IDC_SEX, m_bFemale);
DDX_Text(pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
if (m_bFemale)
    DDV_MinMax(pDX, age, 0, m_maxFemaleAge);
else
    DDV_MinMax(pDX, age, 0, m_maxMaleAge);

[!참고]

위와 같이 이러한 코드 클래스 마법사에서 편집할 수 없습니다 하 고 외부의 특수 한 형식 주석만 사용 해야 합니다.

클래스 마법사 지원

클래스 마법사 자신의 DDX_ 및 DDV_ 루틴을 클래스 마법사 사용자 인터페이스에 통합할 수 있도록 함으로써 DDX/DDV 사용자의 하위 집합을 지원 합니다.이렇게 유익한 특정 DDX 및 DDV 루틴 프로젝트 또는 여러 프로젝트에서 다시 사용할 계획인 경우만 비용입니다.

이 위해서는 특수 항목 DDX에 이루어집니다.CLW (이전 버전의 Visual C++이 정보를 APSTUDIO에 저장 합니다.INI) 또는 프로젝트의.CLW 파일입니다.특정 항목 수 프로젝트의 [일반 정보] 섹션에 입력 합니다.CLW 파일 또는 [ExtraDDX] 섹션의 DDX.CLW 파일에서 \Program Files\Microsoft studio\visual의 Visual C + + \bin 디렉터리입니다.DDX를 만들어야 할 수 있습니다.CLW 파일을 이미 존재 하지 않는 경우입니다.특정 프로젝트에만 사용자 지정 DDX_/DDV_ 루틴을 사용 하는 경우 프로젝트의 [일반 정보] 섹션에 항목을 추가 합니다.CLW 파일 대신.루틴을 여러 프로젝트에서 사용 하는 경우의 DDX [ExtraDDX] 섹션에 항목을 추가 합니다.CLW입니다.

이러한 특별 항목의 일반적인 형식은 다음과 같습니다.

ExtraDDXCount=n

여기서 n은 ExtraDDX 수 있습니까?따르는 줄

ExtraDDX?=<keys>;<vb-keys>; <prompt>; <type>; <initValue>; <DDX_Proc>
[;<DDV_Proc>; <prompt1>; <arg1>; [<prompt2>; <fmt2>]]

위치?DDX 형식을 정의 하 고 목록에서 숫자 1 – n을 나타냅니다.

각 필드에는 ';' 문자로 구분 됩니다.필드와 용도 다음과 같습니다.

  • <keys>
    단일 문자는 대화 상자 컨트롤의이 변수 형식을 사용할 수 있는지 나타내는 목록을입니다.

    E = 편집

    C = 두 가지 상태 확인란

    c = 상 확인란

    R = 첫 번째 라디오 단추 그룹

    L = 것된 목록 상자

    l = 정렬 된 목록 상자

    M = 콤보 상자 (항목) 편집

    N = 것된 드롭 목록

    n = 정렬된 드롭다운 목록

    1 = DDX 삽입 목록의 헤드에 추가 해야 하는 경우 (기본 꼬리에 추가)이 '제어' 속성을 전송 하는 DDX 루틴을 일반적으로 사용 됩니다.

  • < vb 키 >
    VBX 컨트롤 (32 비트 제품에서 VBX 컨트롤을 지원 하지 않는)에 대 한 16 비트 제품에만이 필드 사용

  • <prompt>
    속성 콤보 상자의 (따옴표 없이)를 배치 하는 문자열입니다.

  • <type>
    헤더 파일에 내보낼 수 있는 형식에 대 한 식별자입니다.우리의 위의 예제에서 ddx_time와이 Ctime에 설정 됩니다.

  • < vb 키 >
    이 버전에서 사용 되는 항상 비어 있어야 하 고

  • <initValue>
    초기 값 — 0 또는 공백입니다.비어 있는 경우에 초기화 선이 구현 파일의 //{{AFX_DATA_INIT 섹션에 기록 됩니다.빈 항목에 대 한 c + + 개체를 사용 해야 (예: CString, CTime등) 올바른 초기화를 보장 하는 생성자가 있는.

  • <DDX_Proc>
    DDX_ 프로시저에 대 한 식별자입니다.C + + 함수 이름을 "DDX_"로 시작 해야 하지만 "DDX_" <DDX_Proc>를 포함 하지 않음 식별자입니다.위의 예제에서 <DDX_Proc> 식별자는 시간이 됩니다.때 클래스 마법사 씁니다 함수 호출의 구현 파일에 {{AFX_DATA_MAP 섹션 만들어 추가이 이름은 DDX_, 따라서 ddx_time에 도착 합니다.

  • <comment>
    이 DDX 변수 대화 상자를 표시 하는 주석입니다.DDX/DDV 쌍으로 수행 되는 작업을 설명, 그리고 일반적으로 무언가 제공 시겠습니까 텍스트를 배치 합니다.

  • <DDV_Proc>
    DDV 일부 항목의 선택 사항입니다.DDX 루틴을 모든 해당 DDV 루틴을 갖고 있습니다.종종 전송 정수 계열 일부로 유효성 검사 단계를 포함 하는 더 편리 합니다.DDV 루틴 매개 변수가 필요 하지 않은 경우 DDV 루틴 매개 변수 없이 클래스를 지원 하지 않으므로이 이런 경우가 많습니다.

  • <arg>
    DDV_ 프로시저에 대 한 식별자입니다.C + + 함수 이름을 "DDV_"를 시작 해야 하지만 "DDX_" <DDX_Proc> 포함 되어 있지 않습니다. 식별자입니다.

1 또는 2 DDV args가 옵니다.

  • <promptX>
    위에 편집 항목을 배치할 문자열 (와 & 가속기에 대 한)

  • <fmtX>
    형식 문자 중 하나가 인수 형식에 대 한

    d = int

    u = 서명 되지 않은

    D long int = (즉, 시간)

    U = 부호 없는 long (DWORD)

    f = float

    F = 더블

    s = 문자열

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트