TN026: DDX และงานประจำ DDV

หมายเหตุนี้อธิบายถึงการแลกเปลี่ยนข้อมูลโต้ตอบ (DDX) และการโต้ตอบข้อมูลการตรวจสอบ (DDV) สถาปัตยกรรม มันยังอธิบายถึงวิธีการที่คุณเขียนกระบวนงาน DDX_ หรือ DDV_ และวิธีที่คุณสามารถขยาย ClassWizard การใช้งานของคุณ?

ภาพรวมของการแลกเปลี่ยนข้อมูลการโต้ตอบ

ฟังก์ชันข้อมูลโต้ตอบทั้งหมดเสร็จ ด้วยรหัส c ++ มีไม่มีทรัพยากรที่พิเศษหรือแมโครวิเศษ หัวใจของกลไกที่เป็นเสมือนฟังก์ชันที่จะถูกแทนที่ในทุกชั้นการโต้ตอบที่โต้ตอบแลกเปลี่ยนข้อมูลและตรวจสอบ มันจะพบเสมอในแบบฟอร์มนี้:

cMyDialog::DoDataExchange (CDataExchange * pDX) ถือเป็นโมฆะ
{
 nbsp  CDialog::DoDataExchange(pDX)    / / เรียกใช้คลาสพื้นฐาน

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

ข้อคิดเห็น AFX รูปแบบพิเศษอนุญาตให้ ClassWizard เพื่อค้นหา และแก้ไขรหัสภายในฟังก์ชันนี้ ควรวางโค้ดที่ไม่เข้ากันกับ ClassWizard ภายนอกของข้อคิดเห็นรูปแบบพิเศษ?

ในตัวอย่างข้างต้น lt; data_exchange_function_call > อยู่ในแบบฟอร์ม:

nbsp   DDX_Custom (pDX, nIDC เขตข้อมูล)(&N)

และ ลาย data_validation_function_call > เป็นทางเลือก และเป็นในแบบฟอร์ม:

nbsp   DDV_Custom (pDX ฟิลด์,...)(&N)

DDX_/DDV_ คู่ที่มากกว่าหนึ่งอาจรวมอยู่ในแต่ละฟังก์ชันDoDataExchange?

ดูรายการของการโต้ตอบข้อมูลแลกเปลี่ยนตามปกติและโต้ตอบข้อมูลการตรวจสอบตามปกติให้กับ MFC 'afxdd_.h'?

ข้อมูลโต้ตอบได้เพียงว่า - ข้อมูลสมาชิกในคลาCMyDialog มันไม่ได้เก็บอยู่ใน struct หรืออะไรพิเศษเช่นเดียวกับที่?

หมายเหตุ

แม้ว่าที่เราเรียก "โต้ตอบข้อมูลนี้" คุณลักษณะทั้งหมดพร้อมใช้งานในชั้นใด ๆ มาจากCWndและไม่จำกัดเพียงกล่องโต้ตอบเพียงอย่างเดียว?

กำหนดค่าเริ่มต้นของข้อมูลในตัวที่มาตรฐาน c ++สร้าง มักจะอยู่ในบล็อกกับ //{{AFX_DATA_INIT และ //}}AFX_DATA_INIT ข้อคิดเห็น?

CWnd::UpdateDataเป็นการดำเนินการที่ไม่ได้เตรียมใช้งานและการจัดการข้อผิดพลาดรอบการเรียกไปยังDoDataExchange?

คุณสามารถเรียกCWnd::UpdateDataตลอดเวลาเพื่อทำการแลกเปลี่ยนข้อมูลและตรวจสอบ โดยค่าเริ่มต้นUpdateData(TRUE) ถูกเรียกในตัวจัดการCDialog::OnOKเริ่มต้น และเรียกว่าUpdateData(ปลอม) ในการเริ่มต้นCDialog::OnInitDialog?

ชุดคำสั่ง DDV_ ควรทำตามชุดคำสั่ง DDX_ สำหรับเขตข้อมูลนั้นทันที?

อย่างไรได้ผล?

คุณไม่จำเป็นต้องทำความเข้าใจต่อไปนี้เพื่อใช้ข้อมูลการโต้ตอบ อย่างไรก็ตาม ทำความเข้าใจกับวิธีนี้การทำงานเบื้องหลังจะช่วยให้คุณเขียนกระบวนงานของ exchange หรือตรวจสอบ?

ฟังก์ชันสมาชิกDoDataExchangeเป็นมากเช่นฟังก์ชันสมาชิกSerialize - เป็นผู้รับผิดชอบสำหรับการรับ หรือการตั้งค่าข้อมูลไปยัง/จากแบบฟอร์มภายนอก (ในกรณีนี้ควบคุมในกล่องโต้ตอบ) จาก/ไป ยังข้อมูลสมาชิกในชั้นเรียน พารามิเตอร์pDXเป็นบริบทสำหรับทำการแลกเปลี่ยนข้อมูล และคล้ายคลึงกับพารามิเตอร์CArchiveเป็นCObject::Serialize PDX (วัตถุCDataExchange ) มีสถานะเป็นทิศทางมากเหมือนกับCArchiveมีค่าสถานะทิศทาง

ตรวจสอบเกิดขึ้นเฉพาะเมื่อมีการตั้งค่าm_bSaveAndValidate ค่าของm_bSaveAndValidateจะถูกกำหนด โดยพารามิเตอร์เป็น BOOL CWnd::UpdateData?

มีสามอื่น ๆ น่าสนใจCDataExchangeสมาชิก:

นามสกุลของผู้ใช้

มีหลายวิธีในการขยาย DDX/DDV กลไกในการเริ่มต้น คุณสามารถ:

มีฟังก์ชันDoDialogExchangeสมาชิกรวม conditionals หรือที่อื่น ๆ ถูกต้อง c ++แจงกับ intermixed exchange และการตรวจสอบการเรียกฟังก์ชัน?

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
ถ้า (m_bFemale)
 nbsp  DDV_MinMax (pDX อายุ 0, m_maxFemaleAge);
อื่น
    DDV_MinMax (pDX อายุ 0, m_maxMaleAge)(&N)

หมายเหตุnbsp  ดังที่แสดงไว้ข้างต้น รหัสเช่นไม่สามารถถูกแก้ไข โดย ClassWizard และควรใช้ภายนอกเฉพาะของข้อคิดเห็นรูปแบบพิเศษ(&N)?

สนับสนุน ClassWizard

ClassWizard สนับสนุนชุดย่อยของ DDX/DDV กำหนดเองช่วยให้คุณสามารถรวมงานประจำของ DDX_ และ DDV_ เข้าไปในอินเทอร์เฟซสำหรับผู้ใช้ ClassWizard การทำเช่นนี้คือ ต้นทุนเฉพาะที่มีประโยชน์ถ้าคุณวางแผนที่จะนำมาใช้เฉพาะ DDX และ DDV ชก็ครั้งแล้วครั้งเล่า ในโครงการ หรือ ในหลายโครงการ?

การทำเช่นนี้ รายการพิเศษจะทำใน DDXCLW (รุ่นก่อนหน้านี้ของ Visual c ++เก็บข้อมูลนี้ใน APSTUDIOINI) หรือ ในโครงการของคุณแฟ้ม CLW รายการพิเศษสามารถป้อนข้อมูลใดในส่วน [ข้อมูลทั่วไป] ของโครงการของคุณได้CLW แฟ้มหรือ ในส่วนของการ DDX [ExtraDDX]CLW แฟ้มในการ \Program Files\Microsoft Studio\Visual Visual C ++ ไดเรกทอรี \bin คุณอาจจำเป็นต้องสร้าง DDXCLW แฟ้มถ้ายังไม่มีอยู่ ถ้าคุณวางแผนที่จะใช้งาน DDX_/DDV_ แบบกำหนดเองเฉพาะในบางโครงการ เพิ่มรายการไปยังส่วน [ข้อมูลทั่วไป] ของโครงการของคุณCLW แฟ้มแทน ถ้าคุณวางแผนที่จะใช้งานประจำที่ในหลายโครงการ เพิ่มรายการไปยังส่วน [ExtraDDX] ของ DDXCLW?

รูปแบบทั่วไปของรายการพิเศษเหล่านี้คือ:

ExtraDDXCount = n

; โดยที่ n คือ จำนวนของ ExtraDDX บรรทัดที่จะทำตาม

ExtraDDX ? = lt แป้น >; < vb-คีย์ > <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]

