Aracılığıyla paylaş


TN026: ddx ve ddv yordamları

[!NOT]

Aşağıdaki Teknik Not ilk çevrimiçi belgelerinde yer almıştır bu yana güncelleştirilmemiş.Eski veya yanlış sonuç olarak, bazı yordamlar ve konuları olabilir.En son bilgiler için çevrimiçi belgelere dizinde ilgilendiğiniz konu için arama önerilir.

Bu notu iletişim verisi değişimi (ddx) ve iletişim veri doğrulama (ddv) mimarisi açıklar.Ayrıca birlikte veya ddv_ yordam yazma biçimini ve nasıl kendi yordamları kullanmak için ClassWizard genişletebilirsiniz açıklar.

İletişim kutusu veri değişimi genel bakış

Tüm iletişim veri işlevleri c++ kodu ile yapılır.Özel kaynaklar ya da Sihirli makroları yoktur.İletişim verisi değişimi yapar her iletişim sınıfta geçersiz sanal işlev ve doğrulama mekanizması kalbidir.Ayrıca, bu formda her zaman bulunur:

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
}

Özel biçim afx yorumlar ClassWizard bulun ve bu işlev içindeki kod düzenlemek izin verir.Özel biçim yorumlar dışında ClassWizard ile uyumlu olmayan kod yerleştirilmelidir.

Yukarıdaki örnekte, <data_exchange_function_call> formda aşağıdaki gibidir:

    DDX_Custom(pDX, nIDC, field);

ve <data_validation_function_call> isteğe bağlıdır ve biçimindedir:

    DDV_Custom(pDX, field, ...);

Birden fazla birlikte/ddv_ çifti her eklenebilir DoDataExchange işlev.

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

İletişim verisi değil, yalnızca: üye verileri CMyDialog sınıf.Bir struct veya benzer bir şey depolanmaz.

Notlar

Biz bu "iletişim verisi" call olsa da, tüm özellikler sınıfından türetilmiş sınıftaki kullanılabilir CWnd ve yalnızca iletişim kutuları için sınırlı değildir.

İlk değerleri veri ile bir blok içinde genellikle standart c++ yapıcı ayarlanır //{{AFX_DATA_INIT ve //}}AFX_DATA_INIT yorumlar.

CWnd::UpdateDatabaşlatma ve hata işleme etrafında çağrısı yapar operasyon DoDataExchange.

Arayabileceğiniz CWnd::UpdateData veri değişimi ve doğrulaması gerçekleştirmek için herhangi bir zamanda.Varsayılan olarak UpdateData(true) olarak adlandırılan varsayılan olarak CDialog::OnOK işleyicisi ve UpdateData(yanlış) olarak adlandırılan varsayılan olarak CDialog::OnInitDialog.

ddv_ yordamının hemen birlikte yordam için izlesin alan.

Nasıl çalışır?

Aşağıdaki iletişim verileri kullanmak için anlamanız gerekmez.Ancak, arka planda bunun nasıl çalıştığını anlama kendi exchange veya doğrulama yordamı yazmanıza yardımcı olur.

DoDataExchange Üye işlevine çok benzer olduğu Serialize üye işlevini - onu alırken veya veri/harici bir formdan sorumlu (Bu durumda Kontrol iletişim kutusunda) / sınıf üyesi verilere.pDX Parametre veri değişimi yapmak için bağlam ve benzer şekilde, CArchive parametresi için CObject::Serialize.pDX (Bir CDataExchange nesnesi) bayrak çok benzer bir yönü var CArchive yön bayrağı vardır:

  • ! M_bSaveAndValidate, sonra denetimlere veri durumu yüklenemedi.

  • m_bSaveAndValidate, Sonra denetimlerden veri durumunu ayarlayın.

Yalnızca doğrulama oluşur, m_bSaveAndValidate ayarlanır.Değeri m_bSaveAndValidate bool parametresi tarafından belirlenen CWnd::UpdateData.

Vardır üç diğer ilginç CDataExchange üyeleri:

  • m_pDlgWnd: Denetimleri içerir pencere (genellikle bir iletişim kutusu).Bu birlikte ve ddv_ genel işlevleri arayanlar 'this' geçmesine gerek kalmadan her ddx/ddv yordamına engellemektir.

  • PrepareCtrl, ve PrepareEditCtrl: iletişim denetimi veri değişimi için hazırlar.Bir doğrulama başarısız olursa, odak ayarlamak için denetim tutamacını depolar.PrepareCtrlnonedit denetimler için kullanılır ve PrepareEditCtrl düzenleme denetimleri için kullanılır.

  • Başarısız: uyarmak kullanıcı giriş hatası için bir ileti kutusu duruma getirdiğinizde denir.Bu yordam için olan en son denetim odağı geri yükler (yapılan son çağrı PrepareCtrl/PrepareEditCtrl) ve bir özel durum.Bu üye işlevini birlikte hem ddv_ yordamlarından çağrılabilir.

