Você está na página 1de 12

3.

MENUS

UM EDITOR DE TEXTOS GERENCIADO POR MENUS

O Visual Basic disponibiliza uma excelente ferramenta para projeto de menus: o Menu
Design Window, ou Janela de Projeto de Menus, que pode ser acessada com Ctrl-E ou por meio
do boto direito do mouse. Projetar um menu em VB no mais difcil do que trabalhar com outros
controles. Entretanto, alguns cuidados so necessrios para evitar conflitos entre itens de menu. A
Janela de Projeto de Menus mostrada na Figura 10 a seguir.

Figura 10 - A Janela de Projeto de Menus

As propriedades de itens de menus so as seguintes:

Checked: se for true, uma marca de verificao aparecer ao lado do item de menu;
Enabled: se for true, o item de menu estar disponvel;
Visible: se for true, o item estar visvel.

Estas propriedades podem ser alteradas em tempo de execuo ou de projeto. , ainda,


possvel anexar teclas de atalho a cada item de menu.

A maneira mais fcil de trabalhar com menus construir Arrays de Menus, ou seja, os
diferentes sub-itens de um mesmo menu sero diferenciados apenas por um ndice, tendo o
mesmo nome. A tabela 7 abaixo exemplifica esta construo para o caso de um menu chamado
Arquivo.

Tabela 7

Legenda Nome ndice


Arquivo mnuArquivo -
--- Abrir mnuArquivoItem 0
--- Salvar mnuArquivoItem 1
--- - mnuArquivoItem 2
--- Sair mnuArquivoItem 3

O item principal do menu no tem ndice. Os sub-itens so diferenciados por ndices, tendo
o mesmo nome e sendo indentados em relao ao item principal. O Visual Basic admite at cinco
sub-itens, mas este limite raramente usado. A identao dois itens feita por meio das setas da
Janela de Projeto de Menus. A barra de separao criada com um hfen e no admite cdigo
associado. O ndice, entretanto, obrigatrio.

Podemos usar menus para implementar uma verso aperfeioada do nosso bloco de
notas. Em vez de usarmos botes de comando, usaremos itens de menus para realizar as
operaes. Inicie um novo projeto, pressione Ctrl-E para entrar na Janela de Projeto de Menus e
adicione os itens de menu conforme a tabela abaixo.

Tabela 8

Legenda Nome ndice Tecla de Atalho


Arquivo mnuArquivo - -
--- Abrir mnuArquivoItem 0 Ctrl + F12
--- Salvar mnuArquivoItem 1 Shitf + F12
--- - mnuArquivoItem 2 -
--- Sair mnuArquivoItem 3 Ctrl + Z
Editar mnuEditar - -
--- Cortar mnuEditarItem 0 Ctrl + X
--- Colar mnuEditarItem 1 Ctrl + V
--- Apagar mnuEditarItem 2 Ctrl + P
Fontes mnuFontes - -
--- Courier mnuFontesItem 0 -
--- Helvtica mnuFontesItem 1 -
--- Roman mnuFontesItem 2 -
--- Modern mnuFontesItem 3 -
--- Script mnuFontesItem 4 -
--- Symbol mnuFontesItem 5 -
--- System mnuFontesItem 6 -
--- Terminal mnuFontesItem 7 -

Aps terminar o menu, mude a legenda do formulrio para Editor. O resultado final deve
ser semelhante ao da Figura 11.
Figura 11 - Um editor de textos baseado em menus

O menu Editar contm basicamente o mesmo cdigo que, antes, estava nos botes do
bloco de notas. Quando um menu construdo a partir de arrays, a maneira mais fcil de escrever
o cdigo usando o comando Select ...Case. Para iniciar a programao, insira uma caixa de
texto do formulrio, renomeando-a para txtEditor e abra a janela de cdigo do menu
mnuEditarItem, escrevendo as seguintes linhas:

Private Sub mnuEditarItem_Click(index As Integer)


Select Case index
Case 0 'Cortar
CortaTexto = txtEditor.SelText
txtEditor.SelText = ""
txtEditor.SetFocus
Case 1 'Colar
txtEditor.SelText = CortaTexto
Case 2 'Apagar
txtEditor.Text = ""
txtEditor.SetFocus
End Select
End Sub

Note que o ncleo do cdigo idntico ao utilizado no Bloco de Notas. A utilizao do


comando Select ... Case certamente facilita as coisas e funciona da seguinte maneira: quando um
item do menu mnuEditar selecionado, o evento clique passa o parmetro Index, que corresponde
ao item selecionado. A estrutura de deciso Select ... Case verifica o valor de Index e executa
imediatamente o bloco de comandos associado, pulando a seguir para a linha End Select. O
comando Select ... Case no verifica todos os possveis valores de Index, sendo muito mais rpido
do que uma estrutura correspondente construda com comandos If ... Then ... Else.

O cdigo do menu Fontes pode ser implementado rapidamente. A diferena que


estaremos usando a propriedade Checked dos menus, para identificar qual a fonte atualmente
selecionada.
Private Sub mnuFontesItem_Click(index As Integer)
Select Case index
Case 0
txtEditor.FontName = "Courier"
Case 1
txtEditor.FontName = "Helv"
Case 2
txtEditor.FontName = "Roman"
Case 3
txtEditor.FontName = "Modern"
Case 4
txtEditor.FontName = "Script"
Case 5
txtEditor.FontName = "Symbol"
Case 6
txtEditor.FontName = "System"
Case 7
txtEditor.FontName = "Terminal"
End Select

For Contador = 0 To 7
mnuFontesItem(Contador).Checked = False
Next loop_index

mnuFontesItem(Contador).Checked = True
End Sub

Inicialmente, o comando Select ... Case usado para atribuir propriedade FontName da
caixa de textos a fonte escolhida pelo usurio. Depois, um pequeno lao For ... Next remove as
marcas de verificao de todos os sete itens de menu (porque no sabemos qual delas est ativa).
Finalmente, colocamos uma marca de verificao no item de menu escolhido atualmente. Est no
a nica maneira de trabalhar com marcas de verificao e algum poderia argumentar que no
a mais rpida (por causa do lao For .. Next). Sinceramente, para computadores superiores a um
Pentium 90 isto no faz diferena ... .Entretanto, verdade que poderamos memorizar o item
escolhido anteriormente, fazendo uso de uma varivel do tipo Integer, e ento remover a barra de
verificao somente deste item. Esta pequena modificao fica como lio de casa.

Os comandos para o menu mnuArquivoItem so mais complicados e exigem que


trabalhemos com arquivos e janelas de dilogo, o que ser visto nas prximas sees.
CONSTRUINDO UMA CAIXA DE DILOGO
Uma das maneiras de se abrir ou salvar um arquivo mostrar uma caixa de dilogo onde o
usurio escolhe o nome do arquivo e o caminho desejado. Uma caixa de dilogo personalizada em
Visual Basic basicamente um formulrio adicional, inserido atravs do menu Insert...Form. Um
aplicativo em Visual Basic pode ter at 264 formulrios, mas raro que se precise de tantos.

Caixas de dilogo podem ser modais ou no modais:

Modal: a janela deve ser fechada (escondida ou descarregada) antes que o aplicativo
possa continuar a execuo.
No Modal: a execuo do aplicativo continua, mesmo com a janela aberta.

Janelas modais so bastante comuns em situaes em que devemos evitar que o usurio
faa qualquer coisa em outras janelas enquanto uma operao importante est sendo realizada.
Por exemplo, quando voc escolhe o menu File | Save File As..., no VB 4.0, a caixa de dilogo
aberta modalmente na tela. Se o usurio tentar dar um clique fora da caixa de dilogo, um som de
erro ser emitido. Embora caixas de dilogo modais tenham suas vantagens, algumas vezes voc
no poder us-las, pois existem situaes em que devemos ter mais de uma janela aberta ao
mesmo tempo. O ambiente de trabalho do VB um exemplo de vrias janelas no modais abertas
ao mesmo tempo, possibilitando que o usurio alterne entre elas sem ter de fech-las antes.

Os mtodos e comandos a seguir podem ser usados para carregar e descarregar caixas
de dilogo.

Mtodo Show: Carrega formulrios na memria e os mostra na tela. Para carregar


formulrios modais, escreva: Nome_do_Form.Show 1. Para carregar formulrios no
modais, escreva Nome_do_Form.Show .

Mtodo Hide: esconde (apaga da tela) uma janela, mas no a descarrega da memria.
Sintaxe: Nome_do_Form.Hide.

Comando Load: carrega um formulrio na memria, mas no o mostra na tela. Sintaxe:


Load Nome_do_Form.

Comando UnLoad: descarrega um formulrio da memria e da tela. Sintaxe: UnLoad


Nome_do_Form.

Janelas previamente carregadas na memria podem ser mostradas fazendo-se a


propriedade Visible ser verdadeira. Da mesma forma, janelas carregadas na memria podem ser
escondidas fazendo-se Visible falsa. Quando uma janela descarregada da memria todos os
seus controles, variveis locais e procedures tornam-se inacessveis.

Vale salientar que formulrios que tenham sido apenas escondidos, mas no
descarregados, continuaro presentes, ocupando memria. Entretanto, podero ser acessados
muito mais rapidamente da prxima vez em que forem necessrios, haja vista que no precisaro
ser recuperados do disco.

A figura 12 mostra algumas propriedades de formulrios que podem ser teis na


personalizao, bem como para evitar que o usurio faa coisas que no deve, tais como
maximizar ou minimizar o formulrio ou acessar a Control Box.
ControlBox: Se for false, eliminar a caixinha com o menu ControlBox, que contm
comandos como Restaurar, Mover, Maximizar, Minimizar e Fechar. A tecla de atalho Alt-
F4, usada para fechar janelas, tambm ficar indisponvel;
MaxButton: Se for false, eliminar o boto de maximizao de janela;
MinButton: Se for false, eliminar o boto de minimizao de janela;
BorderStyle: Permite as seguintes definies para a borda do formulrio: Fixed Single,
Fixed Double e Sizable.

Control Box Caption (Legenda) MinButton MaxButton

BorderStyle

Figura 12 - Propriedades de formulrios

Estas propriedades so teis na personalizao de formulrios, mas devem ser usadas


com cuidado. O usurio deve ter ao menos uma opo de fechar a janela antes de recorrer s
derradeiras teclas Ctrl + Alt + Del ... Uma recomendao til que voc pense, antes de mais
nada, em opes de sada do formulrio, pois muito fcil esquecer delas depois.

Botes de comando tambm tm algumas propriedades que ajudam na personalizao de


caixas de dilogo.

Default: O boto que tiver Default = true ser acionado quando o usurio pressionar
Enter;
Cancel: O boto que tiver Cancel = true ser acionado quando o usurio pressionar
Esc.
A JANELA ABRIR ARQUIVO

O menu mnuArquivoItem apresenta dois sub-itens que requerem caixas de dilogos.


Veremos mais tarde que o VB oferece recursos
Drive1 Dir1 para implementar rapidamente
File1 caixas de dilogo
do tipo Abrir Arquivo, Salvar Arquivo, Imprimir, etc., mas interessante saber como funcionam
alguns controles relacionados a arquivos.
Path Alm disso, estePathtipo de procedimento to geral que
podemos construir caixas e deix-las prontas para serem usadas em vrios projetos diferentes,
mudando apenas o cdigo associado.

Para iniciar uma nova janela, escolha o menu Insert | Form, renomeando o formulrio para
frmAbrir. Desenhe no formulrio os seguintes controle: dois Botes de Comando, trs Rtulos, uma
Caixa de Lista de Arquivos (FileListBox), uma Caixa de Lista de Diretrios (DirListBox) e uma Caixa
de Lista de Unidades (DriveListBox). As funes destes trs ltimos controles so descritas a
seguir:

Caixa de Lista de Arquivos: este controle localiza e lista, em tempo de execuo, os arquivos
do diretrio especificado pela propriedade Path. O evento padro deste controle Click;

Caixa de Lista de Diretrios: lista os caminhos e diretrios da unidade selecionada em tempo


de execuo. O evento padro Change, que ocorre sempre que o usurio alterar o caminho
com o mouse ou a teclas de direo;

Caixa de Lista de Unidades: possibilita que o usurio selecione uma unidade (drive) em tempo
de execuo. O evento padro Change.

Estes trs controles, uma vez posicionados no formulrio, so inicialmente independentes.


Para torn-los interconectados devemos escrever algumas linhas de cdigo, baseadas na troca de
informaes que deve haver entre eles, conforme a figura 13 a seguir.

Figura 13

Tudo comea quando o usurio seleciona uma unidade em Drive1, gerando um evento
change. Devemos capturar este evento e atribuir o caminho (Path) selecionado propriedade Path
da caixa de lista de diretrios (Dir1). A atribuio desta propriedade gerar um evento change em
Dir1. Novamente, este evento ser capturado para repassar o caminho correto para File1.

Para implementar esta automao na janela Abrir Arquivo, escreva os seguintes trechos de
cdigo nos objetos correspondentes:

Private Sub Drive1_Change()


Dir1.Path = Drive1.Drive
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub

Nada muito complicado, no mesmo ! O formulrio frmAbrir, finalmente, pode ser


configurado de modo a ficar como na figura 14. Falta apenas escrever os cdigos para os botes
cmdOK e cmdCancelar. O mais simples deles o boto cmdCancelar, cuja procedure para o
evento clique deve apenas descarregar o formulrio sem realizar ao alguma, conforme mostrado
abaixo.

Private Sub cmdCancelar_Click()


Unload frmAbrir
End Sub

Figura 14 - O formulri frmAbrir

A procedure para o boto cmdOk um pouco mais complicada, mas de utlizao geral.
Antes de mais nada, devemos compor o nome do arquivo a ser aberto a partir das informaes de
Dir1.Path e File1.FileName. Depois, devemos abrir este arquivo com o comando Open. A
procedure completa mostrada a seguir.

Private Sub cmdOK_Click()


