Você está na página 1de 12

2.

USANDO CONTROLES
CONVENES DE NOMES PARA CONTROLES

sempre bom estabelecer convenes de nomes para objetos do Visual Basic, sob risco
de no se saber, no meio de um projeto mais complicado, qual o tipo de um objeto cujo nome ,
por exemplo, dados. A tabela 3 a seguir apresenta alguns exemplos para os controles mais
comuns.

Tabela 3

Controle Nome em Portugus Prefixo Exemplo


Form formulrio frm frmAbrir
Check Box Caixa de Verificao chk chkLeitura
Combo Box Caixa Combo cbo cboPortugus
Command Button Boto de Comando cmd cmdCancelar
Data Dados dat datLivros
Directory List Box Caixa de Diretrio dir dirFontes
Drive List Box Caixa de Drives drv drvAlvo
File List Box Caixa de Arquivos fil filArquivos
Frame Quadro fra fraLngua
Grid Grade grd grdPreos
Horizontal scroll bar Barra de Rolagem Horizontal hsb hsbVolume
Image Imagem img imgcone
Label Rtulo lbl lblMensagem
Line Linha lin linVertical
List Box Caixa de Lista lst lstCEP
Menu Menu mnu mnuSalvar
OLE OLE ole oleObjeto
Option Button Boto de Opes opt optFrancs
Picture Box Caixa de Figuras pic picDesenho
Shape Forma (geomtrica) sha shaCrculo
Text Box Caixa de Texto txt txtEntrada
Timer Temporizador tmr tmrAlarme
Vertical Scroll Bar Barra de Rolagem Vertical vsb vsbTaxa

O BLOCO DE NOTAS BLOCO.VBP

Processamento de texto uma das funes bsicas dos computadores e o VB oferece


algumas ferramentas poderosas relacionadas a texto. Nosso objetivo inicial projetar um Bloco de
Notas simplificado que funcione a partir da caixa de textos do Visual Basic e que disponha dos
seguintes recursos:

Edio bsica: insero e excluso de texto, movimentao do cursor, etc.;


Seleo de texto;
Cortar, copiar e colar textos.

Futuramente, nosso Bloco de Notas se transformar em um editor mais poderoso, capaz


de abrir e salvar arquivos do tipo texto e de funcionar tambm a partir de menus.

O Bloco de Notas usar as seguintes propriedades de controles do Visual Basic:


Text: string que contm o texto em uma Caixa de Texto. O tamanho mximo 64
kBytes.
Enabled: se for true, o controle disponvel;
Default: se for true, o controle recebe o foco quando o formulrio for ativado.
SelText: string que contm o texto selecionado em uma Caixa de Texto.

Alm disso, vamos precisar do mtodo SetFocus, cuja sintaxe a seguinte:

Objeto. Setfocus

O Foco uma propriedade comum a todos os controles do VB. Apenas um objeto pode
ter o foco de cada vez e apenas objetos visveis podem receber o foco. Geralmente, o objeto que
tem o foco diferenciado dos outros por uma legenda ou ttulo realado. Em tempo de execuo, o
usurio define o foco clicando sobre os objetos ou usando a tecla TAB. O mtodo Setfocus
tambm define o foco para um objeto em tempo de execuo, mas de maneira automtica. Se
ocorrer uma tentativa de definir o foco em um objeto invisvel, um erro de execuo ser gerado.

a) Criando a interface de BLOCO.VBP

Inicie um novo projeto e desenhe, no formulrio, uma Caixa de Texto e quatro botes de
comando, conforme ilustrado na figura 8 a seguir.

Figura 8 - Objetos de BLOCO.VBP


b) Definindo as propriedades

Defina as propriedades dos controles de acordo com a tabela a seguir.

Tabela 4

OBJETO PROPRIEDADE DEFINIO