Kullanıcı Uzantıları

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

  • Yeni veri türleri ekleyin.

    CTime
    
  • Yeni exchange yordamları (birlikte???) ekleyin.

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Yeni doğrulama yordamlarını (ddv_???) ekleyin.

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • Rasgele ifadeler için doğrulama yordamlarını geçirin.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    [!NOT]

    Rasgele böyle ifadeler ClassWizard tarafından düzenlenen ve bu nedenle özel biçim yorumlar dışında taşınması gereken (/ / {{AFX_DATA_MAP(CMyClass)).

Sahip DoDialogExchange üye işlevini bilgi almak veya herhangi bir diğer geçerli c++ ifadelerle intermixed değişimi ve doğrulaması işlev çağrılarını içerir.

//{{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);

[!NOT]

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

ClassWizard desteği

ClassWizard kendi birlikte ve ddv_ yordamlarını ClassWizard kullanıcı arabirimi entegre izin vererek ddx/ddv özelleştirmeler kümesini destekler.Böylece tek bir projede birçok projelerinde veya belirli ddx ve ddv yordamlar kullanmayı planlıyorsanız yararlı maliyetidir.

Bunu yapmak için özel ddx yapılan girişler.clw (Visual C++'ın önceki sürümleri saklanan bu bilgiler APSTUDIO.INI) veya projenizin.clw dosyası.Özel girdiler olabilir ya da projenizin [genel bilgi] bölümünde girilen.clw dosya veya ddx [ExtraDDX] bölümünde.clw dosyasında \Program Studio\Visual Visual c ++ \bin dizininde.ddx oluşturmanız gerekebilir.clw dosya önceden yoksa.Yalnızca belirli projede özel birlikte/ddv_ yordamlar kullanmayı planlıyorsanız, girişleri projenizin [genel bilgi] bölümüne ekleyin.clw dosyası yerine.Birçok projelerde yordamlar kullanmayı planlıyorsanız, girişleri ddx [ExtraDDX] bölümüne ekleyin.CLW.

Bu özel girişlerin genel biçim yer almaktadır:

ExtraDDXCount=n

n ExtraDDX sayısı nerede?satırları izlemek için

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

nerede?tanımlanmakta olan listesinde hangi ddx türünü gösteren bir sayı 1 – n.

Her alanın ';' karakteriyle sınırlandırılmış.Alanlar ve bunların amacı aşağıda açıklanmıştır.

  • <keys>
    Bu değişken tipi için hangi iletişim kutusu denetimleri izin gösteren tek karakterler listesi =.

    E = düzenleme

    C = iki durumlu onay kutusunu

    c Üçe durumu onay kutusunu =

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

    M = nonsorted liste kutusu

    m = sıralanmış liste kutusu

    M = (düzenleme öğesi ile) birleşik giriş kutusu

    N = nonsorted açılan listesi

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

    1 = ddx ekleme için Kafa listesinin eklenmesi (tail için varsayılan Ekle) Bu genellikle 'Denetim' özelliği aktarım ddx yordamlar için kullanılır.

  • < vb anahtarları >
    Bu alan yalnızca 16-bit ürün vbx denetimleri (32-bit ürün vbx denetimleri desteklenmez) için kullanılır.

  • <prompt>
    Dize (tırnak işaretleri olmadan) özellik birleşik giriş kutusuna yerleştirmek için

  • <type>
    Tek üstbilgi dosyasında verebilmelidir türü tanımlayıcısı.Bizim örneğimizde DDX_Time birlikte, bu CTime için ayarlanır.

  • < vb anahtarları >
    Bu sürümde kullanılmaz ve her zaman boş olmalıdır

  • <initValue>
    İlk değer — 0 ise veya boş.Boşsa, hiçbir başlatma satırı uygulama dosyasının //{{AFX_DATA_INIT bölümünde yazılacaktır.Boş bir girdiyi c++ nesneleri için kullanılmalıdır (gibi CString, CTime, vb.) doğru başlatma garanti oluşturucuları vardır.

  • <DDX_Proc>
    Birlikte yordam tek tanımlayıcısı.c++ işlev adı "İle birlikte" başlaması gerekir, ancak <DDX_Proc> "Birlikte" içerme tanımlayıcı.Yukarıdaki örnekte, <DDX_Proc> tanımlayıcı zaman olacaktır.ClassWizard işlev çağrısı uygulama dosyasına yazdığında {{afx_data_map bölümünde, bu ekler Bu ad için birlikte, bu nedenle at DDX_Time geliyor.

  • <comment>
    Bu ddx değişkenle için iletişim kutusunu görüntülemek için açıklama.ddx/ddv çifti tarafından gerçekleştirilen işlem açıklayan burada ve genellikle bir şey sağlamak istediğiniz metni girin.

  • <DDV_Proc>
    ddv giriş isteğe bağlı bölümüdür.Tüm ddx yordamları karşılık gelen ddv yordamlar vardır.Genellikle, doğrulama aşaması transfer ayrılmaz bir parçası dahil etmek daha uygundur.ddv alışkanlık herhangi bir parametre gerektirmez, ClassWizard herhangi bir parametre olmadan ddv yordamları desteklemediği için genellikle böyledir.

  • <arg>
    ddv_ yordam tek tanımlayıcısı.c++ işlev adı "ddv_" ile başlaması gerekir, ancak <DDX_Proc> "Birlikte" içermez tanımlayıcı.

1 veya 2 ddv args ardından:

  • <promptX>
    Düzenle öğesini yerleştirmek için dize (ile & Hızlandırıcı için)

  • <fmtX>
    değişken türü için aşağıdakilerden birini karakter biçimi

    d = int

    u = imzalanmamış

    D = uzun tamsayı (diğer bir deyişle, uzun)

    U = uzun imzasız (dword)

    f = float

    F = çift

    s = dize

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar