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 루틴을 것입니다.
PrepareCtrl및 PrepareEditCtrl: 대화 상자 컨트롤에 대 한 데이터 교환 준비 합니다.유효성 검사에 실패할 경우 포커스 설정에 대 한 해당 컨트롤의 핸들을 저장 합니다.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 = 문자열