formulrio WindowState Maximized
Caixa de Texto Name txtBloco
Text (Vazio)
Multiline True
ScrollBars Vertical
Boto de Comando 1 Name cmdCortar
Caption &Cortar
Boto de Comando 2 Name cmdColar
Caption Co&lar
Boto de Comando 3 Name cmdApagar
Caption &Apagar
Boto de Comando 4 Name cmdSair
Caption &Sair

Note que a caixa de textos suporta textos com vrias linhas, por causa da propriedade
Multiline e tem uma barra de paginao vertical. Esta barra de paginao no um objeto
adicional, mas faz parte da caixa de textos. O VB cuida de toda a automao necessria para a
rolagem do texto. A caracterstica de edio em linhas mltiplas seria perdida caso definssemos
tambm uma barra de paginao horizontal para a caixa. por esta razo que estamos usando
apenas uma barra de paginao vertical.

c) Escrevendo o cdigo

Neste aplicativo iremos precisar de uma varivel Public 1, ou seja, uma varivel que seja
vista por todas os procedimentos de todos os objetos do aplicativo. Estas variveis s podem ser
declaradas dentro de mdulos. Portanto, a primeira coisa que devemos fazer inserir um mdulo,
o que pode ser feito no menu Insert|Module. A seguir, escreva a seguinte linha dentro da seo
General - Declarations:

Public CortaTexto As String

O primeiro boto a ser implementado o Apagar. Este boto apagar todo o texto da
caixa de texto, indiscriminadamente. Tudo o que temos a fazer anular a propriedade text da
caixa de textos. Para tanto, d dois cliques sobre o boto apagar e escreva o seguinte cdigo:

Private Sub cmdApagar_Click()


txtBloco.Text = ""
txtBloco.SetFocus
End Sub

Aps apagar o texto, o que feito na primeira linha, devemos jogar o foco novamente na
caixa de textos, pois aps clicar o boto Apagar o foco ficou com ele. Seria desagradvel se o
usurio tivesse que clicar na caixa de textos toda vez que usasse o boto Apagar. O computador
no se importa de prestar este pequeno favor.

O boto Sair tambm fcil e o cdigo idntico ao do aplicativo Borbolet.vbp, ou seja:

Private Sub cmdSair_Click()


End
End Sub

1 Variveis Public, at a verso 3.0, eram denominadas Globals. Esta ltima palavra ainda aceita nas
declaraes, mas est definitivamente fora de moda.
Os procedimentos para os botes Cortar e Colar requerem um raciocnio adicional. O
que desejamos fazer cortar um trecho de texto, provavelmente, mas no necessariamente, para
ser colado em algum outro lugar. Logo, ser necessrio armazenar o texto recortado em alguma
varivel temporria, o que ser conseguido com a varivel CortaTexto. Clique sobre o boto
Cortar e escreva o seguinte trecho:

Private Sub cmdCortar_Click()


CortaTexto = txtBloco.SelText
txtBloco.SelText = ""
txtBloco.SetFocus
End Sub

A primeira linha armazena o contedo do texto selecionado na varivel CortaTexto. A


segunda apaga o texto selecionado, dando um efeito de que o texto foi recortado. Finalmente, a
ltima linha joga o foco novamente na caixa de textos. A prodecure para o boto Colar atua de
modo inverso a Cortar, ou seja, devemos recuperar o texto armazenado em CortaTexto e atribu-
lo propriedade SelText da caixa de textos, conforme descrito a seguir.

Private Sub cmdColar_Click()


txtBloco.SelText = CortaTexto
txtBloco.SetFocus
End Sub

O nosso mini-editor j funciona bem, mas algumas melhorias so necessrias. Primeiro,


caso o usurio queira redimensionar o formulrio, os botes e a caixa de texto no o
acompanharo. Este problema pode ser contornado por meio do evento Resize do formulrio.
Este evento ocorre sempre que o formulrio redimensionado, seja por meio do mouse, seja por
meio dos cones de maximizar e minimizar. Resize tambm ocorre quando o formulrio exibido
pela primeira vez, na entrada do programa. O que devemos fazer ajustar a caixa de texto
automaticamente no formulrio cada vez que este for redimensionado, o que pode ser conseguido
com alguns clculos (estes clculos so comuns em procedures de dimensionamento).

