Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Evoluindo
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 







Pesquisa personalizada
Pesquisar Dicas:

 






Quer saber mais?
Torne-se um MCP em Visual Basic
Faça um treinamento na Búfalo Informática

fcil criar componentes

Por: Dennes Trres de Oliveira - Dennes@infolink.com.br


Continuando a srie sobre criao de componentes activex, vamos completar a criao do
componente nmcontrol.

FORMATANDO O NUNERO NA TEXBOX

Vamos agora criar o recurso de formatao do nmero contido na TextBox. A idia  que quando a
TextBox perder o foco o nmero contido na TextBox seja formatado. Quando a TextBox ganhar o 
foco a formatao dever ser retirada para permitir a edio do nmero.

Este recurso est vinculado  propriedade Moeda, que determinar se dever ou no ser utilizado
o formato monetrio no nmero. Assim sendo, vamos primeiramente criar a propriedade Moeda. O
cdigo ficar como abaixo :


Dim Vmoeda as boolean

Public Property Get Moeda() As Boolean
Moeda = Vmoeda
End Property

Public Property Let Moeda(ByVal vNewValue As Boolean)
Vmoeda = vNewValue
End Property

Desta forma a informao estar guardada na varivel Vmoeda e devidamente encapsulada pela
propriedade Moeda.

Importante : Mesmo quando no existe validao alguma para ser realizada  importante manter o
encapsulamento, pois ele ser muito til no futuro quando voc precisar dar manuteno a este
cdigo.

Para completar a criao da propriedade precisamos alterar os eventos ReadProperties e
WriteProperties do UserControl. O novo cdigo ficar como abaixo :



Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
VcorAtiva = PropBag.ReadProperty("CorAtiva", &H80000005)
Vmoeda = PropBag.ReadProperty("Moeda", True)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("CorAtiva", VcorAtiva, &H80000005)
Call PropBag.WriteProperty("Moeda", True)
End Sub

O passo seguinte  programar os eventos LostFocus e GotFocus da caixa de texto de forma a
realizar a formatao do nmero. Assim sendo, o cdigo ficar da seguinte forma :


Private Sub txtnum_GotFocus()
If txtnum.Text <> "" Then
txtnum.Text = CDbl(txtnum.Text)
End If
End Sub

Private Sub txtnum_LostFocus()
If Vmoeda Then
txtnum.Text = Format(txtnum.Text, "currency")
Else
txtnum.Text = Format(txtnum.Text, "standard")
End If
End Sub

Deve-se observar o teste feito no GotFocus : Se a caixa estiver vazia, a converso devolveria
erro. Por isso foi feito o teste.

Observe tambm o teste pela varivel Vmoeda na Sub LostFocus, que determina se a formatao
ser em Currency ou Standard. A formatao seguir as definies do painel de controle do
usurio.

TRATAMENTO DE ERROS EM COMPONENTES

 possvel que o usurio cometa algum erro durante a digitao. Foi permitido ao usurio
digitar "." E ",". Se o usurio errar a digitao, inserindo pontos e vrgulas em excesso,
sero gerados erros na formatao e na converso do valor, por isso ambas as Subs, tanto
GotFocus como LostFocus precisaro possuir um tratamento de erro.

O tratamento de erros em um componente difere um pouco do tratamento de erros convencional :
Evita-se ao mximo utilizar um MSGBOX no tratamento de erros de componentes. Isso porque quando
um erro ocorre, em geral o usurio do componente (que  um programador) deseja tratar esse erro
na sua aplicao, utilizando On Error. Uma MSGBOX exibida pelo componente pode se tornar um
grande inconveniente em alguns sistemas.

Desta forma, o que o componente faz quando detecta um erro  criar um objeto de erro e pass-lo
a quem o chamou. Se a rotina que chamou o componente estiver tratando o erro, timo, no  mais
responsabilidade do componente. Caso contrario o objeto de erro criado se encarregar de exibir
uma mensagem para o usurio.

Veja como ficar o cdigo aps a incluso do tratamento de erro :


Private Sub txtnum_GotFocus()
On Error GoTo trataerro
If txtnum.Text <> "" Then
txtnum.Text = CDbl(txtnum.Text)
End If
Exit Sub
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Sub