If (Right$(Dir1.Path, 1) = "\") Then
FileName$ = Dir1.Path + File1.FileName
Else
FileName$ = Dir1.Path + "\" + File1.FileName
End If
Open FileName$ For Input As #1
frmEditor.txtPad.Text = Input$(LOF(1), #1)
Close #1
Unload frmLoad
End Sub

A primeira linha verifica se o diretrio o raiz. Se for, o caminho completo deve ser
formado com a concatenao direta dos strings Dir1.Path e File1.FileName. Caso contrrio,
devemos inserir uma barra invertida (\) para compor o caminho corretamente. A ltima linha
descarrega o formulrio da memria. A sintaxe completa do comando Open ser vista na prxima
seo.

A JANELA SALVAR COMO

A janela Salvar Como no muito diferente da janela Abrir Arquivo. A nica diferena que
devemos inserir uma caixa de texto onde o usurio pode escrever o nome do arquivo diretamente
ou form-lo a partir dos controles de unidade, drive e arquivo. Insira um novo formulrio e desenhe
os objetos mostrados na figura 15, renomeando a caixa de textos para txtFileName. A
implementao do cdigo ser um pouco diferente, mostrando que existe, frequentemente, mais de
uma maneira de fazer as coisas.

A principal diferena que no iremos compor o nome do arquivo somente quando o


usurio clicar o boto OK, mas sim a cada evento gerado pelos controles de arquivos. Entretanto,
seria desnecessrio escrever o mesmo trecho de cdigo em trs procedures diferentes, nos
controles Drive1, Dir1 e File1. O melhor criar uma procedure interna, que no depende de
eventos, e cham-la quando necessrio. Para criar esta procedure, insira um mdulo de
programao, por meio do menu Insert | Module. A seguir, clique no menu Insert | Procedure e
chame-a de FileName. Esta ser uma procedure do tipo Public Sub, o que significa que ela ser
acessvel por todos os formulrios e mdulos do projeto. Dentro do corpo de FileName escreva o
seguinte cdigo:

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

O que precisamos fazer, agora, chamar a procedure FileName sempre que o usurio
mudar um dos controles do caminho final. Escreva os seguintes trechos de cdigo nos objetos
correspondentes:

Private Sub Drive1_Change()


Dir1.Path = Drive1.Drive
Call FileName
End Sub

Private Sub Dir1_Change()


File1.Path = Dir1.Path
Call FileName
End Sub

Private Sub File1_Click()


Call FileName
End Sub

Note que o comando Call serve para chamar a procedure FileName. Poderamos
escrever simplesmente FileName, mas sempre melhor, por questes de documentao de
programa, usar o comando Call. Veremos mais sobre procedures internas na seo seguinte.
Figura 15 - o formulrio frmSalvar

Agora, tudo que falta escrever o cdigo para carregar os formulrios frmAbrir e frmSalvar,
quando requerido pelo usurio. Isto feito na procedure associada ao menu mnuArquivoItem,
conforme abaixo.

Private Sub mnuArquivoItem_Click(index As Integer)


Select Case index
Case 0 'Abrir
frmAbrir.Show
Case 1 'Salvar
frmSalvar.Show
Case 2 'Separador
Case 3 'Sair
End
End Select
End Sub

Como anteriormente, estamos usando o comando Select Case para estruturar a chamada
de comandos. O mtodo Show est sendo usado para abrir os formulrios frmAbrir e frmSlvar
modalmente. O ndice 2 corresponde barra separadora do menu e no admite cdigo, pois esta
barra no executa o evento clique.

O editor est quase pronto. Voc pode implementar, no evento Resize do formulrio
frmEditor, o mesmo cdigo do Bloco de Notas. Melhorias adicionais envolvem o desenvolvimento
de um menu flutuante e o uso do ClipBoard.
MENUS FLUTUANTES (POP-UP)

Menus flutuantes so aqueles que aparecem quando clicamos o boto direito do mouse
sobre um objeto. O Windows 95 repleto destes menus (em qualquer lugar que voc clicar com o
boto direito, alguma coisa aparece !) e o VB, desde a verso 2.0, fornece recursos para a
implementao destes menus. Por exemplo, para fazer o menu Editar aparecer como flutuante
quando o boto direito do mouse for pressionado sobre a caixa de texto txtEdit, devemos fazer,

Private Sub txtEdit_MouseUp (Button As Integer, Shift As Integer, X As Single, Y


As Single)
If Button = 2 Then Boto direito foi pressionado
PopUpMenu mnuEditar
End If
End Sub

O OBJETO CLIPBOARD

O ClipBoard (rea de Transferncia) uma rea da memria, comum a todos os programas


Windows, usada para armazenar temporariamente texto e figuras. Podemos usar o ClipBoard
para substituir as funes da varivel CortaTexto do menu Editar do nosso editor de textos.

Por exemplo, para armazenar o texto selecionado em txtEditor no ClipBoard, usamos a


funo SetText,

ClipBoard.SetText txtEditor.SelText

Para recuperar o texto do ClipBoard, usamos o mtodo GetText,

txtEditor, SelText = ClipBoard.GetText()

O cdigo completo do menu Editar fica da seguinte forma:

Private Sub mnuEditarItem_Click(Index As Integer)


Select Case Index
Case 0 'Cortar
Clipboard.Clear
Clipboard.SetText txtEditor.SelText ' Copia o texto selecionado para o
"ClipBoard.
txtEditor.SelText = "" ' Apaga o texto selecionado.
Case 1 ' Copiar
Clipboard.Clear
Clipboard.SetText txtEditor.SelText 'Copia o texto selecionado para o
"ClipBoard.
Case 2 ' Colar
txtEditor.SelText = Clipboard.GetText() ' Cola o texto presente no "Clipboard"
End Select
End Sub

Você também pode gostar