Clique o formulrio duas vezes, em tempo de projeto, e procure o evento Resize na caixa
Drop-Down com o nome Proc:. Nesta procedure, escreva o cdigo abaixo.

Private Sub Form_Resize()


If frmBloco.Width > 50 then
txtBloco.Top = 0
txtBloco.Left = 0
txtBloco.Width = ScaleWidth
txtBloco.Height = ScaleHeight - cmdCortar.Height
cmdCortar.Left = 0
cmdColar.Left = cmdCortar.Width
cmdApagar.Left = 2 * cmdCortar.Width
cmdSair.Left = ScaleWidth - cmdSair.Width
cmdCortar.Top = ScaleHeight - cmdCortar.Height
cmdColar.Top = ScaleHeight - cmdColar.Height
cmdApagar.Top = ScaleHeight - cmdApagar.Height
cmdSair.Top = ScaleHeight - cmdSair.Height
End If
End Sub

Estudando a procedure de Resize com cuidado voc ver que estamos simplesmente
alterando valores de propriedades dos controles (em VB isto feito com muito mais freqncia do
que voc pode imaginar). As primeiras quatro linhas ajustam a caixa de textos propriamente dita,
de forma que sobre espao em baixo para os botes ( por isso que a altura do boto Cortar -
cmdCortar.Height - descontada). As linhas seguintes ajustam a posio de todos os botes,
atuando sobre as propriedades Left e Top.

Como exerccio, fica a tarefa de descobrir qual a finalidade do comando If ... Then.

EVENTOS DE TECLA E UM RELGIO DESPERTADOR

O VB 4.0 suporta diversas funes e eventos para manipulao do teclado. O


reconhecimento de teclas pressionadas pode ser feito por meio dos seguintes eventos:

KeyDown - ocorre quando uma tecla pressionada;


KeyUp - ocorre quando uma tecla liberada;
KeyPress - ocorre quando uma tecla pressionada.

Os eventos KeyDown e KeyUp passam o cdigo ANSI da tecla acionada, enquanto


KeyPress passa o cdigo ASCII. KeyDown e KeyUp so mais sofisticados do que KeyPress e
detectam teclas que KeyPress no detecta, tais como: combinaes das teclas Shift, Ctrl e Alt;
teclas de setas; teclas de funes; PageUp e PageDown. A sintaxe para uma procedure do evento
KeyPress mostrada abaixo:

Private Sub controle_KeyPress (KeyAscii As Integer)


[Bloco de cdigo]
End Sub

KeyAscii o cdigo ASCII da tecla pressionada. Controle o controle do Visual Basic que
usamos para capturar o evento KeyPress.

Os eventos KeyDown e KeyUp tm a mesma sintaxe, mostrada abaixo.

Private Sub controle_KeyDown(KeyCode As Integer, Shift As Integer)


[Bloco de cdigo]
End Sub

KeyCode o cdigo ANSI da tecla acionada. Shift um campo de bits que corresponde ao
estado das teclas Shift, Ctrl e Alt no momento do evento, de acordo com a tabela 5 a seguir.

Tabela 5

Valor de Shift Significado


1 Shift pressionado
2 Ctrl pressionado
4 Alt pressionado

Dentro de uma procedure do evento KeyPress, quando fazemos KeyAscii = 0 o evento


ser anulado e a procedure ser encerrada. O mesmo ocorre para os eventos KeyDown e KeyUp
no que diz respeito ao parmetro KeyCode.

O parmetro Shift tambm admite combinaes. Por exemplo, Shift = 6 corresponde s


teclas Ctrl e Alt pressionadas simultaneamente.
O programa de relgio-despertador utiliza, ainda, algumas funes do Visual Basic,
descritas abaixo.