Private Sub txtnum_LostFocus()
On Error GoTo trataerro
If Vmoeda Then
txtnum.Text = Format(txtnum.Text, "currency")
Else
txtnum.Text = Format(txtnum.Text, "standard")
End If
Exit Sub
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Sub

Observe a forma como o Err.Raise foi utilizado :

	O 1o parmetro  o nmero do erro. Ao 1o parmetro foi adicionada a constante
VBObjectError. Isso garante que o nmero do erro no ir colidir com um erro j existente no
VB. Mas s isso no basta :  necessrio que o nmero de erro do componente esteja entre 512 e
65.535, caso contrrio colidir com algum outro erro do sistema. Neste caso, foi escolhido
aleatoriamente o valor de 550.

	O 2o parmetro indica quem gerou o erro, no caso, o componente.

	O 3o parmetro indica a mensagem de erro que ser gerada.




Vamos agora criar a propriedade Value. Primeiramente faremos o Property Let. O Property Let
dever receber o valor do usurio na forma de um nmero e atribui-lo  caixa de texto. O cdigo
ficar como abaixo :

Public Property Let Value(ByVal vNewValue As Double)
txtnum.Text = vNewValue
End Property

Observe que este cdigo est confiando no recurso de autoconverso de valores do VB para
converter a varivel Double para String.

J o PropertyGet far o inverso, entregar o valor contigo na caixa de texto. Porm no Property
Get teremos que nos prevenir quanto a possibilidade da caixa estar vazia. O cdigo ficar como
abaixo :

Public Property Get Value() As Variant
If txtnum.text<>""
Value = txtnum.Text
Else
Value=0
End if
End Property

Novamente estamos confiando na autoconverso do VB para que tudo funcione corretamente. Esse
cdigo, porm, precisar de um tratamento de erro. Ficar como abaixo :


Public Property Get Value() As Double
On Error GoTo trataerro
If txtnum.text<>""
Value = txtnum.Text
Else
Value=0
End if 
Exit Property
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Property

Public Property Let Value(ByVal vNewValue As Double)
On Error GoTo trataerro
txtnum.Text = vNewValue
Exit Property
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Property

Com a propriedade Value temos um exemplo de propriedade que no mantm seu valor diretamente em
uma varivel, mas utiliza algum tipo de calculo quando o valor  gravado ou recuperado. No
nosso caso, o "clculo" foi simplesmente a autoconverso do VB.


UTILIZANDO O ACTIVEX CONTROL INTERFACE WIZARD

Precisamos criar agora as propriedades Font, BackColor e ForeColor. So propriedades da TextBox
que precisaro ser recriadas no nosso componente. O trabalho delas no nosso componente ser
apenas receber a informao do usurio e pass-la para a propriedade da TextBox e vice-versa.

Esse trabalho  um trabalho muito manual e chato, por isso foi criado um Wizard para nos ajudar
: O ActiveX Control Interface Wizard.

Para ativar este Add-In devemos utilizar o menu Add-Ins (original, no?). Caso ele no esteja
listado no menu devemos inclui-lo atravs da tela Add-In Manager.

A 1a tela do Wizard  apenas descritiva, clicamos Next.

Na 2a tela o Wizard nos pede para escolher a partir de uma lista das propriedades mais comuns
quais delas desejaremos em nosso componente. No lado direito da tela voc observar vrias
propriedades j incluidas para voc. Se no desejar alguma delas, dever retira-la.

No nosso caso especfico deixaremos do lado direito da tela apenas as propriedades Font,
BackColor e ForeColor e clicaremos em Next.

Nesta 3a tela o Wizard nos pergunta quais sero as propriedades personalizadas (custom), ou 
seja, as propriedades criadas apenas para o nosso componente e no derivadas dos componentes 
internos como so Font, Backcolor e ForeColor.

Como j criamos propriedades no projeto, o Wizard j mostrar as 3 propriedades que criamos :
CorAtiva, Value e Moeda. Criamos estas propriedades sem utilizar o Wizard para que ficasse
claro como funciona a codificao, mas das prximas vezes vocs podero fazer boa parte do
trabalho pelo Wizard.

Na tela seguinte o Wizard nos pede para fazer o mapeamento das nossas propriedades, ou seja, 
indicar a qual propriedade dos componentes internos elas estaro vinculadas. Por exemplo, a 
propriedade Font do nosso componente estar vinculada  propriedade Font da TextBox. Essa
vinculao deve ser feita para as 3 propriedades : Font, BackColor e ForeColor.

