TN026: ddx ve ddv rutinleri

Bu Not iletişim veri alışverişi (ddx) ve iletişim veri doğrulama (ddv) mimarisi açıklar. Ayrıca nasıl ddx_ ya da ddv_ yordam yazma ve nasıl sen-ebilmek erişmek için yordamları kullanmak için ClassWizard açıklar.

İletişim veri alışverişi genel bakış

Tüm iletişim veri işlevleri c++ kodu ile yapılır. Özel kaynaklar veya sihirli makrolar yoktur. Veri değişimi ve doğrulama iletişim her iletişim sınıfta geçersiz kılınır sanal bir işlev mekanizması kalbidir. Her zaman bu formda bulunur:

void CMyDialog::DoDataExchange (CDataExchange * pDX)
{
 nbsp;  CDialog::DoDataExchange(pDX);    / / Çağrı temel sınıfı

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

Özel biçim afx Yorumlar ClassWizard bulun ve bu işlev içindeki kod düzenlemek izin verir. ClassWizard ile uyumlu olmayan kod dışında özel biçim Yorumlar yer almalıdır.

Yukarıdaki örnekte, lt; data_exchange_function_call > biçimindedir:

    DDX_Custom (pDX, nIDC, alan)

ve lt; data_validation_function_call > isteğe bağlıdır ve formda:

    DDV_Custom (pDX, alan,...)

Birden fazla ddx_/ddv_ çifti her DoDataExchange işlevinde eklenebilir.

'Afxdd_.h' tüm iletişim veri değişimi yordamları ve mfc ile sağlanan iletişim veri doğrulama yordamları listesi için bkz.

İletişim, sadece bu - üye verileri CMyDialog sınıfındaki verilerdir. O bir yapı ya da özel bir şey bunun gibi saklanmaz.

Notlar

Her ne kadar bu "iletişim bilgileri" dediğimiz, tüm özellikleri CWnd türetilmiş tüm sınıflar mevcuttur ve sadece iletişim kutuları için sınırlı değildir.

İlk değerleri veri standart c++ Oluşturucu, genellikle bir blok ayarlanır //{{AFX_DATA_INIT ve //}}AFX_DATA_INIT Yorumlar.

CWnd::UpdateData başlatma ve hata işleme etrafında DoDataExchange çağrısı yaptığı işlemdir.

Sen-ebilmek seslenmek CWnd::UpdateData veri değişimi ve doğrulama gerçekleştirmek için herhangi bir zamanda. Varsayılan olarak, varsayılan CDialog::OnOK işleyicisinde UpdateData(doğru) denir ve varsayılan CDialog::OnInitDialog UpdateData(yanlış) denir.

Ddv_ rutin hemen bu alanda ddx_ rutin takip etmeli.

Nasıl çalışır?

Aşağıdaki iletişim veri kullanmak için anlamanız gerekmez. Ancak, bunun arkası nasıl çalıştığını anlama kendi exchange ya da doğrulama yordamı yazma yardımcı olacaktır.

DoDataExchange üye işlevi çok Serialize üye işlevi gibi - alma veya veri ayarlama/harici bir formdan sorumludur (Bu durumda denetleyen bir iletişim) / üye veri sınıfı. PDX parametresi veri alışverişi yapmak için bağlam ve CObject::Serialize CArchive parametresi benzer. Çok CArchive bir yön bayrağı gibi pDX ( CDataExchange nesne) bir yön bayrağı vardır.

Doğrulama, yalnızca m_bSaveAndValidate olarak ayarlandığında oluşur. M_bSaveAndValidate değeri CWnd::UpdateData bool parametresi tarafından belirlenir.

Diğer üç ilginç CDataExchange üye:

Kullanıcı Uzantıları

Varsayılan ddx/ddv mekanizması uzatmak için çeşitli yolları vardır. Şunları yapabilirsiniz:

Conditionals veya herhangi bir diğer geçerli c++ deyimleri intermixed Döviz ve doğrulama işlev çağrıları ile DoDialogExchange üye işlevi.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
Eğer (m_bFemale)
    DDV_MinMax (pDX, yaş, 0, m_maxFemaleAge);
başka
    DDV_MinMax (pDX, yaş, 0, m_maxMaleAge)

&Notnbsp;  Yukarıda gösterildiği gibi bu tür kod ClassWizard tarafından düzenlenemez ve yalnızca özel biçim yorumlar dışında kullanılmalıdır.

ClassWizard destek

ClassWizard, kendi ddx_ ve ddv_ yordamlarını ClassWizard kullanıcı arayüzü içine entegre izin vererek ddx/ddv özelleştirmeler kümesini destekler. Böylece tek bir projede zaman ve tekrar tekrar ya da birçok projelerde belirli ddx ve ddv yordamları yeniden planlıyorsanız yararlı maliyetidir.

Bunu yapmak için özel ddx içinde yapılan girişler.clw (Visual C++'ın önceki sürümlerinde saklanan bu bilgiler içinde APSTUDIO.INI) veya projenizin.clw dosyası. Özel girişler olabilir ya da projenizin [genel bilgi] bölümüne girmiş.clw dosya veya ddx [ExtraDDX] bölümünde.clw dosyasını \Program Files\Microsoft Visual Studio\Visual c ++ \bin dizininde. ddx oluşturmanız gerekebilir.Zaten yoksa clw dosyası. Özel ddx_/ddv_ yordamlar yalnızca belirli bir proje kullanmayı planlıyorsanız, girişler proje [genel bilgi] bölümüne ekleyin.clw dosya yerine. Rutinleri pek çok projede kullanmayı planlıyorsanız, girişleri ddx [ExtraDDX] bölümüne ekleyin.CLW.

Bu özel girişleri genel biçimi:

ExtraDDXCount = n

; ExtraDDX sayısı n nerede? satırları takip

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

; Nerede? 1-n belirten bir sayı, tanımlanan listesinde hangi ddx türü olduğunu.

Her alan bir ';' karakteriyle ayrılmış. Alanları ve amaçları aşağıda açıklanmıştır.

lt; tuşlar & gt;

hangi iletişim denetimleri bu değişken türüne izin gösteren tek karakter listesi =.

E = Düzenle

C = iki durumlu onay kutusu

c = tri-state onay kutusu

R = ilk radyo düğmesi grubu içinde

L = sigara sıralanan liste kutusu

l = sıralanmış liste kutusu

M = Birleşik giriş kutusu (ile düzenleme öğe)

N = sıralı olmayan açılan listesi

n = sıralanmış açılan listesi

1 = Eğer ddx Ekle listesi&nin başına eklenmelidir (kuyruk için varsayılan Ekle) nbsp; Bu genellikle 'Denetim' özelliği aktarım ddx yordamları için kullanılır.

lt; vb-tuşları & gt;

bu alan yalnızca 16-bit ürün vbx denetimleri (vbx denetimleri desteklenmez, 32-gem ürün) için kullanılır.

lt; istem > =

dize özelliği Birleşik giriş kutusunu (tırnak yok)

lt; türü > =

tek üstbilgi dosyasında emit türü tanımlayıcısı. Örneğimizde DDX_Time birlikte, bu CTime için ayarlanabilir.

lt; vb-anahtarları > =

bu sürümde kullanılmaz ve her zaman boş olmalıdır

lt; InitValue > =

başlangıç değeri - 0 ya da boş. Boşsa, hiçbir başlatma çizgi uygulama dosyasının //{{AFX_DATA_INIT bölümünde yazılacaktır. Boş bir girdiyi doğru başlatma garanti kurucularından olan c++ nesneleri (örneğin, CString CTime vb.) kullanılmalıdır.

lt; DDX_Proc > =

ddx_ yordam tek tanımlayıcısı. c++ fonksiyonun adı, "ddx_" ile başlamalıdır ancak "ddx_" lt; eklemeyin DDX_Proc > tanımlayıcısı. Yukarıdaki örnekte, <DDX_Proc> tanımlayıcı Saat olacaktır. Ne zaman uygulama dosyasında işlev çağrısı yazıyor ClassWizard {{afx_data_map bölümünde, bu ekler bu adı için ddx_, DDX_Time böylece gelen.

lt; yorum > =

bu ddx değişkeni iletişim kutusunda göstermek için yorum. ddx/ddv çifti tarafından gerçekleştirilen operasyonun tanımlayan herhangi bir metin sizi böyle burada, genellikle bir şey sağlayacak yerleştirin.

lt; DDV_Proc & gt;

Ddv giriş isteğe bağlı bölümüdür. Tüm ddx yordamları ilgili ddv rutinleri vardır. Genellikle, doğrulama aşamasında transfer ayrılmaz bir parçası olarak dahil etmek daha uygundur. ClassWizard ddv rutinleri herhangi bir parametre olmadan desteklemeyen beri ddv rutin herhangi bir parametre gerektirmez aldığınızda, genellikle böyle olur.

ddv_ yordam tek tanımlayıcı =. c++ fonksiyonun adı "ddv_" ile başlamalıdır ancak "ddx_" lt; ekleme DDX_Proc > tanımlayıcısı.

1 ya da 2 ddv args tarafından takip:

lt; promptX > =

dize düzenle öğesini (&er ile; için hızlandırıcı) yukarıda yer

lt; fmtX > =

değişken türü için bir biçim karakteri

d = int

u = imzalanmamış

D uzun int = (yani, uzun)

U = uzun imzasız (başka bir deyişle, dword)

f float =

F = çift

s = dize

Özel ddx örneği

Mfc Gelişmiş kavram örnek doğrulama ile özel ddx örnek bulunabilir chkbook. dollcent DDX_DollarsCents bakın.cpp için bir örnek uygulaması özel ddx rutin ve chkbook.clw ilgili örneğin ExtraDDXCount ve CHKBOOK'ın [genel bilgi] bölümündeki ExtraDDX1 girdiler.clw dosya.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index