capítulo i - Zanon Digital
Transcrição
capítulo i - Zanon Digital
CAPÍTULO I 1 - CRIAÇÃO DE UM PROGRAMA Um programa de computador é um conjunto de instruções que informam à máquina o que deve ser feito, para que determinado objetivo seja alcançado. Para se criar um programa, utilizamos uma linguagem de programação. Como exemplo de linguagens temos Pascal, Cobol, C. Após o advento do Windows, o computador passou a apresentar um ambiente gráfico, enquanto que na época do DOS tínhamos um ambiente texto. No Windows as coisas ocorrem disparadas por eventos: clicar o cursor do mouse sobre um botão, apertar um conjunto de teclas, etc. Como a linguagem Visual Basic foi desenvolvida para criar programas para o Windows, dizemos que ela é orientada a eventos. Esse conceito será facilmente compreendido quando começarmos a programar efetivamente em VB. 2 - AS PARTES DE UM PROGRAMA Um programa pode ser dividido em duas partes: a interface visual e o processamento da informação. Nas linguagens antigas, para se criar a interface era necessário escrever linhas de código, e só era possível ver o resultado quando o programa estivesse realmente sendo executado. No VB, a interface é criada visualmente, sem que nenhuma linha de código precise ser escrita, e o resultado é visto no mesmo instante em que ela está sendo criada. 3 - AMBIENTE DE PROGRAMAÇÃO VB O ambiente de programação de uma linguagem é o conjunto de facilidades colocadas à disposição do programador, para que a tarefa de escrever um programa seja facilitada. O ambiente de programação do VB é composto dos seguintes elementos: 3.1) Barra de menu Como todos os aplicativos for Windows, a barra de menu do VB apresenta as opções de menu clássicas (File, Edit, ...), além das específicas (View, Run, Debug, ...). Durante o curso será visto a utilização das diversas opções. fig 1.1 - Barra de Menu 3.2) Barra de ferramentas (atalho para as opções de menu) Caixa com diversos botões que representam atalhos para as ações de menu. Também serão utilizadas durante o curso. Assim como a barra de menus, a barra de Ferramentas também é um objeto comum nos programas que rodam no Windows. fig 1.2 - Barra de Ferramentas 3.3) Caixa de ferramentas (ToolBox) A Caixa de Ferramenta mostra os controles que você pode adicionar ao seu projeto. Imagine um aplicativo que execute no Windows, ele certamente contém muitos objetos, como botões de comando, gráficos, grades, quadros textos, etc. Pois um programa desenvolvido em VB também pode possuir vários objetos. Esses objetos são colocados no programa sem que seja necessário digitar uma linha de código sequer. Basta selecioná-los na ToolBox. Um controle pode ser adicionado ao projeto de duas formas: dando-se um duplo clique sobre ele na ToolBox, ou clicando sobre ele uma só vez, e desenhando-o sobre o formulário, com o auxílio do mouse. Para se visualizar a Caixa de Ferramentas, seleciona-se a opção de menu View - Toolbox. 3.4) Janela de projeto A janela de projeto mostra a lista de todos os arquivos de Formulários e de Módulos do projeto em andamento. Esses arquivos podem ser adicionados ou retirados do projeto, conforme a necessidade. Para que voce tenha uma idéia, cada documento do Word é um formulário diferente, que deve ser adicionado ao programa. 1 Para adicionar um arquivo, usa-se a opção de menu Project - Add Form..., Project - Add Module... , etc, e para se retirar um arquivo, a opção Project - Remove File. Para se visualizar a janela de projeto, seleciona-se a opção View - Project Explorer. fig 1.3 - Caixa de Ferramentas fig 1.4 - Janela de Projeto 3.5) Janela de propriedades A janela de propriedades contém uma lista com as propriedades do controle ou formulário selecionado. As propriedades mostradas são as que podem ser alteradas durante o projeto. Quando mais de um controle é selecionado, a janela de propriedades mostra as propriedades comuns. fig 1.5 - Janela de Propriedades Para se visualizar a janela de propriedades, seleciona-se a opção de menu Window - Properties, ou a tecla de atalho F4. 2 4 - PROJETO 4.1) O que é um projeto Toda vez qual o VB é iniciado, um novo projeto é aberto. Um projeto é a denominação que se dá ao conjunto de formulários, controles e módulos que são utilizados na criação de um programa. Quando um projeto é salvo, são salvos no diretório escolhido pelo programador, os seguintes arquivos: um arquivo de projeto (.VBP), e tantos arquivos de formulários (.FRM) e de módulos (.BAS) quantos forem os formulários e os módulos existentes neste projeto em particular. Os arquivos de controle (.OCX), devem estar disponíveis, normalmente no diretório c:\windows\system. Esses arquivos possibilitam que um ou mais controles estejam disponíveis na caixa de ferramentas. 4.2) Componentes de um projeto São os seguintes, os componentes de um projeto: * Formulários * Controles * Módulos Os formulários são as janelas que estamos acostumados a ver no ambiente Windows. Toda vez que um projeto é iniciado, um formulário é automaticamente adicionado ao projeto. Não pode haver um projeto sem pelo menos um formulário ou um módulo. Os controles são os objetos que povoam as janelas (formulários). Os controles são colocados nos formulários, clicando-se sobre o ícone correspondente na caixa de ferramentas. São exemplos de controles: botões de comando, botões de opção e quadro textos. Os módulos são os locais onde são declaradas as funções, os procedimentos e as variáveis de alcance global. Associado a cada objeto (controles ou formulários) existem as propriedades, os eventos e os métodos. As propriedades, em geral, dizem respeito à aparência de um objeto. Existem propriedades que tratam de aspectos não relacionado à aparência, e serão apresentadas a medida que o curso se desenvolva. Como exemplo de propriedades temos: a cor de um formulário, o tipo de letra de um quadro texto, a legenda de um botão de controle. Existem propriedades que só podem ser alteradas durante o projeto (como o nome de um controle), outras que só podem ser alteradas durante a execução (como a propriedade recordset de um controle de dados), e por fim, as que podem ser alteradas tanto durante o projeto quanto durante a execução (como a legenda de um botão de comando). Os eventos são as ações que ocorrem em relação a algum controle. Por exemplo, temos o evento click de um botão (ocorre quando usamos o mouse e clicamos sobre o botão) e o evento change de um quadro texto (ocorre quando o texto de um quadro texto é mudado). Usamos os eventos para escrever algum código que será executado toda vez que o evento ocorra. Os métodos são procedimentos ou funções previamente definidos, que operam sobre os objetos. Por exemplo, temos o método circle, que desenha um círculo sobre um objeto especificado, e o método Move, que movimenta o objeto para uma localização em particular. 4.3) Salvando um projeto Utilizando a opção de menu File - Save Project, todos os arquivos do projeto são salvos no diretório previamente especificado, ou a janela de diálogo Salvar Como aparece, caso seja a primeira vez que o projeto esteja sendo salvo. 4.4) Gerando um executável Um arquivo executável é gerado através da opção de menu File - Make EXE File.... Uma vez gerado esse arquivo (.EXE), o programa pode ser executado sem que o VB esteja presente na máquina hospedeira. 5 - O PROGRAMA INAUGURAL Neste primeiro programa serão apresentados os seguintes objetos: formulário, botões de comando (Command Button), quadro texto (Text Box) e label (Label). Serão vistas também as propriedades Name, Caption, BackColor, ForeColor, FontSize, FontName e FontItalic, além do evento Click. Veremos também como alterar o valor de uma propriedade em tempo de projeto, em tempo de execução, e como incluir linha de código em um evento. O formulário com o programa em execução, é mostrado na figura 1.6. Para se alterar uma propriedade de algum objeto, em tempo de projeto, deve-se escrever o novo valor dessa propriedade na janela de propriedades, na linha referente à propriedade. Obviamente o objeto escolhido deve estar selecionado, o que pode ser feito de duas formas: antes de visualizar a janela de ferramentas, clicar uma vez sobre o objeto; ou após a janela estar acionada, escolher o objeto na lista de objetos que aparece na janela de propriedades. 3 Para se colocar um controle em um formulário, dar um clique sobre o botão correspondente (na caixa de ferramentas), e desenhar o controle sobre o formulário (com o botão esquerdo do mouse pressionado). Pode-se também, dar dois cliques sobre o botão correspondente (na caixa de ferramentas), o que fará com que o controle apareça no meio do formulário. Para acessar a janela que permite incluir código nos eventos, dar um duplo clique no objeto escolhido, usar a opção de menu View - Code, ou usar a tecla de atalho F7. fig 1.6 - O formulário do primeiro programa Após iniciar uma sessão do VB, realizar as seguintes ações: - Alterar a propriedade Name do formulário para FRMproj1- Este será o nome interno do formulário. - Alterar a propriedade caption do formulário para Aula Inaugural. - Salvar o projeto no diretório c:\aulavb\aula1\proj1 com o nome proj1.vbp. - Salvar o formulário como proj1.frm - Este será o nome do arquivo de formulário, deste formulário. 5.1) Botões de Comando, Quadro Texto e Label - Colocar três Botões de Comando no formulário. Observe que os botões tem os nomes Command1, Command2 e Command3, e que a propriedade Caption dos três controles é igual à propriedade Name de cada um deles. Toda vez que um controle é adicionado a um formulário, o VB lhe dá um nome padrão (um valor para a propriedade Name). É importante que os nomes dos objetos sejam significativos para o programador, por isso sempre alteraremos a propriedade Name de todos os controles. - Alterar as propriedades Name e Caption para as seguintes: name: BTNecoar, BTNlimpar, BTNsair caption: &Ecoar, &Limpar, Sai&r , respectivamente. OBS: Quando o símbolo & é colocado antes de alguma letra, no valor da propriedade Caption, a legenda do controle apresentará a letra sublinhada. Isto significa que o evento Click deste controle pode ser acionado digitando-se <Alt + a_tecla_sublinhada>. - Colocar um quadro texto (Text Box) no formulário, e alterar as seguintes propriedades: name: TXTentrada text: - Colocar um Label no formulário, e alterar as seguintes propriedades: name: LBLeco caption: - Observe a figura 1.6 para dispor os controles adequadamente no formulário. 4 Label Quadro Texto fig 1.7 - Botão de Comando, Quadro Texto e Label 5.2) Evento Click - Adicionar no evento BTNsair_click: End O evento BTNsair_click ocorre sempre que o usuário der um clique com o mouse sobre o botão BTNsair. Quando isso ocorre, o Windows captura esse evento, e o código que estiver associado ocorrerá. A palavra End, é uma instrução do VB que finaliza um programa. - Executar o programa. Verificar que ao se clicar sobre os botões Limpar e Ecoar, nada acontece (não há código associado ao evento Click desses botões), mas que ao clicar sobre o botão Sair, o programa é encerrado. - Adicionar no evento BTNecoar_click: LBLeco.Caption = TXTentrada.Text Para referenciar uma propriedade de um controle durante a execução do programa, escreve-se o nome do controle (propriedade Name), seguido de um ponto e do nome da propriedade que se quer acessar. A linha de código inserida no evento BTNecoar_click copia o valor da propriedade Text do quadro de texto TXTentrada, para a propriedade Caption do label LBLeco. - Executar o programa. Verificar o que ocorre ao se clicar no botão Ecoar. - Adicionar no evento BTNlimpar_click: TXTentrada.Text = "" LBLeco.Caption = "" Este código “limpa” os valores das propriedades Text e Caption, dos controles TXTentrada e LBLeco, respectivamente. - Executar o programa. Verificar o que ocorre quando se clica nos botões. - Salvar o projeto. - Gerar o executável. Usar a opção de menu File - Make EXE File.... Escolher o diretório C:\aulavb\aula1\proj1. - Executar o programa a partir do gerenciador de arquivos. - Executar o programa a partir do gerenciador de programas. - Voltar ao projeto, e para todos os objetos, modificar as seguintes propriedades: * BackColor * ForeColor * FontSize * FontName * FontItalic 5 Essas propriedades dizem respeito a aparência dos objetos, como a cor de fundo e das letras, e o nome, o tamanho e se a fonte deve ou não ficar itálico. Verificar que nem todas as propriedades são comuns a todos os objetos, e que se comportam de forma diferente, de acordo com o objeto. 6 - OUTRO PROGRAMA Apresentação do controle barra de rolagem, com as suas principais propriedades, apresentação dos eventos Form_Load e Change, além das propriedades Tab, Top, Left, Width e Height. - Iniciar um novo projeto. - Salvar o projeto no diretório c:\aulavb\aula1\proj2 com o nome proj2. 6.1) Propriedades Top, Left, Width, Height e ScaleMode - Alterar as propriedades do formulário: *Name = FRMproj2 *Caption = Velocidade *Top = 1170 *Left = 1080 *Width = 4125 *Height = 4545 As propriedades Top e Left são as coordenadas de um objeto. O valor 1170 da propriedade Top significa que o formulário dista 1170 unidades da parte superior da tela, enquanto que a propriedade Left determina a distância do formulário em relação à borda esquerda da tela. A unidade utilizada é definida pela propriedade de formulário Scale Mode, que por default é o Twip. Para os controles, essas propriedades determinam as coordenadas em relação ao formulário que os contém. As propriedades Width e Height definem as dimensões de um objeto (largura e altura), e também dependem da propriedade Scale Mode. Todas essas propriedade podem ser alteradas tanto durante o projeto quanto durante a execução. Observe que alterando a posição ou o tamanho de um objeto, via mouse, as propriedades são automaticamente atualizadas. fig 1.8 - O segundo programa 6.2) Propriedades Alignment e MultiLine - Incluir um quadro texto, com as propriedades: *Name = TXTvelocidade *Text = “” *BackColor = vermelho *ForeColor = branco *Alignment = centro *MultiLine = True *Top = 240 *Left = 1320 *Width = 1215 *Height = 495 A propriedade Alignment determina como o texto (propriedade Text) de um quadro texto será alinhado dentro do controle. Essa propriedade só é reconhecida, se a propriedade MultiLine do mesmo controle tiver o valor True. Essa propriedade habilita várias linhas em um quadro texto. 6 - Incluir um botão de comando *Name = BTNsair *Caption = Sai&r *Top = 3000 *Left = 1440 *Width = 1215 *Height = 495 6.3) Barra de Rolagem Horizontal (HScrollBar) - Incluir uma barra de rolagem horizontal (HScrollBar), com as seguintes propriedades: *Name = HSBvelocidade *Top = 1440 *Left = 600 *Width = 2775 *Height = 255 - No evento BTNsair_click End - Executar o programa. Verificar que não ocorre nada ao se clicar na Barra de Rolagem. 6.4) Propriedades Min, Max, Value, SmallChange e LargChange - Na barra de rolagem horizontal, alterar as seguintes propriedades: *Min = 0 *Max = 100 *Value = 50 *SmallChange = 10 *LargChange = 50 Para uma barra de rolagem funcionar, essas propriedades devem ser configuradas. A propriedade Value indica o valor atual da barra (a posição do marcador), e pode variar entre os valores das propriedades Min e Max. A propriedade SmallChange define de quanto será a variação do valor de Value, quando umas das setas das extremidades do controle for “clicada”, enquanto que LargChange define a mesma variação quando a parte interna da barra de rolagem for “clicada”. Barras de Rolagem fig 1.9 - Barra de Rolagem 6.5) Foco do Teclado - Propriedade TabIndex - Executar o programa. Verificar o que ocorre com a barra de rolagem. Verificar que a medida que se pressiona a tecla <Tab>, o “foco” do teclado passa de um controle para o outro. Quando um controle detém o foco, ele pode ser acessado também pelo teclado, e não apenas pelo mouse. Por exemplo, quando um quadro texto tem o foco, é possível escrever nele; quando um botão tem o foco, é possível “clicálo” teclando-se <Enter>. A propriedade que determina a ordem em que os controles receberão o foco, é a propriedade TabIndex. 6.6) Evento Change -Escrever na janela de código do evento HSBvelocidade_Change. TXTvelocidade.Text = HSBvelocidade.Value O evento Change ocorre sempre que o conteúdo de um controle é alterado ( o texto de um quadro texto, a legenda de um label, o valor de uma barra de rolagem, etc). 7 Esta linha de código copia o conteúdo da propriedade Value do controle HSBvelocidade para a propriedade Text do quadro texto TXTvelocidade. Este evento ocorre toda vez que as setas da extremidade da barra de rolagem forem clicadas. - Executar o programa. Verificar o que ocorre quando se clica nas extremidades da barra de rolagem. 6.7) Evento Load - Escrever no evento Form_load do formulário: TXTvelocidade.Text = BRHvelocidade.Value + “ Km\h” O evento Form_load ocorre sempre que um formulário é carregado na memória. Como só existe um formulário neste projeto, quando iniciamos a execução, automaticamente o formulário é carregado, e o evento Form_load ocorre. O comando copia para a propriedade Text do controle TXTvelocidade, o valor da propriedade Value da barra de rolagem, concatenando-a com a string “ Km\h”. - Executar o programa. Verificar que agora o quadro texto já apresenta o valor da barra, ao iniciar o programa. 6.8) Propriedade Enabled - No controle TXTvelocidade. *Enabled = False A propriedade Enabled habilita (True) ou desabilita (False) um controle - permitindo ou não que o controle receba o foco do teclado. No caso de um quadro texto, Enabled = False impede que o usuário digite algo no quadro texto. 6.9) Evento Scroll - No evento HSBvelocidade_Scroll. TXTvelocidade.Text = BRHvelocidade.Value + “ Km\h” O evento Scroll de uma barra de rolagem ocorre quando se arrasta o marcador do controle. - Executar o programa. 8 CAPÍTULO II 1 - TIPOS DE DADOS Os tipos de dados suportados pelo VB são os seguintes: TIPO DE DADO SUFIXO TAMANHO Integer Long(long integer) % & 2 bytes 4 bytes Single ! 4 bytes Double # 8 bytes Currency @ 8 bytes String $ 1 byte Variant Nenhum Object Nenhum FAIXA por caracter 4 bytes 2 - DECLARAÇÃO DE VARIÁVEIS Ao se declarar uma variável, deve-se especificar qual é seu tipo. Quando o tipo não é especificado, ela é considerada como sendo Variant. 2.1) Dim A declaração de variáveis é feita usando-se a palavra chave Dim, seguida do nome da variável, com a indicação do tipo vindo em seguida: Dim i as Integer ou Dim i% Dim x as Double ou Dim x# 2.2) Public Uma variável declarada como Public, é visível em qualquer parte do projeto, e não apenas no módulo onde ela for declarada. Essa declaração só pode ser feita em um módulo. Ex.: Public Numerodeempregados As Integer 2.3) Private Declara variáveis que são privativas do módulo em que foi feita a declaração. Essas variáveis não são visíveis fora do módulo. Essa declaração só pode ser feita em um módulo .Por exemplo: Private Numero As Integer 2.4) Static As variáveis Static são declaradas em funções, e retém seu valor entre as chamadas. São variáveis locais, que não são destruídas após a função ter sido encerrada, porém só são visíveis de dentro da função. Por exemplo: Function Total(numero) ' Somente a variável acumulo retem seu valor entre as chamadas. Static acumulo acumulo = acumulo + numero Total = acumulo End Function 9 2.5) Matrizes As variáveis matrizes são declaradas usando a seguinte sintaxe: dim <nome_da_variável> (<limite_inferior> to <limite_superior>) as tipo Onde nome_da_variável é um identificador definido pelo programador, e limite_inferior e limite_superior são os valores inteiros que limitam a dimensão da matriz. Para criar uma matriz com mais de uma dimensão (no máximo 60 dimensões), basta acrescentar outros <limite_inferior> to <limite_superior> à declaração, conforme o exemplo: Dim X(1 To 8) As Integer Dim Y(1 To 8, 5 To 9) As Single No primeiro caso temos a declaração da variável vetor X de elementos Integer, de uma dimensão e com índices variando de 1 a 8, . No segundo caso é declarada a variável Y, um vetor de valores Single, com duas dimensões, tendo a primeira índices variando de 1 a 8 e a segunda de 5 a 9. O acesso a um elemento da matriz é feito escrevendo-se o nome da variável seguida de parênteses, que contém a posição do elemento dentro das dimensões da matriz. Observe o exemplo: X (2) = 6 Y (3,6) = 8.9 No primeiro caso, é colocado o valor 6 no segundo elemento da variável X, enquanto que no segundo caso, é colocado o valor 8.9 no elemento de índice 3 na primeira dimensão e 6 na segunda. Se imaginarmos a variável Y como uma tabela, teríamos o seguinte: 5 1 2 3 6 7 8 9 8. 9 4 5 6 7 8 2.6) Redim A instrução ReDim é utilizada para dimensionar ou redimensionar uma matriz dinâmica que já tenha sido declarada formalmente utilizando-se uma instrução Private, Public ou Dim com os parênteses vazios (sem subscritos de dimensão). É possível utilizar a instrução ReDim várias vezes para alterar o número de elementos e dimensões em uma matriz. Observe o exemplo: Dim vetor() As Integer 'declara a matriz com os parênteses vazios ReDim vetor(10) 'redeclara a matriz com 10 elementos 3 - INSTRUÇÕES DE CONTROLE DE FLUXO DE PROGRAMAS 3.1) If <expressão> Then <comando> End If O comando If condiciona a execução de um comando (ou bloco de comandos) à verificação de uma expressão. O comando só é executado se a expressão for verdadeira. If A = 1 Then <cmdo ou bloco executado somente se A for igual a 1> End If Existe também a possibilidade da utilização do Else, como no exemplo abaixo If A = 1 Then <cmdo ou bloco executado somente se A for igual a 1> Else <cmdo ou bloco executado somente se A for diferente de 1> End If 10 Também é possível o uso de If's aninhados, sendo executado o grupo de comandos associados à condição verdadeira. Observe o exemplo: If x > 4 then <comandos> ElseIf x = 4 then <comandos> Else <comandos> End If 3.2) A instrução Select Case Essa instrução tem funcionamento parecido com a anterior, normalmente sendo utilizada quando há a necessidade de uma escolha que envolva várias opções. É testado o valor de uma expressão numérica ou string, contra vários valores, cada um associado a um case. Serão executados os comandos que estiverem relacionados ao case que contiver a condição verdadeira. Select Case x Case 0 <comandos que serão executados caso x = 0> Case 1 <comandos que serão executados caso x = 1> Case 2 <comandos que serão executados caso x = 2> End Select Select Case x Case 0 Beep Case Is > 1 < 5 Text1.Text = x Case 2 x=x*x Text1.Text = x Case Else Text1.Text = 2*x End Select Voce também pode usar múltiplas expressões ou faixas em cada cláusula case. Por exemplo, a seguinte linha é válida: Case 1 To 4, 7 To 9, 11, 13, Is > X 3.3) A instrução Do While ... Loop Esta instrução é utilizada para executar instruções enquanto uma determinada condição for verdadeira. x=1 Do While X < 1000 x=x+1 Loop O pedaço de código acima inicializa a variável x, e executa o comando x = x + 1 enquanto x for menor que 1000. 3.4) A instrução Do ... Loop While No exemplo anterior, se x fosse inicializado com 1000, o loop nunca seria executado. Pode ser conveniente que um determinado loop seja executado pelo menos uma vez, independente da variável de controle. Isto é possível com Do ... Loop While. x = <qualquer_valor> Do x =x+1 Loop While x < 1000 Neste fragmento de código, o comando x = x + 1 é executado pelo menos uma vez, sendo executado novamente enquanto x for menor do que 1000. 11 OBS: É possível a substituição da palavra While pela palavra Until nas instruções vistas anteriormente. Neste caso, o loop será executado até que a condição se torne verdadeira, e não enquanto ela for verdadeira. 3.5) A instrução For ... Next É uma outra forma de se criar loops no VB. Sempre que for possível, deve ser utilizado no lugar das outras instruções de repetição, por ser mais rápida. For x = 1 to 100 Step 2 y=y+1 Next Este comando realiza o loop contando x de 1 até 100, de 2 em 2. Step informa de quanto será o incremento da variável de controle. Se for omitida, o valor do incremento será 1. Observe que o valor inicial da variável de controle (no caso x), é definido no próprio comando, não importando qual valor a variável possuia antes. 3.6) A instrução Exit For Esta instrução determina a saída do loop contido da instrução For ... Next mais interna, mesmo que a condição de término do loop não tenha sido alcançada. For x = 1 to 100 Step 2 y=y+1 if y = 30 then Exit For End If Next Se y tiver o valor 30 durante a execução do loop, o comando For é encerrado. 3.7) A instrução Exit Do Esta instrução determina a saída do loop da instrução Do ... mais interna, mesmo que a condição de término do loop não tenha sido alcançada. É semelhante à instrução Exit For. x = <qualquer_valor> Do x =x+1 if x = 30 then Exit Do End If Loop While x < 1000 4 - SELECIONANDO OPÇÕES O próximo programa nos mostrará como permitir que o usuário selecione uma opção. Para isto serão vistos os controles Option Button (botão de opção) e Check Box (caixa de verificação). - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMopcao Caption = Programa Opção formulário : opcao.frm - Salvar o projeto no diretório c:\aulavb\aula02\proj1: - Inserir um botão de comando: Name = BTNsair Caption = Sa&ir - Inserir um label: Name = LBLescolha Caption = <vazio> O formulário deve ficar conforme a figura 2.1. 12 4.1) Option Button e Check Box Um Botão de opção (Option Button) e um Caixa de verificação (Check Box) permitem que o usuário faça uma escolha. Quando ocorre um clique sobre o controle, em tempo de execução, a propriedade Value muda de True para False, e vice e versa. Quando essa propriedade for True, o botão se apresentará marcado. O funcionamento dos dois controles é similar, com a diferença de que em um formulário, vários Check Box podem estar selecionados, mas somente um Option Button pode ter Value como True. Outra diferença é que os valores possíveis de Value são True e False para um Option Button, e 0, 1 e 2 (não marcado, marcado e não disponível) para um Check Box. - Inserir 3 (três) botões de opção: Name = OPTverde Name = OPTvermelho Caption = Ve&rde Caption = Ver&melho Value = False Value = False Name = OPTbranco Caption = &Branco Value = True - Inserir 3 (três) botões de verificação: Name = CHKcor Name = CHKsom Name = CHKmouse Caption = &Cor Caption = &Som Caption = &Mouse Value = 0 Value = 0 Value = 0 - Inserir o seguinte código nos eventos Click dos botões de opção: atualiza_cor fig 2.1 fig 2.2 - Option Button e Check Box 5 - ESCREVENDO E CHAMANDO FUNÇÕES E PROCEDIMENTOS 5.1) Procedimentos (Sub) A linha de código acima significa que o procedimento atualiza_cor será executado toda vez que qualquer um dos botões de opção for clicado. Obviamente devemos escrever o código deste procedimento. Na seção General do formulário, escreva Sub atualiza_cor, e tecle <Enter>. Automaticamente o VB apresenta uma janela de código para o procedimento em questão. Uma outra maneira de criar um procedimento ou função é através do item de menu Tools – Add Procedure, conforme figura 2.3. A janela de diálogo da figura 2.4 será exibida. 13 fig 2.3 – Criar procedimento A diferença entre um procedimento e uma função é que a função retorna um valor. atualiza_cor, escrever então o seguinte código: No procedimento Sub atualiza_cor If OPTvermelho Then FRMopcao.BackColor = &HFF& OPTvermelho.BackColor = &HFF& OPTverde.BackColor = &HFF& OPTbranco.BackColor = &HFF& CHKcor.BackColor = &HFF& CHKsom.BackColor = &HFF& CHKmouse.BackColor = &HFF& LBLescolha.BackColor = &HFF& ElseIf OPTverde Then FRMopcao.BackColor = &HFF00& OPTvermelho.BackColor = &HFF00& OPTverde.BackColor = &HFF00& OPTbranco.BackColor = &HFF00& CHKcor.BackColor = &HFF00& CHKsom.BackColor = &HFF00& CHKmouse.BackColor = &HFF00& LBLescolha.BackColor = &HFF00& ElseIf OPTbranco Then FRMopcao.BackColor = &HFFFFFF OPTvermelho.BackColor = &HFFFFFF OPTverde.BackColor = &HFFFFFF OPTbranco.BackColor = &HFFFFFF CHKcor.BackColor = &HFFFFFF CHKsom.BackColor = &HFFFFFF CHKmouse.BackColor = &HFFFFFF LBLescolha.BackColor = &HFFFFFF End If End Sub Este procedimento troca o valor da propriedade BackColor de todos os controles do formulário (exceto do botão), de acordo com o botão de opção escolhido. fig 2.4 – janela de diálogo Add Procedure - Inserir o seguinte código nos eventos Click das caixas de verificação: atualiza_label 14 A linha de código acima significa que o procedimento atualiza_label será executado toda vez que qualquer um dos botões de check for clicado. Obviamente devemos escrever o código deste procedimento. Escrever o procedimento atualiza_label: Sub atualiza_label Dim pl, info As String pl = Chr(10) + Chr(13) If CHKcor Then info = "Cor ON" Else info = "Cor OFF" End If If CHKsom Then info = info + pl + "Som ON" Else info = info + pl + "Som OFF" End If If CHKmouse Then info = info + pl + "Mouse ON" Else info = info + pl + "Mouse OFF" End If LBLescolha.Caption = info end sub As duas variáveis (pl e info) são do tipo string. A variável pl recebe o valor Chr(10) + Chr(13). A função chr() devolve o símbolo cujo código Ascii é o número passado como parâmetro, sendo 10 o código de avanço de linha e 13 o de retorno de carro. Na prática, o uso dessa função com esses parâmetros, faz com que uma linha seja avançada. A variável info recebe o seu valor de acordo com as caixas de verificação que estiverem selecionadas. 5.2) Funções Este outro programa mostrará como uma função deve ser codificada e chamada. O formulário deve Ter a aparência mostrada na figura 2.5. - Iniciar um novo projeto, com as seguintes propriedades do formulário: Name = FRMcalcular Caption = Calculadora Simples BackColor = &H00C0C0C0& (cinza) - Salvar o projeto no diretório c:\aulavb\aula02\proj2, com o nome calcular.mak, e o formulário como calcular.frm. - Colocar dois quadros textos: Name = TXTop1 BorderStyle = 1 Name = TXTop2 BorderStyle = 1 15 fig 2.5 – Outro projeto - Colocar dois labels, de forma que o label LBLoperacao fique entre os dois quadros textos, e o label LBLigual fique depois do quadro texto TXTop2: Name =LBLoperacao Name = LBLigual BorderStyle = 0 BorderStyle = 0 Caption = = - Colocar quatro botões de opção, um em cima do outro, do lado esquerdo do formulário, conforme a figura 2.5: Name = OPTsoma Caption = &Soma Name = OPTsubtracao Caption = Su&btracao Name = OPTmultiplicacao Caption = &Multiplicacao Name = OPTdivisao Caption = &Divisao - Colocar dois botões de comando: Name = BTNcalcular Caption = &Calcular Name = BTNSair Caption = Sai&r - Escrever no evento click do botão BTNsair: End - Escrever no evento click de cada botão de opção: LBLoperacao.caption = “+” (OPTsoma_clicK) LBLoperacao.caption = “-” (OPTsubtracao_click) LBLoperacao.caption = “x” (OPTmultiplicacao_click) LBLoperacao.caption = “/” (OPTdivisao_click) Dessa forma, sempre que um botão de opção for selecionado (clicado), o controle LBLoperacao terá a propriedade Caption configurada adequadamente. - Configurar as propriedades FontSize para obter um melhor efeito, aumentando o tamanho da fonte usada. - No evento form_load: optsoma_click optsoma.Value = 1 Isto faz com que o evento click do botão de opção seja executado, colocando “+” no caption do label LBLresultado (1ª linha) e faz com que o OPTsoma fique selecionado (2ª linha), assim que o programa inicie. - Executar o programa. - No evento BTNcalcular_click: LBLresultado.caption = calcular(Val(TXTop1.Text), Val(TXTop2.Text)) Como já dito anteriormente, a diferença entre uma função e um procedimento é que uma função retorna um valor. Portanto, ao chamar uma função, o valor de retorno deve ser atribuído a alguma coisa (variável, propriedade de algum controle,etc.). A linha de código vista acima coloca o valor de retorno da função calcular na propriedade Caption do controle LBLresultado. 16 Tanto uma função como um procedimento podem receber argumentos. Argumentos são como variáveis locais, internas à função ou procedimento. Para chamar uma função com argumentos, eles devem vir entre parênteses; no caso de uma sub (procedimento) , não se usa parênteses. Obviamente a função ou procedimento deve especificar os seus parâmetros na definição, indicando também de que tipo eles são. - Na seção General do formulário, escrever Function calcular(op1, op2). - Inserir o seguinte código na janela de edição da função calcular: Function calcular (op1 As Single, op2 As Single) Select Case LBLoperacao.Caption Case "+" calcular = op1 + op2 Case "_" calcular = op1 - op2 Case "x" calcular = op1 * op2 Case "/" If op1 = 0 Then MsgBox "Impossível dividir por zero!", , "Aviso" Exit Function End If calcular = op1 / op2 End Select End Function - Executar o programa. 5.3) Função Val() A função predefinida Val() recebe como argumento uma string que pode ser interpretada como um número,e retorna este número como um double. Ela lê o argumento até que apareça um caracter que não represente um número. Caso o primeiro caracter não seja numérico, a função retorna o valor zero. 5.4) Propriedade AutoSize - Alterar a propriedade do controle LBLresultado: LBLresultado.AutoSize = True A propriedade AutoSize é aplicada a um Label e a uma Picture (um controle ainda não visto), e determina se o controle se ajustará ao seu conteúdo (o valor da propriedade Caption no caso do Label). 17 CAPÍTULO III 1- CONTROLANDO O TEMPO O próximo programa nos mostrará como permitir que o usuário controle a execução de ações em função do tempo. Para isto será visto o controle Timer. Controle fig. 3.1 - Controle Timer - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMtimer Caption = Timer - Salvar o projeto no diretório c:\aulavb\aula03\proj1: formulário : timer.frm projeto : timer.mak - Inserir um botão de comando: Name = BTNhabilita Caption = Desabilitar - Inserir um quadro texto: Name = TXT1 Caption = <vazio> - Inserir uma barra de rolagem vertical: Name = BRVintervalo Max = 1000 Min = 1 LargeChange = 1 SmallChange = 50 Value = 500 O formulário do programa deve ficar com a aparência da figura 3.1. 1.1) Timer Control Um Timer é um controle que permite a execução de um código, em intervalos de tempo regulares, através do seu único evento Timer. Esse controle sempre fica invisível durante a execução do programa. - Inserir 1 (um) controle Timer: Name = Timer1 Interval = 500 1.2) Propriedade Interval e o evento Timer A propriedade Interval define qual o intervalo de tempo (em milésimos de segundo) decorrerá entre duas ocorrências do evento Timer. Como o valor inicial foi de 500 (definido na Caixa de Propriedades), a cada 500 milisegundos o código relacionado ao evento Timer será executado. - Executar o programa. Note que nada acontece, pois o evento Timer não tem qualquer código associado. 18 fig. 3.2 - O formulário desse programa - Inserir o seguinte código nos eventos Change e Scroll da barra de rolagem vertical: timer1.Interval = BRVintervalo.Value Isso fará com que o usuário possa controlar o intervalo de tempo que decorrerá entre uma chamada e outra ao evento Timer. - Inserir no evento Timer1.Timer a linha de código: TXT1.Text = TXT1.Text + 1 Beep Toda vez que o evento Timer ocorrer, o valor mostrado no quadro texto será incrementado em uma unidade, e um sinal sonoro será emitido. - Executar o programa. - Incluir no evento BTNhabilita.Click o seguinte código: Sub BTNhabilita_Click () If VRGhabilita = 1 Then timer1.Enabled = True VRGhabilita = 0 BTNhabilita.Caption = "Desabilitar" Else timer1.Enabled = False VRGhabilita = 1 BTNhabilita.Caption = "Habilitar" End If End Sub - Execute o programa e veja o que ocorre. - Inclua um controle no programa, de forma que o intervalo seja informado ao usuário. 2 - USANDO O MOUSE Neste outro programa começaremos a entender o funcionamento e a usar o mouse. Veremos inicialmente dois eventos de mouse (MouseDown e MouseMove), e nos próximos projetos discutiremos os demais. Veremos também novos controles e novos métodos: a caixa de figura (Picture Box), o quadro combo (Combo Box), o Frame e a caixa de listagem (List Box); e os métodos Circle e Move. - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMmouse Caption = Mouse 19 fig 3.3 - o formulário desse projeto - Salvar o projeto no diretório c:\aulavb\aula03\proj2: formulário : mouse.frm projeto : mouse.mak - Inserir um Frame: Caption = Cursor - Declarar uma variável de formulário, seguindo a sintaxe abaixo: Dim VFcor As Integer Picture Box Frame Comb oBox List Box fig 3.4 - Controles ComboBox, ListBox, Frame e PictureBox 2.1) List Box Control Esse controle mostra uma lista de itens, a partir da qual o usuário pode selecionar um ou mais itens. Se o nº de itens exceder o nº que pode ser mostrado, uma barra de rolagem automaticamente é adicionada ao controle. As duas propriedades mais importantes são a ListIndex e a ListCount. ListIndex informa o índice do item selecionado (o primeiro item tem índice 0, e assim por diante), e ListCount o nº de itens que estão no controle. A propriedade Text informa o valor do item selecionado. Se nenhum item estiver selecionado, ListIndex tem o valor zero. 2.2) Métodos AddItem e RemoveItem Para adicionar e remover itens de uma List Box, usamos os métodos AddItem e RemoveItem, respectivamente. Esses métodos são usados por vários controles do VB, sendo que o funcionamento é semelhante. - Inserir uma List Box: - No evento Form Load inserir o seguinte código: List1.AddItem "Preto" List1.AddItem "Azul" List1.AddItem "Verde" List1.AddItem "Vermelho" List1.AddItem "Amarelo" List1.AddItem "Branco" List1.ListIndex = 0 Este código fará com que, ao ser carregado o formulário, os itens especificados sejam adicionados ao controle, ficando o primeiro item selecionado ("Preto"). Mais a frente veremos onde utilizar esses itens. - No evento List1_Click, inserir o seguinte código: 20 Private Sub List1_Click() Select Case List1.Text Case "Preto" VFcor = 0 Case "Azul" VFcor = 9 Case "Verde" VFcor = 10 Case "Vermelho" VFcor = 12 Case "Amarelo" VFcor = 14 Case "Branco" VFcor = 15 End Select End Sub Este código ocorre toda vez que for selecionado um novo item no controle, através do evento click do Mouse sobre o controle List1. Observe que de acordo com o valor do item selecionado, a variável de formulário VFcor recebe um valor numérico. A utilização dessa variável será vista mais adiante, no evento Mouse Move. 2.3) Combo Box Control Um Combo Box combina a utilização de um Text Box com uma List Box - o usuário pode digitar texto na parte de texto do controle, ou selecionar um item da parte de lista do controle. As propriedades ListCount e ListIndex, e os métodos AddItem e RemoveItem, têm o mesmo funcionamento que no controle List Box. - Inserir um quadro combo: - No evento Form Load, adicionar as seguintes linhas de código, antes ou depois das linhas que adicionam itens ao controle List Box: Combo1.AddItem "Figura1" Combo1.AddItem "Figura2" Combo1.AddItem "Figura3" Combo1.ListIndex = 0 Este código adicionará ao controle os itens relacionados, e mostrará como selecionado o primeiro item . Mais a frente veremos onde utilizar esses itens. 2.4) Picture Box Control Um controle Picture Box é uma caixa que pode mostrar uma figura a partir de um arquivo gráfico (bitmap, icon, metafile), e a partir da versão 5.0 do VB, arquivos JPEG e GIF. A figura mostrada é definida pela propriedade Picture. - Inserir três caixas de figura, não alterando a propriedade Name, e definir a propriedade picture de cada uma delas, escolhendo uma figura do diretório C:\windows. (Essa escolha é feita clicando-se duas vezes sobre a propriedade Picture do controle. Uma janela se abrirá, permitindo a escolha de um arquivo de figura.) 2.5) O Evento MouseDown - No evento MouseDown do formulário, incluir o seguinte código: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then If Combo1.ListIndex = 0 Then Picture1.Move X, Y ElseIf Combo1.ListIndex = 1 Then Picture2.Move X, Y ElseIf Combo1.ListIndex = 2 Then Picture3.Move X, Y End If End If End Sub O evento ocorre sempre que um botão do mouse for pressionado sobre a área de um controle. Note que esse evento possui os seguintes argumentos: Button As Integer, Shift As Integer, X As Single, Y As Single. Eles significam o seguinte: 21 Button especifica qual botão do mouse foi pressionado, se o esquerdo (valor 1), o direito (2), ou o do centro (4);` Shift define o estado das teclas Shift, Ctrl e Alt, tendo os valores abaixo conforme elas forem pressionadas: VALOR ALT CTRL SHIFT 0 1 2 3 4 5 6 7 NÃO NÃO NÃO NÃO SIM SIM SIM SIM NÃO NÃO SIM SIM NÃO NÃO SIM SIM NÃO SIM NÃO SIM NÃO SIM NÃO SIM X e Y são as coordenadas do local onde o botão do mouse foi pressionado. Observe que o argumento Button só pode representar um botão por vez pressionado do mouse. O código acima faz o seguinte: se o botão do mouse pressionado é o da esquerda, é movido (pelo método Move) um controle picture para as coordenadas X e Y. O controle movido depende de qual item do controle Combo Box está selecionado. Se for pressionado qualquer outro botão do mouse, nada ocorrerá. 2.6) As Coordenadas do Formulário As coordenadas do formulário são definidas em função das seguintes propriedades: ScaleMode: Define qual a unidade que será usada como medida. Os valores possíveis são os seguintes: 0-User (É definido pelas propriedades ScaleHeight, ScaleWidth, ScaleLeft, e ScaleTop) , 1-Twip (default - 1440 Twips por polegada; 567 Twips por centímetros) , 2-Point (72 pontos por polegada), 3 - Pixel (depende da resolução do monitor), 4-Character (horizontal = 120 twips por unidade; vertical = 240 twips por unidade), 5-Inch (polegadas), 6-Millimeter (milímetros), 7-Centimeter (centímetros) ScaleHeight/ScaleWidth: Determina o número de unidades (de acordo com ScaleMode) para a área interna vertical e horizontal, respectivamente. ScaleLeft/ScaleTop: Determina o valor da coordenada do ponto superior esquerdo do controle. O default é zero para ambas. 2.7) O Método Move Este método move um controle ou um formulário, e tem a seguinte sintaxe: [objeto.]Move left[, top[, width[, height] ] ] Com os parâmetros significando o seguinte (somente o argumento left é obrigatório): objeto Menu. left top width height Formulário ou controle a ser movido. Pode ser qq controle, a exceção de Timer e Valor Single que indica a coordenada horizontal para o lado esquerdo do objeto. Valor Single que indica a coordenada vertical para a parte superior do objeto. Valor Single que indica o novo valor da propriedade Width. Valor Single que indica o novo valor da propriedade Height. 2.8) O Evento MouseMove - No evento MouseMove do formulário, incluir o seguinte código: Label1.Caption = X Label2.Caption = Y If Button = 1 Then If Combo1.ListIndex = 0 Then Picture1.Move X, Y ElseIf Combo1.ListIndex = 1 Then Picture2.Move X, Y ElseIf Combo1.ListIndex = 2 Then Picture3.Move X, Y End If 22 ElseIf Button = 2 Then Circle (X, Y), 70, QBColor(VFcor) End If Esse evento ocorre sempre que o mouse for movimentado sobre a área do objeto, com algum de seus botões pressionado. Observe que esse evento possui os mesmos argumentos do evento MouseDown, tendo praticamente os mesmos significados. Uma das diferenças está nos argumentos X e Y, que são as coordenadas do local onde o mouse está posicionado. Esses argumentos são continuamente verificados, enquanto o cursor do mouse percorrer a área do formulário com um botão pressionado. A outra diferença está no argumento Button. Enquanto que no evento MouseDown esse argumento só poderia ter os valores 1, 2 ou 4 (significando botão esquerdo pressionado, botão direito, ou botão central), no evento MouseMove este argumento pode ter os seguintes valores: VALOR BOTÃO ESQUERDO BOTÃO DIREITO BOTÃO CENTRAL 0 1 2 3 4 5 6 7 NÃO SIM NÃO NÃO NÃO SIM NÃO SIM NÃO NÃO SIM SIM NÃO NÃO SIM SIM NÃO NÃO NÃO SIM SIM SIM SIM SIM É importante ressaltar que outros controles também possuem os eventos MouseMove e MouseDown, que são disparados quando o mouse percorre a área sobre o controle respectivo. O código acima faz o seguinte: se o botão pressionado quando o mouse for movimentado é o da esquerda, é movido um controle picture para as coordenadas X eY. O controle movido depende de qual item do controle Combo Box está selecionado. Se o botão pressionado for o da direita, é desenhado um círculo (método Circle) na posição X, Y, com um raio de 70 unidades (definida pela propriedade ScaleMode). OBS: Para verificar o funcionamento do evento MouseMove, e dos argumentos X e Y, insira dois labels no formulário, e esta linha de código no início do evento MouseMove do formulário: label1.caption = x label2.caption = y 2.9) O Método Circle Este método desenha um círculo, uma elipse ou um arco em um objeto. Possui a seguinte sintaxe: [object.]Circle [Step](x, y), radius[,[color] [,[start] [,[end] [,aspect] ] ] ] object Step (x,y) Objeto no qual a figura será desenhada. Especifica que o centro da figura é relativo às coordenadas correntes do objeto. Valores Single que indicam as coordenadas do centro da figura. A medida é determinada pelas propriedades de escala (ScaleMode, ScaleLeft, ScaleTop, ScaleHeight and ScaleWidth). radius Valor Single que indicao raio da figura. A medida é determinada pelaspropriedades de escala (ScaleMode, ScaleLeft, ScaleTop, ScaleHeight and ScaleWidth). color Valor Long integer que indica a cor da linha da figura. Se for omitida, o valor da propriedade ForeColor é usado. start e end Valores Single que indicam o iníco e o final de um arco de círculo ou elipse. A faixa vai de -2 PI radianos até 2 PI radianos. O default para start é 0 radianos, e para end é 2 radianos. aspect Valor Single que indica o aspecto da figura. O default é 1.0, e indica que será denhado um círculo. PI No nosso projeto, esse método é chamado no evento Mouse Move, e como nenhum objeto é especificado, o desenho é feito sobre o formulário. Ele desenha um círculo de 70 unidades de raio, como já foi dito, e com a cor especificada pela função Qbcolor. Essa função será vista em outro capítulo, mas por hora basta informar que ela retorna um valor Long integer que representa uma cor, segundo o argumento numérico que lhe for passado (no caso, a variável VFcor). 3 - UTILIZANDO MENUS Este programa permitirá que o usuário modifique a cor de fundo e o tamanho de um formulário, através da 23 utilização de menus. Também será visto uma nova função do VB, a função QBcolor(). Siga os passos descritos abaixo: - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMmenu Caption = Programa Menu - Salvar o projeto no diretório c:\aulavb\aula04\proj1: formulário :menu.frm projeto : menu.vbp 3.1) Menu Para criarmos um menu em um formulário, utilizamos o Menu Editor do VB. Escolhemos a opção de menu Tools - Menu Editor, ou clicamos as teclas <Ctr E>, e a janela que permite a criação do menu é aberta. Um item de menu também é um controle, e portanto possui propriedades. Essas propriedades são definidas na janela do Editor de Menu. A maioria já é conhecida, e têm a mesma função que em outros controles, como as propriedades Caption, Name, Index, Visible, Checked e Enabled. A propriedade ShortCut permite especificarmos uma tecla de atalho, a partir da lista de opções que é oferecida. Para se criar os menus, escreve-se os valores das propriedades nos locais apropriados da janela Menu Design, e seleciona-se ou não as propriedades que possuem valores do tipo lógico, através dos check box . Os botões de setas da janela permitem a criação de submenus, e a navegação pelos itens. FIG 3.5 - A janela Menu Editor - Criar os seguintes itens de menu: ITEM DE MENU Cores Branco Azul Vermelho ----------Sair Tamanho Minimizado Normal Maximizado NAME MNPcores MNSbranco MNSazul MNSvermelho MNSsep MNSsair MNPtamanho MNSminimizado MNSnormal MNSmaximizado CAPTION &Cores &Branco A&zul &Vermelho Sai&r &Tamanho &Minimizado &Normal Ma&ximizado Após a criação de todos os itens de menu, teclar o botão OK. 24 Observe que os itens com a propriedade name iniciando com as letras MNP, são os itens principais de menu, enquanto que os outros são os submenus. - Inserir o seguinte código no evento click do menu MNSvermelho: Sub MNSvermelho_Click () FRMmenu.BackColor = QBColor(4) MNSvermelho.Enabled = False MNSazul.Enabled = True MNSbranco.Enabled = True End Sub 3.2) Função Qbcolor() A função Qbcolor() é uma função do VB, que retorna um valor de cor (um inteiro longo, que é identificado pelo windows como uma cor), de acordo com o argumento que lhe é passado, conforme a tabela abaixo (observe que o valor do argumento pode ser qq inteiro entre 0 e 15): Nº 0 1 2 3 4 5 6 7 Cor Preto Azul Verde Cyan Vermelho Magenta Amarelo Cinza Nº 8 9 10 11 12 13 14 15 Cor Cinza escuro Azul claro Verde claro Cyan claro Vermelho claro Magenta claro Amarelo claro Branco O código acima faz com que o formulário fique vermelho, desabilitando o item de menu MNSvermelho, e habilitando os itens MNSverde e MNSbranco. Os códigos dos eventos click dos demais itens de menu relacionados com as cores devem produzir resultados semelhantes: - Inserir o seguinte código no evento click do menu MNSazul: Sub MNSazul_Click () FRMmenu.BackColor = QBColor(1) MNSvermelho.Enabled = True MNSazul.Enabled = False MNSbranco.Enabled = True End Sub - Inserir o seguinte código no evento click do menu MNSbranco: Sub MNSbranco_Click () FRMmenu.BackColor = QBColor(15) MNSvermelho.Enabled = True MNSazul.Enabled = True MNSbranco.Enabled = False End Sub - Inserir o seguinte código no evento load do formulário Sub Form_Load () MNSbranco.Enabled = False FRMmenu.BackColor = QBColor(15) MNSnormal.Enabled = False FRMmenu.WindowState = 0 End Sub Este código faz com que o programa sempre inicie com o formulário no tamanho normal, com a cor branca, além de desabilitar os itens de menu MNSbranco e MNSnormal. 3.3) A propriedade WindowState do Formulário A propriedade WindowState de um formulário informa qual o tamanho do formulário. Ela pode ser acessada tanto em tempo de projeto quanto em tempo de execução, e os valores possíveis são os seguintes: 25 0 1 2 (Default) Normal Minimizado Maximizado (toda a tela) - Inserir no evento click do item de menu MNSminimizado: Sub MNSminimizado_Click () FRMmenu.WindowState = 1 MNSminimizado.Enabled = False MNSmaximizado.Enabled = True MNSnormal.Enabled = True End Sub Este código minimiza a janela do programa, além de desabilitar o item de menu MNSminimizado e habilitar os itens MNSnormal e MNSmaximizado. Obviamente os eventos click do outros dois itens relacionados ao tamanho do formulário deverão conter códigos semelhantes. 3.4) O evento Resize do Formulário Com o programa do jeito que está, se o tamanho do formulário for alterado através do menu de controle ou dos botões maximizar e minimizar do formulário, os itens de menu não terão suas propriedades Enabled modificadas de acordo, pois nenhum evento click foi disparado. Para resolver esse inconveniente, temos que capturar o evento que ocorre, e nele inserir o código apropriado. Estamos falando do evento Resize. Ele ocorre sempre que o formulário tem o seu tamanho alterado. Portanto, para que o problema deixe de existir, deve ser feito o seguinte: - Inserir no evento Resize do formulário FRMmenu o seguinte código: Sub Form_Resize () If FRMmenu.WindowState = 0 Then MNSminimizado.Enabled = True MNSmaximizado.Enabled = True MNSnormal.Enabled = False ElseIf FRMmenu.WindowState = 2 Then MNSminimizado.Enabled = True MNSmaximizado.Enabled = False MNSnormal.Enabled = True End If End Sub Desta forma, toda vez que o formulário tiver seu tamanho alterado, os itens de menu terão sua propriedades Enabled alteradas de acordo. Observe as três linhas inferiores do evento click dos menus relacionados ao tamanho do formulário. Elas se encarregam de alterar as propriedades Enabled de cada item de menu apropriadamente. Como é exatamente isso que faz o código do evento Resize, e como este evento ocorre sempre que um item desses é selecionado (devido a instrução que altera a propriedade WindowState), elas não são mais necessárias nos eventos Click dos itens de menu. Deixá-las no programa não causará nenhum problema, mas elas se tornaram redundantes. 3.5) Menus Instantâneos Um menu instantâneo é um pequeno menu que surge em algum lugar do formulário, em resposta a um evento do programa. Como exemplo, temos o menu que aparece no programa Word for Windows 7.0, toda vez que o usuário aperta o botão direito do mouse sobre a área de texto. Um menu instantâneo aparecerá sempre na posição atual do mouse, e depois que a seleção é feita, o menu desaparece da tela. A criação de um menu instantâneo é feita da mesma forma que a de um menu comum. Na verdade, a diferença está na chamada a esse menu, que é feita pelo método PopUpMenu, como veremos adiante. 3.6) Método PopUpMenu Este método faz com que um menu apareça na posição em que o cursor do mouse se encontra. A sua sintaxe é a seguinte: object.PopupMenu menuname Por exemplo, se inserirmos o código a seguir no nosso projeto, toda vez que o usuário apertar o botão direito do mouse, sobre o formulário, o menu Cores irá surgir no posição do cursor. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 26 If Button = 2 Then PopupMenu MNPcores End If End Sub Observe que o menu Cores aparece também na barra de menu. Se quisermos que ele seja apenas um menu instantâneo, basta selecionarmos a sua propriedade Visible como False. 4 - FORMULÁRIO MDI 4.1) MDI Form Um formulário MDI (multiple-document interface) é uma janela que atua em background na aplicação e que pode conter formulários que têm a propriedade MDIChild definida em True. Um exemplo de aplicativo que usa MDI é o Word. Cada documento é um formulário diferente, e quando não há nenhum documento aberto, o formulário MDI assume o foco. É possível adicionar um formulário MDI em um projeto, através da opção de Menu Project - Add MDI Form. Cada aplicação só pode conter um MDI, mas vários formulários filhos (MDIchild). A barra de menu dos formulários filhos é automaticamente aplicada ao MDIForm, quando o formulário filho é ativado. Um MDIchild minimizado aparece como um ícone dentro do MDIForm. Um formulário MDI só pode conter Menu e PictureBox, ou controles que posuam a propriedade Align. 4.2) Propriedade Align Essa propriedade determina como o controle será alinhado dentro do formulário que o contiver. - Inicie um novo projeto, e inclua um formulário MDI. - Inclua um menu com as seguintes propriedades, e de acordo com a figura 3.6: NAME MNParquivo MNSprimeiro MNSnovo sep MNSsair MNPjanela MNShorizontal MNSvertical MNScascata MNSicones CAPTION &Arquivo &Primeiro Form novo Sai&r &Janela Lado a lado (horizontalmente) Lado a lado (verticalmente) Em ascata Organizar ícones - inserir as seguintes linhas de código: Private Sub MNScascata_Click() MDIForm1.Arrange 0 End Sub Private Sub MNShorizontal_Click() MDIForm1.Arrange 1 End Sub Private Sub MNSvertical_Click() MDIForm1.Arrange 2 End Sub Private Sub MNSicones_Click() MDIForm1.Arrange 3 End Sub Private Sub MNSsair_Click() End End Sub A instruções MDIForm1.Arrange 0, MDIForm1.Arrange 1 e MDIForm1.Arrange 2, mostram os formulários filhos do MDI, e que estivem visíveis, em cascata, horizontalmente e verticalmente, respectivamente. A instrução MDIForm1.Arrange 3 organiza os ícones dos formulários filhos que estiverem minimizados. 27 fig 3.6 - janela de menu - Incluir um novo formulário no projeto e definir a propriedade MDIchild para True; - inserir um CommandButton e um ListBox neste formulário, atribuindo os seguintes valores à propriedade Name desses controles CONTROLE Form CommandButton ListBox NAME Formulario BTN List1 4.3) Vetor de Controles Um vetor de controles é um conjunto de controles do mesmo tipo, todos com o mesmo valor para a propriedade Name. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos pergunta se desejamos criar um vetor com esses controles. Para que o vetor possa existir, a propriedade Index dos controles envolvidos devem receber valores inteiros e consecutivos. Também é possível criar vetores de controles dinamicamente. Nesse caso devemos atribuir à propriedade Index de um controle o valor 0 (zero), e usar o método Load, como veremos adiante. - Atribuir à propriedade Index do controle BTN o valor 0 (zero) -Inserir as seguintes linhas de código no formulário MDI: Option Explicit Dim Form() As New Formulario Private Sub MNSprimeiro_Click() Load Formulario End Sub As duas primeiras linhas devem ser escritas na seção general do formulário MDI. A palavra chave New usada com a declaração Dim cria uma matriz de objetos Form, com as características do controle formulario, deste projeto. A instrução Load carrega o controle formulário. - Inserir mais essas linhas de código no MDI: Private Sub MNSnovo_Click() Static i As Integer i=i+1 ReDim Form(i) Load Form(i) 28 Form(i).Caption = Str$(i) + "º Formulário" Form(i).Show End Sub Esse código é executado quando o item de menu Novo é acionado. Observe que é declarada uma variável Static, que será usada para redimensionar a matriz de formulários. A cada vez que esse evento ocorrer, a variável será incrementada de 1, e conseqüentemente a matriz de formulários também, devido a ReDim Form(i). O último formulário dessa matriz (índice i) é carregado, e sua propriedade Caption recebe o valor apropriado. Portanto, a cada vez que esse item de menu for selecionado, um novo formulário será acrescido à aplicação. Da mesma forma que um novo documento é adicionado ao Word. - Inserir as seguintes linhas de código no controle formulario: Private Sub BTN_Click(Index As Integer) Static i As Integer i=i+1 List1.AddItem (i) Load BTN(i) BTN(i).Top = 0 BTN(i).Left = (i - 1) * 1000 BTN(i).Visible = True BTN(i).Caption = "botão " + Str(i) End Sub No evento Private Sub BTN_Click tambem é delarada uma variável Static, e cada vez que esse evento ocorrer acontecerá o seguinte: será adicionado um elemento ao controle List1, mostrando o valor da variável i; um novo controle BTN será carregado, com a propriedade Index uma unidade maior do que a do controle anteriormente carregado, e com a propriedade Caption mostrando a string "botão " seguida do valor da variável i. Observe que as propriedades Left e Top do novo controle BTN são configuradas de forma que o controle fique no alto do formulário, ao lado do controle anteriormente carregado. A aplicação em funcionamento tem a aparência da figura 3.7. fig 3.7 - o programa sendo executado 29 CAPÍTULO IV Neste capítulo veremos a criação de menus, que são utilizados para escolha de opções, e também a criação e utilização de janelas de diálogos. 1- MANIPULANDO JANELAS E MENSAGENS Veremos agora a criação de janelas de diálogo, que possibilitam a comunicação de um programa com o usuário. As janelas podem ser de três tipos: as personalizadas, as predefinidas e as comuns. fig 4.1 - Usando janelas de diálogos Este programa mostrará os dois primeiros tipos de janelas, permitindo que o usuário faça escolhas, como mudar a cor de fundo dos objetos, além de digitar números, datas e nomes. Será visto também a utilização de mais de um formulário por programa. A última categoria de janelas de diálogos, as comuns, será vista no próximo capítulo. O nosso programa terá a aparência da figura 4.1: Seguir as instruções abaixo. - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMjanelas Caption = Verificando Janelas de Diálogo - Salvar o projeto no diretório c:\aulavb\aula04\proj2 formulário :janelas.frm projeto : janelas.vbp 1.1) O Controle SSPanel Este controle é um painel com aparência três dimensões, que serve basicamente para personalizar a aparência de um aplicativo, permitindo a utilização de grupos de controles, como botões de opção. O botão da caixa de ferramentas é o mostrado na fig 4.3: - Inserir um Panel3D. OBS: Para tornar disponível esse controle, é necessário inserir o componente Sheridan 3D Controls, através do item de menu Project - Components. O arquivo que corresponde a esse controle é o IMGADMIN.OCX, como pode ser visto na figura 4.3. fig 4.2 - Ícone do Frame 30 fig 4.3 - A janela de componentes - Alterar as propriedades: Name = Panel3D1 Caption = Personalizadas - Alterar as propriedades referentes à aparência do painel, verificando o que ocorre. - Inserir dois botões de comando, dentro do painel, com as seguintes propriedades: Name = BTNmensagemp Caption = Mensagem Name = BTNsairp Caption = Sair Foram usados nomes terminando em p, para distinguir esses botões como os que mostram as janelas Personalizadas. OBS: Para que os controles referentes ao Sheridan 3D Controls estejam disponíveis, é necessário que eles tenhas sido instalados. Esses controles não são desenvolvidos pela Microsoft, mas são feitos para serem utilizados por programas escritos em VB. Caso o seu computador não tenha esses controles, inclua um Frame ao invés de um Panel. 1.2) Usando novos Formulários Incluir dois novos formulários no programa. Isto é feito através da opção de menu Project - Add Form. Alterar as propriedades dos formulários, conforme tabela abaixo: NOME EXTERNO Mensagem.frm Sair.frm NAME FRMmensagem FRMsair CAPTION Exemplo de Janela Personalizada Sair - Incluir no formulário FRMmensagem um label e um botão, conforme a figura 4.4 e a tabela seguinte: 31 fig 4.4 - Janela personalizada CONTROLE Label Command Button NAME LBL1 BTNok CAPTION Esta msg pode ser alterada por você! Ok Quando temos mais de um formulário em um projeto, podemos ter controles com o mesmo nome, desde que em formulários diferentes. Por exemplo, podemos ter dois botões com Name BTNsair, um em cada formulário. Para referenciar os controles, é necessário que se informe a qual formulário ele pertence: Por ex.: FRMmsg.BTNsair ou FRMinicial.FRMsair - Inserir o seguinte código no evento click do botão FRMjanelas.BTNmensagemp: Sub BTNmensagem_per_Click () FRMmensagem.Show 1 End Sub 1.3) Os Métodos Load e Unload e os Eventos Load e Unload Esses métodos são aplicados a formulários, e fazem com que o formulário seja carregado (Load) e descarregado (Unload) da memória. Quando um formulário é carregado, o evento Load ocorre, e quando ele é descarregado, o evento que ocorre é o Unload. 1.4) Os Métodos Show e Hide e os Eventos Activate e Deactivate Esses métodos são aplicados a formulários, e fazem com que o formulário seja mostrado (show) e escondido (Hide). Quando um formulário é mostrado, o evento Activate ocorre, e quando ele é escondido, o evento que ocorre é o Deactivate. Se um formulário não estiver carregado na memória, o método Show primeiro carrega (ocorre o evento Load) e depois mostra o formulário (ocorre o evento Activate). O método Show tem um parâmetro, que informa se o formulário é modal ou não. Um formulário é modal, quando nenhum outro formulário da aplicação pode ter o foco se ele estiver ativado. Para mostrar um formulário como modal, usa-se o método Show com o parâmetro 1. Um parâmetro 0 ou ausência de parâmetro, mostra o formulário normalmente. Portanto, o código do evento click acima mostra o FRMmensagem da forma modal. - Inserir o seguinte código no evento click do botão FRMmensagem.BTNok: Sub BTNok _Click () FRMmensagem.Hide End Sub Este código esconde o formulário. 1.5) Janelas Personalizadas - Executar o programa, e verificar o que ocorre quando clicamos no botão Mensagem. Temos um exemplo de janela personalizada. Para que o formulário se pareça com uma janela de mensagem, alterar as seguintes propriedades: PROPRIEDADE VALOR BorderStyle 3 ControlBox False Isto fará com que a borda do formulário fique fixa, e que não apareça o botão de controle no canto superior esquerdo. - Incluir no formulário FRMsair um label e dois botões de comando, conforme abaixo: 32 fig 4.5 - Outra janela CONTROLE Label Command Button Command Button NAME LBL1 BTNsim BTNnao CAPTION Deseja realmente sair? Sim Não - Inserir o seguinte código no evento click do botão FRMjanelas.BTNsairp: Sub BTNsairp _Click () FRMsair.Show 1 End Sub Este código fará com que o formulário FRMsair seja mostrado na forma modal. - Inserir o seguinte código no evento click do botão FRMsair.BTNsim: Sub BTNsim _Click () End End Sub Este código encerra o programa. - Inserir o seguinte código no evento click do botão FRMsair.BTNnao: Sub BTNnao _Click () FRMsair.Hide End Sub Este código esconde o formulário FRMsair, e o programa continua a ser executado. Temos um outro exemplo de janela personalizada. Mude as propriedades que se referem a aparência no formulário FRMsair, para que seja alcançado um melhor efeito visual. 1.6) Janelas Padronizadas - MsgBox e InputBox A função MsgBox mostra uma mensagem em uma caixa de diálogo (fig. 4.6), e espera que o usuário clique em um botão desta caixa de diálogo. Tem os seguintes parâmetros: msg, buttons, title. *msg : *buttons: *title: Define a mensagem que será mostrada. É uma string. Define os botões e a imagem que serão mostrados. É um valor integer. Define o título da caixa de diálogo. É uma string. fig 4.6 - MsgBox 33 Ela pode ser usada como function ou como procedimento (statement). Se for usada como function, ela retorna um valor e os parâmetros devem vir entre parênteses; se for usada como procedimento, não é retornado valor e não se usa parênteses. Os valores retornados, no caso de ser usada como function, dependem dos botões mostrados. Tanto os valores de retorno (para o caso de function) quanto os valores para o argumento type podem ser consultados na ajuda on line (help) do VB. Serão mostrados abaixo os valores mais usados para o argumento buttons, imediatamente seguido dos valores de retorno. buttons Descrição 0 1 2 3 4 5 16 32 48 64 Mostra botão OK, somente Mostra botões OK e Cancelar Mostra botões Abortar, Repetir e Ignorar. Mostra botões Sim, Não e Cancelar. Mostra botões Sim e Não Mostra botões Repetir e Cancelar. Mostra ícone de mensagem crítica. Mostra ícone de interrogação. Mostra ícone de exclamação. Mostra ícone de informação. OBS: Para obter uma associação de butões e ícones, os valores devem ser somados. Por exemplo: o valor 36 mostra o ícone de interrogação e os botões Sim e Não, pois 36=32 + 4. Retorno Descrição 1 OK 2 Cancelar 3 Abortar 4 Repetir 5 Ignorar 6 Sim 7 Não A função InputBox mostra um prompt em uma caixa de diálogo, e espera que o usuário digite algo e pressione um botão (Ok e Cancel). Tem os seguintes parâmetros: prompt, title, default, xpos, ypos. *prompt: Define a mensagem. É uma string. *title: Define o título da caixa. É uma string. *default: Define uma string que é mostrada no prompt, e que será usada como valor de retorno, caso o usuário não digite algo. É uma string. *xpos, ypos: Definem as distancias do alto e do lado esquerdo da tela, em twips. É uma expressão numérica. InputBox só pode ser usada como function. O pressionamento do botão Cancel faz com que o valor retornado seja uma string nula. O pressionamento do botão Ok retorna o que foi digitado pelo usuário. - Inserir outro Panel3D, conforme a fig 4.2, com as seguintes propriedades: Name = Panel3D2 Caption = Predefinidas fig 4.7 - InputBox - Inserir dois frames, dentro do painel, com as seguintes propriedades: Name =Frame1 Caption = MsgBox Name =Frame2 Caption = InputBox 34 - Dentro do frame1, inserir os seguintes controles: CONTROLE Command Button Command Button NAME BTNmensagem BTNsair CAPTION Mensagem Sair - Inserir o seguinte código no evento click do botão BTNmensagem: MsgBox "Esta mensagem é informativa.", 16, "Mensagem" - Inserir o seguinte código no evento click do botão BTNsair: Dim X X = MsgBox("Deseja sair do programa?", 36, "Confirma saída") If X = 6 Then End End If No primeiro caso, MsgBox é usada como statement, e o valor 16 como argumento type, define que será mostrado a figura Stop e um botão Ok. O código apenas mostra uma janela de mensagem, que é fechada quando o usuário clicar sobre o botão. No segundo caso, MsgBox é usada como function. O valor 36 como argumento type define que serão mostrados dois botões (Sim e Não) e a figura 4.8: fig 4.8 - Ícone de interrogação No caso de botões Sim e Não, o valor de retorno pode ser 6 ou 7, respectivamente, conforme o botão clicado. O código acima encerra o programa se o botão clicado for o Sim. - Dentro do frame2, inserir os seguintes controles: CONTROLE Command Button Command Button Command Button NAME BTNnome BTNnumero BTNdata CAPTION Nome Número Data - Inserir dois labels no formulário FRMjanelas, na parte superior, fora de qualquer SSPanel. Nomeá-los como LBL1 e LBL2. - Inserir o seguinte código no evento click do botão BTNnome: Dim nome As String LBL1.Caption = "" LBL2.Caption = "" nome = InputBox("Digite seu nome", "Demonstração") If nome = "" Then Exit Sub End If LBL1.Caption = "O seu nome é " + nome Este código limpa o caption dos dois labels, mostra uma InputBox e coloca o valor de retorno como caption do label LBL1. - Inserir o seguinte código no evento click do botão BTNnumero: Dim numero As String LBL1.Caption = "" LBL2.Caption = "" numero = InputBox("Digite um número", "Demonstração") If numero = "" Then Exit Sub End If If IsNumeric(numero) Then LBL1.Caption = "O número digitado foi " + numero Else 35 MsgBox "Você não digitou um número!", , "Aviso!!" End If 1.7) Função IsNumeric Este código limpa o caption dos dois labels, mostra uma InputBox e verifica se o valor retornado é numérico, através da função IsNumeric. Esta função verifica se um argumento String pode ser considerado um número, retornando True ou False. Se foi digitado um valor numérico, o valor de retorno é colocado como caption do label LBL1. 1.8) Função IsDate - Inserir o seguinte código no evento click do botão BTNdata: Dim dta, dia As String LBL1.Caption = "" LBL2.Caption = "" dta = InputBox("Digite uma data", "Demonstração") If dta = "" Then Exit Sub End If If Not IsDate(dta) Then MsgBox "Você não digitou uma data!", , "Aviso!!" Exit Sub End If LBL1.Caption = "A data digitada foi " + dta Select Case Weekday(dta) Case 1 dia = "Domingo" Case 2 dia = "Segunda" Case 3 dia = "Terça" Case 4 dia = "Quarta" Case 5 dia = "Quinta" Case 6 dia = "Sexta" Case 7 dia = "Sábado" End Select LBL2.Caption = "e o dia da semana é : " + dia Este código limpa o caption dos dois labels, mostra uma InputBox e verifica se o valor retornado pode ser uma data, através da função IsDate. Esta função verifica se um argumento String pode ser considerado uma data, retornando True ou False. 1.9) Função WeekDay Se foi digitado um valor que pode ser considerado uma data, o valor de retorno é passado para a função WeekDay. Esta função recebe uma data e retorna um inteiro entre 1 e 7, que informa qual o dia da semana referente àquela data. O código acima utiliza o valor retornado pela função WeekDay para informar qual o dia da semana através do label LBL2. 2 - JANELAS DE DIÁLOGOS COMUNS Dando continuidade ao assunto janelas de diálogos, veremos agora as janelas de diálogos comuns. Elas são as janelas de diálogos padronizadas do Windows. Uma caixa de diálogo comum pode ser vista na figura 5.1. 36 fig 4.9 - A caixa de diálogo Salvar Como O VB oferece um controle que permite exibir facilmente caixas de diálogos, que é o CommomDialog. Para verificarmos isso, iniciaremos um outro projeto, que terá a aparência final da figura 4.10: fig 4.10 - O formulário do programa - Inserir dois CommandButton, com as seguintes propriedades: CONTROLE Command Button Command Button NAME BTNcor BTNarquivo CAPTION Cor Arquivo 2.1) O Controle Common Dialog Este controle proporciona a apresentação das caixas de diálogo comuns (File, Font, Color, Print) para operações como abrir, imprimir ou salvar arquivos, ou selecionar cores ou fontes. Este controle não tem nenhum evento associado, e fica sempre invisível durante a execução. A propriedade Action deste controle determina qual será a caixa de diálogo mostrada. Por exemplo, a caixa de diálogo comum de abrir arquivo é mostrada na fig 4.11: 37 fig 4.11 - Caixa de Diálogo Abrir Action Diálogo Mostrado 0 1 2 3 4 5 nenhum Abrir Salvar como Cor Fonte Impressão De acordo com a caixa mostrada, outras propriedades devem ser selecionadas. Veremos neste capítulo, as caixas de diálogo comuns Abrir e Cor. - Inserir um Common Dialog Control no formulário. Não se preocupe com a localização dele, pois ele sempre fica invisível. O ícone é o da figura 4.12: fig 4.12 - Ícone do Common Dialog Control OBS: Para que o Common Dialog Control fique disponível na ToolBox, é necessário incluir o arquivo de controle respectivo, que é o Microsoft Common Dialog Control 5.0. Isto é feito através da opção de menu Project - Components. O arquivo correspondente é o COMDLG32.OCX. As propriedades principais desse controle são usadas de acordo com o valor da propriedade Action. A propriedade Cancel indica que um erro ocorrerá, caso ela seja definida como True, e o usuário pressione, durante a execução, a tecla Cancelar da janela de diálogo (isso será usado no nosso programa, e será melhor explicado). Já FileName retorna o nome do Path e do arquivo selecionado (se Action = 1). Filter especifica o filtro que será mostrado na ListBox Type da janela, em tempo de execução (para Action = 1), e representa o tipo de arquivo que será mostrado na janela. Color retorna a cor selecionada (para Action = 3). - Inserir no evento click do botão BTNcor: Private Sub BTNcor_Click() On Error GoTo 2 'seleciona a ação para que a caixa de diálogo permita escolha 'de cores CMdialog1.Action = 3 'utiliza a cor escolhida na caixa de diálogo, como cor de 'fundo para os controles e o formulário FRMdialogos.BackColor = CMdialog1.Color 38 Exit Sub 2: If Err = 32755 Then Exit Sub Else MsgBox "Algum erro ocorreu!", , "Aviso" End If Exit Sub End Sub Como podemos ver, Action foi definida em 3, o que significa que uma caixa de diálogo de cores irá aparecer. A propriedade Color representa a cor escolhida pelo usuário, e é utilizada para mudar a cor de fundo de todos os controles do formulário, inclusive o próprio. Como a propriedade Cancel é True, se o usuário clicar no Botão Cancel da caixa de diálogo, ocorre um erro ( o código desse erro é 32755). A linha de código On Error GoTo 2 diz ao VB para que o controle do programa vá para o label 2, caso algum erro ocorra. Se o usuário escolher o botão Cancel, ocorrerá o erro 32755, e o código após o label 2 é executado. Maiores informações sobre o controle de erros será visto adiante. - Inserir no evento click do botão BTNarquivo: Private Sub BTNarquivo_Click() Dim X Dim ext, nome_arquivo As String On Error GoTo 1 'especifica os filtros que são mostrados na caixa de diálogo CMdialog1.Filter = "Texto|*.txt|Desenho|*.bmp" 'especifica que a caixa de diálogo é para abrir arquivos 'se o botão cancelar é clicado, ocorre um erro CMdialog1.Action = 1 'o nome do arquivo escolhido é colocado na variável nome_arquivo nome_arquivo = CMdialog1.filename lbl1.Caption = "O Arquivo escolhido foi: " + nome_arquivo 'se não foi clicado o botão <Cancelar> ext = Mid$(nome_arquivo$, Len(nome_arquivo$) - 2, 3) Select Case ext Case "txt" X = Shell("notepad " + nome_arquivo$, 1) Case "bmp" X = Shell("pbrush " + nome_arquivo$, 1) Case Else MsgBox "Deve ser escolhido um arquivo .txt ou .bmp!", , "Aviso" End Select Exit Sub 1: If Err = 32755 Then Exit Sub Else MsgBox "Algum erro ocorreu!", , "Aviso" End If Exit Sub End Sub Como podemos ver, Action foi definida em 1, o que significa que uma caixa de diálogo Abrir irá aparecer. A propriedade Filter representa o filtro que será mostrado ao usuário, e é utilizada para selecionar o tipo de arquivo que será visível na caixa. É formada pelo nome que informa o tipo do arquivo (Texto, Desenho), que é definido pelo programador ; e pela extensão do arquivo (txt, bmp), que deve ser uma extensão válida (só serão mostrados os arquivos que tiverem a mesma extensão). Observe que deve haver um traço vertical "|" entre cada um dos argumentos da propriedade, como escrito no código transcrito a seguir: CMdialog1.Filter = "Texto|*.txt|Desenho|*.bmp". 39 2.2) Métodos ShowColor, ShowFont, ShowOpen, ShowSave e ShowPrinter A propriedade Action se manteve no VB5 por questões de compatibilidade com as versões anteriores. Nos códigos vistos acima, pode-se usar os novos métodos ShowColor, ShowFont, ShowOpen, ShowSave e ShowPrinter, no lugar dessa propriedade. Esta seria, inclusive, a forma mais adequada de se escrever o código. Após o usuário escolher o arquivo, a propriedade FileName informa qual o nome (incluindo o Path) do arquivo escolhido. O que foi dito em relação à captura de erros do código do evento Click do botão BTNcor ocorre novamente. A linha de código ext = Mid$(nome_arquivo, Len(nome_arquivo) - 2, 3) coloca na variável ext, a extensão do arquivo (as últimas três letras do nome do arquivo). Isto é feito com a utilização de duas funções relacionadas a strings. 2.3) A Função Len Essa função retorna o número de letras de um argumento String. Sua sintaxe é definida abaixo: Len(strintg) 2.4) A Função Mid Essa função retorna, de um argumento String (primeiro argumento), a partir de uma determinada posição (definida pelo 2º argumento), um determinado número de letras (definida pelo 3º argumento). No nosso caso, o primeiro argumento é a extensão e o nome do arquivo selecionado; o segundo argumento informa a posição (o tamanho da string menos 2); e o terceiro argumento define que os três caracteres seguintes a essa posição, inclusive, serão retornados. 2.5) O Comando Shell Este comando inicia a execução de um outro aplicativo a partir do programa em VB. Ele tem dois argumentos: o nome do programa (que deve ser uma String), e um número (que identifica como a janela deste aplicativo será apresentada no monitor). Os valores possíveis são descritos a seguir: 0 1 2 3 4 6 Janela escondida com foco. Janela com foco e tamanho e posição original. Janela como ícone com foco. Janela maximizada com foco. Janela restaurada para o tamanho e posição anterior, sem o foco. Janela como ícone sem foco. Um aplicativo iniciado a partir do comando Shell do VB, será executado, e quando for terminado, devolve o controle ao programa chamador. Portanto, a parte do código referente ao Select, usa a extensão do arquivo para iniciar o aplicativo adequado (Pbrush para um arquivo .bmp, e Notepad para um arquivo .txt) OBS: A cada nova função vista, é interessante que verificar, através do help do VB, quais as funções que tratam de assuntos correlatos. Isto é feito clicando-se na opção See Also do Help. Como exercício, verifique as funções relacionadas com a função M id(). fig 4.13 - Help do VB 40 CAPITULO V Neste capítulo serão vistos as ferramentas gráficas do VB. Veremos os controles gráficos, os métodos gráficos e os controles de imagens. 1 - OS CONTROLES GRÁFICOS Nesta primeira parte do programa serão vistos os controles que representam figuras geométricas. Estes controles são o Shape Control e Line Control. 1.1) Shape Control Shape é um controle gráfico que mostra um retângulo, um quadrado, um círculo, uma elipse, um retângulo arredondado ou um quadrado arredondado. Shape Contro fig 5.1 - o ícone do Shape Control O que determina qual figura será desenhada é a propriedade Shape, conforme quadro abaixo: (Default) 1 2 3 4 5 Retângulo Quadrado Elipse Círculo Retângulo arredondado Quadrado arredondado A propriedade BorderWidth determina a espessura da linha de contorno da figura. - Iniciar um projeto. - Alterar as propriedades do formulário: Name = FRMgrafic1 Caption = Controles Gráficos - Salvar o projeto no diretório c:\aulavb\aula09\proj1: formulário :grafic1.frm projeto :grafic.vbp - Inserir os controles conforme a figura 5.2 (os botões, a barra de rolagem horizontal, a caixa de checagem, e os controles Shape e Line), alterando a propriedade Name de cada controle de acordo com o Caption. Em relação a Barra de Rolagem, alterar as propriedades Max, Mim, SmallChange e LargeChange para 50, 1, 1 e 25, respectivamente. 1.2) Line Control Line é um controle gráfico que mostra uma linha vertical, horizontal ou diagonal. O botão da caixa de ferramentas é mostrado na figura 5.3. Da mesma forma que no controle Shape, a propriedade BorderWidth determina a espessura da linha. O objetivo deste programa é desenhar uma linha ou uma figura geométrica, conforme o botão pressionado. A borda da figura será determinada pela barra de rolagem. Não esqueça de nomear os botões adequadamente, conforme a padronização seguida no curso. 41 fig 5.2 - o primeiro formulário desse projeto Line fig 5.3 - o ícone do Line Control - Inserir os seguintes códigos nos eventos apropriados dos controles: Sub BTNlinha_Click () shape1.Visible = False line1.Visible = True End Sub Sub BTNretangulo_Click () If CHKarredondado.Value Then shape1.Shape = 4 Else shape1.Shape = 0 End If shape1.Visible = True line1.Visible = False End Sub Sub BTNquadrado_Click () If CHKarredondado.Value Then shape1.Shape = 5 Else shape1.Shape = 1 End If shape1.Visible = True line1.Visible = False End Sub Sub BTNelipse_Click () shape1.Shape = 2 shape1.Visible = True line1.Visible = False End Sub Sub BTNcirculo_Click () shape1.Shape = 3 shape1.Visible = True line1.Visible = False 42 End Sub Observe que os códigos acima alternam os controles Shape e Line, mantendo apenas um visível. Quando o controle Shape estiver visível, a figura a ser mostrada depende do valor da propriedade Shape. Observe também que os códigos dos eventos Sub BTNretangulo_Click () e Sub BTNquadrado_Click() verificam a propriedade Value do CHKarredondado, mostrando uma figura arredondada ou não (retângulo ou quadrado). Sub HSClargura_Change () line1.BorderWidth = HSClargura.Value shape1.BorderWidth = HSClargura.Value End Sub Este código altera a espessura da figura, de acordo com o valor da propriedade Value da Barra de Rolagem. 1.3) O Controle SpinButton Este contrloe incrementa e decrementa números. Clicar em um SpinButton altera somente o valor do próprio SpinButton. Você pode escrever o código que utiliza o SpinButton para atualizar o valor exibido de outro controle. Por exemplo, você pode utilizar um SpinButton para alterar o mês, dia ou ano mostrados em uma data. Pode também usálo para se movimentar por um intervalo de valores ou lista de itens ou para alterar o valor exibido em uma caixa de texto. Para exibir um valor atualizado por um SpinButton, você deve atribuir o valor do SpinButton à parte exibida de um controle, como a propriedade Caption de um Label ou a propriedade Text de um TextBox. Para criar um SpinButton horizontal ou vertical, escolha o valor apropriado da propriedade Orientation. A propriedade padrão de um SpinButton é a propriedade Value, e o evento padrão de um SpinButton é o evento Change. No nosso projeto usaremos os eventos SpinDown e SpinUp, que ocorrem quando o usuário clica com o mouse na seta inferior ou superior, respectivamente, de um controle Spin. - Inserir quatro controles SpinButton no formulário, conforme a figura 5.2, e nomeá-los como spin1, spin2, spin3 e spin4, do controle mais ao alto para baixo. - Inserir oito labels, conforme a figura 5.2, e nomeá-los como LBLx1, LBLx2, LBLy1 e LBLy2, para os quatro labels próximos aos controles Spin; e LBL1,LBL2, LBL3 e LBL4 para os outros. Nestes últimos, definir a propriedade Caption com os valores X1, X2, Y1, e Y2, conforme a figura. Spin Button fig 5.4 - o ícone do controle SpinButton - Inserir as seguintes linhas de código: Private Sub Spin1_SpinDown() LBLx1.Caption = LBLx1.Caption - 10 Line1.x1 = LBLx1.Caption End Sub Private Sub Spin1_SpinUp() LBLx1.Caption = LBLx1.Caption + 10 Line1.x1 = LBLx1.Caption End Sub Private Sub Spin2_SpinDown() LBLx2.Caption = LBLx2.Caption - 10 Line1.x2 = LBLx2.Caption End Sub Private Sub Spin2_SpinUp() LBLx2.Caption = LBLx2.Caption + 10 Line1.x2 = LBLx2.Caption End Sub Private Sub Spin3_SpinDown() 43 LBLy1.Caption = LBLy1.Caption - 10 Line1.y1 = LBLy1.Caption End Sub Private Sub Spin3_SpinUp() LBLy1.Caption = LBLy1.Caption + 10 Line1.y1 = LBLy1.Caption End Sub Private Sub Spin4_SpinDown() LBLy2.Caption = LBLy2.Caption - 10 Line1.y2 = LBLy2.Caption End Sub Private Sub Spin4_SpinUp() LBLy2.Caption = LBLy2.Caption + 10 Line1.y2 = LBLy2.Caption End Sub Essas linhas de código definem as propriedades X1, X2, Y1 e Y2 do controle Line com o valor da propriedade Value dos controles Spin respectivos. 2 - OS MÉTODOS GRÁFICOS São semelhantes aos controles gráficos, porém são mais fáceis de usar em algumas situações. Enquanto os controles gráficos podem ser manipulados em tempo de projeto (alterando suas propriedades na Janela de Propriedades), os métodos gráficos só podem ser utilizados em tempo de execução. Veremos os métodos Pset, Line e Circle, que desenham respectivamente pontos, linhas e círculos (ou arcos e elipses). O nosso programa ganhará um novo formulário, que mostrará o funcionamento dos métodos gráficos. - Inserir um novo formulário no nosso projeto, através da opção de menu Project - Add Form. Nomear o novo formulário como FRMgrafic2, e salvá-lo como Grafic2.frm, no diretório desse projeto. O objetivo é desenhar aleatoriamente pontos, linhas e círculos no formulário, conforme o botão selecionado. Será utilizado um Timer, que conterá o “coração” do código. O funcionamento é o seguinte: Serão declaradas variáveis a nível de formulário, conforme abaixo: Option Explicit Dim VRpontos, VRlinhas, VRcirculos As Integer Essas variáveis terão seus valores mudados entre zero e um, conforme o botão pressionado. O código do evento Timer1.timer verifica quais variáveis têm o valor 1, e desenha as figuras respectivas. Inserir 6 botões de comando, um controle Timer e três Frames, posicionando-os e alterando as propriedades Caption (quando for o caso) conforme a figura 5.5. Não esqueça de alterar a propriedade Interval do controle Timer para 1. 44 fig 5.5 - o segundo formulário desse projeto O botão com o Caption “Outro Formulário” servirá para alternar o formulário ativo, devendo ser colocado um botão idêntico no formulário FRMgrafic1, que terá a mesma função. - Inserir o seguinte código no evento Click deste botão: Sub BTNoutro_click() FRMgrafic1.Show FRMgrafic2.Hide End Sub No evento Click() do botão semelhante do formulário FRMgrafic1, o código deve mostrar o segundo formulário e esconder o primeiro. - Inserir os seguintes códigos nos botões: Sub BTNpontos_Click () If BTNpontos.Caption = "Para" Then BTNpontos.Caption = "Desenha" VRpontos = 0 Else BTNpontos.Caption = "Para" VRpontos = 1 End If End Sub Sub BTNlinhas_Click () If BTNlinhas.Caption = "Para" Then BTNlinhas.Caption = "Desenha" VRlinhas = 0 Else BTNlinhas.Caption = "Para" VRlinhas = 1 End If End Sub Sub BTNcirculos_Click () If BTNcirculos.Caption = "Para" Then BTNcirculos.Caption = "Desenha" VRcirculos = 0 Else BTNcirculos.Caption = "Para" VRcirculos = 1 End If End Sub Esses três eventos têm funcionamento semelhante, alterando o valor da propriedade Caption do botão respectivo, de “Desenha “ para “Para” e vice e versa, e alterando o valor da variável respectiva entre 1 e 0. Como já foi dito, e conforme veremos no evento Timer do controle Timer1, serão desenhadas as figuras cujas variáveis respectivas tiverem o valor 1. Sub BTNlimpa_pontos_Click () VRpontos = 0 VRlinhas = 0 VRcirculos = 0 FRMgrafic2.Cls BTNpontos.Caption = "Desenha" BTNlinhas.Caption = "Desenha" BTNcirculos.Caption = "Desenha" End Sub Este evento atribui 0 às variáveis, desabilitando o desenho de todas, e altera o Caption dos botões, além de limpar o formulário com o método Cls. 2.1) O Método Cls Limpa texto e gráficos gerados em tempo de execução, de um Formulário ou de uma Picture Box. Vamos agora verificar qual o código responsável pelo desenho, que está no evento Timer : 45 Sub Timer1_Timer () Dim vermelho, verde, azul Dim X, Y, x1, x2, y1, y2 Dim contador As Integer ‘desenha os pontos If VRpontos = 1 Then vermelho = Rnd * 255 verde = Rnd * 255 azul = Rnd * 255 X = Rnd * FRMgrafic2.ScaleWidth Y = Rnd * FRMgrafic2.ScaleHeight FRMgrafic2.PSet (X, Y), RGB(vermelho, verde, azul) End If ‘desenha as linhas If VRlinhas = 1 Then vermelho = Rnd * 255 verde = Rnd * 255 azul = Rnd * 255 x1 = Rnd * FRMgrafic2.ScaleWidth y1 = Rnd * FRMgrafic2.ScaleHeight x2 = Rnd * FRMgrafic2.ScaleWidth y2 = Rnd * FRMgrafic2.ScaleHeight FRMgrafic2.Line (x1, y1)-(x2, y2), RGB(vermelho, verde, azul)', BF End If ‘desenha os círculos If VRcirculos = 1 Then vermelho = Rnd * 255 verde = Rnd * 255 azul = Rnd * 255 x1 = Rnd * FRMgrafic2.ScaleWidth y1 = Rnd * FRMgrafic2.ScaleHeight FRMgrafic2.Circle (x1, y1), 150, RGB(vermelho, verde, azul)', 0, 3 End If End Sub Este código é dividido em 4 partes: a declaração de variáveis locais, a parte que desenha os pontos, a parte que desenha as linhas e a parte que desenha os círculos. Observe que cada bloco de If verifica se a variável global adequada (VRpontos, VRlinhas ou VRcirculos) tem o valor 1. Se tiver, as instruções do bloco são executadas, e as figuras são desenhadas; caso contrário, o bloco não é executado. 2.2) A Função Rnd Essa função retorna um valor Single aleatório, variando entre zero e um. Dentro de cada bloco IF existe um conjunto de instruções comuns: vermelho = Rnd * 255 verde = Rnd * 255 azul = Rnd * 255 Essas instruções atribuem a cada variável (vermelha, verde e azul) um valor que varia entre 0 e 255, pois multiplica 255 pelo valor retornado pela função Rnd. Essas variáveis serão usadas, no código, como argumentos da função RGB(), que será vista adiante. 2.3) A Função RGB Retorna um inteiro Longo (Long) que representa uma cor no padrão RGB, que é o padrão usado no Windows. Ela é composta de três parâmetros: Red, Green e Blue. Esses parâmetros representam os componentes de vermelho, verde e azul, respectivamente, da cor retornada, e seus valores são inteiros. 46 Observe que após as instruções comuns, cada bloco de If inicializa as variáveis X e Y , ou X1, Y1, X2, Y2, conforme o caso. A elas são atribuídos valores que variam de 0 até ao valor da largura do formulário (no caso de variáveis X) ou de zero até o valor da altura do formulário (no caso dos Y). Isso é conseguido multiplicando-se o valor retornado pela função Rnd (que varia entre 0 e 1) pelo valor da propriedade ScaleWidth (largura útil do formulário) ou pelo valor da propriedade ScaleHeight (altura útil do formulário). Tendo compreendido tudo o que foi visto até agora, veremos a parte do código que realmente desenha no formulário. 2.4) O Método Pset Desenha um ponto em um objeto, com uma cor específica. A sintaxe é a seguinte: [object.]PSet [Step](x, y)[,color] E suas partes são: object Objeto no qual o ponto será desenhado. Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas propriedades CurrentX e CurrentY. x, y Valores Single que indicam as coordenadas horizontal e vertical do ponto color Cor RGB especificada para o ponto. A linha de código que desenha o ponto é a seguinte: FRMgrafic2.PSet (X, Y), RGB(vermelho, verde, azul) 2.5) O Método Line Desenha linhas ou retângulos em um objeto. A sintaxe é a seguinte: [object.]Line [[Step](x1, y1)] - [Step](x2, y2) [,[color][,B[F]]] E suas partes são: object Objeto no qual a linha será desenhada. Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas propriedades CurrentX e CurrentY. x1, y1 Valores Single que indicam as coordenadas horizontal e vertical do ponto de início da linha (ou vértice superior esquerdo do retângulo).. Step Palavra chave que especifica que as coordenadas são relativas ao ponto inicial da linha. x2, y2 Valores Single que indicam as coordenadas horizontal e vertical do ponto de final da linha (ou vértice inferior direito do retângulo). color Cor RGB especificada para a linha. B Opção que determina o desenho de um retângulo. F Se a opção B é usada, essa opção determina que o retângulo será preenchido pela mesma cor da borda. A instrução que desenha a linha é a seguinte: FRMgrafic2.Line (x1, y1)-(x2, y2), RGB(vermelho, verde, azul)', BF Observe que as opções B e F estão comentadas. Retire o comentário, e verifique o que ocorre ao executar o programa. 2.6) O Método Circle Desenha círculos, arcos ou elipses em um objeto. A sintaxe é a seguinte: [object.]Circle [Step](x, y), radius[,[color] [,[start] [,[end] [,aspect] ] ] ] E suas partes são: object Objeto no qual o círculo será desenhado. Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas propriedades CurrentX e CurrentY. x, y Valores Single que indicam as coordenadas horizontal e vertical do centro do círculo (ou do arco ou da elipse). radius Valor Single que indica o raio da figura. color Cor RGB especificada para a figura. Start 47 End Valores Single que indicam o início e o final do arco. A faixa de valores vai de 0 Pi radianos até 2 Pi radianos. aspect Valor Single que indica se a figura será um círculo (valor 1.0) ou uma elipse (valor diferente). A instrução que desenha o círculo é a seguinte: FRMgrafic2.Circle (x1, y1), 150, RGB(vermelho, verde, azul)', 0, 3 Retire o comentário que antecede os números 0 e 3, e verifique o que ocorre ao executar o programa. OBS: A propriedade DrawWidth do formulário determina qual espessura dos pontos, das linhas e dos círculos desenhados pelos métodos Pset, Line e Circle, respectivamente. Experimente alterar o valor dessa propriedade, em tempo de projeto, e veja como os pontos, linhas e círculos serão desenhados. 3 - OS CONTROLES DE IMAGEM Veremos agora os controles que permitem que arquivos de imagens sejam armazenados. Else são A Picture Box Control e a Image Control. Na terceira aula foi apresentado o controle Picture Box, e agora veremos mais alguma coisa referente a esse controle, além do controle Image. 3.1) Picture Box Control Como já visto, permite que uma imagem seja mostrada, bastando que o arquivo gráfico (.bmp, .wmf, .emf, .ico, ou .dib) que contenha informações sobre a imagem seja atribuído à propriedade Picture. Possui ainda a propriedade AutoSize, que determina que o controle se ajuste ao tamanho da figura por ele mostrada. 3.2) Image Control Controle que também permite que uma imagem seja mostrada. A propriedade Picture deve ser configurada da mesma forma que no controle anterior. Possui a propriedade Stretch, que dimensiona a figura de acordo com o tamanho do controle (o contrário da propriedade AutoSize do controle Picture). - Incluir um novo formulário no projeto: Name = FRMgrafic3 Caption = Imagens - Salvá-lo no diretório corrente, como grafic3.frm. - Incluir 7 botões, 2 chek box, dois labels, um controle Picture e outro Image, e distribuí-los conforme a figura 5.6. Por enquanto não se preocupar com a imagem da lua. Os controles referentes a essa imagem serão incluídos mais tarde. - Nomear os controles de acordo com a convenção utilizada, não alterando os nomes da Picture e da Image. - Incluir um CMdialog Control, configurando a propriedade Filter para BMP|*.bmp| ICO|*.ico. - Escrever os seguintes códigos nos respectivos botões: Sub BTNcarrega_picture_Click () CMdialog1.ShowOpen picture1.Picture = LoadPicture(CMdialog1.Filename) End Sub Sub BTNcarrega_image_Click () CMdialog1.ShowOpen image1.Picture = LoadPicture(CMdialog1.Filename) End Sub Os códigos acima acionam o controle CMdialog1, fazendo-o mostrar uma janela de diálogo para abrir arquivo (método ShowOpen, já visto). O arquivo escolhido (CMdialog1.Filename) é atribuído à propriedade Picture, através da função LoadPicture, já vista anteriormente. - Inserir os códigos abaixo nos eventos click dos botões apropriados: Sub BTNlimpa_picture_Click () 48 picture1.Picture = LoadPicture("") picture1.Height = 1575 picture1.Width = 1815 End Sub Sub BTNlimpa_image_Click () image1.Picture = LoadPicture("") image1.Height = 1575 image1.Width = 1815 End Sub fig 5.6 - o terceiro formulário do projeto Os códigos anteriores removem a figura do controle (1ª linha do código), a ajustam o tamanho do controle, para o tamanho inicial (2ª e 3ª linhas). - Inserir os códigos abaixo nos eventos click dos controles CheckBox: Sub Check2_Click () picture1.AutoSize = check2.Value End Sub Sub Check1_Click () image1.Stretch = check1.Value End Sub Esses dois últimos códigos ajustam as propriedades AutoSize e Stretch, dos controles respectivos, tornandoas True ou False, conforme a propriedade Check do controle CheckBox. - Inserir no evento click do controle BTNoutro: Sub BTNoutro_Click () FRMgrafic1.Show FRMgrafic2.Hide FRMgrafic3.Hide End Sub Ajuste os códigos dos eventos Click dos botões BTNoutro dos dois primeiros formulários, de forma similar ao código descrito acima, permitindo que todos os formulários possam ser acionados em tempo de execução. 3.3) Vetor de Controles Um vetor de controles é um conjunto de controles do mesmo tipo, todos com o mesmo valor para a propriedade Name. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos pergunta se desejamos criar um vetor com esses controles. Para que o vetor possa existir, a propriedade Index dos controles envolvidos devem receber valores inteiros e consecutivos. 49 - Inserir um novo controle Image no formulário, na posição em que aparece a lua na figura. Não altera a propriedade Name ( Image2). Com esse controle selecionado, copie para a área de transferência (Ctrl - C). Clique sobre o formulário, e cole (Ctrl - V) o conteúdo da área de transferência. O VB perguntará se você deseja criar um vetor de controles com o objeto Image2. Responda sim e vá colando novos controles Image2, até fazer um total de 9 elementos. Posicione-os, de forma que os elementos fiquem um ao lado do outro, em ordem de valor da propriedade Index, à exceção do primeiro (Index = 0), que deve ficar na posição em que aparece a lua na figura. Observe que a única diferença entre os controles é o valor da propriedade Index. A exceção do primeiro, altere a propriedade Visible para False de todos os controles. Atribua à propriedade Picture do controle com Index = 1 o arquivo“c:\vb\icons\elements\moon01.ico”. Atribua os arquivos subsequentes para os controles que se seguem, em ordem. Caso não encontre esses arquivos ou o diretório, use o pbrush para desenhar as figuras. A posição dos controles no formulário realmente não importa, já que eles ficarão invisíveis durante a execução. Mas para um melhor efeito visual durante o projeto, aconselho colocá-los um ao lado do outro. Eles podem ser colocados inclusive em uma parte do formulário que não é mostrada quando o programa for executado. fig 5.7 - posicionamento dos controles Image2 - Inserir um controle Timer no formulário, atribuindo 100 para Interval. - Escrever o seguinte código: Option Explicit Dim i As Integer Sub Timer1_Timer () i=i+1 If i = 9 Then i=1 End If image2(0).Picture = image2(i).Picture End Sub Sub BTNlua_Click () If timer1.Enabled Then timer1.Enabled = False Else timer1.Enabled = True End If End Sub Ao pressionar o botão BTNlua, se o Timer1 estiver habilitado, ele é desabilitado, e vice-versa. Enquanto o Timer1 estiver habilitado, o evento Timer1_Timer() ocorre de 100 em 100 milisegundos (conforme valor da propriedade Interval). A cada vez que o evento ocorrer, o valor da variável i é incrementado e depois verificado, de maneira que ele nunca seja superior a 8. Desta forma, a propriedade Picture do controle Image2(0) recebe o valor da propriedade Picture de cada um dos controles do vetor, em ordem, dando a impressão de movimento. 50 CAPÍTULO VI 1 - MANIPULANDO ARQUIVOS Veremos agora como manipular arquivos, como utilizar a Área de Transferência do Windows e como tratar os erros. Isto será feito ao desenvolvermos um programa semelhante ao Bloco de Notas do Windows. Para isso, devemos abrir um novo projeto, nomear o formulário como FRMbloco, e salvá-lo como c:\aulavb\aula07\proj1\bloco.frm. Salvar o projeto como c:\aulavb\aula05\proj2\bloco.vbp. O programa terá a aparência da figura 5.6.. - Inserir um quadro texto, nomeando-o como TXTbloco. 1.1) O Evento de Formulário Resize Este evento ocorre sempre que o formulário for redimensionado. - Escrever o seguinte código no evento Resize e no evento Load do formulário: TXTedicao.Height = FRMbloco.ScaleHeight TXTedicao.Width = FRMbloco.ScaleWidth Isto fará com que o controle de texto sempre tenha o tamanho da área útil do formulário. fig 5.6 - Bloco de Notas - Inserir um Menu com os seguintes itens de Menu: Name Caption MNParquivo MNSnovo MNSabrir MNSsep1 MNSsalvar MNSsalvarcomo MNSsep2 MNSsair &Arquivo &Novo &Salvar &Salvar Salvar &Como Sai&r - Inserir um Cmdialog, configurando as propriedades conforme abaixo: Filter = Arquivo texto|*.txt CancelError = True - Escrever os seguintes códigos: Option Explicit Dim numero_arquivo, nome_arquivo Sub MNSnovo_Click () TXTedicao.Text = "" FRMbloco.Caption = "Bloco de Notas" nome_arquivo = "" TXTedicao.SetFocus End Sub 51 Foram declaradas as variáveis, a nível de formulário, numero_arquivo e nome_arquivo. Essas variáveis são utilizadas para abrir e referenciar um arquivo. O código do evento MNSnovo_click limpa o conteúdo do TXTedição e da variável nome_arquivo. Sub MNSabrir_Click () On Error GoTo cancelar1 CMdialog1.Action = 1 nome_arquivo = CMdialog1.Filename numero_arquivo = FreeFile Open nome_arquivo For Input As numero_arquivo FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo TXTedicao.Text = Input(LOF(numero_arquivo), numero_arquivo) Close numero_arquivo TXTedicao.SetFocus Exit Sub cancelar1: trata_erro TXTedicao.Text = "" Exit Sub End Sub O código do evento MNSabrir_click usa o Cmdialog1 para mostrar a janela de diálogo que permite selecionar um arquivo para abertura (Action = 1). 1.2) A Função FreeFile A Função FreeFile retorna um número válido para referenciar um arquivo. O VB pode tratar de vários arquivos abertos simultaneamente, e cada arquivo é referenciado por um número. Essa função retorna o próximo nº livre para um arquivo. Observe que no código acima, o valor retornado pela função é atribuído à variável número_arquivo, que é usada no comando Open, como o último argumento. 1.3) O Comando Open Esse comando abre um arquivo, habilitando leitura e escrita. Um arquivo pode ser aberto nos seguintes modos: Append, Binary, Input, Output e Random. Os modos Append, Input e Output se referem a arquivos abertos no modo sequencial, e definem se o arquivo será aberto para acréscimo, entrada ou saída, respectivamente. Binary abre um arquivo em modo binário, e Random abre um arquivo para acesso aleatório. A sintaxe básica desse comando é a seguinte: Open <nome_arquivo> For <modo> As [#]<número_arquivo> 1.4) A Função Input Essa função retorna caracteres lidos de um arquivo sequencial. Tem dois parâmetros: o nº de caracteres que devem ser lidos, e o nº que referencia o arquivo. Obviamente o arquivo deve ser aberto antecipadamente pela função Open. 1.5) A Função LOF Essa função retorna o nº de bytes de um arquivo aberto. Possuí um parâmetro, que especifica o nº do arquivo previamente aberto. 1.6) O método Close Essa função fecha um arquivo previamente aberto pela função Open. É possível agora entender o código do evento MNSabrir_Click (). O código usa a função Open para abrir o arquivo escolhido pelo usuário, através do controle Cmdialog1 (variável nome_arquivo), no modo Input, com o número retornado pela função FreeFile (variável numero_arquivo). Neste modo (Input), o arquivo é aberto para leitura. Após abrir o arquivo, o conteúdo dele é copiado para a propriedade Text do controle TXTedição, sendo o arquivo fechado logo em seguida, pela função Close. - Incluir os seguintes códigos nos eventos click dos botões MNSsalvar e MNSsalvar_como: Sub MNSsalvar_Click () On Error GoTo cancelar2 If nome_arquivo = "" Then CMDialog1.Action = 1 nome_arquivo = CMDialog1.filename numero_arquivo = FreeFile End If 52 Open nome_arquivo For Output As numero_arquivo FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo Print #numero_arquivo, TXTedicao.Text Close numero_arquivo TXTedicao.SetFocus Exit Sub cancelar2: trata_erro Exit Sub End Sub Sub MNSsalvarcomo_Click () On Error GoTo cancelar3 CMdialog1.Action = 2 nome_arquivo = CMdialog1.Filename numero_arquivo = FreeFile Open CMdialog1.Filename For Output As numero_arquivo FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo Print #numero_arquivo, TXTedicao.Text Close numero_arquivo TXTedicao.SetFocus Exit Sub cancelar3: Exit Sub End Sub 1.7) O Método Print Esse método copia o conteúdo de uma variável em um arquivo sequencial previamente aberto. Tanto o código do evento MNSsalvar_click quanto o do evento MNSsalvarcomo_Click, abrem um arquivo para gravação, usando Open no modo Output. A diferença é no evento MNSsalvarcomo_Click a variável nome_arquivo tem seu valor alterado, através da chamada ao controle Cmdialog1, com Action = 2, enquanto que no evento MNSsalvar_click o conteúdo dessa variável não foi alterado. Ambos os eventos copiam o conteúdo do TXTedicao para o arquivo especificado, usando o método Print, fechando o arquivo logo em seguida. Pode ser notado que o nosso programa sempre trabalha com o arquivo fechado. Ele é aberto somente durante a ocorrência dos eventos click de menu (que têm uma duração de milisegundos), e o seu conteúdo é copiado ou lido, conforme o caso. 2 - ÁREA DE TRANSFERÊNCIA 2.1) O Objeto ClipBoard Esse objeto é utilizado para manipular textos e gráficos na área de transferência. Permite a implementação das ações Copiar, Colar e Recortar nos seus programas. - Adicionar ao menu existente, os seguintes itens de menu: Name Captions MNPeditar MNScolar MNScopiar MNSrecortar Editar Colar Copiar Recortar - Inserir os seguintes códigos: Sub MNScopiar_Click () clipboard.Clear clipboard.SetText TXTedicao.SelText TXTedicao.SetFocus End Sub Sub MNScolar_Click () On Error GoTo cancelar4 TXTedicao.SelText = clipboard.GetText() 53 TXTedicao.SetFocus Exit Sub cancelar4: trata_erro Exit Sub End Sub Sub MNSrecortar_Click () clipboard.Clear clipboard.SetText TXTedicao.SelText TXTedicao.SelText = "" TXTedicao.SetFocus End Sub 2.2) O Método Clear Esse método limpa o conteúdo da área de transferência, quando chamado junto com a palavra chave Clipboard. 2.3) O Método SetText Coloca o conteúdo de uma variável String, que lhe é passada como argumento, na área de transferência. 2.4) O Método SetData Coloca uma picture, que lhe é passada como argumento, na área de transferência, usando o formato grafico específico. Possui outro argumento, que indica o formato da picture. Pode ter um dos seguintes valores: Valor 2 3 8 9 Descrição Bitmap (.bmp files) Metafile (.wmf files) Device-independent bitmap (DIB) Color palette 2.5) O Método GetText Retorna o conteúdo da área de transferência, no formato texto. 2.6) O Método GetData Retorna o conteúdo da área de transferência, em um formato gráfico. Opcionalmente pode especificar o formato, usando os mesmos valores vistos no método SetData. OSB: A utilização dos métodos SetData e GetData será vista oportunamente. 2.7) A Propriedade SelText Essa propriedade identifica a string que está selecionada em um quadro texto. Verificando os códigos dos eventos relacionados aos menus recém inseridos, será possível identificar a sintaxe dos diversos métodos relacionados ao manuseio da Área de Transferência. 3 - MANIPULANDO ERROS Observe que no eventos Colar, e em outros eventos anteriormente vistos, existe a chamada a um procedimento não visto até agora, o procedimento trata_erro. O código desse procedimento é mostrado a seguir. Sub trata_erro () Select Case Err Case 52 MsgBox "Nome de arquivo inválido", , "Impossível salvar" Case 32755 Exit Sub Case 7 MsgBox "Erro de memória", , "Operação cancelada" Case Else MsgBox "Ocorreu algum erro!", , "Operação cancelada" End Select End Sub 54 3.1) On Error Quando um erro de execução ocorre, o programa é encerrado, e uma mensagem do VB é enviada para a tela. Para evitar que isso ocorra, e tratar o erro sem que o programa seja encerrado, deve ser usado a construção On Error. Ela deve ser usada em conjunto com Goto, que especifica para qual linha o controle do programa deve ir, caso seja detectado um erro de execução. Esse tratamento é restrito a um evento ou função. Portanto, cada procedimento deve ter o seu On Error. A linha a que se refere o Goto é especificada por um Label, e o programa continuará a ser executado normalmente após essa linha. 3.2) A função Err A cada erro em tempo de execução, está relacionado um número. A função Err retorna o número do último erro ocorrido. Normalmente ela é utilizada em uma rotina de tratamento de erros, conforme a que foi vista acima. OBS: Existe um número muito grande de erros em tempo de execução. Para verificar quais os erros possíveis, e seus respectivos números, consulte o help, veja a função Err, e escoha os assuntos correlatos. Uma lista com todos os códigos de erros pode ser visualizada.CAPÍTULO VI Neste capítulo veremos como manipular arquivos de acesso randômico (registros). Criaremos uma aplicação que permitirá a gravação, recuperação e alteração de diversos registros em um arquivo. Este capítulo complementa o assunto iniciado no capítulo anterior, quando foi visto a manipulação de arquivos seqüenciais. 4 - MANIPULANDO ARQUIVOS DE REGISTROS -Abrir um novo projeto, nomear o formulário como FRMagenda, e salvá-lo como agenda.frm. Salvar o projeto como agenda.vbp. A aparência final do programa, quando em execução, é a da figura 6.1: LBLagend a fig 6.1 - manipulando registros Esse programa cria e manipula arquivos, através de registros. O usuário pode escolher qual arquivo de agenda será aberto para edição. - Inserir quatro labels, nomeando-os da seguinte forma: LBLnome, LBLtelefone, LBLcomentarios e LBLagenda. A propriedade Caption de cada label deve ser a que aparece na figura, a exceção do LBLagenda, que deve ter essa propriedade vazia. Esse último label será usado para informar qual registro está sendo acessado (parte inferior esquerda da figura). Os Labels devem ser colocados conforme aparecem na figura. - Inserir oito botões de comando, nomeando-os e configurando a propriedade Caption de cada um deles, conforme a figura. Por exemplo: BTNnovo (Caption = &Novo). - Inserir três quadro textos, dispondo-os conforme a figura, e nomeando-os de acordo com o label mais próximo. Por exemplo: TXTnome próximo ao LBLnome. 55 4.1) A Declaração Type Esta declaração permite a definição de um tipo de dado definido pelo usuário, composto de um ou mais elementos. O VB oferece os tipos de dados padrões (integer, string, boolean, etc), mas o programador pode definir novos tipos, usando os tipos pré-definidos, ou outros também definidos. A sintaxe da definição de tipos está mostrada abaixo: - Inserir um módulo no projeto, salvando-o como agenda.bas, no diretório do projeto atual. Um módulo é um objeto que contém código (funções e procedimentos) e declarações de tipos e variáveis, não sendo possível a colocação de controles. Para inserir um módulo no projeto, deve-se selecionar a opção de menu Project - Add Module. - Escrever o seguinte código na seção de declarações do módulo: Option Explicit Type informação nome As String * 40 fone As String * 20 comentários As String * 100 End Type Esta declaração cria o tipo informação, que é composto pelos elementos nome, fone e comentários. A partir de agora, é possível a declaração de uma variável como sendo do tipo informação, da mesma forma que se declara uma variável do tipo integer. Por exemplo: Dim x as informação cria uma variável chamada x que é do tipo informação. Para se acessar os elementos dessa variável (nome, fone, e comentários) usa-se um ponto (.) separando o nome da variável do identificador do elemento, por exemplo: x.nome = "Alfredo" x.fone = TXTfone.text Esta declaração deve ser feita em um módulo. - Escrever o seguinte código na seção de declarações do formulário: Option Explicit Dim pessoa As informação Dim numero_arquivo As Integer Dim tamanho_registro, corrente_registro, ultimo_registro As Long Dim clicou_novo, clicou_cancelar, clicou_change, clicou_excluir As Integer Dim nome_procurado As String Observe que na segunda linha foi declarada uma variável (pessoa), como sendo do tipo informação. As variáveis clicou_<alguma_coisa> serão usadas para controlar o funcionamento do programa, no que diz respeito a habilitação dos botões de comando, como será visto mais adiante. - Inserir o código a seguir, no evento Form_load(): Private Sub form_load() FRMagenda.Show nome_arquivo = InputBox("Digite o caminho e o nome do arquivo", "Selecione Arquivo de Agenda", "c:/agenda.dat", 2300, 2500) If nome_arquivo = "" Then End End If tamanho_registro = Len(pessoa) numero_arquivo = FreeFile Open nome_arquivo For Random As numero_arquivo Len = tamanho_registro _ ultimo_registro = FileLen(nome_arquivo) / tamanho_registro If ultimo_registro = 0 Then BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = False BTNnovo.Enabled = True BTNprocurar.Enabled = False 56 TXTnome.Enabled = False TXTfone.Enabled = False TXTendereco.Enabled = False Else BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNnovo.Enabled = True BTNprocurar.Enabled = True TXTnome.Enabled = True TXTfone.Enabled = True TXTendereco.Enabled = True corrente_registro = 1 mostra_registro End If LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro) End Sub Este código abre (ou cria) o arquivo digitado pelo usuário, na caixa inpubox mostrada ao iniciar o programa. O que for digitado pelo usuário é retornado pela função inpubox para a variável nome_arquivo. fig 6.2 - InputBox("Digite o caminho e o nome do arquivo",... Observe que o comando Open abre o arquivo no modo Randon. O tamanho dos registros desse arquivo é definido pelo último argumento (Len = tamano_registro). Verifique que o valor da variável tamanho_registro é o nº de bytes da variável pessoa. A variável ultimo_registro calcula quantos registros existem no arquivo recém aberto, dividindo o tamanho do arquivo pelo tamanho de cada registro (4ª linha). Observe que conforme o valor apresentado por essa variável (se igual ou diferente de zero), os botões e os quadros textos são habilitados e desabilitados. Por exemplo: não faz sentido deixar os textos habilitados, ou os botões (a exceção do botão Novo), caso não haja registros no arquivo. Observe que se houver pelo menos um registro no arquivo (caso ultimo_registro <>0), a variável corrente_registro recebe o valor 1 (o arquivo sempre é aberto com o apontador no início). Logo em seguida é chamado o procedimento de usuário mostra_registro, que deve ser escrito conforme abaixo, na seção general do formulário (poderia ser escrito no módulo, usando a palavra public). Sub mostra_registro () If ultimo_registro = 0 Then Exit Sub End If Get #numero_arquivo, corrente_registro, pessoa TXTnome.Text = pessoa.nome TXTfone.Text = pessoa.fone TXTcomentarios.Text = pessoa.comentarios LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro) End Sub 4.2) O Procedimento Get O procedimento get lê dados de um arquivo de acesso randômico, colocando o conteúdo de um registro em uma variável. Ele recebe três parâmetros, a saber: o número do arquivo (definido no comando open); o número do 57 registro a ser lido (o primeiro registro é o número 1, o segundo o nº 2, e assim por diante); e a variável que receberá o conteúdo do registro especificado. Essa variável deve ter o mesmo tamanho que o registro do arquivo. O procedimento mostra_registro verifica se existe algum registro no arquivo, verificando a variável ultimo_registro. Caso exista, o arquivo é lido (função Get()) na posição determinada pela variável corrente_registro, e o valor é colocado na variável pessoa. Observe como as variáveis numero_arquivo, corrente_registro e pessoa são passadas para o procedimento get. Por fim, na última linha, o label LBLagenda informa qual o nº registro (variável corrente_registro) que está sendo acessado, e quantos registros (variável ultimo_registro) existem no arquivo. -Inserir no evento click do BTNnovo o seguinte código: Sub BTNnovo_Click () LBLagenda.Caption = "Registro Novo" ultimo_registro = ultimo_registro + 1 corrente_registro = ultimo_registro BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNnovo.Enabled = False BTNprocurar.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False TXTnome.Text = "" TXTfone.Text = "" TXTcomentarios.Text = "" TXTnome.Enabled = True TXTfone.Enabled = True TXTcomentarios.Enabled = True TXTnome.ForeColor = &H0& TXTnome.SetFocus clicou_novo = True End Sub Neste evento, que ocorre quando o usuário quer inserir um registro novo, as variáveis ultimo_registro e corrente_registro são incrementadas, e os botões e quadro textos são habilitados e desabilitados conforme a necessidade. Observe que a variável clicou_novo recebe o valor True. Isto é feito porque, como veremos adiante, os eventos change dos quadro textos contém um código que também atualiza os botões, e nós não queremos que esse código seja executado quando a mudança nos textos tenha ocorrido devido o pressionamento do botão novo. Observe também que a cor dos textos (propriedade ForeColor) muda de vermelho para preto (&H0&), o que significa que os dados que aparecem nos textos não foram gravados ainda. - Inserir no evento click do controle BTNgravar o seguinte código: Sub BTNgravar_Click () If TXTnome.Text = "" Then MsgBox "É necessário preencher o nome!", , "Impossível Gravar" Exit Sub End If BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNnovo.Enabled = True BTNprocurar.Enabled = True BTNproximo.Enabled = True BTNanterior.Enabled = True pessoa.nome = TXTnome.Text pessoa.fone = TXTfone.Text pessoa.comentarios = TXTcomentarios.Text TXTnome.ForeColor = &HFF& TXTfone.ForeColor = &HFF& TXTcomentarios.ForeColor = &HFF& Put #numero_arquivo, corrente_registro, pessoa TXTnome.SetFocus LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro) clicou_novo = False End Sub 58 4.3) O Procedimento Put Esse procedimento grava para um arquivo em disco o conteúdo de uma variável. Ele é o oposto do comando Get, visto anteriormente. Também recebe três argumentos, na mesma ordem que no comando anterior (nº do arquivo, nº do registro, variável). A sintaxe deve ser estudada nas linhas abaixo, que explicam o código do evento Sub BTNgravar_Click (). Este evento ocorre quando o usuário deseja gravar um registro novo, ou uma alteração em algum registro existente. Caso o nome não tenha sido preenchido, a gravação não é feita (as primeiras quatro linhas). Verifique que ele também habilita e desabilita os botões, torna os textos dos quadros textos vermelhos (propriedade ForeColor = &HFF&), e usa o comando put para gravar no arquivo (referenciado pela variável numero_arquivo), na posição determinada pela variável corrente_registro, o conteúdo da variável pessoa. Note que antes da chamada a esse comando (put), a variável pessoa teve os seus diversos elementos atualizados pelos valores dos quadros textos (linhas 12, 13 e 14). Observe que a variável clicou_novo recebe o valor False ao final do evento, só tornando a ficar True caso o botão Novo seja novamente pressionado. Isto ocorre porque durante esse evento, serão chamados os eventos change dos quadros textos, e os códigos nesses eventos verificam o valor dessa variável para tomar decisões. - inserir nos eventos change dos quadros textos os seguintes códigos: Private Sub TXTnome_Change() If clicou_excluir Or clicou_cancelar Then Exit Sub End If If TXTnome.Text <> pessoa.nome Then clicou_change = True TXTnome.ForeColor = &H0& TXTendereco.ForeColor = &H0& TXTfone.ForeColor = &H0& BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNnovo.Enabled = False BTNprocurar.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False End If End Sub Private Sub TXTfone_Change() If clicou_excluir Or clicou_cancelar Then Exit Sub End If If TXTfone.Text <> pessoa.fone Then clicou_change = True TXTnome.ForeColor = &H0& TXTendereco.ForeColor = &H0& TXTfone.ForeColor = &H0& BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNnovo.Enabled = False BTNprocurar.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False End If End Sub Private Sub TXTendereco_Change() If clicou_excluir Or clicou_cancelar Then Exit Sub End If If TXTendereco.Text <> pessoa.comentarios Then clicou_change = True TXTnome.ForeColor = &H0& TXTendereco.ForeColor = &H0& TXTfone.ForeColor = &H0& BTNgravar.Enabled = True 59 BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNnovo.Enabled = False BTNprocurar.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False End If End Sub Veja que a única diferença entre esses códigos está na 5ª linha. Em todos eles, é feita uma comparação entre o conteúdo do quadro texto em questão com o conteúdo do elemento respectivo da variável pessoa. Se esses conteúdos forem diferentes, a cor dos textos muda para preto, e os botões são habilitados/desabilitados de forma que fique claro que houve uma alteração no registro, e que essa alteração pode ser gravada ou cancelada (os botões gravar e cancelar ficam habilitados, e os demais não). Esse evento ocorre nas seguintes ocasiões: 1) sempre que o usuário digitar algo nos quadros; 2) quando clicar o botão Novo, pois nesse evento os quadros têm seus textos alterados para "", o que invoca o evento change; 3) quando clicar o botão Excluir, pois nesse evento os quadros também têm seus textos alterados, como veremos adiante; 4) quando clicar o botão Cancelar, pois nesse evento os quadros também têm seus textos alterados, como veremos adiante. Deve ficar claro que, nos casos de exclusão e cancelamento, não estamos alterando o conteúdo de um registro em particular, como nos outros casos. Por isso o if inicial que verifica se as variáveis clicou-excluir ou clicou_cancelar estão com valor true. A variável clicou_change recebe o valor True no final do evento, pois é verificada no código do evento click do botão BTNcancelar. - Inserir no evento click do controle BTNcancelar: Private Sub BTNcancelar_Click() clicou_cancelar = True TXTnome.ForeColor = &HFF& TXTfone.ForeColor = &HFF& TXTendereco.ForeColor = &HFF& If clicou_novo Then ultimo_registro = ultimo_registro - 1 corrente_registro = ultimo_registro End If If clicou_novo And ultimo_registro = 0 Then BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = False BTNnovo.Enabled = True BTNprocurar.Enabled = True BTNproximo.Enabled = True BTNanterior.Enabled = True TXTnome.Text = "" TXTfone.Text = "" TXTendereco.Text = "" TXTnome.Enabled = False TXTfone.Enabled = False TXTendereco.Enabled = False LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro) ElseIf clicou_change And ultimo_registro <> 0 Then BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNnovo.Enabled = True BTNprocurar.Enabled = True BTNproximo.Enabled = True BTNanterior.Enabled = True TXTnome.Enabled = True TXTfone.Enabled = True 60 TXTendereco.Enabled = True mostra_registro TXTnome.SetFocus End If clicou_novo = False clicou_change = False clicou_cancelar = False End Sub Este evento ocorre quando o usuário deseja cancelar a inclusão de um registro novo ou a alteração do registro corrente. Aparece a variável clicou_change, que é True caso o usuário tenha digitado texto do registro corrente (conforme foi visto nos eventos change dos quadro textos). Observe que os If’s do código verificam as variáveis clicou_... , para habilitar/desabilitar os botões, mostrar ou não um registro, e apresentar o número do registro corrente e o número de registros. Não deixe de entender porque as variáveis clicou_... recebem False ao final do evento. - Inserir o seguinte código no evento click do controle BTNexcluir: Private Sub BTNexcluir_Click() Dim tmp_numero_arquivo Dim tmp_corrente_registro, recnum As Long Dim tmp_pessoa As informação clicou_excluir = True tmp_numero_arquivo = FreeFile Open "c:\agenda.tmp" For Random As tmp_numero_arquivo Len = tamanho_registro tmp_corrente_registro = 1 recnum = 1 Do While recnum < ultimo_registro + 1 If recnum <> corrente_registro Then Get #numero_arquivo, recnum, tmp_pessoa Put #tmp_numero_arquivo, tmp_corrente_registro, tmp_pessoa tmp_corrente_registro = tmp_corrente_registro + 1 End If recnum = recnum + 1 Loop Close numero_arquivo Kill nome_arquivo Close tmp_numero_arquivo Name "c:\agenda.tmp" As nome_arquivo Open nome_arquivo For Random As numero_arquivo Len = tamanho_registro ultimo_registro = FileLen(nome_arquivo) / tamanho_registro If ultimo_registro = 0 Then BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = False BTNnovo.Enabled = True BTNprocurar.Enabled = False TXTnome.Text = "" TXTfone.Text = "" TXTendereco.Text = "" TXTnome.Enabled = False TXTfone.Enabled = False TXTendereco.Enabled = False corrente_registro = 0 Else BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNnovo.Enabled = True BTNprocurar.Enabled = True TXTnome.Enabled = True TXTfone.Enabled = True TXTendereco.Enabled = True corrente_registro = 1 mostra_registro 61 End If LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro) clicou_excluir = False End Sub Este evento ocorre quando o usuário que deletar algum registro. Observe as variáveis locais que são criadas no início do evento; elas servirão para a gravação de um arquivo, que receberá todos os registros do arquivo em uso, menos o registro corrente (o que se quer deletar). O arquivo com a extensão tmp é criado para acesso randômico, com o tamanho do registro igual ao do arquivo em uso. Após sua criação, o loop while faz com que os registros do arquivo original sejam lidos, um a um, para a variável tmp_pessoa, que por sua vez tem seu conteúdo gravado no arquivo .tmp, a exceção do registro corrente. Temos então dois arquivos, sendo que o .tmp é uma réplica do original, menos o registro corrrente. Em seguida, o arquivo original é fechado, sendo deletado pelo procedimento Kill. 4.4) O Procedimento Kill Este procedimento apaga um arquivo em disco. O arquivo deve estar fechado para que posa ser deletado. A sintaxe é a seguinte: Kill <nome_do_arquivo> 4.5) O Procedimento Name ... as ... Este procedimento renomeia um arquivo em disco. O arquivo deve estar fechado para que posa ser renomeado. A sintaxe é a seguinte: Name <nome_do_arquivo> as <nome_novo> O arquivo .tmp é então fechado, e renomeado para o nome do arquivo original. Note portanto, que a exclusão de um registro significa na verdade acessar um outro arquivo com o mesmo nome, com todos os registros do arquivo original, mas sem o registro que foi excluído. - Inserir o código a seguir no evento click do controle BTNprocurar: Private Sub BTNprocurar_Click() Dim achou As Integer Dim aux_corrente_registro As Long Dim aux_pessoa As informação nome_procurado = InputBox("Digite o nome: ", "Procurar" ) 'figura 6.3 If nome_procurado = "" Then Exit Sub End If achou = False For aux_corrente_registro = 1 To ultimo_registro Get #numero_arquivo, aux_corrente_registro, aux_pessoa If UCase(nome_procurado) = UCase(Trim(aux_pessoa.nome)) Then achou = True Exit For End If Next If achou Then corrente_registro = aux_corrente_registro mostra_registro Else MsgBox "Nome não encontrado!", , "Aviso!" End If End Sub Este código proporciona ao usuário procurar por um registro, fornecendo o nome cadastrado. Uma InputBox retorna o nome procurado pelo usuário. 62 fig 6.3 - procurando um registro Dentro do loop for, o arquivo é lido (até o fim) para a variável aux_pessoa, que tem seu conteúdo comparado com o nome digitado pelo usuário na InputBox. Se o conteúdo for igual, o loop é interrompido, caso contrário ele segue. Ao final, de acordo com o resultado da busca, o registro procurado é mostrado, ou é enviada uma MsgBox informando que o nome não foi encontrado. Ele usa duas novas funções, que serão explicadas adiante. 4.6) As Funções UCase e LCase A função UCase recebe um argumento string e retorna uma cópia dessa string, porém com todos os caracteres alfabéticos em maiúsculos. Ela é usada no evento para garantir que um nome seja encontrado, independente de como o usuário o digite (maiúsculo ou minúsculo). A função Lcase funciona de forma semelhante, porém retorna os caracteres em minúsculo. 4.7) As Funções Trim, LTrim e RTrim A função Trim também recebe um argumento string e retorna uma cópia dessa string, só que com os espaços em branco do início e do final, que porventura existam, removidos. É usada com finalidade semelhante a da função anterior. As funções LTrim e RTrim removem os espaços em branco do início e do final de uma string, respectivamente. - Inserir nos eventos click dos botões Próximo e Anterior, os seguintes códigos: Sub BTNproximo_Click () If corrente_registro < ultimo_registro Then corrente_registro = corrente_registro + 1 mostra_registro Else MsgBox "Este é o último registro", , "Aviso!" End If End Sub Sub BTNanterior_Click () If corrente_registro > 1 Then corrente_registro = corrente_registro - 1 mostra_registro Else MsgBox "Este é o primeiro registro", , "Aviso!" End If End Sub - Estes eventos mostram o próximo registro ou o registro anterior, conforme o caso. Os códigos são muito parecidos, e fazem uso da rotina mostra_registro, tendo antes incrementado ou decrementado a variável corrente_registro. Para finalizar o nosso projeto, vamos incluir um menu com os seguintes ítens: Name Caption MNParquivo MNSabrir &Arquivo &Abrir 63 sep MNSsair MNPajuda MNSsobre Sai&r &? &Sobre No evento click do item Abrir, colocar uma chamada ao evento Form_load, da seguinte maneira: Private Sub MNSabrir_Click() form_load End Sub Isso permitirá que o usuário possa escolher um outro arquivo de agenda, mesmo com o programa em execução. No evento click do item Sair, obviamente colocar o comando End. No evento click do item Sobre, inserir a seguinte linha de código: FRMsobre.Show 1 Este formulário ainda não existe. Portanto, devemos adicionar um novo formulário ao projeto (item de menu Project - Add Form), atribuir para a propriedade Name o valor FRMsobre, e salvá-lo no diretório do projeto, com o nome de sobre.frm. É possível agora criarmos uma janela de informações sobre o programa, que será mostrada ao usuário sempre que ele escolha essa opção de menu. Para obter idéias de como essa janela deve ser, selecione os itens de menu Sobre dos diversos programas for Windows existentes. Não esqueça de colocar um botão de comando OK nesse formulário, com uma instrução para que ele seja descarregado, senão o usuário não tem como voltar ao programa, já que o formulário está sendo mostrado na forma modal ( argumento 1 para o método Show). 64 CAPÍTULO VII Neste capítulo veremos como manipular banco de dados utilizando um controle do VB, O Data Control. O programa criado no capítulo anterior será revisto, e o arquivo de registro criado será no formato .mdb, que é o tipo de arquivo manipulado pelo Access. 1 - Definições Gerais de Banco de Dados 1.1) Definições Gerais de Banco de Dados Um banco de dados é formado por um conjunto de tabelas, que por sua vez são formadas por um conjunto de registros, estes últimos contendo campos. Uma tabela representa um conjunto de objetos do mundo real. É utilizada para armazenar informações sobrte vários elementos de um mesmo conjunto. Como exemplo de objetos podemos ter os funcionários de uma empresa, os livros de uma biblioteca, os fornecedores de uma loja, etc. Teríamos, portanto, a tabela funcionários, a tabela livros e a tabela fornecedores, para representar cada um dos objetos citados anteriormente. Cada elemento desses conjuntos (um funcionário, um livro ou um fornecedor) será um registro da tabela respectiva. Na tabela funcionários, por exeplo, seria possível termos um registro referente ao funcionário João. Obviamente, cada elemento possui atributos que o diferenciam dos demais elementos do mesmo conjunto de objetos. Esses atributos são os campos das tabelas. Por exemplo, os funcionários de uma empresa têm os seguintes atributos: nome, endereço, telefone, identidade, etc. Quando for criada a tabela que representar esse conjunto, ela deverá ser organizada com os campos nome, endereço, telefone, identidade, e assim por diante. Podemos imaginar uma tabela como sendo composta de linhas e colunas, as linhas representando os registros, e as colunas os campos, como no exemplo abaixo. IDENTIDADE 002233 023132 NOME João Maria TABELA FUNCIONÁRIOS ENDEREÇO TELEFONE Observe que o campo identidade foi colocado à esquerda. Isto foi proposital, pois ele é chamado de campo chave. Um campo chave é um campo que identifica univocamente um registro. No caso em questão, podemos ter vários registros com o valor João no campo nome, e mais de um registro com o mesmo valor no campo endereço, por exemplo, mas só pode existir um registro com o valor 002233 no campo identidade. Em outras palavras, um campo chave sempre terá valores diferentes para registros diferentes. 1.2) Banco de Dados MDB Um Banco de Dados no formato MDB (Microsoft Data Base) é um arquivo .mdb que pode conter várias tabelas de dados, e que é reconhecido pelo programa Access, da Microsoft. Na verdade, quando se quer criar uma ou mais tabelas de dados, é necessário a utilização de um programa como o Access. Existem vários programas que permitem a criação e manipulação de tabelas de dados, cada um gerando um arquivo em um determinado formato. 2 - O Data Control O Data Control é um controle do VB que proporciona acesso aos dados armazenados em um arquivo de banco de dados. O ícone na Caixa de Ferramentas é o seguinte: Ele permite a movimentação pelos registros e que cada registro seja mostrado em um bound control. Daremos início ao projeto, executando as ações discriminadas abaixo. fig 7.1 - ícone do Data Control -Abrir um novo projeto, nomear o formulário como FRMagenda, c:\aulavb\aula07\proj1\agenda.frm. Salvar o projeto como \aulavb\aula07\proj1\agenda.vbp. e salvá-lo como - Inserir um Data Control no formulário, conforme a figura 7.2. 65 fig 7.2 - Agenda telefônica usando o Data Control - Inserir quatro labels, nomeando-os da seguinte forma: LBLnome, LBLtelefone, LBLcomentarios e LBLfoto. A propriedade Caption de cada label deve ser a que aparece na figura. Os Labels devem ser colocados conforme aparecem na figura. - Inserir oito botões de comando, nomeando-os e configurando a propriedade Caption de cada um deles, conforme a figura. Por exemplo: BTNnovo (Caption = &Novo). - Inserir três quadro textos, dispondo-os conforme a figura, e nomeando-os de acordo com o label mais próximo. Por exemplo: TXTnome próximo ao LBLnome. - Inserir uma caixa de diálogos. Este controle será usado para permitir a escolha de um arquivo de figura, que será mostrada no controle de imagem. - Inserir um controle de Imagem, conforme mostra a figura. Este controle será usado para mostrar uma figura, que será armazenada no nosso arquivo de banco de dados. 2.1) A propriedade Connect Como foi dito anteriormente, existem vários formatos de banco de dados, sendo que o Data Control se conecta com os seguintes: access, dbase, excel, lotus, texto, paradox e foxpro. A definição de qual formato será utilizado é feita configurando-se a propriedade Connect do controle de dados. 2.2) A propriedade DataBase Essa propriedade seleciona o nome e a localização da origem dos dados para o Data Control. Em outras palavras, nesta propriedade deve ser especificado o path e o nome do arquivo que será conectado ao controle. 2.3) A propriedade RecordSource Como foi dito anteriormente, um arquivo de banco de dados pode conter várias tabelas. Enquanto que a propriedade DataBase especifica o arquivo, RecordSource define a origem dos registros. A origem pode ser uma tabela ou uma instrução em SQL. Se o valor dessa propriedade for mudado em tempo de execução, deve ser usado o método Refresh sobre o data control, para habilitar a mudança. 66 fig 7.3 - definindo a propriedade conect do Data Control Para o nosso projeto utilizaremos um arquivo chamado agenda.mdb, que será composto de uma tabela chamada agenda, composta dos seguintes campos: nome (text - 20), telefone (text - 15), comentários (memo) e foto (binary). O campo foto é do tipo Binary, porque esse tipo permite o armazenamento de imagens. A criação desse arquivo foge ao escopo deste trabalho, mas pode ser feita no Access ou no Visula Data Manager. O Visual Data Manager é um utilitário que vem com o pacote do VB, e que permite a criação e a manipulação de banco de dados. Para iniciar esse programa, usa-se o item de menu Add-Ins - Visual Data Manager. fig 7.4 - Executando o Visual Data Manager Para associarmos o controle Data Control à tabela Agenda do banco de dados Agenda.mdb, após ele ter sido criado, devemos configurar as propriedades DatabaseName e RecordSource como segue: - DatabaseName = C:\aulavb\aula07\proj1\agenda.mdb - RecordSource = Agenda 2.4) A propriedade Recordset Quando a origem dos registros é definida pelas propriedades DataBase e RecordSource, o Data Control, ao ser carregado juntamente com o formulário que o contém, cria um conjunto de dados (objeto) chamado Recordsert, que pode ser acessado, em tempo de execução, pela propriedade Recordset. É essa propriedade que permite que o conjunto de dados seja acessado. Portanto, como veremos adiante, qualquer movimentação pelos registros, adição, deleção, deve ser feita com referência a essa propriedade. 2.5) A propriedade RecordsetType A propriedade RecordsetType define qual o tipo do Recordset criado, que pode ser Dynaset, Table ou Snapshot. Neste projeto, usaremos a propriedade com o valor Dynaset, e no próximo capítulo explicaremos a diferença entre esses tipos. A partir de agora, temos que acessar cada campo dessa tabela, para que possamos acessar os seus registros. 3 - Bound control Um bound control é um controle comum do VB, que pode ser conectado a um controle Data Control, desde que esse controle esteja no mesmo formulário. Sem um Data Control, não é possível fazer com que um controle funcione como um bound control em um formulário. Veremos mais adiante, quais são os controles que podem funcionar como um bound control, e como fazer para conectá-los ao data control. 3.1) As propriedades DataSource e DataField Todos os controles que podem funcionar como bound controls possuem essas duas propriedades. Elas providenciam a ligação ao controle Data e ao campo específico, respectivamente. 67 Nos controles textos e imagem do nosso formulário, alterar a propriedade DataSource da seguinte forma: DataSource = Data1 (é o valor da propriedade Name do Data Control do nosso formulário) fig 7.5 - as propriedades DataSource e DataField Para cada controle texto e para o controle imagem, colocar na propriedade DataField os nomes dos campos, em tempo de projeto, da seguinte forma: TXTnome.DataField = Nome TXTtelefone.DataField = fone TXTcomentarios.DataField = comentarios TXTfoto.DataField = foto - Utilizando o Data Manager, inserir dois registros no nosso banco de dados. - Inserir o seguinte código no nosso projeto: Sub Form_Load () BTNcancelar.Enabled = False BTNgravar.Enabled = False frmagenda.Show End Sub Sub Form_Activate () If Data1.Recordset.RecordCount = 0 Then TXTnome.Enabled = False txtfone.Enabled = False txtcomentarios.Enabled = False BTNgravar.Enabled = False End If LBLagenda.Caption = Data1.Recordset.RecordCount End Sub 4 - Objeto Recordset Como foi dito anteriormente, esse objeto é gerado quando o formulário que contem um controle de dados é carregado. Serão vistas adiante, algumas das características mais importantes desse objeto. 4.1) A propriedade RecordCount Retorna o número de registros acessados em um objeto Recordset ou o número total de registros em um objeto Recordset tipo table. Ela não indica quantos registros estão contidos em um objeto Recordset tipo dynaset, snapshot ou forward only, até que todos os registros tenham sido acessados. O código descrito acima habilita os textos do formulário, assim que ele é carregado, somente se houver algum registro. - Executar o programa. Podemos observar que apesar de não termos escrito praticamente nenhuma linha de código, já é possível visualizar e alterar os registros da nosso tabela, bastando escrever nos controles de texto e clicar nas setas do controle Data1. - Inserir os seguintes códigos: 68 Sub BTNnovo_Click () If Data1.Recordset.RecordCount <> 0 Then corrente_registro = Data1.Recordset.Bookmark End If Data1.Recordset.AddNew TXTnome.Enabled = True txtfone.Enabled = True txtcomentarios.Enabled = True Data1.Enabled = False BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False TXTnome.SetFocus End Sub 4.2) O Método AddNew Limpa o buffer do arquivo para a criação de um novo registro em um Recordset. Observe que o código do evento click do botão BTNnovo usa o método AddNew e habilita os textos e a imagem, para que possam ser preenchidos pelo usuário. Também habilitam e desabilitam os botões, conforme o caso. Sub BTNgravar_Click () If TXTnome.Text = "" Then MsgBox "É necessário preencher o nome!", , "Impossível gravar" TXTnome.SetFocus Exit Sub End If Data1.Enabled = True Data1.Recordset.Update BTNnovo.Enabled = True BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True Data1.Recordset.Bookmark = Data1.Recordset.LastModified LBLagenda.Caption = Data1.Recordset.RecordCount End Sub 4.3) O Método Edit Abre o registro corrente do Recordset especificado para edição, copiando o conteúdo para o buffer de arquivo. recordset.Edit Após a sua utilização, deve ser empregado o método Update, para que o conteúdo do buffer seja salvo no registo. 4.4) O Método Update Esse método é usado para salvar qualquer mudança em um registro, após a utilização dos métodos AddNew ou Edit. Ele grava o conteúdo do buffer do arquivo, no registro corrente. 4.5) A Propriedade Bookmark Determina qual o registro do Recordset é o registro corrente. Só é avaliado em tempo de execução. recordset.Bookmark [ = variavel ] Quando um Recordset é criado ou aberto, cada registro tem um único e inequívoco Bookmark. É possível salvar o Bookmark do registro corrente atribuindo esse valor a uma variável do tipo variant. Para retornar rapidamente a esse registro, após ter havido movimentação pelos registros, basta atribuir à propriedade Bookmark do Recordset o valor dessa variável. 69 4.6) A Propriedade LastModify Essa propriedade contem o Bookmark do registro mais recentemente modificado. Só é avaliada em tempo de execução. Recordset.Bookmark = Recordset.LastModified Pode ser usada para fazer com que o registro mais recentemente modificado passe a ser o registro corrente. 4.7) O Método Delete Este método exclui o registro atual em um objeto Recordset atualizável. Após esse método ser executado, é necessário mover o apontador de arquivo para um registro válido, pois o registro excluído deixa de existir. No projeto atual, é usado o método MoveFirst, que move o apontador para o primeiro registro do Recordset. Esse e os outros métodos associados à movimentação e à procura de registros serão vistos no capítulo seguinte. Insira os códigos abaixo e verifique o que ocorre, tendo em vista as explicações dos métodos e propriedades deste capítulo. Sub BTNcancelar_Click () clicou_cancelar = True If corrente_registro <> "" Then Data1.Recordset.Bookmark = corrente_registro End If clicou_cancelar = False Data1.Enabled = True BTNnovo.Enabled = True BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True End Sub Sub BTNexcluir_Click () If Data1.Recordset.RecordCount <> 0 Then Data1.Recordset.Delete Data1.Recordset.MoveFirst LBLagenda.Caption = Data1.Recordset.RecordCount Else MsgBox "Não há registro!", , "Impossível excluir" TXTnome.Enabled = False txtfone.Enabled = False txtcomentarios.Enabled = False End If End Sub - Inserir o seguinte código: Sub Image1_DblClick () On Error GoTo 1 CMdialog1.Action = 1 Image1.Picture = LoadPicture(CMdialog1.Filename) Exit Sub 1: Exit Sub End Sub Observe que ao dar dois clikes sobre a imagem, o controle de caixa de diálogos é ativado, permitindo a escolha de um arquivo de figura. Esse arquivo é então atribuído à propriedade Picture do controle imagem. Sub Image1_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As If Button = 2 Then If MsgBox("Deseja realmente excluir a foto?", 36, "Exclusão de Foto") = 6 Image1.Picture = LoadPicture("") End If End If End Sub Single) Then 70 Esse evento limpa o conteúdo da propriedade picture do controle imagem, caso o usuário assim deseje. Ele ocorre quando o usuário aperta o botão direito do mouse (devido a instrução If Button = 2 Then ). Vamos voltar a falar sobre o Data Control. Existem dois eventos principais associados a esse controle: Validate e Reposition. 5 - Os Eventos do Data Control 5.1) O Evento Reposition Quando o Data Control é carregado, o primeiro registro do Recordset é transformado no registro corrente, e o evento Reposition ocorre. Toda vez que o usuário clicar em qualquer botão do Data Control, movendo-se de registro em registro, ou usar os métodos Move ou Find (que serão vistos no próximo capítulo) o evento Reposition ocorre. Portanto, esse evento ocorre sempre depois que o registro corrente passar a ser outro registro. 5.2 - O Evento Validate O evento Validate ocorre antes de um registro diferente passar a ser o registro corrente, antes do método Update, e antes das operações Delete, Unload e Close. Possue dois parâmetros (como pode ser visto no código abaixo), que têm o seguinte significado: O argumento Action indica a operação que causou a ocorrência do evento. Os valores possíveis desse argumento são: Valor Descrição 0 1 2 3 4 5 6 7 8 9 10 11 Cancela a operação que causou o evento. MoveFirst método. MovePrevious método. MoveNext método. MoveLast método. AddNew método. Update operation. Delete método. Find método. A propriedade Bookmark foi alterada. Close método. O formulário começa a ser descarregado da memória. O argumento Save indica se houve mudança no dado que está no buffer. Se ele for True, os métodos Edit e UpdateRecord são invocados. Portanto, se algum texto tiver seu conteúdo modificado, e um botão do Data1 for clicado, automaticamente essa mudança será salva. Insira o seguinte código no evento Data1_Validate: Sub Data1_Validate (Action As Integer, save As Integer) If clicou_cancelar = True Then save = False End If End Sub Quando o botão cancelar é clicado, o registro que era o corrente volta a sê-lo (verifique o evento BTNcancelar_click). Houve, portanto, alteração da propriedade BookMark (action=9), e o evento validate ocorre. A variável clicou_cancelar neste momento é true, fazendo o argumento save = False, impedindo que os métodos Edit e UpdateRecord ocorram, não salvando qualquer mudança. Para uma maior comodidade, é repetido abaixo o evento Sub BTNcancelar_Click (): Sub BTNcancelar_Click () clicou_cancelar = True If corrente_registro <> "" Then Data1.Recordset.Bookmark = corrente_registro 'nesta linha o evento validate é 'acionado End If clicou_cancelar = False Data1.Enabled = True BTNnovo.Enabled = True BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True End Sub 71 Para encerrar esse projeto, inserir um menu com os itens mostrados abaixo: fig 7.6 - o menu do programa Nomeá-los como MNPOrdenar, MNSnome e MNSregistro. Eles serão usados para ordenar o Recordset por nome ou por ordem de entrada. Observe que isto é feito configurando-se a propriedade Data1.RecordSource com uma instrução SQL, contendo ou não um comando order by. Se essa cláusula estiver presente, isto gera um Recordset ordenado, caso contrário, é gerado o Recordset com os registros em ordem de digitação. Não esqueça que o Recordset só é gerado após o método Refresh ser executado,. Para maiores detalhes sobre a instrução SQL, consultar o apêndice que trata do assunto. Private Sub MNSnome_Click() Data1.RecordSource = "select * from agenda order by nome" Data1.Refresh MNSregistro.Checked = False MNSnome.Checked = True End Sub Private Sub MNSregistro_Click() Data1.RecordSource = "select * from agenda" Data1.Refresh MNSregistro.Checked = True MNSnome.Checked = False End Sub 72 CAPÍTULO VIII I - Objetos de Dados A utilização do controle de dados Data Control para realizar o acesso a um arquivo de dados MDB, foi vista no capítulo anterior. Neste capítulo veremos que esse acesso também é possível sem o uso do controle, mas com o uso dos objetos de dados disponíveis no VB. Um objeto de dados pode ser visto como uma variável que tem uma função específica no tratamento de banco de dados. Os principais objetos de dados do VB são os seguintes: DataBase e Recordset. Enquanto que o Data Control oferece facilidade no manuseio de um Banco de Dados, os Objetos de Dados permitem uma maior flexibilidade, porém com o ônus de uma maior codificação. 1.1) Objeto DataBase Um objeto database é usado para referenciar um arquivo de Banco de Dados (mdb, por exemplo). Sua função pode ser comparada à propriedade DataBaseName do Data Control. A declaração de um objeto database é feita da seguinte forma: Public <nome_objeto> as DataBase 1.2) Objeto Recordset Um objeto Recordset permite o acesso a uma tabela ou grupo de registros de uma ou mais tabelas de um banco de dados previamente aberto com o método Open DataBase. É equivalente à propriedade RecordSource do Data Control. A declaração é a seguinte: Public <nome_objeto> as Recordset Um Recordset pode ser de três tipos: Table, Dynaset ou Snapshot. A definição de qual o tipo do Recordset criado é feita por ocasião da inicialização do objeto, que será vista adiante. Essa definição corresponde à propriedade RecordsetType do Data Control. 1.2.1 - Table Uma table é uma representação física da estrutura do banco de dados. Um recordset do tipo table só pode ser ligado às tabelas existentes no arquivo de dados. É a ligação mais direta, e os dados são acessados e modificados em uma tabela um registro por vez. Como vantagens temos a possibilidade de criar e usar índices; utilizar o método Seek, que permite pesquisas rápidas em busca de um registro e visualizar as mudanças feitas por outros usuários em tempo real. As principais desvantagens são a impossibilidade de se definir filtros para limitar o escopo dos registros acessados e a não utilização dos métodos Find, que podem encontrar mais de uma ocorrência de um mesmo valor para uma determinada chave. O método Seek só encontra a primeira ocorrência. Para se abrir uma tabela, é necessário a inicialização de um objeto Recordset, através do método OpenRecordset. 1.2.2 - Dynaset Uma Dynaset é um agrupamento de dados provenientes de uma ou mais tabelas do banco de dados. Um recordset do tipo Dynaset é composto de campos selecionados, geralmente de um grupo de registros filtrados, de uma ou mais tabelas. Ele permite que seja feito acesso a várias tabelas de um banco de dados, usando-se uma instrução SQL. Na verdade, um Dynaset é um ponteiro de registros para o que havia nas tabelas no momento em que ele foi criado. Qualquer alteração no Dynaset se reflete nas tabelas originais, mas uma alteração em qualquer tabela, não se reflete no Dynaset, devendo ele ser atualizado. Isso diminui a sua utilização em programas multiusuário. Como vantagens temos a possibilidade de manipular informações provenientes de várias tabelas; utilizar os método Find; filtrar campos e registros. As principais desvantagens são a impossibilidade de se utilizar índices e o fato de que ele não reflete as alterações que outros programas ou usuários possam fazer nas tabelas. Para se abrir uma Dynaset, é necessário a inicialização de um objeto Recordset, através do método OpenRecordset. 1.2.3 - Sanpshot Uma Sanpshot é uma cópia dos dados provenientes de uma ou mais tabelas do banco de dados. Um recordset do tipo Sanpshot é quase idêntico ao dynaset. A diferença é que um Sanpshot não pode ser atualizado, sendo apenas de leitura. A sua utilização normalmente se faz em relatórios ou telas de visualização de dados. Existe um tipo de Sanpshot chamado Forward-Only, que só pode ser percorrido no sentido ascendente dos registros, não sendo possível o emprego dos métodos Move. 73 Como vantagens temos a possibilidade de manipular informações provenientes de várias tabelas; utilizar os método Find; filtrar campos e registros. As principais desvantagens são a impossibilidade de se utilizar índices e o fato de que ele não reflete as alterações que outros programas ou usuários possam fazer nas tabelas, e o fato de que ele não é atualizável. Para se abrir uma Sanpshot, é necessário a inicialização de um objeto Recordset, através do método OpenRecordset. 1.3) Método OpenDataBase Proporciona a abertura de um arquivo de banco de dados, e o associa a um objeto database. É a inicialização do objeto. Por exemplo: Public Dbagenda as DataBase {declaração} Set DBagenda = OpenDatabase("C:\agenda\agenda.mdb") {inicialização} 1.4) Método OpenRecordset Este método associa uma ou mais tabelas de um banco de dados, a um objeto Recordset. Quando o objeto é uma table, somente uma tabela pode ser associada; quando o objeto é um dynaset ou um snapshot, pode ser usada uma instrução SQL que filtre os dados de várias tabelas. A sintaxe é a seguinte: Set objeto = objeto_database.OpenRecordset (origem,tipo,opções) Uma table só pode ser criada a partir de um objeto DataBase, mas um dynaset e um snapshot também podem ser criados a partir de outro dynaset ou snapshot. Neste último caso, o argumento origem não é usado. Veremos a seguir vários exemplos de declarações que criam table, dynaset e snapshot. Set DBagenda = OpenDatabase("C:\AGENDA.MDB") Set DYNagenda = DBagenda.OpenRecordset("Select * from agenda order by nome", DbOpenDynaset) 'cria um dynaset Set TABagenda = DBagenda.OpenRecordset("agenda", DbOpenTable) 'cria uma table Set DYNagenda = DBagenda.OpenRecordset("Select * from agenda order by nome", DbOpenSnapshot) 'cria um snapshot Com os objetos de banco de dados vistos, é possível a utilização dos seguintes métodos: métodos Move, métodos Find, método Delete, método Close. Com o objeto Table é possível também a utilização do método Seek, desde que haja um índice especificado para a tabela, mas não é possível a utilização dos métodos Find. Será visto a seguir, como utilizar esses métodos. 1.5) Os Métodos Find São quatro: FindPrevious, FindNext, FindLast e FindFirst. Servem para procurar o registro anterior, o próximo registro, o último registro e o primeiro registro (respectivamente) que se enquadre no critério de procura. A sintaxe é a seguinte: recordset.FindFirst criterio recordset.FindLast criterio recordset.FindNext criterio recordset.FindPrevious criterio onde recordset é um objeto do tipo dynaset ou snapshot. O critério é uma string que contém uma instrução SQL, sem a palavra Where. Por exemplo: DYNagenda.FindFirst “nome = ‘Jose’” {posiciona no primeiro registro cujo conteúdo do campo nome seja igual a Jose} 1.6) Os Métodos Move São quatro: MovePrevious, MoveNext, MoveLast e MoveFirst. Servem para movimentar o ponteiro de registros para o registro anterior, para o próximo registro, para o último registro e para o primeiro registro, respectivamente. A sintaxe é a seguinte: recordset.MoveFirst recordset.MoveLast recordset.MoveNext recordset.MovePrevious onde recordset é um objeto do tipo table, dynaset ou snapshot. Por exemplo: 74 DYNagenda.MoveLast {posiciona no último registro do dynaset} Não esqueça que a propriedade recordset de um Data Control cria um dynaset, um snapshot ou uma table, de acordo com a propriedade RecordsetType, o que significa que esses métodos podem ser usados com um Data Control, através da propriedade recordset. Por exemplo: Data1.recordset.MoveLast {posiciona no último registro} 1.7) O Método Seek Localiza um registro em um objeto Table indexado, seguindo o critério especificado para o índice corrente. A sintaxe é a seguinte: <nome_table>.Seek comparação, chave1, chave2... onde comparação é uma das seguintes strings: <, <=, =, >=, >, ou <>. Devem vir entre aspas duplas. Chaves é um valor para cada campo do índice corrente da table. 1.8) A propriedade Index Define ou retorna um valor que indica o nome do objeto Index atual em um objeto Recordset tipo table. Para utilizar o método Seek, a propriedade Index do recordset deve ser definida antes. O objeto Index especificado deve já estar definido. Se você definir a propriedade Index como um objeto Index que não existe ou se a propriedade Index não for definida quando você usar o método Seek, ocorrerá um erro interceptável. O índice pode ser criado através do Visual Data Manager, ou usando a declaração CreateIndex. A forma de se definir o objeto index utilizado é a seguinte: <nome_table>.Index = nome_do_indice Essa instrução determina qual o índice existente será usado como o índice corrente para indexar os registros de um objeto criado a partir de uma tabela. table.Index [ = indexname ] Indexname é o nome do índice, podendo ser definido através do Visual Data Manager. Sempre que se quiser usar o método seek, deve-se antes se determinar o índice, configurando-se a propriedade index. Por exemplo: TABagenda.index = "indcpf" TABagenda.seek "=", 22314456 {já existe um índice com esse nome} {procura pelo registro que tenha esse cpf} OBS: As propriedades e os métodos vistos para os objetos de acesso a dados podem ser empregados a um controle Data Control, através da propriedade Recordset, observando o tipo de recordset definido pela propriedade RecordsetType. 2 - Praticando com Objetos de Dados Vamos agora por em prática os conhecimentos obtidos, e criar um programa com funções semelhantes ao criado no capítulo anterior, mas usando objetos de dados no lugar do Data Control. A listagem do programa, que tem a aparência da figura 8.1, servirá como exemplo dos conceitos vistos neste capítulo: Option Explicit Public DBagenda As Database Public DYNagenda As Recordset Public TABagenda As Recordset Public corrente_registro Dim inicio, clicou_procurar, clicou_ordenar As Integer Dim clicou_excluir, clicou_novo, clicou_cancelar As Integer Dim clicou_proximo, clicou_anterior As Integer 75 fig 8.1 - Usando objetos de acesso a dados Sub grava_registro() DYNagenda("nome") = FRMagenda.TXTnome DYNagenda("telefone") = FRMagenda.TXTfone DYNagenda("comentarios") = FRMagenda.TXTcomentarios DYNagenda("foto") = FRMagenda.CMDialog1.filename End Sub Sub le_registro() FRMagenda.TXTnome = DYNagenda("nome") If IsNull(DYNagenda("telefone")) Then FRMagenda.TXTfone = "" Else FRMagenda.TXTfone = DYNagenda("telefone") End If If IsNull(DYNagenda("comentarios")) Then FRMagenda.TXTcomentarios = "" Else FRMagenda.TXTcomentarios = DYNagenda("comentarios") End If If IsNull(DYNagenda("foto")) Then FRMagenda.Image1.Picture = LoadPicture("") Else FRMagenda.Image1.Picture = LoadPicture(DYNagenda("foto")) End If End Sub Private Sub BTNanterior_Click() If DYNagenda.RecordCount = 0 Then MsgBox "Não há registro!", , "Atenção" Exit Sub End If clicou_anterior = True DYNagenda.MovePrevious If Not (DYNagenda.BOF) Then le_registro corrente_registro = DYNagenda.Bookmark Else DYNagenda.MoveNext End If clicou_anterior = False 76 End Sub Private Sub BTNcancelar_Click() clicou_cancelar = True If Not IsEmpty(corrente_registro) Then DYNagenda.Bookmark = corrente_registro le_registro Else FRMagenda.TXTnome = "" FRMagenda.TXTfone = "" FRMagenda.TXTcomentarios = "" FRMagenda.Image1 = LoadPicture("") End If clicou_cancelar = False clicou_novo = False BTNnovo.Enabled = True BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNproximo.Enabled = True BTNanterior.Enabled = True End Sub Private Sub BTNexcluir_Click() clicou_excluir = True If DYNagenda.RecordCount <> 0 Then DYNagenda.Delete Set DYNagenda = DBagenda.OpenRecordset("agenda", dbOpenDynaset) 'Set CMPnome = DYNagenda("nome") 'Set CMPtelefone = DYNagenda("telefone") 'Set CMPcomentarios = DYNagenda("comentarios") 'Set CMPfoto = DYNagenda("foto") If DYNagenda.RecordCount <> 0 Then DYNagenda.MoveFirst le_registro corrente_registro = DYNagenda.Bookmark Else TXTnome.Text = "" TXTfone.Text = "" TXTcomentarios.Text = "" Image1.Picture = LoadPicture("") TXTnome.Enabled = False TXTfone.Enabled = False TXTcomentarios.Enabled = False Image1.Enabled = False corrente_registro = Empty End If If DYNagenda.RecordCount <> 0 Then DYNagenda.MoveLast DYNagenda.MoveFirst If DYNagenda.RecordCount <= 1 Then LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro" Else LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros" End If Else LBLagenda.Caption = "Não há registro" End If Else MsgBox "Não há registro!", , "Impossível excluir" TXTnome.Enabled = False TXTfone.Enabled = False TXTcomentarios.Enabled = False Image1.Enabled = False End If 77 clicou_excluir = False End Sub Private Sub BTNgravar_Click() If TXTnome.Text = "" Then MsgBox "É necessário preencher o nome!", , "Impossível gravar" TXTnome.SetFocus Exit Sub End If grava_registro DYNagenda.Update DYNagenda.Bookmark = DYNagenda.LastModified corrente_registro = DYNagenda.Bookmark BTNnovo.Enabled = True BTNgravar.Enabled = False BTNcancelar.Enabled = False BTNexcluir.Enabled = True BTNproximo.Enabled = True BTNanterior.Enabled = True DYNagenda.Bookmark = DYNagenda.LastModified If DYNagenda.RecordCount <= 1 Then LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro" Else LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros" End If clicou_novo = False End Sub Private Sub BTNimprimir_Click() Dim x x = MsgBox("Somente esse registro?", 35, "Imprimir") If x = 6 Then Report1.SelectionFormula = "{agenda.nome} = '" + TXTnome.Text + "'" Report1.Action = 1 ElseIf x = 7 Then Report1.SelectionFormula = "" '+ TXTnome.Text Report1.Action = 1 End If End Sub Private Sub BTNnovo_Click() clicou_novo = True If DYNagenda.RecordCount <> 0 Then corrente_registro = DYNagenda.Bookmark End If DYNagenda.AddNew TXTnome.Enabled = True TXTfone.Enabled = True TXTcomentarios.Enabled = True Image1.Enabled = True TXTnome.Text = "" TXTfone.Text = "" TXTcomentarios.Text = "" Image1.Picture = LoadPicture("") BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False TXTnome.SetFocus End Sub Private Sub BTNproximo_Click() 78 If DYNagenda.RecordCount = 0 Then MsgBox "Não há registro!", , "Atenção" Exit Sub End If clicou_proximo = True DYNagenda.MoveNext If Not (DYNagenda.EOF) Then le_registro corrente_registro = DYNagenda.Bookmark Else DYNagenda.MovePrevious End If clicou_proximo = False End Sub Private Sub BTNsair_Click() End End Sub Private Sub Form_Load() 'abre o arquivo agenda.mdb, e o associa à variável DBagenda Set DBagenda = OpenDatabase("C:\CURSOVB\AULA08\AGENDA.MDB") 'associa o dynaset DYNagenda à tabela agenda Set DYNagenda = DBagenda.OpenRecordset("agenda", dbOpenDynaset) 'associa cada variável field ao campo respectivo da tabela agenda 'Set CMPnome = DYNagenda("nome") 'Set CMPtelefone = DYNagenda("telefone") 'Set CMPcomentarios = DYNagenda("comentarios") 'Set CMPfoto = DYNagenda("foto") 'executa o corpo do if somente se houver algum registro 'na tabela If DYNagenda.RecordCount <> 0 Then inicio = True le_registro inicio = False corrente_registro = DYNagenda.Bookmark Else 'se não houver registro TXTnome.Enabled = False TXTfone.Enabled = False TXTcomentarios.Enabled = False Image1.Enabled = False BTNgravar.Enabled = False End If BTNcancelar.Enabled = False BTNgravar.Enabled = False 'informa o nº de registros If DYNagenda.RecordCount <> 0 Then DYNagenda.MoveLast DYNagenda.MoveFirst If DYNagenda.RecordCount <= 1 Then LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro" Else LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros" End If Else LBLagenda.Caption = "Não há registro" End If FRMagenda.Show End Sub 79 Private Sub Image1_DblClick() On Error GoTo 1 CMDialog1.Action = 1 Image1.Picture = LoadPicture(CMDialog1.filename) If BTNnovo.Enabled = True Then DYNagenda.Edit End If BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False Exit Sub 1: Exit Sub End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single) On Error GoTo 1 If Button = 2 Then If MsgBox("Deseja realmente excluir a foto?", 36, "Exclusão de foto") = 6 Then Image1.Picture = LoadPicture("") Else Exit Sub End If If BTNnovo.Enabled = True Then DYNagenda.Edit End If BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False BTNproximo.Enabled = False BTNanterior.Enabled = False End If Exit Sub 1: Exit Sub End Sub Private Sub MNSnome_Click() clicou_ordenar = True Set DYNagenda = DBagenda.OpenRecordset("select * from agenda order by nome") le_registro corrente_registro = DYNagenda.Bookmark MNSregistro.Checked = False MNSnome.Checked = True clicou_ordenar = False End Sub Private Sub MNSnome2_Click() clicou_procurar = True FRMprocurar.Show 1 clicou_procurar = False End Sub Private Sub MNSproximo_Click() clicou_procurar = True DYNagenda.FindNext "nome = '" + TXTnome.Text + "'" If DYNagenda.NoMatch Then MsgBox "Não existem mais registros com esse nome!", 0, "Aviso" DYNagenda.Bookmark = corrente_registro 80 Else le_registro corrente_registro = DYNagenda.Bookmark End If clicou_procurar = False End Sub Private Sub MNSregistro_Click() clicou_ordenar = True Set DYNagenda = DBagenda.OpenRecordset("select * from agendA") le_registro corrente_registro = DYNagenda.Bookmark MNSregistro.Checked = True MNSnome.Checked = False clicou_ordenar = False End Sub Private Sub TXTcomentarios_Change() If clicou_procurar Or clicou_ordenar Or clicou_anterior Or clicou_proximo Or clicou_novo Or clicou_excluir Or inicio Then Exit Sub End If DYNagenda.Edit BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False End Sub Private Sub TXTfone_Change() If clicou_procurar Or clicou_ordenar Or clicou_anterior Or clicou_proximo Or clicou_novo Or clicou_excluir Or inicio Then Exit Sub End If DYNagenda.Edit BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False End Sub Private Sub TXTnome_Change() If clicou_procurar Or clicou_ordenar Or clicou_anterior _ Or clicou_proximo Or clicou_novo Or clicou_excluir _ Or inicio Then Exit Sub End If DYNagenda.Edit BTNnovo.Enabled = False BTNgravar.Enabled = True BTNcancelar.Enabled = True BTNexcluir.Enabled = False End Sub 81 ÍNDICE ANALÍTICO CAPÍTULO I............................................................................................................................................................................... 1 1 - CRIAÇÃO DE UM PROGRAMA ........................................................................................................................................ 1 2 - AS PARTES DE UM PROGRAMA..................................................................................................................................... 1 3 - AMBIENTE DE PROGRAMAÇÃO VB ............................................................................................................................... 1 3.1) Barra de menu ............................................................................................................................................................ 1 3.2) Barra de ferramentas (atalho para as opções de menu)............................................................................................. 1 3.3) Caixa de ferramentas (ToolBox) ................................................................................................................................. 1 3.4) Janela de projeto......................................................................................................................................................... 1 3.5) Janela de propriedades............................................................................................................................................... 2 4 - PROJETO ......................................................................................................................................................................... 3 4.1) O que é um projeto .................................................................................................................................................... 3 4.2) Componentes de um projeto ....................................................................................................................................... 3 4.3) Salvando um projeto ................................................................................................................................................... 3 4.4) Gerando um executável .............................................................................................................................................. 3 5 - O PROGRAMA INAUGURAL ............................................................................................................................................ 3 5.1) Botões de Comando, Quadro Texto e Label ............................................................................................................... 4 5.2) Evento Click ................................................................................................................................................................ 5 6 - OUTRO PROGRAMA........................................................................................................................................................ 6 6.1) Propriedades Top, Left, Width, Height e ScaleMode .................................................................................................. 6 6.2) Propriedades Alignment e MultiLine............................................................................................................................ 6 6.3) Barra de Rolagem Horizontal (HScrollBar) ................................................................................................................. 7 6.4) Propriedades Min, Max, Value, SmallChange e LargChange ..................................................................................... 7 6.5) Foco do Teclado - Propriedade TabIndex................................................................................................................... 7 6.6) Evento Change ........................................................................................................................................................... 7 6.7) Evento Load ................................................................................................................................................................ 8 6.8) Propriedade Enabled .................................................................................................................................................. 8 6.9) Evento Scroll ............................................................................................................................................................... 8 CAPÍTULO II.............................................................................................................................................................................. 9 1 - TIPOS DE DADOS ............................................................................................................................................................ 9 2 - DECLARAÇÃO DE VARIÁVEIS ........................................................................................................................................ 9 2.1) Dim.............................................................................................................................................................................. 9 2.2) Public .......................................................................................................................................................................... 9 2.3) Private......................................................................................................................................................................... 9 2.4) Static ........................................................................................................................................................................... 9 2.5) Matrizes .................................................................................................................................................................... 10 2.6) Redim........................................................................................................................................................................ 10 3 - INSTRUÇÕES DE CONTROLE DE FLUXO DE PROGRAMAS ...................................................................................... 10 3.1) If <expressão> Then <comando> End If ................................................................................................................... 10 3.2) A instrução Select Case............................................................................................................................................ 11 3.3) A instrução Do While ... Loop.................................................................................................................................... 11 3.4) A instrução Do ... Loop While.................................................................................................................................... 11 3.5) A instrução For ... Next ............................................................................................................................................. 12 3.6) A instrução Exit For................................................................................................................................................... 12 3.7) A instrução Exit Do.................................................................................................................................................... 12 4 - SELECIONANDO OPÇÕES............................................................................................................................................ 12 4.1) Option Button e Check Box ....................................................................................................................................... 13 5 - ESCREVENDO E CHAMANDO FUNÇÕES E PROCEDIMENTOS................................................................................. 13 5.1) Procedimentos (Sub) ................................................................................................................................................ 13 5.2) Funções .................................................................................................................................................................... 15 5.3) Função Val() ............................................................................................................................................................. 17 5.4) Propriedade AutoSize ............................................................................................................................................... 17 CAPÍTULO III........................................................................................................................................................................... 18 1- CONTROLANDO O TEMPO ............................................................................................................................................ 18 1.1) Timer Control ............................................................................................................................................................ 18 1.2) Propriedade Interval e o evento Timer ...................................................................................................................... 18 2 - USANDO O MOUSE........................................................................................................................................................ 19 2.1) List Box Control......................................................................................................................................................... 20 2.2) Métodos AddItem e RemoveItem.............................................................................................................................. 20 2.3) Combo Box Control................................................................................................................................................... 21 2.4) Picture Box Control ................................................................................................................................................... 21 2.5) O Evento MouseDown .............................................................................................................................................. 21 82 2.6) As Coordenadas do Formulário ................................................................................................................................ 22 2.7) O Método Move......................................................................................................................................................... 22 2.8) O Evento MouseMove............................................................................................................................................... 22 2.9) O Método Circle ........................................................................................................................................................ 23 3 - UTILIZANDO MENUS ..................................................................................................................................................... 23 3.1) Menu ......................................................................................................................................................................... 24 3.2) Função Qbcolor() ...................................................................................................................................................... 25 3.3) A propriedade WindowState do Formulário .............................................................................................................. 25 3.4) O evento Resize do Formulário................................................................................................................................. 26 3.5) Menus Instantâneos.................................................................................................................................................. 26 3.6) Método PopUpMenu ................................................................................................................................................. 26 4 - FORMULÁRIO MDI ......................................................................................................................................................... 27 4.1) MDI Form .................................................................................................................................................................. 27 4.2) Propriedade Align...................................................................................................................................................... 27 4.3) Vetor de Controles .................................................................................................................................................... 28 CAPÍTULO IV .......................................................................................................................................................................... 30 1- MANIPULANDO JANELAS E MENSAGENS ................................................................................................................... 30 1.1) O Controle SSPanel.................................................................................................................................................. 30 1.2) Usando novos Formulários ....................................................................................................................................... 31 1.3) Os Métodos Load e Unload e os Eventos Load e Unload......................................................................................... 32 1.4) Os Métodos Show e Hide e os Eventos Activate e Deactivate ................................................................................. 32 1.5) Janelas Personalizadas ............................................................................................................................................ 32 1.6) Janelas Padronizadas - MsgBox e InputBox............................................................................................................ 33 1.7) Função IsNumeric ..................................................................................................................................................... 36 1.8) Função IsDate........................................................................................................................................................... 36 1.9) Função WeekDay...................................................................................................................................................... 36 2 - JANELAS DE DIÁLOGOS COMUNS............................................................................................................................... 36 2.1) O Controle Common Dialog ...................................................................................................................................... 37 2.2) Métodos ShowColor, ShowFont, ShowOpen, ShowSave e ShowPrinter................................................................. 40 2.3) A Função Len............................................................................................................................................................ 40 2.4) A Função Mid ............................................................................................................................................................ 40 2.5) O Comando Shell...................................................................................................................................................... 40 CAPITULO V ........................................................................................................................................................................... 41 1 - OS CONTROLES GRÁFICOS......................................................................................................................................... 41 1.1) Shape Control ........................................................................................................................................................... 41 1.2) Line Control............................................................................................................................................................... 41 1.3) O Controle SpinButton .............................................................................................................................................. 43 2 - OS MÉTODOS GRÁFICOS ............................................................................................................................................. 44 2.1) O Método Cls ............................................................................................................................................................ 45 2.2) A Função Rnd ........................................................................................................................................................... 46 2.3) A Função RGB .......................................................................................................................................................... 46 2.4) O Método Pset .......................................................................................................................................................... 47 2.5) O Método Line........................................................................................................................................................... 47 2.6) O Método Circle ........................................................................................................................................................ 47 3 - OS CONTROLES DE IMAGEM ....................................................................................................................................... 48 3.1) Picture Box Control ................................................................................................................................................... 48 3.2) Image Control............................................................................................................................................................ 48 3.3) Vetor de Controles .................................................................................................................................................... 49 CAPÍTULO VI .......................................................................................................................................................................... 51 1 - MANIPULANDO ARQUIVOS .......................................................................................................................................... 51 1.1) O Evento de Formulário Resize ................................................................................................................................ 51 1.2) A Função FreeFile..................................................................................................................................................... 52 1.3) O Comando Open ..................................................................................................................................................... 52 1.4) A Função Input.......................................................................................................................................................... 52 1.5) A Função LOF........................................................................................................................................................... 52 1.6) O método Close ........................................................................................................................................................ 52 1.7) O Método Print .......................................................................................................................................................... 53 2 - ÁREA DE TRANSFERÊNCIA .......................................................................................................................................... 53 2.1) O Objeto ClipBoard ................................................................................................................................................... 53 2.2) O Método Clear......................................................................................................................................................... 54 2.3) O Método SetText ..................................................................................................................................................... 54 2.4) O Método SetData .................................................................................................................................................... 54 2.5) O Método GetText..................................................................................................................................................... 54 2.6) O Método GetData .................................................................................................................................................... 54 83 2.7) A Propriedade SelText .............................................................................................................................................. 54 3 - MANIPULANDO ERROS................................................................................................................................................. 54 3.1) On Error .................................................................................................................................................................... 55 3.2) A função Err .............................................................................................................................................................. 55 4 - MANIPULANDO ARQUIVOS DE REGISTROS ............................................................................................................... 55 4.1) A Declaração Type.................................................................................................................................................... 56 4.2) O Procedimento Get ................................................................................................................................................. 57 4.3) O Procedimento Put.................................................................................................................................................. 59 4.4) O Procedimento Kill .................................................................................................................................................. 62 4.5) O Procedimento Name ... as ... ................................................................................................................................. 62 4.6) As Funções UCase e LCase ..................................................................................................................................... 63 4.7) As Funções Trim, LTrim e RTrim .............................................................................................................................. 63 CAPÍTULO VII ......................................................................................................................................................................... 65 1 - DEFINIÇÕES GERAIS DE BANCO DE DADOS ........................................................................................................................... 65 1.1) Definições Gerais de Banco de Dados ..................................................................................................................... 65 1.2) Banco de Dados MDB............................................................................................................................................... 65 2 - O DATA CONTROL .............................................................................................................................................................. 65 2.1) A propriedade Connect ............................................................................................................................................. 66 2.2) A propriedade DataBase........................................................................................................................................... 66 2.3) A propriedade RecordSource.................................................................................................................................... 66 2.4) A propriedade Recordset .......................................................................................................................................... 67 2.5) A propriedade RecordsetType .................................................................................................................................. 67 3 - BOUND CONTROL ............................................................................................................................................................... 67 3.1) As propriedades DataSource e DataField................................................................................................................. 67 4 - OBJETO RECORDSET .......................................................................................................................................................... 68 4.1) A propriedade RecordCount ..................................................................................................................................... 68 4.2) O Método AddNew.................................................................................................................................................... 69 4.3) O Método Edit ........................................................................................................................................................... 69 4.4) O Método Update...................................................................................................................................................... 69 4.5) A Propriedade Bookmark .......................................................................................................................................... 69 4.6) A Propriedade LastModify......................................................................................................................................... 70 4.7) O Método Delete ....................................................................................................................................................... 70 5 - OS EVENTOS DO DATA CONTROL ........................................................................................................................................ 71 5.1) O Evento Reposition ................................................................................................................................................. 71 5.2 - O Evento Validate .................................................................................................................................................... 71 CAPÍTULO VIII ........................................................................................................................................................................ 73 I - OBJETOS DE DADOS ............................................................................................................................................................ 73 1.1) Objeto DataBase....................................................................................................................................................... 73 1.2) Objeto Recordset ...................................................................................................................................................... 73 1.3) Método OpenDataBase............................................................................................................................................. 74 1.4) Método OpenRecordset ............................................................................................................................................ 74 1.5) Os Métodos Find....................................................................................................................................................... 74 1.6) Os Métodos Move ..................................................................................................................................................... 74 1.7) O Método Seek ......................................................................................................................................................... 75 1.8) A propriedade Index.................................................................................................................................................. 75 2 - PRATICANDO COM OBJETOS DE DADOS ................................................................................................................................ 75 84