Aps clicar em Next o Wizard nos perguntar quais as caractersticas das propriedades que no
esto vinculadas a componente algum, no caso, Moeda, Value e CorAtiva. J fizemos quase tudo
pela janela de cdigo, portanto no Wizard s nos resta criar a descrio para as propriedades.
Atribuir uma descrio  importante pois esta descrio aparecer na parte inferior da janela
de propriedades quando algum programador estiver utilizando o nosso componente.

Enfim, finalizamos a montagem das propriedades, podemos clicar Finish no Wizard e ele montar o
cdigo para ns.

Vocs podero observar com facilidade o cdigo que o Wizard criou : Alm de criar 
as Subs Let/Get/Set, ele inseriu tambm o cdigo necessrio dentro do ReadProperties e 
Write Properties.

Por fim, falta acrescentarmos apenas uma funcionalidade ao nosso componente : Executar a 
troca de cor quando a caixa ganhar ou perder o foco.
Quando a caixa ganhar o foco, a cor de fundo dela ser trocada. Assim sendo precisaremos 
de uma varivel na qual possamos guardar a cor de fundo original da caixa. Chamaremos esta 
varivel de CorFundo. A instruo ficar na rea de declaraes do componente :

Dim CorFundo as Ole_Color

Aps isso devemos alterar o cdigo dos eventos gotfocus e lostfocus da caixa de texto de 
forma a que executem a troca de cores. O cdigo ficar como abaixo :

Private Sub txtnum_GotFocus()
On Error GoTo trataerro
If txtnum.Text <> "" Then
txtnum.Text = CDbl(txtnum.Text)
End If
CorFundo = txtnum.BackColor
txtnum.BackColor = VcorAtiva
Exit Sub
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Sub

Private Sub txtnum_LostFocus()
On Error GoTo trataerro
If Vmoeda Then
txtnum.Text = Format(txtnum.Text, "currency")
Else
txtnum.Text = Format(txtnum.Text, "standard")
End If
txtnum.BackColor = CorFundo
Exit Sub
trataerro:
Err.Raise vbObjectError + 550, "NumControl", "Valor Invlido na caixa"
End Sub

Agora s est faltando o retoque final : Fazer com que nosso componente possa ser 
vinculado a um campo de um banco de dados atravs das propriedades DataSource e DataField.

Fazer essa vinculao  mais simples do que pode parecer. Precisamos selecionar qual das
propriedades do componente ser gravada no banco de dados e isso  tarefa fcil : ser a
propriedade Value.

Tendo escolhido a propriedade, devemos utilizar o menu Tools->Procedure Attributes. Caso
este menu esteja desativado posicione o cursor dentro de uma Sub na janela de cdigo ou 
posicione o cursor na rea de criao do componente.

Na janela Procedure Attributes devemos selecionar a propriedade Value e clicar no boto 
Advanced. 

Tornaremos esta propriedade uma propriedade DataBound marcando a opo
"Property is Data Bound". Devemos tambm marcar a opo "This property bind to DataField", 
para indicar que o valor desta propriedade estar vinculado ao campo apontado em DataField.

Podemos aproveitar que estamos nesta tela e alterar a caixa ProcedureId da propriedade Value,
selecionando o valor "(Default)". Isso far com que a propriedade Value torne-se a propriedade
default do componente NumControl.

TESTANDO O COMPONENTE

Vamos enfim testar o nosso componente. Para isso precisaremos adicionar um projeto Standard 
no Vb de forma a fazer um grupo de projetos. Utilize File->Add Project para isso.

Poderemos ento inserir vrios NumControls no form do projeto Standard para testarmos os
NumControls. Voc lembra que s conseguir fazer isso caso o rea de criao do componente
esteja fechada, no  ? Confira isso no menu Window.

Depois de inserir vrios NumControls no projeto Standard e executar o projeto voc observar
que o ENTER ter o mesmo efeito do TAB, conforme ns programamos no NumControl. J poder 
tambm observar o efeito da propriedade CorAtiva, que ir alterar a cor do componente sempre 
que ele receber o foco.

Experimente alterar o valor da propriedade moeda e veja o componente formatando o nmero
que voc digitar.

Por fim, vincule o componente a um campo de uma tabela e verifique a exibio dos dados.


� Búfalo Informática, Treinamento e Consultoria - Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br