Valide os dados de controle limitando o foco
O evento Validate e a propriedade CausesValidation são usados em conjunto para confirmar a entrada em um controle antes de permitir que o usuário mova o foco para fora do controle. Por exemplo: Considere um aplicativo com várias caixas de texto e um botão Ajuda Quando cada caixa de texto recebe o foco, você deseja evitar que o usuário mova o foco até que os critérios especiais de validação da caixa de texto sejam atendidos. usuário mova o foco quando a caixa de texto receber o foco O botão Ajuda pode ser clicado a qualquer momento. Para fazer isso, defina os critérios de validação no evento Validate e defina a propriedade CausesValidation do botão Ajuda como False. Se a propriedade estiver configurada como True (configuração padrão), o evento Validate ocorrerá no primeiro controle. Se a propriedade estiver definida como False, o evento Validate no primeiro controle ocorrerá primeiro.
O evento Validate é mais adequado para validar entradas de dados do que o evento LostFocus porque o evento LostFocus (por definição) ocorre após a movimentação do foco. Em vez disso, usando o evento Validate, você pode impedir que o foco seja movido para outro controle até que as regras de validação sejam atendidas.
usos possíveis
Os aplicativos de entrada de dados precisam realizar uma validação de entrada de dados mais complexa do que a validação fornecida pelo controle MaskedEdit ou que ocorre nas regras de negócios.
O formulário precisa impedir que o usuário use a tecla TAB ou as teclas aceleradoras para mover os controles até que os dados sejam inseridos no campo.
Os documentos ActiveX executados no Internet Explorer precisam de uma maneira para o usuário terminar de trabalhar no formulário antes que o script mova o foco programaticamente.
Foco de controle no evento Validar
O evento Validate inclui um parâmetro keepfocus. Quando o parâmetro é definido como True, o controle mantém o foco. Isso evita efetivamente que o usuário clique em outros controles.
Usando uma variedade de controles
Uma matriz de controle é um grupo de controles com um nome e tipo comum. O curso dos acontecimentos também é o mesmo. Uma matriz de controle deve ter pelo menos um elemento, e o número de elementos pode ser aumentado dentro do escopo permitido pelos recursos do sistema e pela memória. O tamanho da matriz também depende da memória e dos recursos do Windows exigidos por cada controle; O valor máximo do índice disponível na matriz de controle é 32767. Os elementos na mesma matriz de controle possuem suas próprias configurações de propriedade. Os usos comuns para matrizes de controle incluem a implementação de controles de menu e agrupamentos de botões de opção.
Observe que o Visual Basic inclui a capacidade de adicionar dinamicamente controles não referenciados à coleção Controls em tempo de execução. Este tópico refere-se apenas aos controles de referência que são adicionados em tempo de design, recortando e colando um controle em um formulário. Para obter mais informações sobre como adicionar controles em tempo de execução, consulte os tópicos de referência "Adicionar método (coleção de controles)" e "Adicionar método (coleção de licenças)".
Por que usar matrizes de controle
Em tempo de design, adicionar controles usando uma matriz de controle consome menos recursos do que adicionar vários controles do mesmo tipo diretamente ao formulário. Matrizes de controle também são úteis quando você deseja que vários controles compartilhem código. Por exemplo, se você criar uma matriz de controle contendo três botões de opção, o mesmo código será executado independentemente de qual botão for clicado.
Para criar uma nova instância de um controle em tempo de execução, o novo controle deve ser membro da matriz de controles. Ao usar um array de controles, cada novo membro herda os procedimentos de eventos públicos do array.
Não é possível criar novos controles em tempo de execução usando o mecanismo de array de controle, pois cada novo controle herda o procedimento de evento escrito para o array. Por exemplo, se você tiver diversas caixas de texto no formulário e cada caixa de texto aceitar um valor de data, você poderá criar uma matriz de controles para que todas as caixas de texto compartilhem o mesmo código de validação.
Aplicativo de exemplo: Calc.vbp
O aplicativo de exemplo Calculator mostrado na Figura 7.2 (listado no diretório Samples!Alink(vbsamples)) contém duas matrizes de controle – botões numéricos e botões de ação.
Observe como o exemplo usa a sintaxe object(index) para fazer referência a cada controle. Especifique o valor do índice ao criar o controle. Na verdade, especificar um índice arbitrário para um controle em tempo de design tornará o controle parte de uma matriz.
A propriedade Index distingue elementos na matriz de controle. Quando um controle na matriz reconhece um evento, o Visual Basic chama o procedimento de evento público e passa um parâmetro (o valor da propriedade Index) para identificar qual controle reconheceu o evento.
Por exemplo, a primeira linha de código no procedimento do evento Number_Click é semelhante a esta:
PRivateSubNumber_Click(IndexAsInteger)
Se Number(0) identificar o evento, o VisualBasic passará 0 como o parâmetro de índice e se Number(1) identificar o evento, o VisualBasic passará 1 como o parâmetro de índice. Ao contrário do valor do índice, o restante do código Number_Click que foi executado é o mesmo para Number(0) a Number(9).
Criar matriz de controle em tempo de design
Existem três maneiras de criar matrizes de controle em tempo de design:
1. Dê o mesmo nome a vários controles.
2. Copie o controle existente e cole-o no formulário.
3. Defina a propriedade Index do controle com um valor não nulo.
Observe que a matriz de controle de menu deve ser criada no Editor de Menu. Para obter mais informações sobre esta operação, consulte "Criando e modificando menus em tempo de execução" no Capítulo 6, "Criando a interface do usuário".
Para adicionar um elemento de matriz de controle alterando o nome do controle:
1. Desenhe o controle a ser adicionado ao array de controle (deve ser do mesmo tipo de controle) para determinar qual controle será o primeiro elemento do array.
2. Selecione o controle e altere seu valor de configuração de Nome para o valor de configuração de Nome do primeiro elemento da matriz.
3. Quando você insere um nome existente para um controle na matriz, o Visual Basic exibirá uma caixa de diálogo solicitando a confirmação se você deseja criar a matriz de controle. Neste ponto selecione “OK” para confirmar a operação.
Por exemplo, se o primeiro elemento da matriz de controle for denominado cmdCtlArr, selecione um CommandButton, adicione-o à matriz e defina seu nome como cmdCtlArr. Neste momento, a seguinte mensagem será exibida: "Um controle denominado 'cmdCtlArr'. já existe. Deseja criar uma matriz de controles?" Selecione OK para confirmar a operação.
Os controles adicionados desta forma compartilham apenas a propriedade Name e o tipo de controle; outras propriedades têm os mesmos valores de quando o controle foi desenhado originalmente.
Para adicionar um elemento de matriz de controle copiando um controle existente:
1. Desenhe os controles na matriz de controle.
2. Quando o controle ficar em foco, selecione o comando “Copiar” no menu “Editar”.
3. No menu “Editar”, selecione o comando “Colar”. O Visual Basic exibirá uma caixa de diálogo perguntando se é necessário confirmar a criação da matriz de controle. Selecione OK para confirmar a operação. O valor do índice atribuído ao controle é 1. O primeiro controle desenhado tem valor de índice 0.
O valor do índice de cada novo elemento da matriz é igual à ordem em que foi adicionado à matriz de controle. Quando você adiciona um controle como esse, a maioria das propriedades visuais, como altura, largura e cor, são copiadas do primeiro controle da matriz para o novo controle.
Adicionar matriz de controle em tempo de execução
Em tempo de execução, você pode usar as instruções Load e Unload para adicionar e remover controles da matriz de controle. No entanto, o controle adicionado deve ser um elemento de uma matriz de controle existente. Você deve criar um controle com (na maioria dos casos) uma propriedade Index igual a 0 em tempo de design e, em seguida, usar a seguinte sintaxe em tempo de execução:
Ao carregar um novo elemento de uma matriz de controle, a maioria das configurações de propriedade serão copiadas do elemento existente na matriz com o menor subscrito — neste caso, o elemento com índice 0. Como as configurações das propriedades Visible, Index e TabIndex não são copiadas automaticamente para novos elementos na matriz de controle, para tornar o controle recém-adicionado visível, sua propriedade Visible deve ser definida como True.
Observe que o Visual Basic gerará um erro ao tentar usar a instrução Load em um valor de índice que já existe na matriz.
O ponto importante é que a instrução Unload pode ser usada para excluir todos os controles criados pela instrução Load. No entanto, Unload não pode excluir controles criados em tempo de design, independentemente de eles fazerem parte da matriz de controle.
Esquema de controle: adicionando e removendo controles na matriz de controle
Como adicionar e remover controles em tempo de execução é demonstrado no exemplo da matriz de controle, onde o controle é um botão de opção. De acordo com este exemplo, o usuário pode adicionar botões de opção para alterar a cor de fundo da caixa de imagem.
Conforme mostrado na Figura 7.3, inicie o formulário e desenhe nele uma caixa de imagem, um rótulo, dois botões de opção e três botões de comando.
Controlar eventos de aplicativos de array
Em seguida, você deve adicionar procedimentos de evento para o botão de opção e o botão de comando. Inicie o aplicativo após adicionar a declaração do formulário:
DimMaxIdAsInteger
Todos os botões de opção compartilham o procedimento do evento Click:
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor = QBColor (Índice 1)
Fim Sub
Adicione um novo botão de opção através do procedimento de evento Click do botão de comando "Adicionar". Neste exemplo, antes de executar a instrução Load, o código verifica se não mais do que dez botões de opção estão carregados. Após o controle ser carregado, sua propriedade Visible deve ser definida como True.
PrivateSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 'Define todos os botões de opção.
IfMaxId>8ThenExitSub 'Apenas dez botões são permitidos.
MaxId=MaxId 1 'A contagem de botões aumenta.
LoadoptButton(MaxId) 'Cria um novo botão.
optButton(0).SetFocus 'Redefinir opções do botão.
'Coloque o novo botão abaixo do botão anterior.
optButton(MaxId).Top=optButton(MaxId-1)._
400 melhores
optButton(MaxId).Visible=True 'Mostrar novo botão.
optButton(MaxId).Caption=Opção&MaxId 1
Fim Sub
Exclua um botão de opção por meio do procedimento de evento Click do botão de comando Excluir:
PrivateSubcmdDelete_Click()
IfMaxId<=1ThenExitSub 'Mantém os dois primeiros botões.
UnloadoptButton(MaxId) 'Exclui o último botão.
MaxId=MaxId-1 'A contagem de botões diminui.
optButton(0).SetFocus 'Redefinir opções do botão.
Fim Sub
Finalize a aplicação através do procedimento do evento Click do botão Fechar:
PrivateSubcmdClose_Click()
Descarregar-me
Fim Sub
->