Time$: retorna a hora do sistema.;


Chr$(): converte um cdigo ASCII para um string;
Asc():retorna o cdigo ASCII do primeiro caractere de um string.

Para iniciar o projeto do Relgio Despertador, posicione os seguintes controles em um


formulrio, conforme a figura 9:

Dois Rtulos;
Dois Botes de Opo;
Um Timer.

Um rtulo, ou label, basicamente um controle no editvel para sada de dados. Deve ser
usado em substituio caixa de texto sempre que no for necessrio que o usurio edite o
texto. Estaremos usando dois rtulos neste projeto: um deles servir de display para mostrar as
horas. Este controle deve ser um rtulo, pois no queremos, evidentemente, que o usurio edite a
hora atual !; o outro rtulo ter uma finalidade mais prosaica, servindo apenas para indicar a funo
da caixa de textos. Rtulos constituem, portanto, um maneira fcil de se imprimir textos no
formulrio. Para modificar o texto em tempo de execuo, mude a propriedade caption (rtulos
no tm a propriedade text).

Os botes de opo, algumas vezes denominados botes de rdio, so semelhantes queles


botes push-button encontrados em vrios tipos de aparelhos de som. A finalidade convidar o
usurio a escolher apenas uma opo dentre vrias. uma boa prtica de programao usar
botes de opo dentro de uma estrutura denominada array de controles, isto , os controles
tem o mesmo nome, mas ndices diferentes. Para criar um array de controles proceda da seguinte
forma: insira o primeiro controle e mude o nome. A seguir, clique sobre o controle e use os
comandos do menu Editar para copiar o controle e col-lo novamente no formulrio. Uma
mensagem ser gerada pelo VB, avisando que j existe um controle com o mesmo nome e
perguntando se voc quer criar um array. Responda que sim e repita a operao tantas vezes
quantas forem necessrias.

O controle de timer tem a propriedade Interval ajustada para 1000 ms, ou 1 s, pois
desejamos que a hora seja mostrada no display a intervalos de 1 segundo.

A tabela a seguir mostra as definies dos objetos de Alarme.vbp.

Tabela 6

OBJETO PROPRIEDAD DEFINIO


E
formulrio Nome frmAlarme
Rtulo Nome lblDisplay
Legenda (vazio)
Fonte MS Sans Serif, 24,
negrito
Caixa de Texto Nome txtAjuste

Tabela 6 (contiuao)

OBJETO PROPRIEDAD DEFINIO


E
Boto deNome optOpo
Opo(0) ndice 0
Boto deNome optOpo
Opo(1) ndice 1
Timer Intervalo 1000

Figura 9 - O formulrio frmAlarme

Para comear a insero do cdigo de optOpo, clique duas vezes em um dos botes de
opo e digite o seguinte trecho:

Private Sub optOpo_Click(Index As Integer)


If (Index = 1) Then
AlarmOn = True
Else
AlarmOn = False
End If
End Sub

AlarmOn uma varivel Public booleana que definir se o som de alarme deve estar ligado
ou desligado. Para declarar esta varivel, insira um mdulo de programao (menu Insert|Module)
e digite a seguinte linha na seo General-Declarations:

Public AlarmOn As Integer

A seguir, salve o mdulo com o nome Alarme.bas. A procedure optOpes_Click


chamada cada vez que o usurio clica em qualquer um dos botes de opo. Index um
parmetro passado para a procedure, correspondendo ao ndice do boto que foi acionado (
assim que o VB fica sabendo qual controle foi acionado dentro de um array). Assim, se o usurio
tiver clicado no segundo boto (On, ndice 1), o valor da varivel AlarmOn ser verdadeiro (true).
Caso contrrio (Else), o valor ser falso.

O prximo passo escrever o cdigo de validao de entrada da caixa de texto txtAjuste.