; ที่ไหน มีตัวเลข 1-n ระบุชนิดที่ DDX ในรายชื่อที่ถูกกำหนดไว้?

แต่ละเขตข้อมูลถูกคั่น ด้วยอักขระ เขตข้อมูลและวัตถุประสงค์ของตนถูกอธิบายไว้ด้านล่าง?

lt แป้น & gt;

=รายการอักขระเดียวที่ระบุสำหรับตัวควบคุมที่โต้ตอบชนิดนี้ตัวแปรได้?

E =แก้ไข

C =กล่องกาเครื่องหมายสองสถานะ

c =กล่องกาเครื่องหมาย tri-สถานะ

R =ปุ่มแรกในกลุ่ม

L =กล่องรายการที่ไม่เรียงลำดับ

l =กล่องรายการที่เรียงลำดับ

M =กล่องคำสั่งผสม (พร้อมแก้ไขรายการ)

N =หล่นไม่เรียงลำดับรายการ

n =หล่นเรียงลำดับรายการ

1 =ถ้าควรเพิ่มแทรก DDX หน้าของรายการ (ค่าเริ่มต้นคือเพิ่มหาง) nbsp โดยทั่วไปจะใช้ DDX ตามปกติที่ถ่ายโอนในคุณสมบัติ 'ตัวควบคุม'(&N)?

