TN026: DDX e DDV rotinas

Esta anotação descreve o diálogo dados troca (DDX) e arquitetura de validação (DDV) de dados de caixa de diálogo. Ele também descreve como escrever um procedimento de DDX _ ou DDV _ e como você pode estender o ClassWizard para usar suas rotinas.

Visão geral de troca de dados de caixa de diálogo

Todas as funções de dados de caixa de diálogo são feitas com código C++. Não há recursos especiais ou macros mágicas. O coração do mecanismo é uma função virtual que é substituída em cada classe de caixa de diálogo caixa de diálogo dados exchange e validação. É sempre encontrado neste formulário:

privatevoid CMyDialog::DoDataExchange (CDataExchange pDX)
{
 nbsp;  CDialog::DoDataExchange(pDX);    / / chamada de classe base

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

Comentários AFX Formatarar especial permitem ClassWizard localizar e editar o código dentro desta função. Código que não é compatível com ClassWizard deve ser colocado fora dos comentários Formatarar especial.

No exemplo acima, lt; data_exchange_function_call > é sob a forma:

    DDX_Custom (pDX, nIDC, campo)

e o lt; data_validation_function_call > é opcional e é sob a forma:

    DDV_Custom (pDX, campo,...)

Mais de um par DDX _ / DDV _ pode ser incluído em cada função DoDataExchange.

Consulte 'afxdd . h' para obter uma lista de todas as rotinas de troca de dados de caixa de diálogo e rotinas de validação de dados de caixa de diálogo fornecidas com MFC.

Dados de caixa de diálogo são apenas que - dados de membro na classe CMyDialog . Ele não é armazenado em um struct ou qualquer coisa especial como esse.

Notas

Embora nós chamamos este "dados de caixa de diálogo", todos os recursos estão disponíveis em qualquer classe derivada de CWnd e não estão limitados a apenas os diálogos.

Valores iniciais de dados são definidos no Construtor de C++ padrão, normalmente em um Bloquear com //{{AFX_DATA_INIT e //}}AFX_DATA_INIT comentários.

CWnd:: UpdateData é a operação que faz a inicialização e manipulação de erros em volta a chamar para DoDataExchange.

Você pode chamar CWnd:: UpdateData em qualquer momento para executar dados exchange e validação. Por padrão UpdateData(TRUE) é chamado no manipulador padrão de CDialog:: OnOK e UpdateData(falso) é chamado em um padrão de CDialog:: OnInitDialog.

A rotina DDV _ imediatamente deve seguir a rotina DDX _ para esse campo.

Como funciona?

Você não precisa entender o seguinte para usar dados de caixa de diálogo. No entanto, compreender como isso funciona nos bastidores irá ajudá-lo a escrever seu próprio procedimento de troca ou validação.

A função de membro DoDataExchange é muito parecido com a função de membro Serialize - é responsável por obter ou configuração dados para/de um formulário externo (neste caso controles em uma caixa de diálogo) de/para dados de membro na classe. O parâmetro pDX é o contexto para fazer a troca de dados e é semelhante ao parâmetro CArchive a CObject:: Serialize. O pDX (um objeto CDataExchange ) tem um sinalizador de direção muito como CArchive tem um sinalizador de direção

Validação ocorre somente quando m_bSaveAndValidate é definido. O valor de m_bSaveAndValidate é determinado pelo parâmetro BOOL para CWnd:: UpdateData.

Há três outros membros CDataExchange interessantes:

Extensões de usuário

Existem várias maneiras de estender o mecanismo DDX/DDV. É possível:

Ter a função de membro DoDialogExchange incluir conditionals ou qualquer outro válidas instruções C++ com exchange misturada e chamadas de função de validação.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
se (m_bFemale)
    DDV_MinMax (pDX, idade, 0, m_maxFemaleAge);
outra pessoa
    DDV_MinMax (pDX, idade, 0, m_maxMaleAge)

&Notanbsp;  Como mostrado acima, esse código não pode ser editado por ClassWizard e deve ser usado somente fora dos comentários Formatarar especial.

ClassWizard suporte

ClassWizard oferece suporte a um subconjunto das personalizações de DDX/DDV, permitindo que você para integrar suas próprias rotinas DDX _ e DDV _ a interface do usuário ClassWizard. Fazer isso é o único custo benéfico se você planeja reutilizar particulares DDX e DDV rotinas e outra vez num projecto ou em vários projectos.

Para fazer isso, entradas especiais são feitas em DDX.CLW (versões anteriores do Visual C++ armazenavam esta informação em APSTUDIO.INI) ou no seu projeto.Arquivo CLW. As menções especiais podem ser inseridos na seção [General Info] do seu projeto.Arquivo CLW ou na seção [ExtraDDX] o DDX.Arquivo CLW em \Arquivos de Programas\Microsoft Visual Studio\Visual C + + diretório \bin. Talvez você precise criar o DDX.Arquivo CLW se ele já não existir. Se você planeja usar as rotinas DDX _ / DDV _ personalizadas somente em um determinado projeto, adicione as entradas à seção [General Info] do seu projeto.CLW arquivo em vez disso. Se você planeja usar as rotinas em muitos projetos, adicione as entradas à seção [ExtraDDX] de DDX.CLW.

O Formatarar geral dessas entradas especial é:

ExtraDDXCount = n

; onde n é o número de ExtraDDX? linhas a seguir

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

; Onde? é um número 1-n indicando que tipo DDX na lista que está sendo definido.

Cada campo é delimitado por um caractere ';'. Os campos e sua finalidade são descritas a seguir.

lt; chaves & gt;

= lista de caracteres que indica para quais controles de diálogo deste tipo de variável é permitido.

E = editar

C = caixa de seleção de dois Estados

c = tri-estado marcar caixa

R = primeiro botão de opção em um grupo

L = caixa de listagem não classificado

l = caixa de lista classificada

M = caixa de combinação (com editar item)

N = não classificados Soltar lista

n = classificados soltar lista

1 = se a i&nserir DDX deve ser adicionada à cabeça da lista (padrão é adicionar a cauda) nbsp; Isso é geralmente usado para rotinas DDX que transferir a propriedade de 'Controlo'.

lt; chaves de vb & gt;

este campo é usado apenas no produto de 16 bits para controles VBX (VBX controles não são suportados no produto 32-bit)

lt; prompt > =

cadeia de caracteres para colocar na caixa de combinação da propriedade (sem aspas)

lt; tipo > =

identificador único tipo emitir no arquivo de cabeçalho. Em nosso exemplo acima com DDX_Time, isso seria definido como CTime.

lt; vb-chaves > =

não usados nesta versão e sempre deve estar vazio

lt; initValue > =

valor inicial - 0 ou em branco. Se estiver em branco, nenhuma linha de inicialização será gravada na seção //{{AFX_DATA_INIT do arquivo de implementação. Uma entrada em branco deve ser usada para objetos de C++ (como CString, CTime e assim por diante) que têm construtores que garantem a inicialização correta.

lt; DDX_Proc > =

identificador único para o procedimento de DDX _. O nome de função do C++ deve começar com "DDX _", mas não inclui "DDX _" o lt; DDX_Proc > identificador. No exemplo acima, o identificador de <DDX_Proc> seria tempo. Quando ClassWizard grava a chamada de função no arquivo de implementação da {{seção AFX_DATA_MAP, ele acrescenta este nome DDX _, chegando assim no DDX_Time.

lt; comentário > =

comentário para mostrar na caixa de diálogo variável com este DDX. Colocar qualquer texto que você seria assim aqui, geralmente fornecer algo que descreve a operação executada pelo par DDX/DDV.

lt; DDV_Proc & gt;

A porção DDV da entrada é opcional. Nem todas as rotinas DDX têm correspondentes DDV rotinas. Muitas vezes, é mais conveniente incluir a fase de validação como parte integrante da transferência. Este é frequentemente o caso quando sua rotina DDV não requer quaisquer parâmetros, uma vez que ClassWizard não oferece suporte a DDV rotinas sem quaisquer parâmetros.

= identificador único para o procedimento de DDV _. O nome de função do C++ deve começar com "DDV _" mas não inclui "DDX _" o lt; DDX_Proc > identificador.

seguido por 1 ou 2 args DDV:

lt; promptX > =

c&adeia de caracteres para colocar acima do item de editar (com amp; accelerator)

lt; fmtX > =

caractere de formatarar para o tipo arg, uma das

d = int

u = não assinados

D = int longo (isto é, há muito tempo)

U = longo não assinado (isto é, DWORD)

f = flutuar

F = duplo

s = string

Um exemplo de Personalizar DDX

Um exemplo de Personalizar DDX com validação pode ser encontrado no MFC Avançado conceitos exemplo CHKBOOK. Consulte DDX_DollarsCents em DOLLCENT.CPP para uma implementação de exemplo de uma rotina DDX e CHKBOOK personalizados.CLW para o exemplo correspondente ExtraDDXCount e ExtraDDX1 entradas na seção [General Info] do CHKBOOK.Arquivo CLW.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index