No queremos que o usurio escreva qualquer coisa nesta caixa. Somente nmeros no formato de
data devem ser permitidos. Para realizar a validao, capturamos o evento KeyPress da caixa de
texto e verificamos se o caractere digitado aceitvel. Por exemplo, apenas nmeros entre zero e
nove podem ser aceitos, assim como o sinal de dois pontos para separar horas de minutos.
Clicando duas vezes sobre txtAjuste, escreva o seguinte trecho de cdigo:

Private Sub txtAjuste_KeyPress(KeyAscii As Integer)


Key$ = Chr$(KeyAscii)
If ((Key$ < "0" Or Key$ > "9") And Key$ <> ":") Then
Beep
KeyAscii = 0
End If
End Sub

A primeira linha transforma o parmetro KeyAscii de inteiro para string. A clusula de


verificao If ... Then verfica se o caractere digitado aceitvel. Se for, a procedure encerrada e
a caixa de texto conter, deste modo o novo caractere. Caso contrrio, o evento KeyAscii
desabitado e um bip soa. Tudo se passa como se o usurio no tivesse digitado caractere algum.
Esta rotina de validao simples e exclui teclas como del e backspace, que podem ser
includas desde que saibamos o cdigo ASCII de cada uma delas.

O prximo cdigo pertence ao objeto Timer. Devemos simplesmente mostrar a hora atual,
com auxlio da funo Time$. Alm disso, caso a varivel AlarmOn seja verdadeira, devemos soar
um bip, mostrando que o alarme est ativado. Naturalmente, esta ltima condio s deve ocorrer
se a hora ajustada em txtAjuste for maior do que a hora atual, conforme mostra a rotina abaixo.

Private Sub Timer1_Timer()


If (Time$ > txtAjuste.Text And AlarmOn) Then
Beep
End If
lblDisplay.Caption = Time$
End Sub

Resumindo, o funcionamento do alarme simples. A cada segundo gerado um evento de


Timer e, capturando este evento, verificamos se o tempo ajustado em txtAjuste maior ou menor
do que o tempo do display lblDisplay. Se for maior, e se o boto de opo estiver na posio
Ligado, fazemos o alto-falante emitir um bip a cada segundo. Cada vez que ocorre um evento
Timer a funo Time$ usada para atualizar a hora em lblDisplay.

O som gerado pelo alarme no muito emocionante e poderamos pensar em tocar uma
msica de qualquer espcie (que tal aquela musiquinha do gs ?). Linguagens convencionais
escritas para DOS resolviam este problema fornecendo funes que faziam soar uma nota musical
de freqncia escolhida pelo programador. Trabalhando com a freqncia e durao de cada nota
era possvel compor trechos de musicas (nada de acordes, portanto). O VB trata o assunto de
maneira muito mais eficiente e moderna, executando arquivos .wav, desde que se tenha uma placa
de som instalada. Entretanto arquivos .wav so assunto da ferramenta multimdia do VB e ficaro
para mais tarde. Por enquanto ficamos apenas com o bip, por mais montono que seja.

NOTA SOBRE OS CDIGOS ASCII, ANSI E UNICODE

O ASCII um cdigo de caracteres de 8 bits (1 byte) desenvolvido na poca em que s o


DOS existia. Com estes 8 bits no possvel representar mais do que 256 caracteres, mas no
incio as coisas eram mais simples e memrias de computador mais caras ( por estas questes
econmicas, entre outras coisas, que algum teve a fantstica idia de usar apenas dois dgitos
para representar anos, sem se lembrar do que aconteceria quando chegssemos ao ano 2000). O
ANSI tambm um cdigo de 8 bits, mas inclui alguns caracteres no suportados pelo ASCII. O
Windows 3.1 usava o ANSI como padro, suportando tambm o ASCII.

O Unicode um cdigo de 16 bits desenvolvido pela International Standards Organization