lt แป้น-vb & gt;

ฟิลด์นี้ถูกใช้เฉพาะในผลิตภัณฑ์ 16 บิตสำหรับการควบคุม VBX (VBX ควบคุมไม่ถูกสนับสนุนในผลิตภัณฑ์ 32 บิต)

lt พร้อมท์ > =

สายอักขระการวางในกล่องคำสั่งผสมคุณสมบัติ (ไม่มีใบเสนอราคา)

lt ชนิด > =

ตัวระบุสำหรับชนิดคายในส่วนหัวของแฟ้มเดียว ในตัวอย่างของเราเหนือกับ DDX_Time นี้จะถูกตั้งค่าเป็น CTime?

lt แป้น-vb > =

ไม่ได้ใช้ในรุ่นนี้ และตลอดเวลาควรจะว่างเปล่า

lt; initValue > =

ค่าเริ่มต้น - 0 หรือเปล่า ถ้ามันว่างเปล่า แล้วบรรทัดไม่มีการเตรียมใช้งานจะถูกเขียนในส่วน //{{AFX_DATA_INIT ของแฟ้มใช้งาน รายการว่างควรใช้วัตถุ c ++ (เช่น CString, CTime และอื่น ๆ) ที่มี constructors ที่รับประกันการเตรียมใช้งานถูกต้อง?

lt; DDX_Proc > =

รหัสเดียวสำหรับกระบวนงาน DDX_ ชื่อฟังก์ชัน c ++ต้องเริ่มต้น ด้วย "DDX_" แต่ไม่รวม "DDX_" lt; DDX_Proc > ตัวระบุ ในตัวอย่างข้างต้น ตัวระบุ <DDX_Proc>จะเป็นเวลา เมื่อเขียนการเรียกฟังก์ชันการใช้งานแฟ้มใน ClassWizard {{ส่วน AFX_DATA_MAP จะผนวกชื่อนี้เพื่อ DDX_ จึง มาถึงที่ DDX_Time?

lt ข้อคิดเห็น > =

ความคิดเห็นเพื่อที่แสดงในกล่องโต้ตอบสำหรับตัวแปรด้วย DDX นี้ วางข้อความคุณจะต้องที่นี่ มักจะนำสิ่งที่อธิบายถึงการดำเนินการที่ดำเนินการ โดยคู่ DDX/DDV?

lt; DDV_Proc & gt;

ส่วน DDV ของรายการหรือไม่ก็ ตามปกติ DDX ทั้งหมดไม่สอดคล้องกัน DDV ชก็ได้ มัก ได้สะดวกรวมขั้นตอนการตรวจสอบเป็นส่วนหนึ่งของการโอนย้าย เป็นบ่อย ๆ กรณีนี้เมื่อรูทีน DDV ของคุณไม่จำเป็นต้องมีพารามิเตอร์ เนื่องจาก ClassWizard ไม่สนับสนุน DDV ตามปกติ โดยไม่มีพารามิเตอร์ใด ๆ?

=รหัสเดียวสำหรับกระบวนงาน DDV_ ชื่อฟังก์ชัน c ++ต้องเริ่มต้น ด้วย "DDV_" แต่ไม่รวม "DDX_" lt; DDX_Proc > ตัวระบุ?

ตาม ด้วยมีอาร์กิวเมนต์ DDV 1 หรือ 2:

lt; promptX > =

สายอักขระการวางอยู่เหนือการแก้ไขรายการ (มีแอมป์ สำหรับการเร่งความเร็ว)(&A)

lt; fmtX > =

จัดรูปแบบอักขระสำหรับชนิดอาร์กิวเมนต์ของค่า อย่างใดอย่างหนึ่ง

d = int

u =ไม่มีลายเซ็น

D =ยาว int (นั่นคือ ยาว)

U =ไม่มีลายเซ็นยาว (นั่นคือ DWORD)

f =ทุ่น

F =คู่

s =สตริง

ตัวอย่างของการกำหนดเอง DDX

ตัวอย่างของ DDX ที่กำหนดเองด้วยการตรวจสอบสามารถพบได้ในตัวอย่างแนวคิดขั้นสูง MFC CHKBOOK ดูที่ DDX_DollarsCents ใน DOLLCENTCPP สำหรับการใช้งานตัวอย่างของรูทีน DDX และ CHKBOOK แบบกำหนดเองCLW สำหรับสอดคล้องอย่าง ExtraDDXCount และรายการ ExtraDDX1 ในส่วนของ CHKBOOK ของ [ข้อมูลทั่วไป]แฟ้ม CLW?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index