(ISO), com possibilidade para 65.536 caracteres diferentes. Este espao suficiente para
acomodar todos os caracteres usados no Usinas atualmente, incluindo lnguas antigas como
snscrito e hieroglifos egpcios. Tambm existe espao vago suficiente para que no se precise
preocupar com isto durante mais algumas centenas de anos. O Unicode totalmente suportado
pelo Windows 95 e pelo Windows NT, convertendo-se caracteres do ANSI para o Unicode e vice-
versa. Os caracteres so armazenados em ANSI pelo sistema operacional e manipulados em
Unicode pelo Visual Basic.

ERROS COMUNS EM PROGRAMAO

FORMULRIOS MUITO CARREGADOS

O Visual Basic disponibiliza uma quantidade fantstica de controles e grande a tentao


de usar todos em um s formulrio. Esta estria semelhante de um grande jornal brasileiro que,
certa vez, completou a instalao de um parque grfico super-moderno. No dia seguinte, a primeira
pgina do jornal continha reportagens escritas em todas as cores e fontes disponveis nos
equipamentos, como se os jornalistas no tivessem resistido tentao de fazer todas as
experincias possveis de um s vez.

O Visual Basic oferece mais de uma soluo para este problema da densidade grfica,
tais como controles giratrios (spin buttons), caixas drop-down, pginas tab-strip e outros. A
melhor ferramenta, contudo, uma boa programao grfica dos formulrios.

Outra maneira de evitar o carregamento dos formulrios usar controles carregados


dinamicamente, isto , medida que o programa vai sendo executado.

Lembre-se, o uso excessivo de controles no ser visto como um sinal de que o


programador conhece profundamente a linguagem, mas sim como um sinal de amadorismo.

FALTA DE IDENTAO E ESPAAMENTO

O Visual Basic no exige que voc idente o cdigo e compilar trechos de cdigo
identados ou no exatamente da mesma maneira. Ainda assim, voc descobrir que a identao
uma ferramenta poderosa na documentao de programas. Por exemplo, compare os seguintes
trechos.

Public Sub FileName()


If (Right$(frmSave.Dir1.Path, 1) = "\") Then
frmSave.txtFileName.Text = frmSave.Dir1.Path + frmSave.File1.FileName
Else
frmSave.txtFileName.Text = frmSave.Dir1.Path + "\" + frmSave.File1.FileName
End If
End Sub

Public Sub FileName()


If (Right$(frmSave.Dir1.Path, 1) = "\") Then
frmSave.txtFileName.Text = frmSave.Dir1.Path + frmSave.File1.FileName
Else
frmSave.txtFileName.Text = frmSave.Dir1.Path + "\" + frmSave.File1.FileName
End If
End Sub

evidente que o primeiro trecho, embora contenha as mesmas instrues do segundo


muito mais fcil de ser lido. Facilidade de leitura no um preciosismo, mas sim um instrumento de
depurao muito usado. Infelizmente, linguagens mais antigas, especialmente linguagens para
MainFrame2, no permitiam a identao nem a presena de linhas em branco. Pior para elas !

2 Se voc um micreiro, talvez fique espantado em saber que os mainframes ainda existem e que, mais incrvel ainda,
ainda existem programadores que s programam para mainframes. Eles esto tendo muito trabalho atualmente para
minimizar os estragos futuros do bug milnio, quando todos os computadores, na virada do sculo, mudaro as datas de
99 para 00 (2000).
USAR NOMES LONGOS

Outra prtica desaconselhvel usar nomes longos para variveis e constantes. Alguns
desenvolvedores, em vez de chamar um simples boto de cmdOK, preferem escrever
cmdOKformulrioFechaArquivoSemSalvar. Esta prtica totalmente desnecessria e dificulta
enormemente a leitura (se bem que eu tenha a impresso que a inteno destes programadores
justamente esta.).

PROCEDIMENTOS LONGOS

Sempre possvel quebrar um procedimento longo em outros menores, aumentando a


reusabilidade do cdigo e facilitando o entendimento. Alm disso, procedimentos muito longos
tornaro o programa susceptvel a estouro de memria.

Você também pode gostar