You are on page 1of 129

MICROSOFT VISUAL BASIC

DESVENDANDO A LINGUAGEM DE PROGRAMAÇÃO


MAIS POPULAR DO MUNDO

Autor: William Costa Rodrigues


Copyright© 2004, W.C. Rodrigues (Lizaro Soft)
Sumário
1. INTRODUÇÃO .............................................................................................................1

2. CONCEITOS BÁSICO DO VISUAL BASIC.....................................................................3


2.1. INTERFACE DO VISUAL BASIC ................................................................................................. 3
2.2. CONTROLE BÁSICO ............................................................................................................... 4
2.3. CONTROLES PERSONALIZADOS ................................................................................................ 5
2.4. TIPOS DE PROJETOS .............................................................................................................. 5
2.5. TIPO DE VARIÁVEIS .............................................................................................................. 6
2.6. DECLARANDO VARIÁVEIS NO VISUAL BASIC .............................................................................. 6
2.7. CONVERTENDO DADOS .......................................................................................................... 7
2.8. EXERCÍCIOS......................................................................................................................... 8
3. ESTRUTURA DE UMA APLICAÇÃO ..............................................................................9
3.1. ESTRUTURAS DE PROGRAMAÇÃO DO VISUAL BASIC ................................................................... 10
3.1.1. Tipos de Estruturas de Linguagem......................................................................................10
3.1.1.1. Estrutura de Tomada de Decisão:................................................................................10
3.1.1.1.1 IF... Then... Else ....................................................................................................10
3.1.1.1.2 IIF ........................................................................................................................11
3.1.1.1.3 Select Case............................................................................................................11
3.1.1.2. Estrutura de Loop ......................................................................................................11
3.1.1.2.1 For... Next .............................................................................................................11
3.1.1.2.2 Do... Loop .............................................................................................................12
3.1.1.2.3 Do While... Loop ....................................................................................................12
3.1.1.2.4 Do Until... Loop......................................................................................................12
3.1.1.2.5 While... Wend ........................................................................................................13
3.1.1.2.6 For Each... Next .....................................................................................................13
3.1.1.2.7 With... End With.....................................................................................................13
3.1.1.3. Saindo das Estruturas de Loop ....................................................................................14
3.2. FORMULÁRIOS E CONTROLES ................................................................................................ 14
3.3. MÓDULOS (MODULE) E MÓDULOS CLASSE (CLASS MODULE)...................................................... 17
3.3.1. Módulos (Module) .............................................................................................................17
3.3.2. Módulos Classe (Class Module)...........................................................................................18
3.4. MENU EDITOR .................................................................................................................... 20
3.5. EXERCÍCIOS....................................................................................................................... 21
4. CONTROLES PERSONALIZADOS (PROPRIEDADES E EVENTOS)..............................25
4.1. MICROSOFT WINDOWS COMMON CONTROL 6.0....................................................................... 26
4.1.1. ImageList (Lista de Imagens).............................................................................................26
4.1.1.1. Carregando uma Imagem da Coleção. .........................................................................26
4.1.2. Controle ListView (Lista de Visualização) .............................................................................28
4.1.3. Controle ProgressBar (Barra de Progresso)..........................................................................30
4.1.4. Controle StatusBar (Barra de Status) ..................................................................................31
4.1.5. Controle ToolBar (Barra de Ferramentas) ............................................................................32
4.1.6. Controle TreeView (Árvore de Visualização).........................................................................34
4.1.7. Controle Slider ..................................................................................................................37
4.2. EXERCÍCIOS....................................................................................................................... 37
5. FUNÇÕES DATA E HORA ...........................................................................................39
5.1. DATE ................................................................................................................................ 39
5.2. DATAVALUE ....................................................................................................................... 39
5.3. FORMAT ............................................................................................................................ 39
5.4. PROJETO COMENTADO ......................................................................................................... 39
6. CONTROLANDO AS VERSÕES E INFORMAÇÕES DO SEU APLICATIVO ....................41
III Microsoft Visual Basic – Sumário

7. TRABALHANDO COM FUNÇÕES NUMÉRICAS E FINANCEIRAS ................................45


7.1. FUNÇÕES NUMÉRICAS ......................................................................................................... 45
7.2. FUNÇÕES FINANCEIRAS ....................................................................................................... 45
7.2.1. Função Pmt (Pagamento de Anuidade Baseado num Período) ...............................................45
7.2.2. Função FV (Valor Futuro de Anuidade)................................................................................46
7.2.3. Função IPmt (Taxa de Juros para Durante um Período)........................................................46
7.2.4. Função NPer (Número de Períodos para Atingir uma Anuidade) ............................................46
7.2.5. Função PV (Presente Valor Presente Baseado num Período)..................................................46
7.2.6. Função NPV (Valor Presente Líquido) ..................................................................................46
7.2.7. Função Rate (Taxa por Período) .........................................................................................46
8. INICIANDO COM A SQL (STRUCTURED QUERY LANGUAGE)...................................47
8.1. CRIANDO TABELAS VIA SQL. ................................................................................................ 48
8.2. ÍNDICES E TABELAS - CRIAR, ALTERAR E EXCLUIR .................................................................... 49
8.2.1. Excluindo Tabelas .............................................................................................................49
8.2.2. Alterando Tabelas .............................................................................................................49
8.2.3. Criando Índices.................................................................................................................50
8.2.4. Excluindo Índices ..............................................................................................................50
8.3. TESTANDO AS INSTRUÇÕES SQL ........................................................................................... 50
8.4. SQL - CRIANDO CONSULTAS PARAMETRIZADAS ....................................................................... 50
8.4.1. Métodos de QueryDef........................................................................................................51
9. TRABALHANDO COM BANCO DE DADOS ACCESS ....................................................53
9.1. CRIANDO UM BANCO DE DADOS ............................................................................................ 53
9.2. O MODELO DAO (DATA ACCESS OBJECT) ............................................................................... 54
9.3. ABRINDO UM BANCO DE DADOS ............................................................................................ 55
9.3.1. Recordset.........................................................................................................................55
9.3.1.1. dbOpenTable.............................................................................................................55
9.3.1.2. dbOpenDynaset .........................................................................................................55
9.3.1.3. dbOpenSnapshot .......................................................................................................56
9.3.1.4. dbOpenFowardOnly ...................................................................................................56
9.3.1.5. dbAppendOnly...........................................................................................................57
9.3.1.6. dbReadOnly ..............................................................................................................57
9.3.1.7. dbSeeChanges...........................................................................................................57
9.3.2. Utilizando o Motor do Banco de Dados DBEngine .................................................................57
9.3.3. Utilizando o Controle DataControl .......................................................................................58
9.4. ACESSANDO DADOS DE UMA TABELA ...................................................................................... 58
9.4.1. Acesso à Dados de uma Tabela Utilizando o DataControl ......................................................58
9.4.2. Acesso à Dados de uma Tabela Utilizando Instrução SQL .....................................................58
9.5. ADICIONANDO, LOCALIZANDO, EDITANDO E EXCLUINDO DADOS DE UMA TABELA ........................... 59
9.5.1. Adicionado Dados .............................................................................................................59
9.5.2. Localizando Dados ............................................................................................................60
9.5.2.1. Exemplo de como Localizar Dados...............................................................................61
9.5.3. Editando Dados ................................................................................................................63
9.6. COMPACTANDO E RECUPERANDO UM BANCO DE DADOS ............................................................. 63
9.6.1. Compactando Banco de Dados ...........................................................................................63
9.6.2. Recuperando Banco de Dados............................................................................................64
9.7. SALVANDO E RECUPERAR FIGURAS NUM BANCO DE DADOS EM CAMPO OLE .................................. 64
9.8. ACESSANDO OUTROS BANCOS DE DADOS ................................................................................ 66
9.8.1. Banco de Dados dBase ......................................................................................................66
10. TRABALHANDO COM O CONTROLE MSCHART NO VISUAL BASIC ...........................69
10.1. CRIANDO UM GRÁFICO MANUALMENTE ................................................................................... 70
10.2. ACESSANDO DADOS DE UM BANCO DE DADOS PARA PLOTAR UM GRÁFICO ..................................... 73
11. TRATANDO ERROS EM SUA APLICAÇÃO ..................................................................75
11.1. OS OBJETO ERR E ERROR DO VISUAL BASIC ............................................................................ 75
IV

11.1.1. Propriedades dos ObjetosErr e Error ...............................................................................75


11.1.1.1. Propriedade Description .............................................................................................75
11.1.1.2. Propriedades HelpFile/HelpContext ..............................................................................75
11.1.1.3. Propriedades Number.................................................................................................75
11.1.1.4. Propriedades Source ..................................................................................................75
11.1.1.5. Propriedades LastDLLError..........................................................................................75
11.1.2. Métodos do Objeto Err...................................................................................................75
11.1.2.1. Método Clear.............................................................................................................75
11.1.2.2. Método Raise ............................................................................................................76
11.2. ERROS RELACIONADO A BANCO DE DADOS .............................................................................. 76
11.3. ERROS RELACIONADO A ARQUIVO ......................................................................................... 77
11.4. ROTINA PARA TRATAMENTO DE ERROS ................................................................................... 77
12. DISTRIBUINDO SUA APLICAÇÃO.............................................................................81
12.1. COMPILANDO O PROJETO ..................................................................................................... 81
12.2. SETUP WIZARD (VISUAL BASIC 5.0)...................................................................................... 81
12.3. PACKAGE AND DEPLOYMENT WIZARD (VISUAL BASIC 6.0) ........................................................ 81
12.4. INNO SETUP COMPILER ....................................................................................................... 82
12.4.1. Dicas para Visual Basic ..................................................................................................82
12.4.1.1. Gerando as Mensagens de Instalação em Português. ....................................................82
12.4.1.2. Instalando Arquivos OCX. ...........................................................................................82
12.4.1.3. Instalando Arquivos do Visual Basic.............................................................................83
12.4.1.4. Usando o SETUP.LST Gerado pelo P & D Wizard...........................................................83
12.4.1.5. Instalando ADO, DCOM e MDAC..................................................................................84
12.5. ISTOOL ............................................................................................................................. 84
13. TRABALHANDO COM API'S ......................................................................................87
13.1. ABRINDO ARQUIVO DE AJUDA ATRAVÉS DE API........................................................................ 87
13.2. ABRINDO O BROWSER OU EDITOR DE E-MAIL PADRÃO ............................................................... 88
13.3. ENCONTRANDO O DIRETÓRIO DE INSTALAÇÃO DO WINDOWS E DE SISTEMA .................................. 88
13.4. DRIVE DO CD .................................................................................................................... 89
13.5. ECREVENDO E OBTENDO INFORMAÇÕES DE UM ARQUIVO INI ..................................................... 90
14. CRIANDO ARQUIVOS DE AJUDA BASEDO EM ARQUIVOS HTML .............................93
14.1. CRIANDO UM ARQUIVO DE AJUDA .......................................................................................... 93
14.1.1. Arquivo de Conteúdo .....................................................................................................95
14.1.2. Arquivo de Índice ..........................................................................................................97
14.1.3. Aparência da Janela do Arquivo de Ajuda ........................................................................97
14.1.4. Configurar Sensibilidade ao Contexto ..............................................................................97
14.1.5. Compilando o Projeto da Ajuda.......................................................................................99
14.1.6. Nota Final .....................................................................................................................99
14.2. ACESSANDO O ARQUIVO CHM, ATRAVÉS DO VISUAL BASIC ....................................................... 99
15. GERANDO RELATÓRIOS COM O CRYSTAL REPORTS .............................................101
15.1. INICIALIZANDO O CRYSTAL REPORTS ................................................................................... 101
15.2. CRIANDO UM NOVO RELATÓRIO .......................................................................................... 101
15.3. INSERINDO NOVOS CAMPOS A PARTIR DA TABELA. .................................................................. 105
15.4. FORMATANDO CAMPOS, INSERINDO FIGURAS, LINHAS E CAIXAS ................................................ 105
15.4.1. Formatando Campos.................................................................................................... 105
15.4.2. Inserindo Figuras, Linhas e Caixas ................................................................................ 106
15.5. TRABAHANDO COM FÓRMULAS ............................................................................................ 107
15.5.1.1. Especificando o valor de uma fórmula através do Visual Basic...................................... 108
15.6. IMPRIMINDO, VISUALIZANDO E EXPORTANDO UM RELATÓRIO A PARTIR DO VISUAL BASIC............ 108
15.6.1. Imprimindo................................................................................................................. 108
15.6.2. Visualizando................................................................................................................ 108
15.6.3. Exportando (para arquivo e por e-mail) ......................................................................... 109
15.6.3.1. Exportando para arquivo formato do Word................................................................. 109
V Microsoft Visual Basic – Sumário

15.6.3.2. Enviando um relatório em anexo por e-mail ............................................................... 110


15.7. OUTROS CÓDIGOS ÚTEIS PARA TRABALHAR COM RELATÓTIOS.................................................... 111
15.7.1. Abrindo um relatório, cujo banco de dados possuui senha............................................... 111
15.7.2. Alterar via código o caminho da base de dados do relatório ............................................ 111
15.7.3. Como direcionar a impressão do Crystal para a porta LPT2?............................................ 111
15.7.4. Fazendo com que a janela de impressão do Crystal Reports fique como filha (MDIChild) de
um MDI? ................................................................................................................................. 111
15.7.5. Inserir uma quebra de página no Crystal Reports? ......................................................... 111
15.7.6. Modificar as margens de um relatório em modo de execução?......................................... 111
15.7.7. Outra forma de especificar a senha do banco de dados utilizado pelo relatório.................. 112
16. CRIANDO UM ACTIVEX ..........................................................................................113

17. BIBLIOGRAFIA CONSULTADA ................................................................................115


VI
Microsoft Visual Basic – Índices de figuras VII

Índice de Figuras
FIGURA 1. INTERFACE MDI (MUTIPLE DOCUMENT INTERFACE) DO VISUAL BASIC 6.0 .................................................3
FIGURA 2. INTERFACE SDI (SINGLE DOCUMENT INTERFACE) DO VISUAL BASIC 6.0 ....................................................3
FIGURA 3. TELA DE SELEÇÃO DE UM NOVO PROJETO, COM OS DIVERSOS MODELOS.......................................................6
FIGURA 4. ORGANOGRAMA SIMPLIFICADO DE UMA APLICAÇÃO. ............................................................................17
FIGURA 5. JANELA DE PROPRIEDADES DO VISUAL BASIC. ...................................................................................17
FIGURA 6. MENU EDITOR DO MICROSOFT® VISUAL BASIC. ...............................................................................21
FIGURA 7. CAIXA DE CONTROLES ACTIVEX PERSONALIZADOS, LOCALIZADOS NO SISTEMA. ...........................................25
FIGURA 8.MICROSOFT WINDOWS COMMON CONTROL 6.0 .................................................................................26
FIGURA 9. A- CONFIGURAÇÕES DO TAMANHO DAS IMAGENS; B- COLEÇÃO DE IMAGENS INSERIDAS NO IMAGELIST. .............28
FIGURA 10. CONTROLE LISTVIEW, EXIBINDO ÍCONES PEQUENOS..........................................................................29
FIGURA 11. CONTROLES PROGRESSBAR'S EXIBINDO OS DOIS VALORES DA PROPRIEDADES SCROLLING (0 –
CCSCROLLINGSTANDARD E 1- CCSCROLLINGSMOOTH) ...............................................................................30
FIGURA 12. CONTROLE STATUSBAR, EXIBINDO VÁRIAS INFORMAÇÕES ADICIONAIS....................................................31
FIGURA 13. CONTROLE STATUSBAR DO PROCESSADOR DE TEXTOS MICROSOFT® WORD............................................31
FIGURA 14. CONTROLES TOOLBAR'S ALINHADOS NO TOPO DA JANELA E EM BAIXO E COM A PROPRIEDADE STYLE 1 – TBRFLAT E
0 – TBRSTANDARD, RESPECTIVAMENTE..................................................................................................32
FIGURA 15. CAIXA DE PROPRIEDADES GERAL DE UMA BARRA DE FERRAMENTAS (ABA GENERAL).....................................34
FIGURA 16. CAIXA DE PROPRIEDADES DOS BOTÕES DE UMA BARRA DE FERRAMENTAS (ABA BUTTONS). ...........................34
FIGURA 17. CAIXA DE PROPRIEDADES DOS BOTÕES DE UM CONTROLE TREEVIEW (ABA GENERAL). .................................35
FIGURA 18. EXEMPLO DE UM CONTROLE TREEVIEW, COM UM NODE PAI (ÍCONES) E 4 NODES FILHOS. LINESTYLE IGUAL A 1–
TVWROOTLINE. ..............................................................................................................................36
FIGURA 19. CONTROLE SLIDER ..................................................................................................................37
FIGURA 20. INTERFACE DA CALCULADORA DE IDADE .........................................................................................40
FIGURA 21. CAIXA DE DIÁLOGO DE CONTROLE VERSÕES E INFORMAÇÕES DO APLICATIVO. ...........................................41
FIGURA 22. TELA DE INFORMAÇÕES DE UM PROJETO.........................................................................................43
FIGURA 23. ESTRUTURA DO BANCO DE DADOS COM QUATRO TABELAS....................................................................48
FIGURA 24. ORGANOGRAMA SIMPLES DE UM BANCO DE DADOS. AS LINHAS PONTILHADAS INDICAM O RELACIONAMENTO ENTRE
AS TABELAS....................................................................................................................................53
FIGURA 25. HIERARQUIA DE CLASSES DAO ...................................................................................................54
FIGURA 26. LAYOUT PARA PESQUISA DE DADOS DO PROGRAMA LIZARO VISUAL BASIC DICAS V3.0 ................................63
FIGURA 27. CONTROLE MICROSOFT CHART 5.0 ..............................................................................................69
FIGURA 28. GRÁFICO DE RECEITAS/DESPESAS DE ABRIL A JUNHO APRESENTANDO A MÉDIA DE CADA MÊS. ........................71
FIGURA 29. GRÁFICO CRIADO COM DADOS DE ENTRADA MANUAL, EXIBINDO AS ESTATÍSTICAS. .....................................72
FIGURA 30. GRÁFICO PLOTADO A PARTIR DOS DADOS DE UM BANCO DE DADOS ACCESS 97 .........................................74
FIGURA 31. TELA INICIAL DO SETUP WIZARD QUE ACOMPANHA O VISUAL BASIC 5.0. ................................................81
FIGURA 32. TELA INICIAL DO PACKAGE AND DEPLOYMENT WIZARD QUE ACOMPANHA O VISUAL BASIC 5.0 ......................82
FIGURA 33. FIGURA DO EDITOR DE SCRIPT DO INNO SETUP COMPILER V3.0. ..........................................................84
FIGURA 34. INTERFACE DO PROGRAMA ISTOOL 3.0 EM PORTUGUÊS (BR) ..............................................................85
FIGURA 35.JANELA PARA INICIAR UM NOVO ARQUIVO........................................................................................93
FIGURA 36. TELA DO WIZARD PARA ESPECIFICAR O CAMINHO E O NOME DO PROJETO. ...............................................94
FIGURA 37. LISTAGEM DE ARQUIVOS HTML, QUE IRÃO FAZER PARTE DO ARQUIVO DE AJUDA. ......................................94
FIGURA 38. JANELA DO PROJETO RECÉM CRIADO, COM AS OPÇÕES E LISTAGEM DE ARQUIVOS CRIADOS. ..........................95
FIGURA 39. JANELA DE OPÇÃO PARA CRIAÇÃO OU ABERTURA DE UMA RQUIVO DE CONTEÚDO. .......................................95
FIGURA 40. JANELA DE ADIÇÃO DE TÓPICOS E DE LIGAMENTO (LINK) COM O ARQUIVO CORRESPONDENTE. .......................96
FIGURA 41. JANELA DE "LINKAGEM" DE ARQUIVO AO TÓPICO DO CONTEÚDO. A LISTAGEM É EXIBIDA POR TÍTULO DO ARQUIVO.
..................................................................................................................................................96
VIII Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

FIGURA 42. ABA DE CONTENTS, COM SUA APARÊNCIA FINAL LISTANDO TODOS OS TÓPICOS CRIADOS..............................97
FIGURA 43. JANELA HTMLHELP API INFORMATION COM A ADIÇÃO DO ARQUIVO DE CABEÇALHO INSECTA.H. ...................98
FIGURA 44. JANELA DE LIGAÇÃO DA DEFINIÇÃO (IDH_MAIN), COMO O ARQUIVO HTML (INSECTA.HTM). .......................98
FIGURA 45. ÍCONE DO CRYSTAL REPORTS V4.6. ........................................................................................... 101
FIGURA 46. JANELA PARA CRIAÇÃO DE UM RELATÓRIO NOVO NO CRYSTAL REPORTS................................................. 101
FIGURA 47. JANELA CREATE REPORT EXPERT, COM A OPÇÃO O PASSO 1: SELEÇÃO DE TABELAS NO CRYSTAL REPORTS ...... 102
FIGURA 48. PASSO 3: SELEÇÃO DE CAMPOS A SEREM EXIBIDOS NO RELATÓRIO DO CRYSTAL REPORTS. ......................... 103
FIGURA 49. PASSO 4: SELEÇÃO DOS CAMPO DE ORDENAÇÃO DO RELATÓRIO E TIPO DE ORDENAÇÃO NO CRYSTAL REPORTS. 103
FIGURA 50. PASSO 8: ESPECIFICAÇÃO DE TÍTULO E SELEÇÃO SE ESTILO DO RELATÓRIO NO CRYSTAL REPORTS................ 104
FIGURA 51. JANELA DO MODO DE DESENHO DO CRYSTAL REPORT. ..................................................................... 104
FIGURA 52. JANELA PAR INSERÇÃO DE NOVO(S) CAMPO(S) AO RELATÓRIO NO CRYSTAL REPORTS................................ 105
FIGURA 53. BARRA DE FERRAMENTAS DE FORMATAÇÃO DO TEXTO DOS CAMPOS NO CRYSTAL REPORTS. ........................ 105
FIGURA 54. MENU SUSPENSO PARA FORMATAÇÃO DO CAMPO (FONTE, FORMATO, BORDAS, ETC.) NO CRYSTAL REPORTS .... 106
FIGURA 55. JANELA DE ALTERAÇÃO DO FORMATO DO CAMPO NO CRYSTAL REPORTS. ............................................... 106
FIGURA 56. ALTERAÇÃO DE BORDA E CORES DE BORDA E TEXTO DO CAMPO DO CRYSTAL REPORTS. ............................. 106
FIGURA 57. BARRA DE FERRAMENTAS PARA INSERÇÃO DE FIGURA, LINHA E CAIXA (RESPECTIVAMENTE) DO CRYSTAL REPORTS.
................................................................................................................................................ 107
FIGURA 58. JANELA DE EDIÇÃO DE FÓRMULA DO CRYSTAL REPORTS .................................................................... 107
FIGURA 59. BARRA DE FERRAMENTAS NA JANELA DE VISUALIZAÇÃO DO CRYSTAL REPORTS. ....................................... 109
FIGURA 60.JANELA DE VISUALIZAÇÃO DE UM RELATÓRIO PELO CRYSTALREPORT ACTIVEX CONTROL............................. 109
FIGURA 61. CONTROLE ACTIVEX EM DESIGN-TIME. ....................................................................................... 113
Microsoft Visual Basic – Índices de códigos IX

Índice de Códigos
CÓDIGO 1. EXEMPLO DE DECLARAÇÃO DE VARIÁVEIS NO VISUAL BASIC....................................................................7
CÓDIGO 2. PROCEDIMENTO PARA EXIBIÇÃO DO FORMULÁRIO FRMMAIN....................................................................9
CÓDIGO 3. CÓDIGO EXTENSOS PARA ALTERAR A PROPRIEDADE CAPTION E BACKCOLOR, DO FORM2 E EXIBI-LO. ................18
CÓDIGO 4. CÓDIGO MAIS PRÁTICOS ATRAVÉS DA FUNÇÃO SHOWFORM PARA ALTERAR A PROPRIEDADE CAPTION E BACKCOLOR,
DO FORM2 E EXIBI-LO. .....................................................................................................................18
CÓDIGO 5. ESTE EXEMPLO CARREGA VÁRIOS BITMAPS EM UM CONTROLE IMAGELIST. QUANDO O FORM É CLICADO UM UMA
IMAGEM DA LISTA É SUBSTITUÍDA POR OUTRA IMAGEM. ESTE EXEMPLO NECESSITA DE UM CONTROLE IMAGELIST E UM
CONTROLE PICTUREBOX. ...................................................................................................................28
CÓDIGO 6. LINHA DE COMANDO PARA RETORNAR A SEGUNDA IMAGEM DA COLEÇÃO DA IMAGELIST1 PARA O CONTROLE
PICTURE1. ....................................................................................................................................28
CÓDIGO 7, LINHA DE COMANDO PARA RETORNAR A SEGUNDA IMAGEM (ÍCONE) DA COLEÇÃO DA IMAGELIST1 PARA O CONTROLE
PICTURE1. ....................................................................................................................................28
CÓDIGO 8. ROTINA SIMPLES PARA EXIBIR O PROGRESSO DE UM CONTROLE PROGRESSBAR...........................................30
CÓDIGO 9. LINHA DE COMANDO PARA EXTRAIR A IMAGEM DE INDEX 1 CONTIDA NUM CONTROLE IMAGELIST E RETORNA-LO
PARA O PAINEL A PROPRIEDADE PICTURE DA BARRA DE STATUS COM O INDEX 1. ...............................................31
CÓDIGO 10. CONTROLE STATUSBAR. ATRIBUINDO UM TEXTO AO PAINEL 1 E ADICIONANDO PAINÉIS E FIGURAS. ...............32
CÓDIGO 11. ADIÇÃO DE NODES NUM CONTROLE TREEVIEW................................................................................37
CÓDIGO 12. REMOVENDO UM NODE DO CONTROLE TREEVIEW. ...........................................................................37
CÓDIGO 13. PROJETO CALCULADORA DE DIAS, MESES E ANOS VIVIDOS ..................................................................40
CÓDIGO 14. PROJETO PARA EXIBIR AS INFORMAÇÕES DE UM APLICATIVO................................................................42
CÓDIGO 15. ROTINA PARA ACESSO A DADOS DE UMA TABELA UTILIZANDO A INSTRUÇÃO DBOPENTABLE ..........................55
CÓDIGO 16. ROTINA PARA ACESSO A DADOS DE UMA TABELA UTILIZANDO A INSTRUÇÃO DBOPENDYNASET, UTILIZANDO
INSTRUÇÕES SQL............................................................................................................................55
CÓDIGO 17. PREENCHENDO UMA CAIXA DE LISTAGEM COM DADOS DE UMA TABELA UTILIZANDO O RECORDESET DO TIPO
FOWARD-ONLY. ..............................................................................................................................57
CÓDIGO 18. ROTINA PARA ABERTURA DE UMA BASE DE DADOS MS ACCESS.............................................................58
CÓDIGO 19. ROTINA PARA ABERTURA DE UMA BASE DE DADOS MS ACCESS COM SENHA..............................................58
CÓDIGO 20. ROTINA PARA ACESSO A UM BANCO DE DADOS DO TIPO MS ACCESS. .....................................................58
CÓDIGO 21. ROTINA PARA ACESSO A DADOS DE UMA TABELA VIA INSTRUÇÃO SQL....................................................59
CÓDIGO 22. ROTINA PARA PREPARAR UMA TABELA PARA RECEBER NOVOS DADOS (REGISTRO) ......................................59
CÓDIGO 23. ROTINA PARA GRAVAR DADOS EM UMA TABELA DO BANCO DE DADOS. ....................................................60
CÓDIGO 24. ROTINA PARA LOCALIZAR DADOS DENTRO DE UMA TABELA, UTILIZANDO AS INSTRUÇÕES DO DATACONTROL E
INSTRUÇÕES SQL............................................................................................................................60
CÓDIGO 25. ROTINA PARA FILTRAR OS DADOS DE UMA TABELA ............................................................................61
CÓDIGO 26. ROTINA PARA LOCALIZA DADOS DENTRE DE UMA TABELA, UTILIZANDO SQL E EM SEGUINDA PREENCHENDO UMA
TREEVIEW COM OS DADOS ENCONTRADOS. .............................................................................................62
CÓDIGO 27. ROTINA PARA EDITAR UM REGISTRO GRAVADO EM UMA TABELA DO BANCO DE DADOS. ................................63
CÓDIGO 28. ROTINA PARA COMPACTAR UM BANCO DE DADOS SEM SENHA. ..............................................................64
CÓDIGO 29. ROTINA PARA COMPACTAR UM BANCO DE DADOS COM SENHA. .............................................................64
CÓDIGO 30. ROTINA PARA RECUPERAR UM BANCO DE DADOS CORROMPIDO.............................................................64
CÓDIGO 31. ROTINA PARA SALVAR E RECUPERAR UMA FIGURA DENTRO DUM CAMPO OLE DE UM BANCO DE DADOS. ............66
CÓDIGO 32. ROTINA PARA ACESSO À BANCO DE DADOS DBASE VERSÃO III. ............................................................66
CÓDIGO 33. ROTINA PARA ACESSO À BANCO DE DADOS FOXPRO VERSÃO 2.5. .........................................................66
CÓDIGO 34. ROTINA PARA ACESSO À BANCO DE DADOS EXCEL VERSÃO 4.0.............................................................67
CÓDIGO 35. ROTINA PARA ACESSO À BANCO DE DADOS TEXTO. ...........................................................................67
CÓDIGO 36. CÓDIGO PARA CRIAÇÃO DE UM GRÁFICO DE RECIETAS/DESPESAS E MÉDIA DUTRANTE TRÊS MESES..................70
CÓDIGO 37. CÓDIGOS PARA CRIAÇÃO DE UM GRÁFICO MANUALMENTE E XIBIÇÃO DE ESTATÍSTICAS. ...............................72
X Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

CÓDIGO 38. CÓDIGO PARA EXTRAIR DADOS DE UM BANCO DE DADOS ACCESS 97, LISTANDO O NÚMERO DE PESQUISADORES
POR ESTADO. .................................................................................................................................73
CÓDIGO 39. ROTINA COMPLETA PARA INTERCEPTAÇÃO, EXIBIÇÃO E ARMAZENAMENTO DE ERRO DE UMA APLICAÇÃO ............80
CÓDIGO 40. EXEMPLO DE COMO ABRIR UM ARQUIVO DE AJUDA ATRAVÉS DE API ......................................................88
CÓDIGO 41. EXEMPLO DE COMO ABRIR O BROWSER OU EDITOR DE E-MAIL PADRÃO ..................................................88
CÓDIGO 42.EXEMPLO DE COMO ENCONTRAR O DIRETÓRIO DE INSTALAÇÃO DO WINDOWS E DE SISTEMA ........................89
CÓDIGO 43. EXEMPLO DE COMO DETECTA R ALETRA DO DRIVE DO CD ...................................................................90
CÓDIGO 44. EXEMPLO DE COMO ESCREVER E OBTER INFORMAÇÕES DE UM ARQUIVO INI.............................................91
CÓDIGO 45. ESTRUTURA DE UMA ARQUIVO DE CABEÇALHO, CONTENDO OS TÓPICOS SENSÍVEIS AO CONTEXTO E SUA
IDENTIFICAÇÃO NUMÉRICA. ................................................................................................................98
CÓDIGO 46. CLASSE CLSHELPCHM, CRIADA PARA ACESSAR ATRAVÉS DE API AO ARQUIVO DE AJUDA CHM, PELO VISUAL BASIC
..................................................................................................................................................99
CÓDIGO 47. CODÍGO PARA EXIBIR O ARQUIVO DE AJUDA ATRAVÉS DO EVENTO CLICK, DE UM COMMANDBUTTON, CHAMADO
CMDHELP. ................................................................................................................................... 100
CÓDIGO 48. CODÍGO PARA EXIBIR O CONTEXTO ESPECÍFCO DO ARQUIVO DE AJUDA ATRAVÉS DO EVENTO CLICK, DE UM
COMMANDBUTTON, CHAMADO CMDHELP. ............................................................................................. 100
CÓDIGO 49. TEXTO DA FÓRMULA "NOME" INSERIDA NO RELATÓRIO DO CRYSTAL REPORTS........................................ 107
CÓDIGO 50. ENVIO DE VALOR PARA UMA FÓRMULA DO CRYSTALREPORT .............................................................. 108
CÓDIGO 51. FILTRAGEM DE DADOS NO CRYSTALREPORTS ATRAVÉS DO VISUAL BASIC.............................................. 108
CÓDIGO 52. CÓDIGO PARA IMPRESSÃO DIRETA DO RELATÓRIO SEM VISUALIZAÇÃO PRÉVIA NO CRYSTAL REPORTS. ........... 108
CÓDIGO 53. CÓDIGO PARA VISUALIZAR UM RELATÓRIO. .................................................................................. 109
CÓDIGO 54. CÓDIGO PARA EXPORTAR UM ARQUIVO NO FORMATO DO WORD. ........................................................ 110
CÓDIGO 55. EXPORTANDO UM ARQUIVO PARA UMA MENSAGEM DE E-MAIL............................................................. 111
CÓDIGO 56. CÓDIGO DO CONTROLE ACTIVEX PARA ESPECIFICAR E RETORNAR AS PROPRIEDADES. ............................... 114
CÓDIGO 57. CÓDIGO PARA EXIBIR A ARQUIVO DE AJUDA ESPECÍFICO ATRAVÉS DA API WINHELP NO CONTROLE ACTIVEX. . 114
Microsoft Visual Basic – Índices de tabelas XI

Índice de Tabelas
TABELA 1. CONTROLES BÁSICO E SUAS DESCRIÇÕES. ..........................................................................................4
TABELA 2. TIPO DE VARIÁVEIS SUA CAPACIDADE DE USO. .....................................................................................6
TABELA 3. SUGESTÃO DE PREFIXO PARA IDENTIFICAÇÃO DO TIPO DE VARIÁVEL...........................................................7
TABELA 4. FUNÇÕES INTERNAS DO VISUAL BASIC PARA CONVERSÃO DE DADOS. .........................................................7
TABELA 5. PREFIXOS PARA NOMES DOS OBJETOS MAIS UTILIZADOS EM APLICAÇÃO (SUGESTÃO DA MICROSOFT E DO AUTOR) 14
TABELA 6. PRINCIPAIS PROPRIEDADES DE UM FORMULÁRIO.................................................................................16
TABELA 7. CONSTANTES, VALORES E DESCRIÇÃO DO PROPRIEDADE VIEW DO CONTROLE LISTVIEW. ...............................28
TABELA 8. PROPRIEDADES DO CONTROLE LISTVIEW. ........................................................................................29
TABELA 9. CONSTANTES, VALORES E DESCRIÇÃO DA PROPRIEDADE STYLE DO CONTROLE STATUSBAR.............................31
TABELA 10. AS CONSTANTES PARA RELATIONSHIP SÃO: ....................................................................................36
TABELA 11. CONTROLES PARA O PROJETO IDADE. ............................................................................................39
TABELA 12. CONTROLES PARA EXIBIR AS VERSÃO E AS INFORMAÇÕES DE UM PROJETO. ...............................................41
TABELA 13. PRINCIPAIS FUNÇÕES NUMÉRICAS UTILIZADAS PELO VISUAL BASIC E A DESCRIÇÃO. ....................................45
TABELA 14. TIPOS DE DADOS UPORTADOS PELO JET E PELA A SQL ......................................................................49
TABELA 15. TIPOS DE DADOS SUPORTADOS PELO BANCO DE DADOS ACCESS ............................................................53
TABELA 16. THE OPENDATABASE METHOD SYNTAX HAS THESE PARTS....................................................................57
TABELA 17. TIPO DE GRÁFICO A SEREM EXIBIDOS PELA PROPRIEDADE CHARTYPE, SUAS CONSTANTE E VALORES.................69
TABELA 18. ERROS GENÉRICOS RELACIONADOS À OPERAÇÃO DE BANCO DE DADOS ....................................................76
TABELA 19. ERROS RELACIONADOS A BLOQUEIO DE REGISTROS ...........................................................................76
TABELA 20. ERROS RELACIONADOS A PERMISSÕES ...........................................................................................77
TABELA 21. STRINGS UTILIZADAS PELO ARQIVO SETUP.LST AS STRINGS EQUIVALNTES NO INNO SETUP COMPILER..............83
Microsoft Visual Basic – Dedicatória e Agradecimentos XIII

Dedicatória
Dedico a presente obra a DEUS, pela concessão de minha
vida, a minha mãe por aceitar está tarefa árdua, a minha
filha pela paciência e por suportar as incansáveis e
exageradas hora que fico na frente do computador.
William Costa Rodrigues

Agradecimentos
A todos aqueles que direta ou indiretamente
participaram e incentivaram-me na confecção da
presente obra.
Meus humildes e sinceros agradecimentos.
William Costa Rodrigues
Microsoft Visual Basic – Introdução 1

1. INTRODUÇÃO
O Microsoft™ Visual Basic é uma poderosa linguagem de programação, e tem uma grande
vantagem em relação às outras linguagens, por ser do mesmo fabricante do sistema operacional
Microsoft™ Windows tem uma maior integração com o mesmo. Outra vantagem e que os
programas gerados pelo Visual Basic, para serem ser executados necessitam da biblioteca
Msvbvm50.dll ou Msvbvm60.dll e outros arquivos de extensão de aplicativos. Na prática a
vantagem é o seguinte, os programas têm tamanhos menores e são executados, compartilhando
este arquivos (bibliotecas e ActiveX).
As interfaces de usuário gráficas, ou GUIs (pronuncia "gúis", do Inglês Graphic Interfaces
User), revolucionaram a indústria da microinformática. Elas demonstram que a frase "Uma figura
vale por mil palavras" é verdadeira para a maioria dos usuários de computadores. Em lugar do
estranho prompt do DOS C:> que os usuários observavam durante muito tempo (e que assustou
muitos deles), você é presenteado com uma área de trabalho cheia de ícones e com programas
que utilizam mouse e menus.
Embora alguns programadores tenham apresentado sentimentos contraditórios a respeito
das GUIs, os iniciantes gostam delas, e assim é de se esperar que os programas Windows sejam
baseados no modelo GUI (e que tenham a aparência e proporcionem a sensação certa). Portanto ,
se você precisar desenvolver um programa para qualquer versão Windows, desejará Ter uma
ferramenta para desenvolver com eficiência aplicativos fundamentados em GUIs, e o Visual Basic é
a ferramentas mais indicada, por possui facilidade na síntese de código e interface amigável,
próxima dos aplicativos do Windows.
Os exemplos e dicas aqui exibidos são de parte de exemplos de livros, do Help do Visual
Basic, dicas da Internet (VBAccelerator.com – www.vbaccelerator.com de Steve MacMahon,
vbbrasil.com – www.vbbrasil.com.br, VBMania – www.vbmania.com.br, José Carlos Macorati – Site
Pessoal www.macoratti.net e etc.).
Uma recomendação bastante pertinente para que pretende programar é por em dia o
Inglês, pois todos os comandos os arquivos de ajuda (Help) e a maioria da documentação para as
linguagens de programação estão em Inglês. Outra recomendação é sempre que possui dúvidas
acesse o arquivo de Ajuda ou o Books Online que vêm junto com o Visual Basic.
Para quem não possui uma versão registrada do Microsoft™ Visual Basic poderá adquirir
gratuitamente no site da Microsoft a versão mais simplificada: Visual Basic Control Create. Apesar
de muito básica é possível criar executáveis simples e componentes ActiveX, com a mesma
facilidade das outras versões (Standard, Professional e Enterprise).
2 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues
Microsoft Visual Basic – Conceitos Básicos do Visual Basic 3

2. CONCEITOS BÁSICO DO VISUAL BASIC

Se você já está familiarizado com o Visual Basic pode passar para o próximo capítulo, pois
o capítulo atual visa fazer uma introdução do Visual Basic para os iniciantes.

2.1. Interface do Visual Basic

O Visual Basic Possui uma interface amigável com o padrão MDI (Multiple Document
Interface), porém é possível trabalhar com uma interface SDI (Single Document Interface),
através do menu Tools > Options > Advanced.

Figura 1. Interface MDI (Mutiple Document Interface) do Visual Basic 6.0

Figura 2. Interface SDI (Single Document Interface) do Visual Basic 6.0


4 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

2.2. Controle Básico


O Visual Basic ao ser carregado apresenta uma barra de ferramenta a esquerda da tela
contendo 19 controles padrão, que fazem parte da Biblioteca do VB (MSVBVM50.dll v5.0 ou
MSVBVM60.dll v6.0, em síntese a biblioteca significa MicroSoft Visual Basic Virtual Machine versão
do VB, ou seja, Máquina Virtual do MicroSoft Visual Basic). Eles poderão ser utilizados e no
momento da distribuição do aplicativo, também deverá ser distribuída à biblioteca (MSVBVMx0.dll,
onde x é a versão do VB). A única exceção é o controle Data, que necessita da biblioteca DAO
(Data Access Objects, ou seja, Acesso a Objetos de Dados.

Tabela 1. Controles básicos e suas descrições.


Img Controle/Descrição
Pointer – Não verdade não se trata de um Controle, mas sim uma
ferramenta que serve para dimensionar e mover Controles.
PictureBox – Permite exibir figuras (bmp, ,jpg, gif, wmf, emf) e ícones.
Label – Etiqueta ou rótulo, exibe um texto para identificação outros
controles no formulário.
TextBox – Este controle permite ao usuário digitar texto.
Frame – Moldura utilizada para agrupar controles dentro de um
formulário.
CommandButton – Controle que permite o usuário realizar uma
operação, através de linhas de comando pré-determinadas.
CheckBox – Pode assumir valores falso ou verdadeiro. Em um mesmo
Formulário vários CheckBox's podem assumir o valor verdadeiro ao
mesmo tempo.
OptionButton – Pode também assumir valores falso/verdadeiro, mas
em um mesmo Formulário somente um OptionButton pode assumir o
valor verdadeiro.
ComboBox – Combina caixa de texto com caixa de listagem. O usuário
pode digitar a informação como também pode encolher da lista.
ListBox – Exibe uma lista de itens que o usuário pode selecionar.
HScrollBar e VScrollBar – Permite selecionar com o mouse um
determinado valor numa faixa de valores.
Timer – Controla intervalos de tempo determinados pelo programador
em milisegundos.
DriveListBox – Exibe os drivers do computador.
DirListBox – Exibe as pastas (diretórios) do computador.

FileListBox – Exibe os arquivos de uma pasta (diretório).


Shape – Permite exibir várias formas geométricas num formulário.
Line – Permite traçar linhas dentro do formulário.
Image – Permite exibir figuras (bmp, jpg, gif, wmf, emf) e ícones, ainda
permitindo que seja dimensionado de acordo com a necessidade do
programador.
Data – Permite acessar diversas base de dados.

OLE – permite incorporar objetos ou arquivos no formulário.


Microsoft Visual Basic – Conceitos Básicos do Visual Basic 5

2.3. Controles Personalizados


As versões Professional e Enterprise permitem que o programador utilize controle
personalizados, que são os ActiveX, que possuem funções específicas de acordo com o controle.
Alguns do mais utilizados são RichTextBox, CommomDialog, Toolbar, StatusBar,
ProgressBar; TreeView, ListView, ImageList, Slider, MSChart, entre outros. Cada um
possui sua função específica. Deste modo atendendo as necessidades do programador.
Para acessar os controle personalizados no Visual Basic, basta clicar Project >
Components... ou pressionar "Control+T".
Existe uma infinidade de ActiveX no diretório do sistema (em geral C:\Windows\System)
que poderão ser utilizados, caso o ambiente suporte tal componente ou se ela estiver registrado
no sistema. Além disto o programador poderá adquirir componentes personalizados elaborados por
empresas de Software ou na Internet (gratuitamente).
O Visual Basic permite que o usuário avançado elabore seus próprios controles, deste modo
atendendo mais ainda as necessidades específicas do programador, maiores detalhes serão vistos
no Capítulo 4.

2.4. Tipos de Projetos


O Visual Basic permite nas versões Professional e Enterprise diverso tipos de projeto. A
seguir consta a descrição de cada projeto:

 Standard EXE – Este é o projeto padrão. Através do qual o programador inicia um novo
projeto baseado na construção de um aplicativo executável comum;
 ActiveX EXE – Este projeto permite que o aplicativo gerado possa de utilizado ou distribuído
pela Internet;
 ActiveX DLL – Este tipo de projeto permite a criação de executáveis do tipo DLL (Dynamic
Link Libary, ou seja Biblioteca de Vínculo Dinâmico). Sua construção permite a utilização dos
códigos nela construídos, em projeto futuros;
 ActiveX Control – Permite a criação de controles personalizados de acordo com a
necessidade de funções e controles para outros projetos, minimizando assim o excesso de
programação;
 VB Application Wizard – Este projeto dispara o assistente de criação de aplicativos do Visual
Basic, permitindo a criação de formulários chaves de uma aplicação como a tela de entrada
SplashScreen, formulário das informações do sistema, vínculo com base de dados, ente outros;
 VB Enterprise/Professional Edition Controls – Este tipo de projeto permite que o
programador elabore um aplicativo com base em todos os controles disponíveis para as
versões Professional e Enterprise;
 Addin – Permite a elaboração de Add-ins que poderão ser utilizados pelo Visual Basic, para
automatizar tarefas repetitivas e/ou complexas;
 ActiveX Document DLL – Permite criar DLLs do tipo ActiveX que podem ser utilizadas na
Internet para exibir ou capturar dados;
 ActiveX Document EXE – Permite que seja criado documentos para utilização na Internet.
6 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 3. Tela de seleção de um novo projeto, com os diversos modelos.

2.5. Tipo de Variáveis

O Visual Basic trabalha com 8 tipo de variáveis fixas que possuem características próprias
de tamanho e forma de uso. Porém você poderá criar variáveis temporárias para atender suas
necessidade. A seguinte demonstra o nome das variáveis e a capacidade de dados de cada uma.

Tabela 2. Tipo de variáveis sua capacidade de uso.


Tipo de Variável Capacidade
Boolean True ou False
Byte 0 a 256
Currency -922.337.203.685.477,5808 a -922.337.203.685.477,5807
Date Qualquer expressão de data válida.
(Valores negativos)
-1,79769313486232 E-308 a -4,94065645841247 E-324
Double
(Valores positivos)
4,94065645841247 E-324 a 1,79769313486232 E-308
Integer -32.768 a 32.767
Long -2.147.483.648 a 2.417.483.647
(Valores negativos)
-3,402823 E-38 a -1,401298 E-45
Single
(Valores positivos)
1,401298 E-45 a 3,402823 E-38
String Qualquer tamanho
Variant –

2.6. Declarando Variáveis no Visual Basic


As variáveis do Visual Basic (como visto no Tópico 2.5), podem ser declaradas dentro de
eventos ou procedimentos. Quando o programador declara uma variável com Dim, esta será
eliminada da memória, quando o evento finalizar, entretanto se a variável for declarada como
Public, está permanecerá na memória até que a aplicação seja finalizada. Duas outras formas de
declarar uma variável são através dos argumentos Private (que restringe a variável a um
Form/Module/Class) ou através de Global que possui a mesma amplitude de Public.
Microsoft Visual Basic – Conceitos Básicos do Visual Basic 7

Alguns padrões poderão ser seguidos para facilitar a identificação do tipo de variável, o
seja, antes do nome da variável o programador poderá inserir uma letra ou duas letras que
identifique o tipo de variável. Veja uma sugestão na Tabela 3.

Tabela 3. Sugestão de prefixo para identificação do tipo de variável.


Tipo de Variável Letra/Prefixo Exemplo
Boolean b bFinalizar
Byte by byLetter
Currency c cReal
Date dt dtAniversario
Doublé d dJuros
Integer i iIndice
Long l lTitulo
Single sg sgLetra
String s sEndereco
Variant v vCEP

Public sNome As String 'Variável pública declarada como String

Private lTitle As Long 'Variável pública declarada como Long

Dim vCEP as Variant 'Variável privada a um evento declarada como Variant

Global sEndereco as String 'Variável global declarada como String


Código 1. Exemplo de Declaração de variáveis no Visual Basic.
Se o programador não especificar o tipo de variável o Visual Basic atribuirá o tipo Variant a
variável.
Para exigir que as variáveis sejam sempre declaradas, nas declarações da janela Code
sempre insira Option Explicit. Uma forma mais fácil e acionar esta opção automaticamente, para
que toda vez que o programador exibe a janela Code pela primeira vez seja inserida esta string.
Para tal clique em no meu Tools > Options, na aba Editor (primeira) marque a opção Require
Variable Declaration, clique em OK para confirmar. A vantagem desta opção é que o Visual Basic
verifica a síntese de cada variável e impede que uma variável seja utilizada sem antes ser
declarada.

2.7. Convertendo Dados


O Visual Basic possui funções internas de conversão de dados, o que facilita e muito a vida
de um programador, pois hora é necessário que uma variável possua dados longos outra hora
dados do tipo String. Entretanto cuidado no momento de converter os dados pois fica um tanto
quanto incoerente converter um dado string para um dado byte. A Tabela seguinte exibe a
funções e suas respectivas descrições.

Tabela 4. Funções internas do Visual Basic para conversão de dados.


Função Descrição
CInt Transforma uma expressão numérica em um número inteiro por arredondamento.
CLng Transforma uma expressão numérica em um inteiro longo por arredondamento.
CSng Transforma uma expressão numérica em precisão simples.
CDbl Transforma uma expressão numérica em precisão dupla
CCur Transforma uma expressão numérica em moeda.
CStr Transforma qualquer expressão string.
CVar Transforma uma expressão variante.
8 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Função Descrição
CBool Transforma uma expressão em booleana (verdadeira/falsa)
CByte Transforma uma expressão numérica em um byte.
CDate Transforma uma expressão compatível em uma data válida.

2.8. Exercícios
1. Quais controles abaixo são básico da biblioteca padrão do Visual Basic?
( ) PictureBox ( ) RichTextBox ( ) ProgressBar ( ) Image ( ) OLE
( ) Label ( ) TabStrip ( ) Timer ( ) ListBox ( ) ComboBox

2. De acordo com as funções dos componentes básicos da biblioteca do VB, assinale V


(verdadeiro) ou F (Falso), para as função especificadas abaixo:
( ) Line - Permite traçar linhas dentro do formulário.
( ) Shape – permite traçar linhas e caixas de texto no formulário.
( ) Frame – Moldura utilizada para agrupar controles dentro de um formulário.
( ) OptionButton – Pode assumir valores falso ou verdadeiro. Em um mesmo Formulário vários
OptionButton's podem assumir o valor verdadeiro ao mesmo tempo.
( ) CheckBox – Pode também assumir valores falso/verdadeiro, mas em um mesmo Formulário
somente um CheckBox pode assumir o valor verdadeiro.
( ) DriveListBox – Exibe os drivers do computador.
( ) DirListBox – Exibe as pastas (diretórios) do computador.
( ) FileListBox – Exibe os arquivos de uma pasta (diretório).

3. De acordo com os tipos de projeto do Visual Basic qual dos tipos encaixa-se na descrição
seguinte: "Permite a criação de controles personalizados de acordo com a necessidade de
funções e controles para outros projetos, minimizando assim o excesso de programação"
( ) StandardEXE ( ) ActiveX EXE ( ) ActiveX Control ( ) AddIn

4. Defina o projeto do tipo StandardEXE.


________________________________________________________________________________
________________________________________________________________________________

5. Qual das variáveis do Visual Basic, listadas abaixo, retorna o valor verdadeiro/false
(True/False).
( ) String ( ) Variant ( ) Boolean ( ) Long ( ) Integer ( ) Single

6. Qual das variáveis do Visual Basic, listadas abaixo, retorna o maior valor numérico.
( ) Byte ( ) Variant ( ) Boolean ( ) Long ( ) String ( ) Single

7. Qual das variáveis do Visual Basic, listadas abaixo, retorna o menor valor numérico.
( ) Integer ( ) Variant ( ) Byte ( ) Long ( ) String ( ) Single

8. Declare uma variável publica (Public) do tipo String, atribua uma valor a esta variável e por fim
converta esta para uma variável longa (Long)
Microsoft Visual Basic – Estrutura de uma Aplicação 9

3. ESTRUTURA DE UMA APLICAÇÃO


Uma aplicação em Visual Basic é um conjunto de elementos (formulários, módulos, classes,
etc.) contendo diversas instruções que orientam o computador na realização de determinadas
tarefas. Essas instruções encontram-se devidamente organizadas numa estrutura lógica bem
definida, como veremos a seguir, e, quanto mais complexa for a aplicação maiores os cuidados
devem ser tomados com essa estrutura.
O desenvolvimento de uma aplicação obedece a algumas etapas importantes, geralmente
bem distintas. A primeira delas é a criação de uma interface, isto é, um conjunto de elementos
que permitirá a comunicação do aplicativo com o usuário. Nesta etapa, deve ser definido, como o
usuário irá interagir com a aplicação e, para isso, programador precisa criar os formulários e
desenhar os componentes (controles) que permitirão a interação usuário-aplicação.
O primeiro passo ao desenvolver um aplicativo em Visual Basic é planejar o que será visto
pelo usuário final, ou seja, projetar as telas. Quais os menus deverão conter na aplicação? Qual
deverá ser o tamanho das janelas (formulários) a serem exibidas pelo programa? Quantas janelas
deverá possuir o aplicativo. O usuário deverá ser capaz de redimensionara a janela? Onde deverão
ser desenhados os controles (botões, caixas de texto, etc.)? Quais serão os controles necessários
para que o aplicativo possa desempenhar as funções a que se propõem?. Bom, entre outras
infinitas perguntas que poderão surgir a medida que o programador interage com a linguagem de
programação. Na Figura 04, está um exemplo de um organograma simplificado de uma aplicação
básica.
Após projetar a interface o segundo passo é escrever os códigos para ativar a interface
visual que foi previamente elaborada. Os objetos no Visual Basic irão reconhecer eventos como
clique do mouse. A maneira pela qual os objetos irão responder a esses eventos dependerá do
código que o programador escreveu. O exemplo a seguir exibe o formulário frmMain a partir do
procedimento Main, contido num módulo (Module)
Public Sub Main()
frmMain.Show
End Sub
Código 2. Procedimento para exibição do formulário frmMain.
Grande parte do código de programação em Visual Basic que informa ao programa como
responder a eventos como um clique do mouse ocorre no que o Visual Basic chama de
procedimentos de eventos (ou procedures de eventos). Um procedimento de evento nada mais é
que o código necessário para informar ao Visual Basic como responder a um evento.
Essencialmente, tudo o que é executável em um programa Visual Basic é um procedimento na
realização de sua tarefa.
É evidente que o terceiro e quarto passo na construção de um aplicativo, consiste em
localizar e tratar o erros no código (depuração) e depois corrigi-los.
Eis um resumo dos passos que um programador poderá adotar na construção de um
aplicativo com o Visual Basic:
1. Personalizar as janelas que serão exibidas para o usuário;
2. Decidir quais os eventos que os controles na janela devem reconhecer;
3. Escrever os procedimento de eventos (procedures) para aqueles eventos e os
prcedimentos subsidiários que fazem funcionar tais procedimentos de eventos.
Quando o aplicativo for executado, acontecerá o seguinte:
1. O Visual Basic monitora as janelas e os controles em cada janela para todos os eventos
que cada controle consegue reconhecer (movimentos do mouse, cliques, teclas, etc.);
2. Quando o Visual Basic detecta um evento, caso não haja uma resposta intrínseca ao
evento, o Visual Basic examina o aplicativo para ver se o programador escreveu um
procedimento (procedure) para tal evento;
10 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

3. Se o programador escreveu o procedimento (procedure), o Visual Basic executa o


código que forma tal procedimento de evento e volta para o passo 1. Se o
procedimento (procedure), não for localizada o Visual Basic, gera um erro.
Devemos ressaltar que existem vários padrões adotados por programadores para nomear
os controles ou objetos que fazem parte de uma aplicação, porém é ideal que a equipe de
programação possua um padrão de nomeação os objetos ou controles. A Tabela 5 apresenta o
padrão de prefixos para os nomes dos objetos mais utilizados em uma aplicação.
Uma das informações mais importantes para o programador que está iniciando,
é que o hábito de consultar a ajuda do Visual Basic dever ser constante, pois assim as
dúvidas poderão ser sanadas em tempo muito curto. Outra forma de sanar estas
dúvidas é adquirindo bibliografia a respeito do assunto (Visual Basic). Devemos
lembrar que o programador deverá ter pelo menos uma noção de INGLÊS, pois toda
documentação que acompanha o Visual Basic é em inglês, e a maioria da bibliografia
do mercado, pelo menos as mais sofisticadas, estão no idioma Inglês. Felizmente com
a popularização da linguagem vários livros e tutoriais são encontrados em português,
no caso dos tutoriais é possível encontra-los vastamente na WEB.

3.1. Estruturas de Programação do Visual Basic1


Aqui será apresentado às principais estruturas de programação da linguagem. Dominando
estas estruturas, você poderá escrever programas mais simples e concisos e, muitas vezes,
diminuir consideravelmente o número de instruções e comandos para executar a mesma tarefa e
consequentemente o tamanho do aplicativo/componente.

3.1.1. Tipos de Estruturas de Linguagem


As estruturas de utilizadas para se escrever códigos no Visual Basic 5 ou 6 são
normalmente divididas em dois tipos distintos: estruturas de tomada de decisão e estrutura de
loop (ou laço).

3.1.1.1. Estrutura de Tomada de Decisão:


Estas estruturas são utilizadas durante o fluxo do programa para permitir a execução de
diferentes tipos de códigos, de acordo com o contexto atual em que o usuário do seu programa se
encontra.

3.1.1.1.1 IF... Then... Else


If <condição 1> = verdadeiro Then
Declaração 1
ElseIf <condição 2> = verdadeiro> Then
Declaração 2
Else
Declaração 3
End If

Considerada a mais tradicional estrutura de linguagem (Se... Então... Senão), esta


instrução avalia o conteúdo da <condição 1> e, se ela for verdadeira, executa as Declaração 1
contida entre a linha If e a primeira instrução Else ou ElseIf (se houver alguma). Caso contrário,
pula para a próxima cláusula ElseIf <condição2> Then, para avaliar a <condição 2>, caso
ela seja verdadeira a Declaração 2, será executada (Se houver alguma), caso contrário a
instrução executará a cláusula Else (senão) da expressão.

1
Baseado na obra Morgado, F. 1998. Visual Basic 5, método rápido
Microsoft Visual Basic – Estrutura de uma Aplicação 11

3.1.1.1.2 IIF
Variável=IIF(<condição>, <valor true>, <valor false>)

Considerada uma variante da função anterior, também chamada de Se Imediato nas


versões em Português do Microsoft Access e Excel, está instrução permite que o programador
coloque uma instrução If... Then... Else End If em uma única linha de código, permitindo que
atribua diferentes valores a variáveis ou objetos, dependendo do resultado da expressão.
Esta instrução avalia o valor da cláusula <condição> e se o valor for verdadeiro, retorna
para variável o resultado da expressão contida na cláusula <valor true>. Caso o resultado de
<condição> seja falso, <variável> é preenchida com o valor da cláusula <valor false>.

3.1.1.1.3 Select Case


Select Case <condição>
Case <resultado 1>
Declaração 1
Case <resultado 2>
Declaração 2
Case Else
Declaração 3
End Select

Considerada uma variante à estrutura If... Then... Else, a instrução Select Case permite
que o programador faça apenas um teste <condição> no início da instrução Select Case e
tome várias decisões dependendo do valor retornado.
Esta instrução é geralmente utilizada quando existem inúmeras possibilidades de
tratamento do valor gerado pela cláusula <condição>, como é o caso das rotinas de tratamento
de erro em tempo de execução ou ativação de botões de uma ToolBar (Barra de Ferramentas),
onde nesse caso a resultado é geralmente o valor Key ou o valor Index de cada botão.
Verifique que esta estrutura oferece uma saída caso nenhum valor retornado (resultado)
seja verificado pelos Case's da instrução, assim o valor retornado poderá ser atribuído na
expressão Case Else (Declaração 3).

3.1.1.2. Estrutura de Loop


As estruturas de loop (ou laço) são utilizadas para permitir que um mesmo conjunto de
instruções seje executado continuamente, até que uma determinada condição seja satisfeita.

3.1.1.2.1 For... Next


For... <contador> = <começo> To <fim> Step <passo>
Declaração
Next <contador>

Esta estrutura de laço permite que você execute todas as instruções contidas dentro de
For... Next, por um número de vezes definido entre o valor <começo> e o valor <fim>, contando-
se as interações de acordo com o argumento opcional Step <passo>. O valor do contador não
poderá ser uma variável Boolean (Boleana) ou uma array.
ª Exemplo: O laço For... Next..., abaixo, faz com que a variável IntJ sela incrementada de 1 a
tá 100, de 5 em 5 unidades (forçando a execução do laço por 20 vezes consecutivas):
Dim IntJ as Integer
For IntJ = 1 To 100 Step 5
<executar as instruções>
Next IntJ
12 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

A especificação do nome da variável contadora dentro da cláusula Next ( como Next IntJ é
opcional) é opcional – basta escrever Next para fechar o laço. No entanto, ela melhora
significativamente a compreensão do código e, portanto, é amplamente recomendada.

3.1.1.2.2 Do... Loop


Do
Declaração
Loop

A instrução Do... Loop convencional é executada continuamente. Você deve colocar uma
condição de teste no interior do laço, através de uma instrução If... Then... Else, para fazer com
que ela termine sua execução, enviando uma instrução do tipo Exit Do.
ª Exemplo: No exemplo a seguir, a instrução Do... Loop é executada continuamente, ate que
o valor da variável fCancelar seja verdadeiro.
Do
DoEvents
If fCancelar Then
Exit Do
End If
Loop

Muito cuidado na hora de utilizar uma instrução Do... Loop, pois se o valor que determina o
final do laço não for alcança o laço seja executado infinitamente, fazendo com que a aplicação seja
paralisada, provocando um Bug, consequentemente travando o computador.
As estruturas Do... Loop possuem diversas variantes e são utilizadas para fazer com que o
código seja executado seguidamente, até que uma determinada condição seja verdadeira. Esta
condição pode ser testada no início ou no fim do laço, e é normalmente utilizada com as cláusulas
While (enquanto) ou Until (até).

3.1.1.2.3 Do While... Loop


Do While <condição>
Declaração
Loop

Nesta variante, as instruções dentro do laço Do... Loop serão executadas enquanto
(While) o valor de <condição> for verdadeiro. Isto significa que, se o valor de <condição> for
falso antes do início do laço, as declarações contidas em seu interior não serão executadas.

3.1.1.2.4 Do Until... Loop


Do Until <condição>
Declaração
Loop

Apesar desta instrução ser muito semelhante a anterior à anterior, o teste é feito em um
momento diferente. Neste caso, o laço será executado até que o valor <condição> seja
verdadeiro, o que inverte a situação anterior, ou seja, as declarações no interior do laço serão
executadas apenas se o valor de <condição> for falso.
Microsoft Visual Basic – Estrutura de uma Aplicação 13

3.1.1.2.5 While... Wend


While <condição>
Declaração
Wend

Esta estrutura é bastante semelhante a estrutura Do While... Loop. A diferença entre elas
consiste no fato de que While... Loop é menos flexível do que um laço Do... Loop convencional,
não permitindo, por exemplo, sair prematuramente do laço em uma instrução Exit Loop.
Além disso, a estrutura While... Wend sempre executa o teste <condição> no início do
laço.

3.1.1.2.6 For Each... Next


For Each <objeto> In <Colação>
Declaração
Next

Esta estrutura permite que você caminhe por todos os objetos de uma coleção ou matriz
(variável do tipo array).
ª Exemplo: No exemplo a seguir, você pode utilizar a estrutura For... Each para alterar a
propriedade Enabled (ativado) de todos os controles do tipo TextBox (Caixa de Texto) do
formulário frmMain, tornando-os indisponíveis.
For Each ctl In frmMain
If TypeOf ctl Is TextBox Then
ctl.Enabled = False
End IF
Next

A cláusula For... Each cria automaticamente uma variável chamada ctl (uma abreviação de
control ou controle), e faz um laço por todos os controle do formulário frmMain, desativando todas
as caixas de texto, sem importar quantas elas são. Verifique que o teste para saber se o controle é
mesmo uma caixa de texto (TextBox), é realizado pela cláusula If TypeOf Is TextBox Caso o valor
retornado seja verdadeiro o controle testado é desabilitado, ou seja, o controle é uma caixa de
texto, se o controle for um botão (CommandButton) este não será desabilitado pois não é um
TextBox.

3.1.1.2.7 With... End With


With <coleção>
Declaração
End With

Esta estrutura permite que o programador referencie diretamente cada elemento ou


propriedade de uma coleção (ou matriz), sem a necessidade de especificar o caminho completo
(ou índice) para cada elemento da coleção.
A estrutura With... End With, é muito utilizada para permitir a alteração de diversas
propriedades de um único controle ou formulário do Visual Basic ou Access.
ª Exemplo: para alterar diversas propriedades de uma Caixa de Texto (TextBox) chamada
txtxValorTotal, utiliza-se a estrutura With... End With, da seguinte forma:
With txtValorTotal
.Locked = False
.MaxLenght = 30
14 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

.TabStop = True
.Visible = True
End With

3.1.1.3. Saindo das Estruturas de Loop


Algumas vezes você pode precisar terminar abruptamente a execução de uma estrutura de
laço antes de a condição testada ser verdadeira.
No caso da estrutura For... Next, você pode utilizar uma instrução Exit For dentro do
laço, para que a instrução que segue a cláusula Next seja imediatamente executada.
Já nas estruturas Do... Loop utilize a instrução Exit Do. Isto fará com que a instrução que
segue a cláusula Loop seja imediatamente executada.
Devemos lembrar que Exit Loop, não funcionara na cláusula While... Wend.

3.2. Formulários e Controles


Cada formulário de uma aplicação é gravado em um arquivo com seções bem-definidas –
uma seção reúne o código que define os objetos apresentados em tela e a configuração de suas
propriedades, outra seção contém as declarações das variáveis e objetos não visuais utilizados
pelo formulário e, finalmente, uma outra seção inclui o código das rotinas de eventos, além das
rotinas e funções escritas pelo programador para uma determinada finalidade.
O formulário visualizado em uma tela possui uma interface gráfica, que é carregada pelo
VB a partir do arquivo padrão som extensão FRM. Além da interface gráfica os formulários
(Forms) possuem instruções (código) para execução e tarefas, pré-determinadas pelo
programador.
Um formulário possui propriedades, para sua definição visual, métodos, que definem
seu comportamento e eventos, relativos à interação como usuário.
As propriedades podem ser definidas na fase de desenho (Design Time) – através da janela
de propriedades (Figura 05) – ou também durante a execução da aplicação (Run Time), porém
existem algumas propriedades que são somente leitura (Read Only) em tempo de execução (Run
Time). Caso alguma seqüência de código seja definida para um determinado evento, ela será
automaticamente disparada quando este ocorrer, já os métodos são funções intrínsecas ao
formulário e, se invocadas em determinada linha de comando (código), podem ser acessadas
somente durante a execução da aplicação pelo disparo de algum evento.

Tabela 5. Prefixos para nomes dos objetos mais utilizados em aplicação (Sugestão da Microsoft e
do Autor)
Objeto/Componente Prefixo Exemplo
"Outline" out outChart
Abas (TabStrip) tab tabDados
Árvore de visualização (TreeView) tvw tvwNome
Barra de Ferramentas (ToolBar) tlb tlbMain
Barra de rolagem horizontal (HscroolBar) hsb hsbPicture
Barra de rolagem plana (FlatScroolBar) fsb fsbTextBox
Barra de rolagem vertical (VScroolBar) vsb vsbPicture
Barra de Status stb stbMain
Botão de comando (CommandButton) cmd cmdClose
Botão de opção (OptionButton) opt optSend
Caixa de Diálogo (CommonDialog) cdl cdlOpenFile
Caixa de Listagem (ComboBox) cbo ou cmb cboName
Caixa de listagem de Banco de dados (DBCombo) dbc dbcState
Caixa de listagem de imagens (ImageCombo) icb ou cbi icbIconSmall
Microsoft Visual Basic – Estrutura de uma Aplicação 15

Objeto/Componente Prefixo Exemplo


Caixa de Máscara (MaskEditBox) msk mskPhone
Caixa de Texto (TextBox) txt txtName
Caixa de texto formatado (RichTextBox) rtf rtfFile
Caixa de Verificação (CheckBox) chk chkSaveSetting
Contador de tempo ou temporizador (Timer) tmr tmrShowAll
Controle de animação (Animation) ani aniAviFile
Controle de Dados (DataControl) dat ou dtc datDBase
Controle de gráfico (MSChart) grf grfDBase
CoolBar clb clbMain
DTPicker dtp dtpMonth
Figura (PictureBox) pic piclogo
Forma (Shape) shp shpSquare
Formulário (Form) frm frmMain
Formulário MDI (MDIForm) mdi mdiMain
Grade (Grid) grd grdName
Grade do Bando de Dados (DBGrid) dbg dbgTitle
Imagem (Image) img imgIcon
Legenda (Label) lbl lblTitle
Linha (Line) lnh lnhVertical
Lista (Listbox) lst lstEmail
Lista de arquivos (FileListBox) flb filBitmap
Lista de diretórios (DirListbox) drl drlSource
Lista de Drive (DriveListBox) dvl dvlSource
Lista de imagens (ImageList) iml imlIcons32
Lista de visualização (ListView) lvw lvwTitles
Listagem de Banco de dados (DBList) dbl dblAuthor
mnu ou mnuFile ou
Menu
smnu smnuProperty
Módulo (Module) mod modAPIs
Módulo Classe (Class Module) cls clsTypeFile
Moldura (Frame) fra fraTitles
MothView mvw mvwCalendar
MS Flex Grid fgd fgdAuthor
MS Tab tab tabConfig
OLE ole oleWord
Página de propriedades (Property Page) ppg ppgFont
Painel Tridimensional (3D Panel) pnl pnlGroup
ProgressBar (Barra de progresso) pbr pbrLoadfile
Relatório (DataReport) drp drpTitles
Resource File res resIcons
Slide (Slider) sld sldConfig
UpDown upd updCopies
User Control ctl ctlButton
16 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Os formulários possuem várias propriedades como segue na Tabela 6.


Tabela 6. Principais propriedades de um formulário.
Propriedade Descrição Valor Padrão
Define o nome do formulários (vide prefixos de nome de
(Name) Form1
objetos Quadro 4)
Apparence Define a aparência do formulário se 0 – Flat ou 1 – 3D 1 – 3D
BackColor Define a cor do fundo do formulário &H8000000F&
Define o tipo borda que o formulário exibirá: 0 – None; 1
BorderStyle 2 – Sizable
– Fixed Single; 2 – Sizable; 3 – Fixed Dialog
Define o texto que será exibido na barra de título do
Caption Form1
formulário
Define se o formulário irá exibir ou não os botões de
ControlBox True
minimizar, maximizar, fechar e o ícone da janela.
Enabled Define se o formulário estará ativo ou não True
Font Define a fonte que o formulário irá exibir MS Sans Serif
Fore Color Define a cor da fonte no formulário &H80000012&
Height Define a altura do formulário 3570
Icon Define o ícone que o formulário exibirá
Define a posição a esquerda do monitor que o formulário
Left 0
irá se posicionar
MaxButton Exibe ou oculta o botão fechar do formulário True
Define se o formulário será "Child - filho" ou não de uma
MDIChild False
formulário MDIForm
MinButton Exibe ou oculta o botão minimizar do formulário True
MouseIcon Exibe o cursor personalizado do formulário (None)
Exibe o cursor do formulário: 0 – Default; 1 – Arrow; 2 –
Cross; 3 – I-Bean; 4 – Icon; 5 – Size; 6 – Size NE SW; 7 –
MousePointer Size N S; 8 – Size NW SE; 9 – Size W E; 10 – Up Arrow; 0 – Default
11 – Hourglass; 12 – No Drop; 13 – Arrow or Hourglass;
14 – Arrow and Question; 15 – Size All; 99 – Custom
Moveable Define se o formulário será móvel ou não True
Picture Define a imagem que será exibida no fundo do formulário (None)
Define a posição que o formulário será exibido na tela: 0
3 – Windows
StartUpPosition – Manual; 1 – CenterOwner; 2 – CenterScreen; 3 –
Default
Windows Default
Define a posição no parte superior do monitor que o
Top 0
formulário irá se posicionar
Visible Define se o formulário será visível ou não True
Width Define a largura do formulário 4770
Define como o formulário será exibido em run time
WindowState (tempo de execução) 0 – Normal; 1 – Minimized; 2 – 0 – Normal
Maximided

Além do arquivo alfanumérico FRM, que contém as informação de propriedades, linhas de


comando, eventos do formulário dos controles inseridos nele, o VB poderá gerar um arquivo
binário com extensão FRX, o qual contém informações binárias de certas propriedades do form ou
dos controles, por exemplo: ícone e figura do Form, figura do PictureBox, etc.
Os controles, assim como o formulário, também possui propriedades, eventos e métodos,
porém muito variáveis, de acordo com a finalidade do controle e do fabricante.
Microsoft Visual Basic – Estrutura de uma Aplicação 17

Sistema operacional modMa in Módulos Classes


API's módulo In icial da aplicação User Control
DL L's
ActiveX's

frmMain m enus

controles
frmCad astro

Banco de d ados Imp ressora

Arqu ivo

con troles
menus

Figura 4. Organograma simplificado de uma aplicação.

Figura 5. Janela de propriedades do Visual Basic.


3.3. Módulos (Module) e Módulos Classe (Class Module)
3.3.1. Módulos (Module)
Os módulos padrão (Module), em geral são utilizados para declarar procedimentos públicos
(procedures) e criar funções publicas, minimizando assim o trabalho de escrita de códigos e
reduzindo desta forma o tamanho do executável final. Em geral se utiliza os módulos padrão para
criar procedimentos comuns a vários eventos que o Visual Basic irá utilizar. Por exemplo, se o
programador deseja que três botões (CommandButton) exiba o mesmo formulário, porém com
as propriedades deste forma diferente, uma função poderá substitui o exemplo do exibido no
Código 3, ou seja, o Código 4, seria mais rápido e menos trabalhoso.
Sempre que possível recomenda-se ao programador que crie suas próprias funções com o
objetivo de minimizar o trabalho árduo de declaração de eventos. Agilizar a escrita das linhas de
código poderá facilitar a localização de possíveis erros que possam ser gerados pelo Visual Basic.
Se houver erro será mais fácil encontrar dentro de uma função que serve de procedimento para
18 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

inúmeros eventos, do que procedimentos idênticos, escritos várias vezes ao longo das linhas de
códigos.

Private Sub cmdOpcao1_Click()


Form2.Caption = "Exibindo a primeira opção"
Form2.BackColor = vbWhite
Form2.Show
End Sub

Private Sub cmdOpcao2_Click()


Form2.Caption = "Exibindo a segunda opção"
Form2.BackColor = vbBlack
Form2.Show
End Sub

Private Sub cmdOpcao3_Click()


Form2.Caption = "Exibindo a terceira opção"
Form2.BackColor = vbRed
Form2.Show
End Sub
Código 3. Código extensos para alterar a propriedade Caption e BackColor, do Form2 e exibi-
lo.
Private Sub cmdOpcao1_Click()
Call ShowForm(Form2, "Exibindo a primeira opção", vbWhite)
End Sub

Private Sub cmdOpcao2_Click()


Call ShowForm(Form2, "Exibindo a segunda opção", vbBlack)
End Sub

Private Sub cmdOpcao3_Click()


Call ShowForm(Form2, "Exibindo a terceira opção", vbRed)
End Sub

'Num Módulo, podem ser inserido na janela Code do Form


Public Function ShowForm(frm As Form, sCaption As String, cColor As
ColorConstants)
With frm
.Caption = sCaption
.BackColor = cColor
.Show
End With
End Function
Código 4. Código mais práticos através da função ShowForm para alterar a propriedade
Caption e BackColor, do Form2 e exibi-lo.

3.3.2. Módulos Classe (Class Module)


Os módulos classe (ou simplesmente Class), diferem dos módulos padrão na forma como
seus dados são armazenados. Eles existem separadamente para cada instância de classe (isto é,
para cada objeto criado de uma classe).
Num módulo padrão, as variáveis declaradas públicas são visíveis em qualquer lugar do
projeto. Já num módulo classe, elas poderão ser acessadas apenas se uma variável de objeto
contiver uma referência a uma instância particular de uma classe.
Microsoft Visual Basic – Estrutura de uma Aplicação 19

Para exemplificar vamos criar um projeto StandardEXE e adiciona um modulo padrão


(Module) e um Class Module) ambas opções poderão ser encontradas no menu Project.
Adicione o código a seguir em Class1:
'Uma propriedade dos objetos Class1
Public Comment as String

'Um método dos objetos Class1


Public Sub ShowComment()
Msgbox Comment,, sTitle
End Sub
No módulo Class1, foi criado a variável Comment que verdadeiramente é uma propriedade
da Class1, de maneira que temos a propriedade Comment e o método ShowComment, para
qualquer objeto da classe Class1.
Adicione o seguinte código no modulo padrão Module1:
'Código modulo padrão é publico
Public sTitle as String

Public Sub GetComment (ByVal c1 as Class1)


c1.Comment = "Acionado por uma função pública"
End Sub

A linha de comando c1.Comment= "Acionado por uma função pública", altera o conteúdo
da variável pública Comment, ou melhor, altera o valor da propriedade Comment de um objeto
Class1. Somente a instância, isto é, o objeto passado para a rotina (ByVal c1 as Class1) será
afetado.
A seguir insira dois botões (CommandButton) no From1 e adicione as seguinte linhas de
código na seção Declarations:
Private c1Firt As Class1
Private c1Second as Class1

No evento Load do Form1, entre com as seguintes instruções – estas criarão duas
instâncias da classe Class1:
Private Sub Form_Load()
Set c1First = New Class1
Set c1Second = New Class1
sTitle = "Dados públicos de texto"
End Sub

Para completar a codificação, adicione as seguintes linhas de comando no evento Click dos
botões de comando:
Private Sub Command1_Click()
Call GetComment(c1First)
c1First.ShowComment
End Sub

Private Sub Command2_Click()


c1Second.ShowComment
End Sub
Ao rodar o projeto, quando o Form1 for "carregado", serão criadas duas instâncias de
Class1, cada uma com seus próprios dados. A instrução sTitle = "Dados públicos de texto",
configura o valor da variável pública sTitle.
Pressionando o botão Command1, será chamada a rotina pública e passada uma
referência para o primeiro objeto Class1 criado. A rotina pública configura a propriedade
20 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Comment – o método ShowComment, será carregado para exibir o dado do objeto. A caixa de
mensagem mostra o texto "Acionado por uma função pública", demonstrando que a rotina pública
GetComment configurou a propriedade Comment do objeto que lhe foi passado, e que a "string"
pública está visível dentro de Class1.
O botão Command2, apensa chama o método ShowComment, da segunda instância de
Class1. Os dois objetos têm acesso à variável pública "string", mas a propriedades Comment do
segundo objeto está em vazia (em branco), porque chama a rotina pública GetComment comente
da propriedade Comment alterada para o primeiro objeto.

3.4. Menu Editor


Toda a aplicação necessita de menus. Po exemplo o Microsoft® Word, possui cerca de 9
menus padrão, contendo cada menu uma série de submenus. Entretanto é necessário planejar
bem o menus que farão parte da aplicação pois uma mau planejamento poderá levar sua aplicação
ao fracasso. A Figura 6, o menu editor. Iremos discutir um pouco cada campo para que você
possa saber a função de cada um.
ª Caption – Especifica o texto que deverá aparecer no menu. Para criar uma tecla de atalho
associando a tecla Alt mais uma letra do valor caption, basta inserir o símbolo & antes da
letra desejada. Ex.: &Arquivo, será exibido em run-time (tempo de execução) Arquivo.
Quando o usuário da aplicação pressionara conjuntamente as teclas ALT+A o menu será
selecionado;
ª Name – Especifica o nome do menu. Este deverá possuir um valor único, ou seja, não
poderão existir dois ou mais menus com o mesmo nome, salvo se for atribuído valor
seqüencial no campo Index;
ª Index – Se for especificado um valor seqüencial no campo index é possível dar a vário menu
o mesmo nome;
ª Shortcut – Especifica a tecla de atalho do menu. Somente submenus poderão conter teclas
de atalho de acordo com a lista do campo;
ª HelpContextID – O número do tópico de ajuda associado ao menu;
ª NegotiatePosition – Especifica a posição do menu;
ª Checked – Especifica se o menu será ticado (9) ou não;
ª Enabled – Especifica se o menu estará habilitado ou não;
ª Visible – Especifica se o menu estará visível ou não;
ª WindowsList – Esta opção e muito importante para aplicação MDI e lista as janelas abertas
pela aplicação, porém está opção deverá ser especificada somente para um men;
ª ÅÆ – Estas setas possibilitam criar o remover uma hierarquia. Ex.. Na Figura 6 o submenu
&Novo, foi criado clicando no botão Æ, para removê-lo basta clicar no botão Å;
ª ÇÈ – Estas setas permitem mover o menu para cima o para baixo.
Microsoft Visual Basic – Estrutura de uma Aplicação 21

Figura 6. Menu Editor do Microsoft® Visual Basic.


3.5. Exercícios

1. Para desenvolver uma aplicação em Visual Basic é necessário um planejamento detalhado das
janelas e procedimentos da aplicação? Porquê?
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________

2. São propriedades de um formulário?


( ) ImageHeight ( ) Icon ( ) Picture ( ) Click ( ) Load ( ) Top
( ) WindowState ( ) Caption ( ) Print ( ) Resize ( ) Left ( ) BackColor

3. Assinale V (verdadeiro) ou F (falso) nas opções seguintes:


( ) Tanto os dados alfanuméricos quanto os dados binários do formulário são armazenados no
arquivo de extensão FRM.
( ) Somente os dados alfanuméricos do formulário são armazenados no arquivo com extensão
FRX.
( ) Os dados binário do formulário são armazenados no arquivo com extensão FRX.
( ) Os dados alfanuméricos do formulário são armazenados no arquivo com extensão FRM.

4. Qual das estruturas de decisão oferece ao programador utilizar in;umeras possibilidades de


tratamento do valor gerado pela cláusula <condição>?
________________________________________________________________________________

5. Dentre as estruturas de laço qual delas é menos flexível e não permite a interrupção abrupta
pela instrução Exit Loop.
________________________________________________________________________________
22 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

6. Crie um código em que seja possível verificar se o tipo de controle testado é um


CommandButton e em segunda altere através do laço With... End With as propriedades Cancel
para falso; Default para verdadeiro e Enabled para verdadeiro.
For Each

Next

7. Correlacione os controles aos prefixos sugeridos pela Microsoft e pelo Autor.


(1) CommandButton ( ) fra
(2) Frame ( ) lbl
(3) DBCombo ( ) lvw
(4) TreeView ( ) cdl
(5) ToolBar ( ) dbc
(6) Timer ( ) hsc
(7) ListBox ( ) dat
(8) StatusBar ( ) pgb
(9) ProgressBar ( ) msk
(10) CommonDialog ( ) pic
(11) DataControl ( ) cmd
(12) RichTextBox ( ) lst
(13) MaskEditBox ( ) tmr
(14) PictureBox ( ) rtf
(15) HScroolBar ( ) stb

8. Assinale V (verdadeiro) ou F (falso) nas descrições das propriedades do formulário:


( ) BorderStyle – Define o tipo borda que o formulário exibirá.
( ) O valor padrão da propriedade ControlBox é False.
( ) StartUpPosition - Define a posição que o formulário será exibido na tela: 0 – Manual; 1 –
CenterOwner; 2 – CenterScreen; 3 – Windows Default
( ) Height define a largura e Width define a altura do formulário.
( ) WindowState – Define como o formulário será exibido em run time (tempo de execução) 0 –
Normal; 1 – Minimized; 2 – Maximided

9. Qual a diferença básica ente um módulo padrão (Module) e um Módulo Classe (Class Module)
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
10. Qual dos dois código abaixo tem maior rapidez no momento da escrita dos códigos.
Código 1 ( )
Private Sub cmdShowAbout_Click()
Microsoft Visual Basic – Estrutura de uma Aplicação 23

Call LoadForm (frmAbout, "Sobre...", vbNormal, vbWhite)


End Sub

Private Sub cmdShowCredits_Click()


Call LoadForm (frmCredits, "Créditos...", vbMaximized, vbBlack)
End Sub

Public Function LoadForm(frm As Form, sCaption As String, wState As


FormWindowStateConstants, cColor As ColorConstants)
With frm
.Caption = sCaption
.WindowState = wState
.BackColor = cColor
.Show 1, Me
End With
End Function

Código 2 ( )
Private Sub cmdShowAbout_Click()
frmAbout.Caption = "Sobre..."
frmAbout.WindowState = vbNormal
frmAbout.BackColor = vbWhite
frmAbout.Show 1, Me
End Sub

Private Sub cmdShowCredits_Click()


frmCredits.Caption ="Créditos..."
frmCredits.WindowState= vbMaximized
frmCredits.BackColor= vbBlack
frmCredits.Show 1, Me
End Sub

11. Especifique descritivamente com criar uma seqüência de menus contendo o menu Arquivo,
com submenus Novo, Abrir, Fechar, Salvar, Salvar Como... e Sair. Cada menu deverá possui
uma teca de atalho associada a tecla Alt e um Shortcut.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
_______________________________________________________________________________
24 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 25

4. CONTROLES PERSONALIZADOS (PROPRIEDADES E EVENTOS)


Neste capítulo será abordado os controle personalizados, mais utilizados no Visual Basic,
obviamente na maioria, este são controles da própria Microsoft, outros não.
Existem milhares de controles (componentes) que em geral são designados como Controles
ActiveX2, que tem o objetivo de substituir dezenas, centenas ou milhares de linhas de código que o
programador teria de escrever sem a presença deste controles, em síntese uma "mão na roda",
facilitando e diminuindo o tempo de programação. A Microsoft acredita que até 1998 existiam
cerca de 2.000 controles comerciais e milhares de controles shareware e freeware disponíveis na
internet.
Para ter acesso aos controles personalizados do Visual Basic, basta clicar no menu Project
> Components, ou simplesmente Ctrl+T. será exibida uma janela como todos os controles ActiveX
registrados no sistema operacional (Figura 7).
Selecione o(s) controle(s) desejado(s) e clique em OK ou Aplicar. Para cada controle
selecionado poderá ser exibido um ou mais ícone na barra de ferramentas (lateral) do Visual Basic,
referente ao componente. Por exemplo, o Microsoft Windows Common Control 6.0 (SP4)
(MSComctl.ocx), possui 9 componentes embutidos (TabStrip, ToolBar, StatusBar,
ProgressBar, Treeview, ListView, ImageList, Slider e ComboImage),(Figura 8) já o
componente Microsoft Windows Common Control –2 (SP4) (MSComctl332.ocx), possui apenas um
controle (CoolBar).
A versão Standard do Visual Basic oferece cerca de 25 componente, já as versões
Profesional e Enterprise, oferecem mais de 50 componentes ActiveX.
O Visual Basic possibilita ao programador desenvolver seus próprios componentes, sejam
eles ActiveX ou Dll's. porém é necessário que o programador possua conhecimento avançado
sobre o próprio Visual Basic e conhecimentos sobre API's (Application Programmable Internal, ou
seja, Aplicação Internas Programáveis). Vários livros e tutoriais estão dsiponíveis para quem
deseja enveredar por está fascinante área da programação. Só para elucidar ao programador que
deseja realmente adentrar neste campo, a documentação da Microsoft para API's (Microsoft API's
Guide), são nada mais nada menos que cinco (05) livros com mais de 400 páginas cada.

Figura 7. Caixa de controles ActiveX personalizados, localizados no sistema.

2
Tecnologia da Microsoft que utiliza componentes externos para desempenhar tarefas dentro de uma
aplicação, minimizando assim o tamanho do executável e aumentando assim a velocidade de execução
desta tarefas.
26 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 8.Microsoft Windows Common Control 6.0


4.1. Microsoft Windows Common Control 6.0
4.1.1. ImageList (Lista de Imagens)
O controle ImageList (Lista de Imagens), possibilita ao programador armazenar uma
coleção de imagens (bitmaps, ícones e cursores), para serem utilizados pelo aplicativo. Exemplo
as imagens que os controles ToolBar, ListView e TreeView, utilizam são oriundos do
ImageList.
A melhor forma para trabalhar com um controle ImageList é saber exatamente o índice
(Index) e/ou a chave (Key), que a imagem foi armazenada.
As propriedades ImageHeight e ImageWidth, especificam as dimensões da imagem que
será armazenada na coleção. Estas propriedades somente poderão ser alteradas em Design Time e
se não existir nenhuma imagem inserida no controle.
Os valores pré-fixados para imagens são 16x16 pixels, 32x32 pixels. Existe também a
opção Custom, que o programador poderá definir dimensões de altura diferente de largura na
caixa de texto Heigth e Width da Property Page, onde a dimensão de todas as imagens será
igual à dimensão da primeira inserida ao controle. Para inserir as imagens, basta clicar na
propriedade (Custom), na barra de propriedade do controle. Será exibida uma página de
propriedades (Property Page), com três abas (General, Images, Color). Na primeira aba as
propriedades de dimensão são exibidas e na segunda aba o programador poderá inserir as
imagens, clicando no botão Insert Picture3 e remover a imagem selecionada clicando em
Remove Picture4 (Figura 9).
O programador poderá inserir quantos controles ImageList quiser, porém o bom senso
deverá prevalecer.

4.1.1.1. Carregando uma Imagem da Coleção.


Para retornar ou carregar uma imagem da coleção que está dentro da ImageList, para
um PictureBox, o programador deverá saber exatamente o número do índice da imagem (a

3
Para inserir uma imagem após ligar o controle ImageList a um controle ToolBar o programador somente
poderá inserir a imagem após a última inserida e nunca entre duas imagem já inseridas.
4
Somente será possível remover a imagem caso o controle ImageList não esteja ligado a um controle
ToolBar.
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 27

coleção ListImages começa em 1), para retornar a imagem correta. A partir daí a linha de código
abaixo carrega a segunda imagem da coleção da ImageList1 para a Picture1.
Na Figura 9a podemos ver as configurações do tamanho das imagens que irão compor a
coleção, devemos ressaltar que o tamanho deverá ser escolhido antes de iniciar a inserção de
imagens à coleção, pois o controle não permite modificar este valor após Ter sido inserida pelo
menos uma imagem, a opção UseMaskColor retorna ou seta a mascara de cor que a coleção irá
utilizar, veja exemplo no Código 5. Na Figura 9b pode ser verificado dois campos Key e Tag. O
campo Key deverá ser único e é Case Sensitive, ou seja, há diferença entre info e Info, pois há
diferença na primeira letra. Para evitar erros recomenda-se que todos os valores sejam em
minúsculo, sabe-se que o valor setado pode conter qualquer letra, número ou símbolos. Ex:
info@/1. Entretanto seria mais fácil somente info1. O campo Tag serve para que qualquer
configuração extra possa ser especificada (setado). Desta forma o campo Tag em qualquer
controle serve para dar maior flexibilidade ao programador na hora de especificar um valor, além
das variáveis que podem ser declaradas, mas a propriedade Tag acaba sendo mais flexível.

Private Sub Form_Load()


Dim imgX As ListImage

' Load bitmaps.


Set imgX = ImageList1.ListImages. _
Add(, "No", LoadPicture("bitmaps\assorted\Intl_No.bmp"))
Set imgX = ImageList1.ListImages. _
Add(, , LoadPicture("bitmaps\assorted\smokes.bmp"))
Set imgX = ImageList1.ListImages. _
Add(, , LoadPicture("bitmaps\assorted\beany.bmp"))

ScaleMode = vbPixels
' Set MaskColor property.
ImageList1.MaskColor = vbGreen
' Set the form's BackColor to white.

Form1.BackColor = vbWhite
End Sub

Private Sub Form_Click()


Static intCount As Integer ' Static variable to count images.

' Reset variable to 2 if it is over the ListImages.Count value.


If intCount > ImageList1.ListImages.Count Or intCount < 1 Then
intCount = 2 ' Reset to second image
End If

' Overlay ListImage(1) over ListImages 2-3.


Picture1.Picture = ImageList1.Overlay(intCount, 1)
' Increment count.
intCount = intCount + 1

' Create variable to hold ImageList.ImageWidth value.


Dim intW
intW = ImageList1.ImageWidth

' Draw images onto the form for reference. Use the ImageWidth
' value to space the images.
ImageList1.ListImages(1).Draw Form1.hDC, 0, 0, imlNormal
28 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

ImageList1.ListImages(2).Draw Form1.hDC, 0, intW, imlNormal


ImageList1.ListImages(3).Draw Form1.hDC, 0, intW * 2, imlNormal
End Sub
Código 5. Este exemplo carrega vários bitmaps em um controle ImageList. Quando o form é
clicado um uma imagem da lista é substituída por outra Imagem. Este exemplo necessita de um
controle ImageList e um controle PictureBox.5

Set Picture1.Picture = ImageList1.ListImages(2).Picture


Código 6. Linha de comando para retornar a segunda imagem da coleção da ImageList1 para o
controle Picture1.
Caso a imagem da coleção seja um ícone, poderá ser utilizada a seguinte linha de código.

Set Picture1.Picture = ImageList1.ListImages(2).ExtractIcon


Código 7, Linha de comando para retornar a segunda imagem (ícone) da coleção da ImageList1
para o controle Picture1.

A– B–
Figura 9. A- configurações do tamanho das imagens; B- coleção de imagens inseridas no
ImageList.

4.1.2. Controle ListView (Lista de Visualização)


O controle ListView (Figura 10)permite que o programador apresente itens de várias
maneiras. Arranjados em colunas, em lista, com detalhes, ícones pequenos, ícones grandes. Como
é o gerenciador de arquivos do Windows, o Windows Explorer. A Tabela 7, demonstra os
valores da propriedade View do controle ListView.

Tabela 7. Constantes, valores e descrição do propriedade View do controle ListView.


Constante Valor Descrição
(Padrão) Cada objeto ListItem é representado por um ícone de
lvwIcon 0
tamanho grande.
Cada objeto ListItem é representado por um ícone de tamanho
lvwSmallIcon 1 pequeno e um rótulo de texto que aparece à direita do ícone.
Vários itens são arranjados horizontalmente.
Cada objeto ListItem é representado por um ícone de tamanho
lvwList 2 pequeno e um rótulo de texto que aparece a direita do ícone.
Os objetos ListItem são verticais em linha diferentes, e a

5
Exemplo retirado do arquivo de ajuda do Microsoft® Visual Basic 6.0.
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 29

Constante Valor Descrição


informação de texto é organizada em colunas.
Cada objeto ListItem é representado por um ícone de tamanho
pequeno e um rótulo. Os ícones é rótulos aparecem em
lvwReport 3
colunas. Colunas adicionais são utilizadas para exibir texto
adicionais, ou propriedades.

Figura 10. Controle ListView, exibindo ícones pequenos.


Os itens exibidos no controle ListView são chamados (naturalmente) de objetos
ListItem. Um objeto ListItem tem suas próprias propriedades que descrevem o item, entre as
quais há algumas mais importantes, exibidas na Tabela a seguir.

Tabela 8. Propriedades do controle ListView.


Propriedade Descrição
Icons Retorna ou configura o índice ou a chave para o ícone associado ao objeto
ListItem. Quando declarado após o controle (ListView1.Icons), é utilizado para
indicar qual controle ImageList, contém os ícones grandes6 a ser exibidos.
SmallIcons Retorna ou configura o índice ou a chave para o ícone associado ao objeto
ListItem. Quando declarado após o controle (ListView1.SmallIcons), é utilizado
para indicar qual controle ImageList, contém os ícones pequenos7 a ser
exibidos.
Selected Informa se LisItem foi selecionado (ou faz sua seleção).
SubItems Retorna ou configura a string representando os dados do subsitema associado
com um determinado ListItem. Em geral é utilizado para adicionar ou selecionar
uma coluna, quando a propriedade View é igual 3- lvwReoprt
View Configura a forma de exibição do objeto ListItem, como visto no Quadro 7.

Sintaxe para inserir um objeto ListItem.


object.Add(index, key, text, icon, smallIcon) ou ListView1.ListItems.Add([Index], [Key], [Icon],
[SmallIcon])

Parte Descrição
object Requerido. Uma expressão de objeto que possua uma coleção de ListItems.
index Opcional. Um inteiro (Integer) que especifica a posição onde você quer inserir o
ListItem. Se nenhum índice for especificado, o ListItem é adicionado no fim da
coleção ListItems.
key Opcional. Uma expressão de string única que pode ser usada para acessar um
membro da coleção.
text Opcional. Uma string que é associada ao controle de objeto de ListItem.
icon Opcional. Um inteiro que fixa o ícone para ser exibido a partir de um controle de

6
Em geral ícones grandes possuem a dimensão de 32x32 pixels
7
Em geral ícones pequenos possuem a dimensão de 16x16 pixels
30 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

ImageList, quando o controle de ListView for configurado para visão de Ícone


smallIcon Opcional. Um inteiro que fixa o ícone para ser exibido a partir de um controle
ImageList, quando o controle ListView for configurado para visão de Small-
Icon.
Para poupar recursos do sistema, é possível o programador pode"amarrar" um controle
ImageList ao controle ListView, através da propriedade (Custom), além de poder especificar
qual é a ImageList, que possui ícones pequenos (SmallIcon) e ícones grandes (Icon), outra
propriedade que poderá ser alterada em design time ou run time é a exibição da legenda das
colunas (HideColumnHeaders), o valor é do tipo booleano (True/False).

4.1.3. Controle ProgressBar (Barra de Progresso)


A controle ProgressBar (barra de progresso), é em geral utilizado para exibir o
"andamento" de uma determinada tarefa (em geral "demorada") que está sendo desenvolvida
pelo aplicativo, demonstrando ao usuário que o aplicativo não "travou" e está desempenhando a
tarefa que foi determinada. O progresso poderá se dar de duas formas, através de progresso
quadro a quadro ou em faixa contínua (Figura 11). Que poderá será alterado na propriedade
Scrooling.
As propriedades Min e Max, permite configurar, respectivamente, o valor inicial (mínimo =
0) e o valor limite. Já a propriedade Value, se refere a posição entre o intervalo já preenchido e o
intervalo que falta para ainda a conclusão do progresso.

Figura 11. Controles ProgressBar's exibindo os dois valores da propriedades Scrolling (0 –


ccScrollingStandard e 1- ccScrollingSmooth)
Para simular um progresso insira no Form1 um controle ProgressBar, um TextBox e um
CommandButton, e em segunda escreva as seguintes linhas de código no evento Click do botão.
Private Sub Command1_Click()
Dim i As Integer
pgbTarefa.Min = 0
pgbTarefa.Max = Text1.Text
pgbTarefa.Value = pgbTarefa.Min

For i = 0 To Text1.Text
pgbTarefa.Value = i
Next i
End Sub
Código 8. Rotina simples para exibir o progresso de um controle ProgressBar.
O Código 8 não verifica se o valor digitado na caixa de texto Text1, é numérico, portanto
para que não ocorra erro digite somente valor numérico positivo. Outra informação é que, quanto
maior for o valor maior será o tempo para que o preenchimento do progresso seja efetuado.
Inicialmente no Código 8, declaramos uma variável privada i, com Integer, para ser
utilizada no laço For-Next, que conta cada incremento a partir do valor 0 a adiciona o valor 1 a
variável i cada vez que o laço e reiniciado, até que o valor de i seja igual ao valor digitado na
caixa de texto. O valor mínimo (Min) da barra de progresso foi atribuído como 0 e o valor máximo
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 31

(Max), foi atribuído ao valor digitado na caixa de texto (se a caixa de texto estiver vazia ou com
valor não numérico positivo o Visual Basic retorna um erro (Run-time error '13': Type mismatch).
Para testa o progresso, basta inserir, por exemplo, o valor 1.000 ou 2.000 na caixa de texto
e clicar o botão CommnadButton1.

4.1.4. Controle StatusBar (Barra de Status)


O controle StatusBar, fornece a o usuário informações adicionais de status do seu
aplicativo tais como: se as tecla Caps Lock, Num Lock, Insert está ativar ou não, Data e Hora do
Sistema operacional, etc.(Figura 12). Por exemplo, o processador de texto Microsoft® Word,
utiliza o controle barra de status para informara ao usuário qual a página que está sendo editada,
qual seção, qual linha e coluna e assim por diante (Figura 13).
Cada barra de status, poderá ser dividido em no máximo em 16 painéis (panels), cada
Painel possui as seguintes propriedades:
1. Index – é o valor de posicionamento do painel dentro do controle StatusBar (somente
leitura);
2. Text – é o texto que deverá ser exibido no painel, esta propriedade deverá está associada com
valor 0 – sbrText da propriedades Style;
3. ToolTipText – é a mensagem de dica que será exibida quando o usuário passar e parar o
mouse no painel;
4. Key – é um valor único que indica o painel;
5. Allignment – especifica o alinhamento do conteúdo do painel.
6. Stye – define o estilo e as informações que será exibida no painel (Tabela 9);
7. Bevel – configura o painel para o modo de exibição. Os valores são: 0 – sbrNoBevel, 1 –
sbrInsert (padrão) e 2 – sbrRaised. Estes valores exibem o painel respectivamente, como
plano, baixo relevo e auto relevo.
8. AutoSize – esta propriedade define o ajuste do tamanho do painel. O valores são: 0 –
sbrNoAutoSize, 1 – sbrSrping e 2 – sbrContents. Estes valores definem respectivamente o
tamanho do painel como sem ajuste, com ajuste de acordo com o espaço que falta até a
barra de status completar o tamanho da janela e ajuste de acordo com o conteúdo do painel;
9. MinimumWidth – especifica o tamanho mínimo que ao painel deverá Ter;
10. Actual Width – Exibe o tamanho atual do painel (somente leitura);
11. Picture – especifica a figura que deverá ser exibida no painel. Em geral utiliza-se figuras com
tamanho de 16x16 pixels. Esta imagem poderá ser também carregada de um controle
ImageList, com mostra o Código 6 e 7;
12. Enabled – habilita ou não o painel em run time;
13. Visible – exibe ou não o painel em run time.

Figura 12. Controle StatusBar, exibindo várias informações adicionais.

Figura 13. Controle StatusBar do processador de textos Microsoft® Word.


Private Sub Form_Load()
sbrMain.Panels(1).Picture = imlIcon16.ListImages(1).Picture
End Sub
Código 9. Linha de comando para extrair a imagem de Index 1 contida num controle ImageList
e retorna-lo para o painel a propriedade Picture da Barra de status com o Index 1.

Tabela 9. Constantes, valores e descrição da propriedade Style do Controle StatusBar.


32 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Constante Valor Descrição


(Padrão) Texto e ou bitmap (figura). Especifica o texto através
da propriedade Text; especifica a propriedade Picture, como o
sbrText 0
método LoadPicture ou através da Property Page ou como
demonstrado no Código 8.
Caps Lock. Exibe as letras CAPS em negrito quando a tecla
sbrCaps 1
Caps Lock é ativada, ou então desabilita o painel.
Number Lock. Exibe as letras NUM em negrito quando a tecla
sbrNum 2
Num Lock é ativada, ou então desabilita o painel.
Exibe as letras INS em negrito quando a tecla Insert (Ins) é
sbrIns 3
ativada, ou então desabilita o painel.
Exibe as letras SCRL em negrito quando a tecla Scrool Lock
sbrScrl 4
é ativada, ou então desabilita o painel.
sbrTime 5 Exibe o horário atual do sistema operacional
sbrDate 6 Exibe a data atual do sistema operacional

É possível adicionar (até no máximo 16 painéis) em tempo de execução (run time) através
de linhas de comando, ou mesmo especificar uma imagem a partir de uma imagem existente no
disco rígido (HD – Hard Disk) ou ainda alterar as propriedade do controle StatusBar, como pode
ser visto no (Código 9)

Private Sub Form_Load()


Dim pnlPanel As Panel
sbrMain.Panels(1).Text = "Controle StatusBar"
Set pnlPanel = sbrMain.Panels.Add(, , , sbrTime)
Set pnlPanel = sbrMain.Panels.Add(, , , sbrData)
Set pnlPanel = sbrMain.Panels.Add(, , , sbrCaps)
Set pnlPanel = sbrMain.Panels.Add(, , , , LoadPicture(App.Path _
& "\graphics\icons\Win95\Desktop.ico"))
Set pnlPanel = sbrMain.Panels.Add(, , , ,
imlIcon16.ListImages(1).Picture)
End Sub
Código 10. Controle StatusBar. Atribuindo um texto ao painel 1 e Adicionando painéis e figuras.

4.1.5. Controle ToolBar (Barra de Ferramentas)


O controle ToolBar (Figura 14), facilita a construção de uma barra de ferramentas, estilo
Windows, ou seja como pode ser visto no Windows Explorer, por exemplo. A barra de ferramenta
é um dos controles mais utilizados em aplicativos por ser intuitiva, ou seja, fornece ao usuário a
real função de cada botão contido na barra de ferramenta.

Figura 14. Controles ToolBar's alinhados no topo da janela e em baixo e com a propriedade
Style 1 – tbrFlat e 0 – tbrStandard, respectivamente.
As propriedades Gerais do controle Toolbar (Figura 15 e 16) são:
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 33

1. MousePointer – permite alterar o tipo de cursor que será exibido pela Barra de ferramenta;
2. ImageList – é o controle ImageList associado que contém os ícones que serão exibidos pela
barra de ferramentas;
3. DisabledImageList - é o controle ImageList associado que contém os ícones que serão exibidos
pela barra de ferramentas quando o botão estive desabilitado;
4. HotImageList - é o controle ImageList associado que contém os ícones que serão exibidos pela
barra de ferramentas quando o usuário passa o mouse por cima do botão8;
5. HelpContextID – Nesta propriedade o programador deverá atribuir o número do tópico de
ajuda, que foi especificado no projeto da ajuda, na seção MAP;
6. HelpFile – Nesta propriedade o programador deverá especificar o caminho lógico onde
encontra-se o arquivo de ajuda, caso este seja diferente do arquivo de ajuda do
programa/aplicativo;
7. AllowCostumize – permite que o usuário a partir de um duplo clique possa personalizar a barra
de ferramentas;
8. Wrappable – permite que a barra de ferramentas possa ser exibida "com quebra" caso o
tamanho da janela seja menor que a soma das larguras dos botões;
9. ShowTips – permite exibi ou ocultar as dicas dos botões;
10. Enabled – habilita ou desabilita a barra de ferramentas;
11. Appearance – Permite exibir a barra de ferramentas em 3D (cc3D - Padrão) ou plano (ccFlat);
12. BorderStyle – Altera o estilo da borda da barra de ferramentas, para ccNone (Sem borda -
Padrão) ou ccFixedSingle (com bordas);
13. TextAlignment – Permite alinhar o texto abaixo do botão ou ao lado – tbrTextAlignBottom
(Alinha abaixo) e tbrTextAlignRight (Alinha ao lado);
14. Style - permite alterar o estilo dos botões para 3D (tbrStandard - Padrão) ou plano (tbrFlat).

8
Geralmente quanto a propriedade HotImageList é vinculada a um controle ImageList, esta contém ícones
ou figuras coloridas e a propriedade ImageList é vinculada a um controle ImageList com ícones ou figuras
com colação em escala de cinza ou cores esmaecidas. Dando assim o efeito que poder ser visto no Windows
Explorer, Internet Explorer, etc.
34 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 15. Caixa de propriedades geral de uma barra de ferramentas (aba General).

Figura 16. Caixa de propriedades dos botões de uma barra de ferramentas (aba Buttons).

4.1.6. Controle TreeView (Árvore de Visualização)


Este controle é muito utilizado quando se quer exibir/visualizar dados de forma hierárquica,
como ocorre no Windows Explorer nas pastas exibidas à direita da janela. Outro exemplo seria
exibir dados de uma banco de dados, ou seja, dados de um mesmo autor agrupados
hierarquicamente.
O controle TreeView, possui uma Property Page (Figura 17), com praticamente todas
as propriedades exibidas na janela propriedades. A seguir iremos especificar as propriedades mais
utilizadas no controle.
A propriedade Style fornece o estilo que será exibido os nós (nodes) do controle os valores
vão de 0 a 7, como seguem:
0 – Somente texto (tvwTextOnly).
1 – Imagem e texto (tvwPictureText).
2 – Mais/menos e Texto (txwPlusMinustext).
3 – Mais/menos, imagem e texto (txwPlusPictureText).
4 – Linhas e texto (txwTreelinesText).
5 – Linhas, imagem e texto (txwTreelinesPictureText).
6 – Linhas, mais/menos e texto (txwTreelinesPlusMinusText).
7 – (Padrão) Linhas, mais/menos, imagem e texto (txwTreelinesPlusMinusPictureText).

As demais propriedades são:


1. MousePointer – permite alterar o tipo de cursor que será exibido pelo controle;
2. LineStyle – retorna ou seta o estilo de linhas exibidas entre os Nodes. Os valores são 0-
tvwTreeLines e 1 -tvwRootLines;
3. LabelEdit – configura os node para que o texto possa ser editado ou não com um duplo clique.
Os valores são 0 – tvwAutomatic (editado com duplo clique) e 1 – tvwManual (não editável);
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 35

4. ImageList – configura a o controle ImageList que contém as imagem que serão exibidas nos
nodes;9
5. BorderStyle – configura se o controle irá exibir as borad ou não. Os valores são 0 – ccNone e
1 – ccfixedSingle;
6. Appearance – configura a aparência do controle, se 3D ou plano. Os valores são 0 – ccFlat
(plano) e 1- cc3D (tridimensional);
7. Indentation – configura a largura indentation, ou seja, a largura entre o imagem ou o sins
menos/mais do node e o texto. O valor padrão é: 566,9292;
8. PathSeparator – configura o tipo de caractere que será utilizado como separador de nodes. O
valor padrão é \;
9. HideSelection – configura o controle para exibir uma marcação no último node selecionado
quando o controle perde o foco. Quando selecionado o texto não é marcado, quando não
selecionado o node fica marca com uma coloração amena, em geral cinza, quando o controle
perde o foco;
10. Sorted – configura o controle para distribuir o texto inserido nos nodes em ordem alfabética,
quando esta opção e marcada ou setada;
11. FullRowSelected – seleciona todo a linha quando o texto do node é selecionado;
12. Enabled – habilita o desabilita o controle;
13. CheckBoxes – quando esta opção e marcada ou setada, cada node exibira um CheckBoxes
(;).

Figura 17. Caixa de propriedades dos botões de um controle Treeview (aba General).

9
As imagem dentro do controle ImageList, deverão ser especificada o valor key, que deverão ser únicos, ou
seja, não podem ter valor igual. O valor key será utilizado para especificar a imagem que irá ser exibida pelo
Node, quando ele é adicionado no controle TreeView. Em geral o nome das chaves (key) são dadas em
minúsculo, pois existe uma sensibilidade entre maiúscula e minúscula, ou seja o parâmetro é Case Sensitive.
36 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 18. Exemplo de um controle Treeview, com um node pai (Ícones) e 4 nodes filhos.
LineStyle igual a 1– tvwRootLine.
Para inserir nodes num controle Treeview, basta setar os valores no método Add da
propriedade Nodes. Como mostra o Código 11.
A sintaxe para adição de nodes é: Object.Nodes.Add([relative], [relationship], [key],
[text], [image], [selectedimage])

Parte Descrição
object Requerido. Uma expressão de objeto que possua uma coleção de ListItems.
relative Opcional. O número de índice ou chave de um objeto de Node pré-existente. A
relação entre o novo node e o node pré-existentes é verificado no próximo
parâmetro, relationship.
relationship Opcional. Especifica a colocação relativa do objeto Node, como descritas na
Tabela 10.
key Opcional. Uma expressão de string única que pode ser usada para acessar um
membro da coleção.
text Opcional. Uma string que é associada ao controle de objeto de ListItem.
image Opcional. O índice ou key de uma imagem em um controle de ImageList
associado.
selectedimage Opcional. O índice ou key de uma imagem em um ImageList associado ao
controle a imagem é exibida quando o Node for selecionado.

Tabela 10. As constantes para relationship são:10


Constante Valor Descrição
tvwFirst 0 First. The Node is placed before all other nodes at the same level of
the node named in relative.
tvwLast 1 Last. The Node is placed after all other nodes at the same level of
the node named in relative. Any Node added subsequently may be
placed after one added as Last.
tvwNext 2 (Default) Next. The Node is placed after the node named in relative.
tvwPrevious 3 Previous. The Node is placed before the node named in relative.
tvwChild 4 Child. The Node becomes a child node of the node named in relative.

Private Sub Form_Load()


Dim xNode As Node
Set xNode = TreeView1.Nodes.Add(, , , "Ícones", "vb")
Set xNode = TreeView1.Nodes.Add(1, tvwChild, , "Informação",
"info")

10
Extraído do arquivo de ajuda do Microsoft® Visual Basic 6.0
Microsoft Visual Basic – Controles Personalizados (Propriedades e Eventos) 37

Set xNode = TreeView1.Nodes.Add(1, tvwChild, , "Interrogação",


"inter")
Set xNode = TreeView1.Nodes.Add(1, tvwChild, , "Exclamação",
"exc")
Set xNode = TreeView1.Nodes.Add(1, tvwChild, , "Critico", "stop")
xNode.EnsureVisible
End Sub
Código 11. Adição de nodes num controle TreeView.
Para remover um node basta seguir o exemplo do Código 12. A sintaxe para o método
Remove é Object.Nodes.Remove(index)
Private Sub Form_Click()
TreeView1.Nodes.Remove (1)
End Sub
Código 12. Removendo um node do controle TreeView.

4.1.7. Controle Slider


O controle Slider (Figura 19) resume-se em uma "régua" e um cursor. O cursor da régua
pode ser deslocado através do mouse ou pelas setas de direção do teclado. Através de sua
movimentação pode-se obter o valor relativo através da propriedade Value.
O controle possui duas propriedades importantes que determinam o intervalo entre o valor
mínimo e máximo que a propriedade value poderá ser setada. São elas Min e Max. A propriedade
LargeChange, especifica a freqüência de deslocamento do Slider, quando é acionada as teclas
Pagedown ou PageUp quando o controle recebe o foco ou quando é clicado o ponteiro do Mouse.
Mcomo este é um controle pouco utilizado em aplicações sugiro consultar o arquivo de ajuda do
Visual Basic, para maiores detalhes sobre propriedades, métodos e eventos deste controle.

Figura 19. Controle Slider

4.2. Exercícios
1. Crie um pequeno projeto utilizando os seguintes controle ToolBar, ImageList e StatusBar.
Neste projeto adicione 3 ícones ao controle ImageList e em seguida crie 3 botões no controle
ToolBar. No controle StatusBar adicione um Pannels e adicione a imagem 2 do controle
ImageList através de código. Os códigos deverão se escrito abaixo e no projeto a ser entregue
para análise.
Private Form_ ()

End Sub
38 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

2. Utilizando o controle TreeView adicione via código seis nodes com valor text livre entretanto os
valores Image e SelectedImage, diferente para cada node. O primeiro node deverá ser pai e os
demais deverão ser filhos. Adicione comentário para cada linha de comando escrita. Dica
Lembre-se da coleção de imagens.
Private Form_Load() 'Begin load event of this form

End Sub 'End or close load event of this form

3. Quanto painéis (pannels) é possível adicionar num controle StatusBar? Ë poss;ivel adiciona-los
via código, caso verdadeiro crie um exemplo, para maiores informações verifique a ajuda do
Visual Basic
________________________________________________________________________________

Private Form_Load()
'Insira aqui o código para inserir um novo painel ao controle StatusBar

End Sub

4. É possível alterar em Run-time (em tempo de execução) o valor da(s) propriedade(s):


Scrolling de um controle ProgressBar.............................: ( ) Sim ( ) Não
Style de um controle StaturBar......................................: ( ) Sim ( ) Não
ImageHeight e ImageWidth de uma controle ImageList..: ( ) Sim ( ) Não
Identation de um controle TreeView..............................: ( ) Sim ( ) Não
Gridlines de um controle ListView...................................: ( ) Sim ( ) Não
Min e Max de um controle ProgresBar.............................: ( ) Sim ( ) Não
Name de um controle TreeView......................................: ( ) Sim ( ) Não
Align de um controle StatusBar.......................................: ( ) Sim ( ) Não
LabelEdit de um controle TreeView..................................: ( ) Sim ( ) Não
Microsoft Visual Basic – Funções Data e Hora 39

5. FUNÇÕES DATA E HORA


As funções de data e hora são muito úteis para um aplicativo, por exemplo a subtração de
uma data de nascimento e a data atual, para saber a idade de uma pessoa (funcionários). Entre
diversas outras funções. Veremos as forma de declarar as diversas formas de data e hora e um
exemplo de subtração.
As funções de data aceitos pelo VB, são, Date, DateValue, Format. Abaixo segue os
formatos das funções de datas.

5.1. Date
Datas com formato inválidos, devolverá uma mensagem "Illegal function call",(Chamada
ilegal de função), em tempo de execução (Run Time).
Date = "mm-dd-aaaa" 'Devolva a dada da seguinte forma mês-dia-ano
Date = "mm/dd/aaaa" 'Devolva a dada da seguinte forma mês/dia/ano
Date = "dd.mm.aaaa" 'Devolva a dada da seguinte forma dia.mês.ano
Date = "dd/mm/aaaa" 'Devolva a dada da seguinte forma dia /mês/ano

5.2. DataValue
Datas com formato inválido gera um erro Type Mismatch, em tempo de execução (Run
Time), por exemplo: DataValue("30-02-2001").
DataValue("11-20-2000")
DataValue("Novembro 11, 2000")
DataValue("Dez 31, 2000")
DataValue("31 Dezembro 2000")
DataValue("31-Dez-2000")

5.3. Format
Format (Now, "General Date") 'Devolve a seguinte data: 20/11/2000 00:44:26
Format (Now, "Long Date") 'Devolve a seguinte data: segunda-feira, 20 de novembro de 2000
Format (Now, "Medium Date") 'Devolve a seguinte data: 20-nov-00
Format (Now, "Short Date") 'Devolve a seguinte data: 20/11/00
Format (Now, "Long Time") 'Devolve a seguinte data: 00:49:34
Format (Now, "Medium Time") 'Devolve a seguinte data: 12:50
Format (Now, "Short Time") 'Devolve a seguinte data: 00:50

5.4. Projeto Comentado


Para o nosso pequeno projeto insira os controles como especificados na Tabela 11:
Tabela 11. Controles para o projeto idade.
Controle Propriedade Atributo
Name: TelPrin
Caption: Idade
Form
BorderStyle: 0 – Fixed Single
StartUpPosition: 2 – ScreenCenter
Name: cmdCalcular
CommandButton Caption: &Calcular
Default: True
Name: cmdFechar
CommandButton Caption: &Fechar
Cancel: True
Name: lbNascimento
Label
Caption: Data de Nascimento
Label Name: lbIdade
40 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Caption: Idade (dias, meses, ano)


TextBox Name: txtDtNasc
TextBox Name: txtDia
TextBox Name: txtMes
TextBox Name: txtAno

A seguir insira as seguintes linhas de código:


Private Sub cmdCalcular_Click()
Dim DataNasc As Date 'Declara a variável com Data
If Not IsDate(txtDtnasc.Text) Then 'Se a data digitada não for válida...
MsgBox "Data '" & txtDtnasc.Text & "' é inválida" '...exibe esta
mensagem...
txtDtnasc.Text = Empty '... limpa a caixa de texto de data de
nascimento e ...
txtDtnasc.SetFocus '... devolve a ela o foco.
Else 'Se não
txtDia.Text = Empty 'Limpa a caixa de texto de dias vividos
txtMes.Text = Empty 'Limpa a caixa de texto de meses vividos
txtAno.Text = Empty 'Limpa a caixa de texto de anos vividos
DataNasc = txtDtnasc.Text 'Devolve a variável DataNasc o valor da
data digitada
txtDia.Text = "Dias vividos " & Date - DataNasc & " dias" 'Exibe o
número de dias vividos
txtMes.Text = "Meses vividos " & Fix((Date - DataNasc) / 12) & "
meses" 'Exibe o número inteiro de meses vividos
txtAno.Text = "Anos vividos " & Fix((Date - DataNasc) / 365) & "
anos" 'Exibe o número inteiro de anos vividos
End If
End Sub

Private Sub cmdFechar_Click()


End 'Finaliza a aplicação
End Sub
Código 13. Projeto Calculadora de dias, meses e anos vividos

Figura 20. Interface da calculadora de idade


Microsoft Visual Basic – Controlando as versões e informações do seu aplicativo 41

6. CONTROLANDO AS VERSÕES E INFORMAÇÕES DO SEU APLICATIVO


É sempre interessante oferecer informações sobre as versões (Major, Minor, Revision) do
seu aplicativo e controlar as informações adicionais, tais como o ícone do arquivo executável, o
título do aplicativo (Title), comentários (Comments), nome da empresa produtora do softwares
(Company Name), Descrição do Arquivo (File Description), Copyrigth (Legal Copyright), Marcas
Registradas (Legal Trademarks), Nome do Produto (Product Name). A seguir a descrição de cada
campo.

Figura 21. Caixa de diálogo de controle versões e informações do aplicativo.


Version Number Æ Cria o número de versão para o projeto.
Major – Número principal de lançamento do projeto; 0 – 9999.
Minor – Número secundário de lançamento do projeto; 0 – 9999.
Revision – Número de versão de revisão do projeto; 0–9999.
Auto Increment – Se selecionado, incrementa automaticamente o número de Revision com um
cada tempo que você executar o comando Make Project para este projeto.

Application Æ Permite identificar um nome e ícone para seu projeto.


Title – Nome do aplicativo.
Icon – Ícone para o aplicativo.

Version Information Æ Permite fornecer informações específicas sobre a versão atual de seu
projeto.
Type – Você pode entrar com as informações do nome da companhia, descrição do arquivo,
direitos autorais, marcas registradas legais, nome do produto e comentários.
Value – O valor para o tipo de informações selecionadas na caixa de Tipo (Type).
Para exibir as informações na tela de informações (About) Figura 22 inseridas nas
propriedades do projeto, insira num form os controles como na Tabela 12 abaixo:

Tabela 12. Controles para exibir as versões e as informações de um projeto.


Controle Propriedade Atributo
Name: frmAbout
Form
Caption: Sobre - Tutorial do Microsoft Visual Basic
42 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

5.0
BorderStyle: 0 – Fixed Single
StartUpPosition: 2 – ScreenCenter
Name: cmdOK
CommandButton
Caption: &OK
Name: lbTitulo
Label Caption: Titulo
Align: Right Justify
Name: lbVersao
Label Caption: Versão
Align: Right Justify:
Name: lbDesc
Caption: Descrição
Label
Autosize: True
WordWrap: True
Name: lbComentarios
Caption: Comentários
Label
Autosize: True
WordWrap: True
Name: lbCopyright
Label
Caption: Copyright
Name: lbTradeMarks
Label
Caption Trademarks
Name: lbProduto
Label
Caption Produto

Em seguida insira as seguintes linhas de comando.


Private Sub cmdOk_Click()
Unload Me 'Fecha o formulário
End Sub

Private Sub Form_Load()


lbTitle.Caption = App.Title 'Exibe o título do aplicativo
lbVersao.Caption = "Versão " & App.Major & "." & App.Minor & "." &
App.Revision 'Exibe as versões Major, Minor e Revision
lbDesc.Caption = "Descrição: " & App.FileDescription 'Exibe a
descrição do aplicativo
lbComentarios.Caption = "Comentários: " & App.Comments 'Exibe os
comentários do aplicativo
lbCopyright.Caption = "Copyright " & App.LegalCopyright 'Exibe os
direitos autorais do aplicativo
lbTradeMarks.Caption = "Trademarks: " & App.LegalTrademarks 'Exibe
os direitos das marcas registradas do aplicativo
lbProduto.Caption = "Produto: " & App.ProductName
End Sub
Código 14. Projeto para exibir as informações de um aplicativo
Microsoft Visual Basic – Controlando as versões e informações do seu aplicativo 43

Figura 22. Tela de informações de um projeto.


Microsoft Visual Basic – Trabalhando com funções numéricas e financeiras 45

7. TRABALHANDO COM FUNÇÕES NUMÉRICAS E FINANCEIRAS


7.1. Funções Numéricas
Caso você utilize programas científicos, as funções numéricas serão longas companheiras
do seu dia-a-dia, com elas é possível não somente realizar cálculos, mas desenhar curvas e retas.
A seguir na tabela abaixo estão as principais funções numéricas sua descrição.
Tabela 13. Principais funções numéricas utilizadas pelo Visual Basic e a descrição.
Função Descrição
1/Cos(x) Devolve a secante de um ângulo x em radiano
1/Sin(x) Devolve a cosecante de um ângulo x em radiano
1/Tan(x) Devolve a cotangente de um ângulo x em radiano
4*Atn(1#) Devolve o valor de π com dupla precisão
Abs(x) Devolve o absoluto de um número x
Atn(x) Devolve a arcotangente de um ângulo x em radiano
Cos(x) Devolve o cosseno de um ângulo x em radiano
E = Exp(1#) Devolve o valor de e com dupla precisão
Exp(x) Devolve a valor e (2,7182) elevado a um número x
Fix(x) Devolve o número aproximado de um valor x
Hex(x) Devolve o hexadecimal do número x
Log(x) Devolve o logaritmo natural de um número x
Log(x)/Log(10) Devolve o logaritmo na base 10 de um número x
Log(x)/Log(n) Devolve o logaritmo na base n de um número x
Oct(x) Devolve o octagonal do número x
Rnd(x) Devolve o número radomizado de uma valor x
Sin(x) Devolve o seno de um ângulo x em radiano
Sqr(x) Devolve a raiz quadrada de um número x
Tan(x) Devolve a tangente de um ângulo x em radiano
x*180/4*Atn(1#) Converte o valor x radiano para grau
x*4*Atn(1#)/180 Converte o valor de x grau para radiano

7.2. Funções Financeiras


O Visual Basic oferece funções financeiras pré-fromatadas, evitado que o programador
passe horas quebrando cabeça para motar um rotina para cáculo de aopsentadoria por exemplo. A
seguir veremos as principais funções financeiras oferecidas pelo Visual Basic e sua sintaxe.

7.2.1. Função Pmt (Pagamento de Anuidade Baseado num Período)


A sintaxe para a função é: Pmt(rate, nper, pv[, fv[, type]])
Pmt (TaxaPorPeriodo, NumPeriodos, ValorInicial [, ValorFinal [, QuandoPaga]]). Para ficar mais
simples veja o exemplo abaixo.
Para calcular uma hipoteca de $100.000,00 de 30 anos a 8%, utilize:
Hipoteca = Pmt(0.08/12,30*12,100000, 0,1)
ª TaxaPorPeriodo – normalmente, taxa de juros é estipilada por ano, mas você paga todo mês.
Portanto o valor da taxa anual deve ser 0.08 e a TaxaPorPeriodo 0.08/12.
ª NumPeriodos – Este é o número de períodos, ou seja, se o pagamento é mensal num
período de 30 anos o NumPeriodos deve ser 30*12. Ara uma hipoteca de pagamento
quinzenal o valor do NumPeriodos seria 30*26.
ª ValorInicial – é o valor do saldo inicial.
ª ValorFinal – em uma hipoteca o valor seria zero. Em um plano de poupança, insto seria a
quantia que você gostaria de reservar para a aposentadoria, por exemplo.
ª QunadoPaga – você paga no início do período ou no final? Utilize 0 (zero) para o finla do mês
e 1 para o início.
46 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Embora você tenha de utilizar esses nomes para os parâmetros se você os utiliza como
argumentos nomeados, a notação da Microsoft não enfatiza suficientemente Que as unidades
utilizadas para as várias entradas devem ser as mesmas. Por exemplo, se a taxa é calculada
utilizando meses, nper também tem de ser calculada utilizando meses.

7.2.2. Função FV (Valor Futuro de Anuidade)


Está função é utilizada, por exemplo, para o cálculo de aposentadoria, porque ela fornece o
valor futuro de uma anuidade com base em pagamentos (ou retiradas) periódicas e uma taxa de
juros constante.
A sintaxe para a função é: FV(rate, nper, pmt[, pv[, type]]) , para melhor entendimento
FV(TaxaJurosPorPeriodo, NumPeriodos, PagamentoPOrPeriodo [, ValorInicial [, QuandoDevido]])
Os dois primeiros argumentos devem ser expressos pelas mesmas unidades. E, como para
todas as funções financeiras, os valores pagos são representados por números negativos; e os
valores recebidos são representados por números positivos.

7.2.3. Função IPmt (Taxa de Juros para Durante um Período)


Esta função fornece a taxa de juros para durante um período de uma anuidade com base
em pagamentos iguais e períodos e uma taxa de juros constante. Por exemplo, você poderia
utilizá-la para verificar os juros pagos em um determinado ano – que os computadores da
empresa hipotecária estão relatando à Receita Federal.
A sintaxe para a função é IPmt(rate, per, nper, pv[, fv[, type]]), para melhor entendimento
IPmt(TaxaJurosPeriodo, NumPeriodos [, ValorInicial [,QuandoDevido]] )

7.2.4. Função NPer (Número de Períodos para Atingir uma Anuidade)


Esta função informará quanto tempo (o número de depósitos/retiradas periódicas) levará
para acumular uma anuidade.
A sintaxe é: NPer(rate, pmt, pv[, fv[, type]])

7.2.5. Função PV (Presente Valor Presente Baseado num Período)


Esta função informa quanto vale hoje os pagamentos periódicos feitos no futuro.
A sintaxe é: PV(rate, nper, pmt[, fv[, type]])

7.2.6. Função NPV (Valor Presente Líquido)


Está função calcula o valor presente líquido. Esta função é utilizada, por exemplo, se você
começa pagando com um custo inicial, mas depois obtém dinheiro em anos sucessivvos.
A sintaxe é: NPV(rate, values()), ou melhor NPV(TaxaPorPeriodo, ArrayOf())
É necessário preencher o array com valores aproprieados na ordem coreta. Por exemplo, a
primeira entrada poderia ser um número positivo representado o valor recebido. Pelo menos um
entrada tem que ser positiva e uma entrada tem que ser negativa. Esta função é mais geral que a
função PV, pois a utilização de uma array permite que o valor recebido ou desembolsado varie
com o tempo.

7.2.7. Função Rate (Taxa por Período)


Esta função fornece a taxa de juros por período para uma anuidade. Você utilizaria isso
para verificar a taxa de juros reais que estaria pagando se realmente houvesse a promoção padrão
de "Por apenas $30,00 por mês durante dois anos"
Sintaxe é: Rate(nper, pmt, pv[, fv[, type[, guess]]])
Microsoft Visual Basic – Iniciando com a SQL (Structured Query Language) 47

8. INICIANDO COM A SQL (STRUCTURED QUERY LANGUAGE)


A SQL - Structured Query Language (Linguagem de Consulta Estruturada) praticamente
surgiu com a terceira geração de banco de dados, os RDBs-Relational Databases, ou seja,
banco de dados relacionais.
A SQL é uma linguagem padrão para o gerenciamento de banco de dados, e não é nem
estruturada (Structured) e não esta limitada somente a consultas (Queries) em banco de dados.
Na verdade podemos dizer que SQL é uma linguagem para definir e manipular bancos de
dados relacionais e praticamente todos os produtos de bancos de dados relacionais que estão no
mercado suporta SQL.
Infelizmente ainda não existe uma padronização da SQL; embora a portabilidade seja
grande, dependendo do produto que se está utlizando (Oracle, Sybase, Informix, etc.) haverá
diferenças na sintaxe das declarações. Atualmente o padrão SQL-92 é o mais utilizado.
No nosso caso usaremos as declarações SQL utilizadas no Microsoft Access, pois
estaremos trabalhando em nível de desktop.
Ao utilizar a SQL em seu código você terá muitos benefícios;
ª Primeiro irá ganhar tempo, pois a quantidade de linhas de código necessárias para
realizar uma tarefa via SQL é menor que o método procedural via DAO.
ª Seus projetos também ficarão mais rápidos, pois geralmente a SQL e mais rápida que
o método procedural via DAO.
ª A portabilidade sua aplicação será maior visto que a SQL é aceita pelos princi-pais
bancos de dados relacionais (Oracle, Sybase,etc.).

Creio que estes motivos já são suficientes para você dar uma olhada no que a SQL pode
fazer por você e por seu código.
Com a SQL podemos realizar as seguintes tarefas:
ª Criação de Bases de Dados (Ver Banco de Dados).
ª Segurança de acesso aos Dados.
ª Recuperar informações e Integridade de transações.
ª Manipulação e controle de bases de dados.

Se você tem uma cópia do Access, sua incursão no mundo SQL será facilitada, pois o
Access praticamente escreve em SQL para você, depois você só precisar copiar e colar as
instruções no seu código em Visual Basic. Mas vale a pena aprender pelo menos as instruções
mais importantes em SQL. Com isso você já conseguira usar muito do seu potencial.
Talvez o maior problema para os que já utilizavam uma linguagem procedural (Basic,
Clipper, Fortran, Cobol, etc), ao lidar com a SQL seja o seguinte: Você tem que mudar a forma de
pensar ao programar com SQL.
Estas linguagens ditas da terceira geração, são caracterizadas por comandos que dizem
ao computador exatamente o que fazer em estruturas sequenciais executadas passo a passo.
São chamadas de linguagens procedurais.
A SQL,por outro lado, é caracterizada por ser uma linguagem declarativa, ou seja, ela diz
ao computador o que quer que ele faça, sem se preocupar de que forma o trabalho será realizado,
o que importa é o resultado.
A SQL é composta de subconjuntos de comandos para executar diferentes tarefas. Assim
podemos dizer que a SQL suporta:
ª Uma linguagem de definição de dados (DDL)
ª Uma linguagem de manipulação de dados (DML)
ª Uma linguagem de segurança de dados (DCL)
A DDL permite criar e modificar e excluir a estrutura de uma tabela e seus índices; seus
principais comandos são:

ª CREATE – Cria tabelas, campos e índices num banco de dados.


48 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

ª DROP – Remove tabelas e índices de um banco de dados.


ª ALTER – Altera a estrutura de uma tabela de um banco de dados.

A DML permite manipular os dados (Inserir, Excluir e Atualizar) bem como executar
consultas através da recuperação de subconjuntos de dados para posterior tratamento. seus
principais comandos são:
ª SELECT – Seleciona um conjunto de registros de uma ou mais tabelas usando um
critério específico.
ª INSERT – Adiciona dados a uma tabela.
ª UPDATE – Atualiza os dados de uma tabela segundo critérios específicos.
ª DELETE - Remove registros de uma tabela.

A DCL permite a implementação da segurança interna do Banco de dados.Seus comandos


principais são GRANT e REVOKE, mas como não é suportada pela plataforma Access, não iremos
utilizá-la.

8.1. Criando Tabelas via SQL.

Vamos criar via SQL as tabelas através da a estrutura dos dados que é são dados a seguir:
TblAlunos TblCursos TblNotas TblProfessor
codaluno codcurso codaluno codprofessor
nome nomecurso codcurso nome
endereco codprofessor nota endereco
telefone ano telefone
nascimento bimestre
nomepai Observacao
nomemae
observacao
Periodo
serie
numero

Obs : Codaluno , Codcurso, CodProfessor são chaves primárias de suas respectivas tabelas.
Para exercitar iremos definir os relacionamentos entre as tabelas da seguinte forma (figura 1.0
abaixo:

Figura 23. Estrutura do banco de dados com quatro tabelas.

A tabela tblprofessor pode ser definida como a seguir (Access SQL):

CREATE TABLE tblprofessor (codprofessor INTEGER CONSTRAINT


primarykey PRIMARY KEY, nome TEXT (50), endereco TEXT (50), telefone
TEXT (15) );
Microsoft Visual Basic – Iniciando com a SQL (Structured Query Language) 49

A instrução CREATE TABLE irá criar a tabela tblprofessor, com as definições da lista de
campos entre parênteses, separados um dos outros por vírgulas. Cada descrição de campo possui
duas partes: o nome do campo e o tipo de dados os quais são separados por um espaço entre si.
A cláusula CONSTRAINT é utilizada para definir a chave primária codprofessor.
Para criar a tabela no VB execute a instrução CREATE TABLE passando-a como parâmetro
do método Execute do objeto Database. Ex: db.Execute ("CREATE TABLE...")
Os nomes dos tipos de dados utilizados pelo JET não é igual aos nomes exigidos pelas
instruções SQL. Veja na tabela a abaixo a correspondência entre ambos:

Tabela 14. Tipos de dados uportados pelo JET e pela A SQL


Tipos de Dados SQL Tipos de dados do JET
BIT YES/NO
BYTE NUMERIC - BYTE
COUNTER COUNTER - Contador
CURRENCY CURRENCY - Moeda
DATETIME DATE/TIME
SINGLE NUMERIC - SINGLE
DOUBLE NUMERIC - DOUBLE
SHORT NUMERIC - INTEGER
LONG NUMERIC - LONG
LONGTEXT MEMO
LONGBINARY OLE OBJECTS
TEXT TEXT

A tabela TblCursos será criada pela instrução:


CREATE TABLE tblcursos (codcurso INTEGER CONSTRAINT primarykey PRIMARY KEY,nomecurso
TEXT (15), Codprofessor INTEGER CONSTRAINT tblprofessorFK REFERENCES tblprofessor);

A cláusula CONSTRAINT é utilizada para definir uma chave primária e uma chave externa.
Note que existe uma relação de um para muitos entre a tabela TblProfessor e a tabela
TblCursos, sendo que a coluna codprofessor da tabela TblCursos, é uma chave estrangeira
(Foreign Key - FK )

8.2. Índices e Tabelas - Criar, Alterar e Excluir


8.2.1. Excluindo Tabelas
Para excluir uma tabela via SQL usamos a instrução DROP TABLE nome da tabela.
Assim para excluir a tabela tblalunos criada anteriormente fazemos:
DROP TABLE tblalunos

A tabela e todo o seu conteúdo são excluidos.

8.2.2. Alterando Tabelas


Para alterar uma tabela, adicionando ou excluindo um campo da tabela, usamos a
instrução: ALTER TABLE

1- Na inclusão de um campo temos que especificar o NOME, TIPO e TAMANHO do campo, e usar
a cláusula ADD COLUMN

Assim para incluir o campo CIDADE com 50 caracteres na tabela tblalunos fazemos:
ALTER TABLE tblalunos ADD COLUMN cidade TEXT (50)
50 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

2- Na exclusão de um campo basta especificar o nome do campo e usar a cláusula DROP


COLUMN
O código abaixo exclui o campo NOME da tabela tblalunos
ALTER TABLE tblalunos DROP COLUMN nome

Note que não será possível excluir um campo empregado em um índice ou em uma
relação.

8.2.3. Criando Índices


Podemos criar um índice de um único campo ou um índice de vários campos com a
instrução: CREATE INDEX.
Na criação do índice devemos informar o nome do índice o nome da tabela e pelo menos
um campo a ser incluído como índice. Assim se quisermos criar um índice pela data de nascimento
na tabela tblalunos fazemos:
CREATE INDEX nascimento ON tblalunos (nascimento)

A instrução abaixo cria um índice chamado series, usando os campos serie e periodo da
tabela tblalunos, sendo que serie será usado na ordem ASCENDENTE e periodo na ordem
DESCENDENTE.
CREATE INDEX series ON tblalunos(serie ASC, periodo DESC)

8.2.4. Excluindo Índices


Para excluir um índice de uma tabela utilize a instrução DROP INDEX, devemos informar
o nome do índice e o nome da tabela. Assim para excluir o índice serie criando anteriormente
fazemos:
DROP INDEX series ON tblalunos

8.3. Testando As Instruções SQL


Para criar e testar todas essas instruções SQL você pode codificá-las direto no Visual Basic
e executar o código para ver o resultado, para isto voce deverá usar o método Execute (ver a
seguir) do objeto DataBase, mas você pode usar os seguintes meios:

1-) O aplicativo VISDATA que acompanha o Visual Basic


2-) O Microsoft Access
3-) O Microsoft Query (para usuários do Excel ou Office)

É aconselhado a evitar a codificação quando estiver testando as instruções, pois tanto o


VISDATA como o Access são mais fácies de usar e lhe dão o resultado de imediato.

8.4. SQL - Criando Consultas Parametrizadas

O Microsoft Access nos dá a possibilidade de criar e armazenar consultas dentro do arquivo


de banco de dados. A vantagem em armazenar as consultas no banco de dados é que para
executar uma instrução SQL o JET verifica erros de sintaxe, depois ele tenta otimizar a instrução e
a seguir executa a instrução, tudo isto leva tempo e a coisa piora se você estiver executando as
mesmas instruções SQL diversas vezes, pois o JET terá que refazer tudo novamente.
Ao criar e armazenar definições de consultas através de instruções SQL o Access analisa a
instrução e a otimiza só então ele armazena a instrução original e a otimizada, quando for
executar a instrução o trabalho estará feito e o tempo de execução será diminuido.
Microsoft Visual Basic – Iniciando com a SQL (Structured Query Language) 51

Cada consulta armazada em um banco de dados Access é um objeto QueryDef, o conjunto


de objetos QueryDef compõem a coleção QueryDefs do objeto Database. Então uma QueryDef é
uma consulta SQL pré-compilada e pré-otimizada.
Para criar uma QueryDef usamos o método CreateQuery do objeto DataBase ou a criamos
diretamente usando o próprio Microsoft Access.
O CreateQuery necessita de dois parâmetros: o nome da QueryDef e a instrução SQL que o
cria.
Vejamos com o criar uma consulta SQL e armazená-la no banco de dados:
Para criar uma consulta chamada Lista_Alunos , que lista todos os alunos por ordem
alfabética da tabela tblalunos e armazená-la no banco de dados Escola.mdb, fazemos o seguinte:

Dim db as Database
Dim qd as QueryDef
set db=DbEngineworkspaces(0).Opendatabase(app.path & "\escola.mdb")
set qd=db.CreateQueryDef("Lista_alunos", "SELECT * FROM tblalunos ORDER
BY nome"

Uma vez criada a QueryDef podemos executá-la e manipulá-la como um recordset:

Dim db as Database
Dim dyn as Recordset
set db=DbEngine.Workspaces(0).OpenDatabase(app.path & "\escola.mdb")
set dyn=db.QueryDefs("lista_alunos").OpenRecordset(dbOpendynaset)

Ou eliminá-la :
db.Querydefs.Delete "Lista_alunos"
Para tirar maior proveito das QueryDefs costuma-se criá-las de forma que aceitem
parâmetros, para isto usamos a palavra-chave PARAMETERS para passar um ou mais parâmetros
para as consultas SQL.
Suponha que no caso do exemplo anterior gostariamos de listar todos os alunos de uma
determinada série, para isso criamos a consulta e passamos o parâmetro da série desejada :

Dim db as Database
Dim qd as QueryDef
Dim dyn as Recordset
Dim Sql as String
set db=DbEngineworkspaces(0).Opendatabase(app.path & "\escola.mdb")
sql= "PARAMETERS pSerie String SELECT * FROM tblalunos WHERE serie =
pSerie "
sql=sql & " ORDER BY nome "
set qd=db.CreateQueryDef("Lista_alunos", Sql )
qd.Parameters("pSerie")= "1"
set dyn= qd.OpenRecordset()

8.4.1. Métodos de QueryDef


Os métodos usados pelas QueryDefs são: Execute e OpenRecordset.

O método Execute é usado para executar comandos de ação como DELETE ou UPDATE que
não retornam um conjunto de registros , é usado também para criar tabelas e índices via instrução
SQL.
O método OpenRecordset é usado para retornar um conjunto de registros como resultado
da consulta.
52 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Assim para apagar todos os alunos inativos, fazemos:

Dim db as Database
Dim qd as QueryDef
Dim dyn as Recordset
Dim Sql as String
set db=DbEngineworkspaces(0).Opendatabase(app.path & "\escola.mdb")
sql= "DELETE * FROM tblalunos WHERE ativo=False "
set qd=db.CreateQueryDef("Apaga_alunos", Sql )
qd.Execute
As QueryDef possuem as seguintes propriedades:

ª MaxRecords - fixa um limite que um QueryDef pode retornar


ª Name - Armazena e define o nome de um consulta
ª RecordsAffected - armazena o número de registros afetados por um comando Execute.
ª SQL - Retorna o comando SQL que originou a consulta.
Microsoft Visual Basic – Trabalhando com banco de dados Access 53

9. TRABALHANDO COM BANCO DE DADOS ACCESS


Aplicação que acessem bancos de dados são sempre requeridas seja no comércio em geral,
como por grandes empresas e por que não pela agropecuária. Desta forma iremos detlhas
inicialmente como acessar um banco de dados Access e os principais procedimentos, eventos que
o DBEngine (Motor de banco de dados DAO 3.5) pode nos oferecer.

9.1. Criando um Banco de Dados


Um banco de dados é composto principalmente por tabelas e dentro de cada tabela termos
campos onde serão armazenados os dados. Estes campos podem ter tamanho como tipo de dado
a ser armazenados diferentes. São eles:
Tabela 15. Tipos de dados suportados pelo banco de dados Access
Tipo de Dado Constante no Visual Basic Descrição
Boolean dbBoolean Verdadeiro/Falso
Byte dbByte Byte 0-255
Integer dbInteger Inteiro
Long dbLong Longo
Currency dbCurrency Moeda
Single dbSingle Simples
Double dbDouble Duplo (negativo/positivo)
Date/time dbDate Data ou hora
Text dbText Texto até 255 caracteres
Objeto OLE (figura, arquivo,
Long Binary (Ole Object) dbLongBinary
etc).
Memo dbMemo Memorando texto longo
GUID dbGUID Global Unique Identifier

Recomenda-se ao programador estruturar bem o banco de dados antes mesmo de escrever


se quer uma linha de comando no Visual Basic, ou seja, lançar mão de um bom organograma para
que o banco de dados seja bem estruturado e a partir daí começar a escrever as linhas de código
que darão acesso, às informação, podendo o usuário inserir, editar e excluir os dados contidos na
base de dados.
Existem vários materiais gratuitos na Internet sobre como estruturar um banco de dados e
mesmo sobre o programa Microsoft Access, portanto é necessário que o programador entenda
bem das estrutura do banco de dados que pretende trabalhar e com certeza entender sobre SQL
pelo menos o básico.
Banco de Dados

Tabela Disciplinas Tabela Alunos

Codigo Disciplina Codigo Nome


125 Português 001 João da Silva
254 Matemática 002 José Américo de Novaes
632 História do Brasil 003 Marcelo Paes Gulart

Tabela Exame

Ident IDAluno IDExame Nota


1 001 125 8,0
2 001 254 8,5
3 001 632 9,0

Figura 24. Organograma simples de um banco de dados. As linhas pontilhadas indicam o


relacionamento entre as tabelas.
54 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

9.2. O Modelo DAO (Data Access Object)


O DAO (Data Access Object - Objeto de Acesso a Dados) é uma hierarquia de classe,
equivalentes a uma visão logica de um sistema relacional de dados, utilizada para criara objetos de
acesso. Como se trata de uma hierarquia, muitas dessas classes pertencem a uma coleção que,
por sua, vez pertence a outras, como ilustra o a Figura 25.
O DBEngine possui uma coleção chamada Workspaces, que pode conter um ou mais
objetos Workspace. Um objeto Workspace estabelace um área de trabalho – uma sessão –
para um usuário, contendo m;utiplas bases ou conexões abertas e mecanismos para o
gerenciamento de transações (uma série de alterações de dados inclusive de bases externas).
Quando um objeto Workspace é referenciado pela primeira vez no código, automaticamente é
criada uma área –padrão (DBEngine.Workspace(0)) e os valores para as propriedade Name
(nome da "workspace") e UserName (nome do usuário) são, respectivamente, "#Default
Workspace#" e "Admin".
Como a DAO é um conjunto de classes, para declarar os objetos no código nasta informar
seu nome e o tipo ao qual se refere:
Dim WS As Workspace
DBEngine

WorkSpace Error

Database

Container QueryDef RecordSet Relation TableDef

Document Field Parameter Field Field Index Field

Field

User Group

Group User

Figura 25. Hierarquia de Classes DAO

Objetos membros de uma coleção são acessados através de índices (a partir de zero).
Assim, por exemplo, para identificar de modo completo a coluna Código do primeiro TableDef
numa coleção TableDefs do primeiro Database de uma coleção Databases do primeiro Workspace
de uma coleção Workspaces do Dbengine, escrevemos:
DBEngine.Workspaces(0).Databses(0).TableDefs(0).Fields("nome")

Este exemplo nos faz lembrar que, quando a referência a um membro for explícita , isto é,
não desejarmos utilizar um índice da coleção, as duas formas seguintes são equivalentes:
Tabela.Fields("Nome")
Tabela.Fields!Nome

A programação com objetos de acesso a dados consiste na criação de variáveis a fim de


configurar as propriedades e invocar os métodos desses objetos. Por exemplo:
Dim Area AS Workspace, Banco As Database, Tabela As Recordset

Set Area = DBEngine.Workspace(0)


Set Banco = Area.OpenDataBase(App.Path & "\sample.mdb")
Microsoft Visual Basic – Trabalhando com banco de dados Access 55

Set Tabele = Banco.OpenRecordSet ("Clientes")

Tabela.Index = "Nome"

O método OpenDatabase do objeto Area é invocado para efetuar a abertura da base de


dadoa "sample.mdb" e fazer a atribuição da variável de objeto Banco. O mesmo acontece com o
método OpenRecordSet de Banco: é utilizado para criar um "recordeset"(um conjunto de
registros que representam uma tabela ou o resultado de uma consulta na base de dados) e fazer a
atribuição à variável de objeto Tabela. Depois disso, podemos atribuir à proproedade Index do
objeto Tabela o índice "nome"".
Para o programador poder trabalhar com banco de dados este deverá referenciar a
biblioteca (DLL) que irá geenciar o banco de dados. A biblioteca mais recomendada é a MS DAO
2.5/3.0 Compatibility Libary e MS DAO 2.5/3.5 Compatibility Libary, para evitar
problemas de compatibilidade entre versões e abertura das bases de dados criadas pelo Visual
Basic ou pelo MS Access. Caso o programador esteja trabalhancdo com VB6 pode realizar o
download do MDAC v2.6 ou 2.7 (Microsoft Data Access Compnents v2.7) no site da Microsoft pois
este pscote possui ao versão 3.6 do DAO que permite acesso à baco de dado do MS Access 2000
Este pacote também é requerido para que se faça a instalação do Service Pack 5 do VB. Para
referenciar uma destas bibliotecas, basta acessar o menu Project/Reference e selecionar a
biblioteca desejada.
9.3. Abrindo um Banco de Dados
É possível abrir ou acessar um banco de dados diretamente do motor (DBEngine) ou
através do controle de dados DataControl, que é um controle padrão da biblioteca do Visual Basic.
Devemos fazer alguns comentários de acesso a banco de dados no que se refere ao tipo de
acesso como mostra a tabela a seguir.
9.3.1. Recordset
9.3.1.1. dbOpenTable
Permite acesso a somente uma tabela do banco de dados e lhe permite trabalhar os dados.
Não é possível utilizar uma instrução SQL para extrair dados, somente o nome da tabela. Por
Exemplo:
Dim tblPais As Recordset
Set tblPais = Dbase.OpenREcordSet ("Paises", dbOpenTable)
Código 15. Rotina para acesso a dados de uma tabela utilizando a instrução dbOpenTable
9.3.1.2. dbOpenDynaset
Permite extrair dados de uma ou mais tabelas usando uma instrução SQL. O conjunto de
dados retornado é atualizável. Um dynaset não consiste em dados reais, mas em vez disso é uma
lista das referências para as localizações de dados dentro das tabelas. Tipicamente o programador
utilizaria um dynaset em uma tela de edição onde os dados estão sendo apresentados para os
usuários para adição, edição e exclusão. Por exemplo:
Dim tblPais As Recordset
Set tblPais = Dbase.OpenREcordSet ("SELECT * FROM Paises ORDER BY SIGLA",
dbOpenDynaset)
Código 16. Rotina para acesso a dados de uma tabela utilizando a instrução dbOpenDynaset,
utilizando instruções SQL.
Como um dynaset consiste em uma coleção de referências e não de dados reais, ele não
acessa os dados subjacentes até que um campo seja referenciado no aplicativo. Desse modo, o
programador tema a certeza de que os dados apresentados são atuais, um detalhe importante em
sistemas multiusuários.
56 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

9.3.1.3. dbOpenSnapshot
Como um dynaset, um snapshot permite extrair dados de uma ou várias tabelas usando
uma instrução SQL, mas o conjunto do resultado não é editável. Um snapshot consiste em uma
cópia fixa dos dados reais que existem no banco de dados ao tempo que o Sanpshot é criado.
Uma vez que uma snapshot seja criado, os dados retornados tornam-se independentes da cópia
original no disco, e as referências subsequentes a um campo snapshot podem não
necessariamente refletir os dados subjacentes mais atuais. Como os snapshots não precisam
verificar o disco toda vez que um campo é referenciado, eles são consideravelmente mais rápidos
que os dynasets.
É necessário ter cuidado ao utilizar um sanpshot. Como está extraindo os dados para a
estação de trabalho, consideravelmente mais memória é utilizada do que ao criar um dynaset.
Uma vez que a memória pode ficar toda ocupada, o VB começará a transferir dados para o disco.
Neste ponto, a degradação no desempenho começará a ser sentida. Se o snapshot for grande o
bastante e o espaço de transferência ficar todo ocupado, o aplicativo irá diparar mensagem de
erro ou mesmo poderá ficar paralisado.

9.3.1.4. dbOpenFowardOnly
Os recordsets do tipo Foward-only permitem que os usuários passem uma vez por um
recordset. Esta opção é útil para as operações tais como quando se está carregando uma caixa de
combinação (ComboBox) ou uma caixa de listagem (ListBox) com os dados de uma tabela como
mostra o Código 17.
Public Sub CarregaDados(oList As ListBox)
Dim oDataBase As Database
Dim snpDici As Recordset

'oList é o nome do da caixa de listagem que irá receber os dados do


recordset

'Esta subrotina acessa a base de dados NWind.mdb padrão do VB


Set oDataBase = DBEngine.OpenDatabase(App.Path & "\Nwind.mdb")

'Esta sub-rotina assume uma tabela com pelo menos duas colunas:
CompanyName e descr
Set snpDici = oDataBase.CreateSnapshot("SELECT * FROM Customers ORDER BY
CompanyName", dbForwardOnly)

'Percorre o Snapshot em um laço e acrescenta os dados na caixa de


listagem

Do While Not snpDici.EOF


oList.AddItem snpDici!ContactName & vbTab & snpDici!CompanyName
snpDici.MoveNext
Loop
snpDici.Close
Set snpcdic = Nothing
End Sub

'Para carregar os dados acrescente a seguinte linha de comando no evento


Load
Private Sub Form_Load()
CarregaDados Me.List1
End Sub
Microsoft Visual Basic – Trabalhando com banco de dados Access 57

Código 17. Preenchendo uma caixa de listagem com dados de uma tabela utilizando o recordeset
do tipo Foward-only.

9.3.1.5. dbAppendOnly
Permite o usuário acrescentar novos registros, porém impede a edição e exclusão dos
registros existentes, inclusive dos que ele adicionou.

9.3.1.6. dbReadOnly
Permite somente a consulta de dados, ou seja, não é possível acrescentar, editar ou excluir
dados.

9.3.1.7. dbSeeChanges
Dispara um erro de execução se um usuário estiver alterando os dados que outro usuário
estiver editando. Este tipo de recordset é ideal para rede multiusuários.

9.3.2. Utilizando o Motor do Banco de Dados DBEngine


Para abrir um banco de dado é necessário referenciar a biblioteca DAO desejada. A sintaxe
de abertura de um banco de dados Access é como segue:
Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

Tabela 16. The OpenDatabase method syntax has these parts11.


Part Description
database An object variable that represents the Database object that you want to open.
workspace Optional. An object variable that represents the existing Workspace object that
will contain the database. If you don't include a value for workspace,
OpenDatabase uses the default workspace.
dbname A String that is the name of an existing Microsoft Jet database file, or the data
source name (DSN) of an ODBC data source. See the Name property for more
information about setting this value.
options Optional. A Variant that sets various options for the database, as specified in
Settings.
read-only Optional. A Variant (Boolean subtype) value that is True if you want to open
the database with read-only access, or False (default) if you want to open the
database with read/write access.
connect Optional. A Variant (String subtype) that specifies various connection
information, including passwords.

'This example uses the OpenDatabase method to open one Microsoft Jet
database.

Sub OpenDatabaseX()
Dim wrkJet As Workspace
Dim dbsNorthwind As Database
' Create Microsoft Jet Workspace object.
Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
' Open Database object from saved Microsoft Jet database
' for exclusive use.
MsgBox "Opening Northwind..."
Set dbsNorthwind = wrkJet.OpenDatabase("Northwind.mdb", True)

11
Extraído do Arquivo de Ajuda do Visual Basic v5.0
58 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

End Sub
Código 18. Rotina para abertura de uma base de dados MS Access12.
Caso a base de dados possuir uma senha esta deverá ser informada como segue o
exemplo abaixo:
Sub OpenDatabaseX()
Dim wrkJet As Workspace
Dim dbsNorthwind As Database
' Create Microsoft Jet Workspace object.
Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
' Open Database object from saved Microsoft Jet database
' for exclusive use, don't read-only, and with password.
MsgBox "Opening Northwind..."
Set dbsNorthwind = wrkJet.OpenDatabase("Northwind.mdb", True,
False,";PWD=senha")
End Sub
Código 19. Rotina para abertura de uma base de dados MS Access com senha.

9.3.3. Utilizando o Controle DataControl


Para Ter acesso a um banco de dados através do controle Data, inicialmente o
programador deverá inserir um deste controle no formulário. No evento Load as seguintes linhas
de código deverão ser especificadas.

Private Sub Form_Load()


With Data1
.DatabaseName = App.Path & "\Nwind.mdb" 'Abre o banco de dados
.RecordSource = "Customers" 'Especifica qual a tabela o controle
deverá acessar os dados
End With
End Sub
Código 20. Rotina para acesso a um banco de dados do tipo MS Access.

9.4. Acessando Dados de uma Tabela


O acesso a dados de uma determinada tabela pode ser feito através do controle
DataControl ou através de uma instrução SQL.
9.4.1. Acesso à Dados de uma Tabela Utilizando o DataControl
Como foi visto no tópico Utilizando o Controle DataControl, o acesso ao banco de
dados e o acesso a uma tabela, porém não somente através de código o programador poderá
especificar a tabela que o controle deverá acessar, pois na janela propriedades e na propriedades
RecordSource este valor (nome da tabela) poderá ser especificado. Obviamente que este
procedimento dá menor flexibilidade ao programador, caso ele queira alterar o valor, mas como
quase tudo no Visual Basic é possível, caso você tenha especificado o valor e queira alterá-lo,
basta modifica-lo via código, como é demonstrado no Código 20.

9.4.2. Acesso à Dados de uma Tabela Utilizando Instrução SQL


O acesso a dados de uma tabela com certeza fica mais dinâmico quando lançamos mão das
instruções SQL, portanto conhecimentos básicos desta linguagem são requeridos ara se trabalhar
com banco de dado seja ele qual for. A flexibilidade de ordenar, agrupar e mesmo filtrar dados
proporcionada pela SQL é sempre bem vinda em aplicação críticas e que usam banco de dados

12
Extraído do Arquivo de Ajuda do Visual Basic v5.0
Microsoft Visual Basic – Trabalhando com banco de dados Access 59

robustos. Apesar do MS Access ter suas limitações, o uso de instruções SQL torna mais rápido o
acesso aos dados.
É possível utilizar as instruções SQL em conjunto com o DataControl, como podemos
verificar no Código 21.
Private Sub Form_Load()
With Data1
.DatabaseName = App.Path & "\Nwind.mdb" 'Abre o banco de dados

'Especifica qual a tabela o controle deverá acessar os dados via


instrução SQL
'O asterisco(*) indica que todos os campos da tabela serão carregados,
entretanto nunca especifique o asterisco juntamente com a instrução SQL
GROUP BY, pois o motor do banco de dados exibirá um erro de sintaxe de
instrução SQL.
.RecordSource = "SELECT * FROM Customers ORDER BY CompanyName"
End With
End Sub
Código 21. Rotina para acesso a dados de uma tabela via instrução SQL

9.5. Adicionando, Localizando, Editando e Excluindo Dados de uma Tabela


Agora vamos exemplificar como podemos adicionar, edita r e excluir dados em uma tabela.

9.5.1. Adicionado Dados


Para preparar a tabela para receber um novo registro é necessário que o número de
registro de uma tabela seja verificado, evitando assim erros, no código que segue é possível
verificar o teste do n.º de registro da tabela e em seguida através de estrutura de decisão
especificar a linha de comando desejada (declaração)
Public Sub AddNew()
With Data1 'Inicia o laço with
'Verifica o número de registro da tabela
If .Recordset.RecordCount <> 0 Then
'Se for diferente de zero
'Move o registro para o último
.Recordset.MoveLast
'Prepara a tabela para adicionar um novo registro
.Recordset.AddNew
Else 'Senão
'Somente prepara a tabela para adicionar um novo registro
.Recordset.AddNew
End If
End With 'Finaliza o laço with
End Sub
Código 22. Rotina para preparar uma tabela para receber novos dados (registro)

Obviamente que antes de iniciar uma rotina desta, o banco de dados e a tabela deveram
ter sido especificados, pois se não este procedimento irá gerar um erro.
Com a utilização do DataControl é possível vinculara TextBox, ListBox, Label, ComboBox e
outros controles que possuam as propriedade DataField e DataSource. A propriedade DataField
especifica qual o campo da tabela o controle estará vinculado e a propriedade DataSource,
especifica a qual controle DataControl o objeto está vinculado, ou seja, se o programador
especifica o caminho do banco de dados e o nome da tabela em um controle Data (nome=Data1)e
em seguida especifica as propriedades de uma caixa de texto, DataSource como Data1 e DataField
60 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

como Code, significa que a caixa de texto estará ligada aos dados da tabela do banco de dados
especificada e exibirá os dados do campo Code. Vale lembrar que estas propriedades poder ser
alterada via código, ou seja, em Run-Time.
Após o preparo da tabela para receber o novo registro é necessário ao final salva-lo, pois
por se só o método AddNew, não garante a adição no banco de dados.
Para adicionar um registro é sempre necessário iniciar o método AddNew e em seguida o
método UpdateRecord, como pode ser visto no Código 23.
Public Sub SaveReg ()
'Salva fisicamente os dados no registro preparado pelo método
AddNew
Data1.UpdateRecord

'Cria um Bookmark (marca), onde após o registro ser salvo o banco


de dados aponta para o último registro modificado, neste caso o registro
recém adicionado
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
End Sub
Código 23. Rotina para gravar dados em uma tabela do banco de dados.

9.5.2. Localizando Dados


Antes de editar um dado é necessário localiza-lo de forma precisa e rápida, nesta hora
entra a perspicácia do programador.
Existem duas formar de localizar um determinado registro dentro da tabela. São elas via as
instrução do próprio DataControl ou via SQL. Vale lembrar que as instruções do SQL dá ao
programador maior flexibilidade para trabalhar do que as instruções do DataControl.
Para localizar um determinado dado o programador deve ter em mente quais o campos
poderão ser utilizados para localizar, ou seja, numa tabela com 20 campos, é necessário que
alguns deles seja utilizado como fontes de pesquisa. Para exemplificar, digamos que destes 20
campos escolhemos 4 (codigo, produto, tipo, fornecedor). Assim o Código 24 exemplifica de forma
simples como localizar os dados através do DataControl e SQL.
'Localizando dados através do DataControl
Public Sub Localiza(sDado As String)
Data1.Recordset.FindFirst " campo ='" & sDado & "'"
End Sub

'Localizando dados através da SQL


Public Sub Localiza (sDado As String)
Dim rsLocal As Recordset
Set rsLocal = DB.OpenRecordset _
("SELECT * FROM tabela WHERE campo ='" & sDado & "'" _
, dbOpenSnapshot)
End Sub

'No local onde está escrito campo você pode substitui pelo verdadeiro
nome do campo, obviamente deve-se tomar cuidado no momento de especificar
este nome pois se o campo não existir o Visual Basic gera um erro "Item
Not found in this collection"

Código 24. Rotina para localizar dados dentro de uma tabela, utilizando as instruções do
DataControl e instruções SQL.
Microsoft Visual Basic – Trabalhando com banco de dados Access 61

O DataControl possui ainda outras variantes para pesquisa, são elas: FindLast, FindNext,
FindPrevious.
ª FindFirst – localiza o primeiro registro de acordo com o parâmetro passado;
ª FindLast – localiza o último registro de acordo com o parâmetro passado;
ª FindNext – localiza o registro seguinte ao primeiro de acordo com o parâmetro passado;
ª FindPrevious – localiza o registro anterior ao localizado de acordo com o parâmetro passado.
Outra instrução que pode ser utilizada pelo DataControl é Seek, porém este tipo de
instrução somente é aceito em RecordSet do tipo Table. Outro inconveniente de te método e que
o índice deve ser indicado na propriedade Index do DataControl.
A instrução de consulta da SQL também possui flexibilidade, por exemplo, filtrar todos os
produtos com um determinado código. Neste momento lançamos mão da instrução LIKE. Como
mostra ao Código 25.
Public Sub Localiza (sDado As String)
Dim rsLocal As Recordset
Set rsLocal = DB.OpenRecordset _
("SELECT * FROM tabela WHERE campo LIKE'" & sDado & "'" _
, dbOpenSnapshot)
End Sub
Código 25. Rotina para filtrar os dados de uma tabela

Dentro da instrução LIKE é possível utilizar caracteres curinga, tais como: *, ?, %, _.


Entretanto o trema (') e restringido por esta instrução e gera um erro quando por exemplo o
registro a ser localizado tiver a seguinte forma: D'Avila.

9.5.2.1. Exemplo de como Localizar Dados13


Para este exemplo você precisará dos seguintes objetos num formulário:
Controle Propriedade Atributo
Name: OpLTitulo
OptionButton Caption: L&ocalizar no Título
Value: True
Name: OpLDica
OptionButton Caption: Lo&calizar no texto da dica
Value: False
ComboBox Name: cboLocal
Treeview Name: tvwLocal
ImageList Name: imgTVW
Name: cmdSearch
CommandButton
Caption: &Localizar

Private Sub cmdSearch_Click()


On Error GoTo Err_Local 'Se houver algum erro o programa irá redirecionar
para Err_Local
Dim xNode As Node 'Declara a variável xNode como Node
Dim rsTitle As Recordset 'Declara a variável rsTitle como RecordSet

If Trim(cboLocal.Text) = Empty Then


'Se não tiver nenhuma palavra digitada a seguinte mensagem
MsgBox "Digite com pelo menos uma palavra para iniciar a pesquisa
no banco de dados!", vbExclamation, Titulo
Exit Sub

13
Código extraído do programa Lizaro Visual Basic Dicas v3.0
62 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

End If
Me.tvwLocal.Clear 'Limpa os nodes do Treeview
cboLocal.AddItem cboLocal.Text 'Adiciona a palavra digitada no List do
ComboBox

'Localiza o título a partir de pelo menos uma palavra digitada no


ComboBox.
If Me.opLTitulo.Value Then
'O caractere curinga asterisco(*), permite localizar a palavra em aulauer
parte do campo titulo
Set rsTitle = DB.OpenRecordset("SELECT * FROM tbdicas WHERE titulo
LIKE '*" & Me.cboLocal.Text & "*'")
Else
'Essa opção somente permite localizar o titulo exatamente como ele foi
inserido na tabela
Set rsTitle = DB.OpenRecordset("SELECT * FROM tbdicas WHERE dica
LIKE '" & Me.cboLocal.Text & "'")
End If
If rsTitle.RecordCount <> 0 Then
'Se registro(s) que satisfação a pesquisa fome localizado
'Os titulo serão inserido num Treeview
'Inicia o lação até que o último registr que satisfaça a consulta sej
alcançado
Do Until rsTitle.EOF
Set xNode = tvwLocal.Nodes.Add(, , , rsTitle!Titulo)
xNode.Image = "dica" 'Na ImageList deverá conter uma imagem
(ícone) com o valor key igual a dica
xNode.SelectedImage = "vis" 'na ImageList deverá conter uma
imagem (ícone) com o valor key igual a vis
rsTitle.MoveNext 'Move o registro para o próximo
'finaliza o laço qunado o final da pesquisa/consulta for alcançada
Loop
Else
'Caso nenhum registro for encontrado é exibida a seguinte mensagem
MsgBox "A(s) palavra(s) '" & cboLocal.Text & "'" & vbCrLf & _
"não foi(am) localizada(s) no banco de dados!", vbExclamation,
Titulo
End If
Exit Sub
Err_Local:
Call SaveErros 'Chama uma rotina para exibir erros
End Sub
Código 26. Rotina para localiza dados dentre de uma tabela, utilizando SQL e em seguinda
preenchendo uma TreeView com os dados encontrados.
Uma sugestão para o layout do exemplo anterior é mostrado na Figura 26.
Microsoft Visual Basic – Trabalhando com banco de dados Access 63

Figura 26. Layout para pesquisa de dados do programa Lizaro Visual Basic Dicas v3.0

9.5.3. Editando Dados


Sempre necessitamos alterar dados dentro de uma tabela, pois os dados são dinâmicos ou
mesmo pelo fato do digitador ter errado alguma coisa na hora de inserir as informações, portanto
é sempre bem vinda a opção editar dados em um projeto que possuam conexão com banco de
dados. O Código 27 ilustra de forma simples uma rotina de como editar um registro de uma
tabela.
Public Sub EditReg()
Data1.Recordset.Edit
End Sub
Código 27. Rotina para editar um registro gravado em uma tabela do banco de dados.

9.6. Compactando e Recuperando um Banco de Dados


Sempre que valores são inseridos ou excluídos das tabelas de um banco de dados, espaços
vazios acabam sendo criados, assim para limpara este espaço vazios é necessário compactar o
banco de dados para tal. Outro recurso que o DBEngine (motor do banco de dados) oferece é a
recuperação de um banco de dados. Esta opção funciona quando o banco de dados está
corrompido por algum motivo, assim ele não poderá ser acessado pelo DBEngine e
consequentemente pelo programa. Assim está duas rotina são bem vindas no início da aplicação
que trabalha com banco de dados, obviamente recupera-se e depois compacta-se.
Outro detalhe é para estas operações funcionarem sem erro a base de dados não poderá
está sendo utilizada por outro usuário, ou seja, deverá estar fechada.
Devemos ressaltar que a compcatação e restauração (reparação) abordada aqui somente
servem somente para banco de dados MS Access e recomendamos uma leitura mais detalhada da
ajuda do Visual Basic para melhor esclarecimento de todas as opções oferecidas por estes
métodos.

9.6.1. Compactando Banco de Dados


Agora veremos duas rotinas para compactar o banco de dados com senha e sem senha,
como segue abaixo lembre-se que o banco de dados deverá esta fechado.

Sub Compacta_Database()
Dim dbsNorthwind As Database
'Fecha o banco de dados para evitar erros
dbsNorthwind.Close
'Verifica se já existe um arquivo com o nome do arquivo a ser
compactado
64 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

If Dir("NwindBackup.mdb") <> "" Then Kill "NwindBackup.mdb"

'Cria uma versao compactada do banco de dados


DBEngine.CompactDatabase "Northwind.mdb", "NwindBackup.mdb",
dbLangGeneral
Set dbsNorthwind = OpenDatabase("NwindBackup.mdb")
End Sub
Código 28. Rotina para compactar um banco de dados sem senha.14

Sub Compacta_Database()
Dim dbsNorthwind As Database
'Fecha o banco de dados para evitar erros
dbsNorthwind.Close
'Verifica se já existe um arquivo com o nome do arquivo a ser
compactado
If Dir("NwindBackup.mdb") <> "" Then Kill "NwindBackup.mdb"

'Cria uma versao compactada do banco de dados


DBEngine.CompactDatabase "Northwind.mdb", "NwindBackup.mdb",
dbLangGeneral,,";pwd=senha"
Set dbsNorthwind = OpenDatabase("NwindBackup.mdb")
End Sub
Código 29. Rotina para compactar um banco de dados com senha.15

9.6.2. Recuperando Banco de Dados


Sub Repara_Database()
Dim erro_Loop As Error

If MsgBox("Deseja reparar o arquivo Northwind ?", _


vbYesNo) = vbYes Then
On Error GoTo Erro_Repara
DBEngine.RepairDatabase "Northwind.mdb"
On Error GoTo 0
MsgBox "Fim Do processo de reparação !"
End If
Exit Sub
Erro_Repara:

For Each erro_Loop In DBEngine.Errors


MsgBox " A reparação falhou...!" & vbCr & "Erro numero: " &
errLoop.Number & _
vbCr & erro_Loop.Description
Next erro_Loop
End Sub
Código 30. Rotina para recuperar um banco de dados corrompido.16

9.7. Salvando e Recuperar Figuras num Banco de Dados em Campo OLE


Sem pre existe a seguinte pergunta "E se eu quiser salvar uma figura dentro de uma banco
de dados é pssível?" A resposta é sim porém a mão de obra pode ser grande até se obter um

14
Exemplo retirado do programa Lizaro Visual Basic Dicas v3.0
15
Exemplo retirado do programa Lizaro Visual Basic Dicas v3.0
16
Exemplo retirado do programa Lizaro Visual Basic Dicas v3.0
Microsoft Visual Basic – Trabalhando com banco de dados Access 65

código limpo e funcional, abaixo exemplificaremom como salvar e recuperaruma figura de um


campo OLE de banco de dados. Entretanto inserir figuras dentro de uma tabela (banco de dados)
sempre deixa o acesso a este banco de dados muito lento, primciplamente se os recursos da
máquina for escassos. Desta forma prefira somente salvar o caminho da figura no HD (HardDisk
Disco Rígido) da figura dentro de um campo na tabela e no momento que a aplicação requerer a
figura ela irá buscar no caminho físico. Bom mas já que a dúvida surege eis abaixo a rotina limpa e
funcional para armazenar e recuperar uma imagem a partit de um banco de dados.

Dim dbTest As Database


Dim rstAlbum As Recordset
Dim FileLen&, X%, lngOffset&, Chunks%, lngTotalSize&
Dim Arr() As Byte
Const ArrSize As Integer = 16384

Sub ReadPictureFromDb()
On Error Resume Next
Open "d:\picture.gif" For Binary Access Write As #1
lngTotalSize = rstAlbum!Picture.FieldSize
Chunks = lngTotalSize \ ArrSize
Fragment = lngTotalSize Mod ArrSize
ReDim Arr(ChunkSize)
Arr() = rstAlbum!Picture.GetChunk(lngOffset, ArrSize)
Put #1, , Arr() lngOffset = lngOffset + ArrSize

With rstAlbum
Do While lngOffset < lngTotalSize
Arr() = !Picture.GetChunk(lngOffset, ArrSize)
Put #1, , Arr()
lngOffset = lngOffset + ArrSize
Loop Close #1
Close
End With
End Sub

Sub SavePictureToDb()
rstAlbum.AddNew
Open "c:\picture.gif" For Binary Access Read As #1
FileLen = LOF(1) Chunks = FileLen \ ArrSize Fragment = FileLen Mod
ArrSize
ReDim Arr(Fragment)
With rstAlbum Get #1, , Arr()
!Picture.AppendChunk Arr()
ReDim Arr(ChunkSize)
For I = 1 To Chunks
Get DataFile, , Arr()
!Picture.AppendChunk Arr()
Next
Close #1 .Update
End With
End Sub

Private Sub Form_Load()


Set dbTest = OpenDatabase("d:\db1.mdb", True)
Set rstAlbum = dbTest.OpenRecordset("select * from Album", dbOpenDynaset)
66 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

SavePictureToDb
ReadPictureFromDb
Set rstAlbum = Nothing
dbTest.Close
End Sub
Código 31. Rotina para salvar e recuperar uma figura dentro dum campo OLE de um banco de
dados17.

9.8. Acessando Outros Bancos de Dados


Com o Microsoft® JET é possível acessar e atualizar outras bases de dados além do
Access. As bases suportadas pelo MSJET são: FoxPro (versões 2.0, 2.5, 2.6, 3.0 e DBC), dBase
(versões III, IV e 5.0), MS Excel (versão 3.0, 5.0, 6.0, 7.0, 8.0, ou posteriores), Lotus ( WKS,
WK1, WK3 e WK4), HTML, MS Exchange e arquivos ASCII (texto, separados por ponto e vírgula).
Entretanto alguns métodos aplicados ao banco de dados Access, não podem ser aplicados a estas
bases de dados, tais como: CompactDatabase, CreateDatabase, CreatField, CreateQueryDef,
RepairDatabase e os objetos container, Document, QueryDef e Relation.

9.8.1. Banco de Dados dBase


Este tipo de banco de dados pode ser aberto indicando o caminho ("path") através do
método OpenDatabase, além do caminho é preciso indicar o tipo de acesso e o tipo de versão do
banco de dados.
No exemplo abaixo mostra o acesso a um banco de dados chamado "Registros.dbf",
localizado no diretório "C:\Aplicação\Bdados".
Dim dBase as Database, Table as Recordeset
Set dbase =DbEngine.OpenDatabase("C:\Aplicação\Bdados", False, False,
"dBase III;")
Set Table = dBase.OpenRecordeset("Regitros")
'O argumento dBase III pode ser substituído por dBase IV ou dBase 5.0, de
acordo com a versão do banco de dados.
Código 32. Rotina para acesso à banco de dados dBase versão III.
O MS Jet considera o caminho do bando de dados como o próprio e o banco de ados como
se fosse uma tabala.

Dim dBase as Database, Table as Recordeset


Set dbase =DbEngine.OpenDatabase("C:\Aplicação\Bdados", False, False,
"FoxPro 2.5;")
Set Table = dBase.OpenRecordeset("Regitros")
'O argumento FoxPro 2.5 pode ser substituído por FoxPro 2.0, FoxPro 2.6
ou FoxPro 3.0 de acordo com a versão do banco de dados.
Código 33. Rotina para acesso à banco de dados FoxPro versão 2.5.

Dim dBase as Database, Table as Recordeset


Set dbase =DbEngine.OpenDatabase("C:\Aplicação\Bdados", False, False,
"Excel 4.0;HDR=NO")
Set Table = dBase.OpenRecordeset("Regitros#XLS")
'O argumento Excel 4.0 pode ser substituído por Excel 3.0, Excel 5.0,
Excel 6.0, Excel 7.0, etc. de acordo com a versão do banco de dados.

17
Exemplo retirado do programa Lizaro Visual Basic Dicas v3.0
Microsoft Visual Basic – Trabalhando com banco de dados Access 67

'O argumento HDR, especifica se a primeira expressão da planulha deve ser


('HDR = YES') ou não ('HDR = NO') considerada como cabecálho das colunas,
ou seja, se haverá ou não os nomes das colunas
Código 34. Rotina para acesso à banco de dados Excel versão 4.0.

Dim dBase as Database, Table as Recordeset


Set dbase =DbEngine.OpenDatabase("C:\Aplicação\Bdados", False, False,
"Text;")
Set Table = dBase.OpenRecordeset("Regitros")
'Note que o argumento Text não especifica versão, pois o arquivo de texo
não necessita deste tipo de parámentro para ser reconhecido pelo MSJet ou
por qualquer editor de textos.
'O arquivo contendo os dados, ou seja, que será a tabaka da base de dados
deverá possuir a extensão 'TXT'
Código 35. Rotina para acesso à banco de dados Texto.
68 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues
Microsoft Visual Basic – Trabalhando com o Controle MSChart no Visual Basic 69

10. TRABALHANDO COM O CONTROLE MSCHART NO VISUAL BASIC

Em aplicação com banco de dados é sempre requerido que os dados sejam apresentados
na forma de relatórios ou gráfico, tamanaha é a facilidade de análise deste através destas duas
ferramentas. Neste capítulo iremos abordar a utilização do controle Microsoft Chart v5.0.
Com este controle é possível gerar gráficos de barras, linha e pizza (torta), de oforma
simples ou tridimensional.

Figura 27. Controle Microsoft Chart 5.0


Os dados que irão ser plotados no grafico tem origem em um banco de dados, ou mesmo
com entrada manual, entretanto os valores inciais são aleatórios e são passíveis de alteração em
'Design Time'
Através da propriedade ChartType, é possível (Design ou Run Time), especificar o tripo de
gráfico que será exibido. Assim a tabela seguinte detalha os valores, as contantes e o tipo de
gráfico exibido.
Tabela 17. Tipo de gráfico a serem exibidos pela propriedade Chartype, suas constante e
valores18.
Descrição Valor Constante
Barra 3D 0 VtChChartType3dBar
Barra 2D 1 VtChChartType2dBar
Linha 3D 2 VtChChartType3dLine
Linha 2D 3 VtChChartType2dLine
Área 2D 4 VtChChartType3dArea
Área 3D 5 VtChChartType2dArea
Degrau 3D 6 VtChChartType3dStep
Degrau 2D 7 VtChChartType2dStep
Combinação 3D 8 VtChChartType3dCombination
Combinação 2D 9 VtChChartType2dCombination
Pizza ou Torta 2D 14 VtChChartType2dPie
Dispersão 2D 16 VtChChartType2dXY

A sequência de dados de um gráfico (R1 a R5 na figura anterior) é definida pela


propriedades RowCount, enquanto a quantidade de colunas, pela propriedade ColumnCount.
No gráfico do tipo torta (pizza), RowCount representa a quantidade de "tortas" apresentadas e
ColumnCount, a quantidade de fatias.

18
Extraído em parte do arquivo de ajuda do Micotsoft Visual Basic 6.0™
70 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Além das janelas de propreidades do VB, podemos abrir uma caixa de diálogo de
propriedades do controle MSChart, como em todos a maioria dos controle ActiveX.

10.1. Criando um Gráfico Manualmente19


O exemplo que se segue irá demonstrar como criar um gráfico manualmente, inclusive a
configuração do gráfico. Obviamente que tais configurações poderiam ser feitas em Design Time,
entretanto como a configuraçã a ser ealizada é simples daremos preferência pela configuração via
código, mostrando as propriedades do controle.
Inicie um novo projeto no VB e em seguida insirra um controle Microsoft Chart Control e
por fim insira o código abaixo para platar os dados no gráfico.
Private Sub Form_Load()
'Determinado uma varíavel array
Dim Matriz(1 To 4, 1 To 4)

With MSChart1'Inicia o laço With

'Configura as propriedades do controle


.ShowLegend = True 'Exibir Legenda
.Title = "Receitas/Despesas"
.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Meses"
.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "Valor em Reais ($)"

'Determina os valores da Matriz


Matriz(1, 2) = "Receita"
Matriz(1, 3) = "Despesas"
Matriz(1, 4) = "Média"
Matriz(2, 1) = "Abril"
Matriz(3, 1) = "Maio"
Matriz(4, 1) = "Junho"
Matriz(2, 2) = 500
Matriz(2, 3) = 400
Matriz(2, 4) = (Matriz(2, 2) + Matriz(2, 3)) / 2
Matriz(3, 2) = 625
Matriz(3, 3) = 500
Matriz(3, 4) = (Matriz(3, 2) + Matriz(3, 3)) / 2
Matriz(4, 2) = 300
Matriz(4, 3) = 700
Matriz(4, 4) = (Matriz(4, 2) + Matriz(4, 3)) / 2

'Plota os dados no gráfico


.ChartData = Matriz

End With 'Finaliza o laço With


End Sub
Código 36. Código para criação de um gráfico de recietas/despesas e média dutrante três meses.

A figura abaixo demonstra como fica o gráfico após as linhas inseridas no evento Load do
From.

19
Consulta ao livro Lima (1998)
Microsoft Visual Basic – Trabalhando com o Controle MSChart no Visual Basic 71

Figura 28. Gráfico de receitas/despesas de abril a junho apresentando a média de cada mês.
Outro exemplo de gráfico manual poderá ser criado com exibição da estatística pode ser
visto no exemplo abaixo e figura seguinte:
Private Sub cmdDesvio_Click()
'Exibe a linha de desvio padrão
MSChart1.Plot.SeriesCollection.Item(1).StatLine.Flag = VtChStatsStddev
End Sub

Private Sub cmdMaximo_Click()


'Exibe a linha de valor máximo
MSChart1.Plot.SeriesCollection.Item(1).StatLine.Flag = VtChStatsMaximum
End Sub

Private Sub cmdMedia_Click()


'Exibe a linha de valor médio
MSChart1.Plot.SeriesCollection.Item(1).StatLine.Flag = VtChStatsMean
End Sub

Private Sub cmdMinimo_Click()


'Exibe a linha de valor mínimo
MSChart1.Plot.SeriesCollection.Item(1).StatLine.Flag = VtChStatsMinimum
End Sub

Private Sub cmdRegressao_Click()


'Exibe a linha de regressão
MSChart1.Plot.SeriesCollection.Item(1) _
.StatLine.Flag = VtChStatsRegression
End Sub

Private Sub Form_Load()


'Determinado uma varíavel array
72 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Dim Matriz(1 To 6, 1 To 2)
With MSChart1
'Configurando as propriedades do controle
.ShowLegend = False 'Oculta Legenda
.Title = "Receitas/Despesas"
.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Meses"
.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "Valor em Reais ($)"
.Plot.AutoLayout = True
'Determinando os valores da Matriz
Matriz(1, 1) = "Janeiro"
Matriz(2, 1) = "Fevereiro"
Matriz(3, 1) = "Março"
Matriz(4, 1) = "Abril"
Matriz(5, 1) = "Maio"
Matriz(6, 1) = "Junho"
Matriz(1, 2) = 345
Matriz(2, 2) = 978
Matriz(3, 2) = 410
Matriz(4, 2) = 1520
Matriz(5, 2) = 200
Matriz(6, 2) = 280
'Modifica o tipo do gráfico
.chartType = VtChChartType2dLine '3 – Grafico de linha 2D
'Plota os dados no gráfico
.ChartData = Matriz
End With
Código 37. Códigos para criação de um gráfico manualmente e xibição de estatísticas.

Figura 29. Gráfico criado com dados de entrada manual, exibindo as estatísticas.
Microsoft Visual Basic – Trabalhando com o Controle MSChart no Visual Basic 73

10.2. Acessando Dados de um Banco de Dados para Plotar um Gráfico


A maneira simples de criar um gráfico manualmente, não é refletida para acesso de dados
num banco de dados, por exemplo, muitas linhas de códigos poderão ser utilizadas. Apesar da
entrada manual dos dados ser fácil algumas aplicações poderão requerer que estes dados tenham
origem de uma ou mais tabelas ou mesmo consultas de um banco de dados. O exemplo que se
segue será utilizado um banco de dados Microsoft Access® 97.
Para o exemplo que se segue será necessário já ter criado a consulta 'cnsUF', agrupando
por Estado e contando os nomes dos pesquisadores.
Public Function Grafico(sCampo As String)
Dim rsGrp As Recordset
Dim rsDados As Recordset
Dim qry As QueryDef
Dim reg As Integer
Dim i As Integer
If sCampo = "estado" Then
Set qry = DB.QueryDefs("cnsUF")
Set rsGrp = qry.OpenRecordset
rsGrp.MoveLast
rsGrp.MoveFirst
reg = rsGrp.RecordCount
msGrafic.ColumnCount = 1
msGrafic.Title = "Gráfico de pesquisadores por Estado"
msGrafic.RowCount = reg
msGrafic.Visible = True
While Not rsGrp.EOF()
For i = 1 To reg
msGrafic.Row = i
If Not IsNull(rsGrp!estado) Then
msGrafic.RowLabel = rsGrp!estado
Else
msGrafic.RowLabel = "Não especificou"
End If
msGrafic.Data = rsGrp!contardenomecompleto
rsGrp.MoveNext
Next
Wend
End If
End Function
Código 38. Código para extrair dados de um banco de dados Access 97, listando o número de
pesquisadores por Estado20.

20
Código extraído do programa Entomologistas do Brasil Manager v3.1
74 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Gráfico de pesquisadores por Estado

30 30

25 25

20 20

15 15

10 10

5 5

0 0

Figura 30. Gráfico plotado a partir dos dados de um banco de dados Access 97
Microsoft Visual Basic – Tratando erros em sua aplicação 75

11. TRATANDO ERROS EM SUA APLICAÇÃO


É sempre bem vindo tratar erros dentro de uma aplicação, porque nenhun software está
livre de Bug. Assim iremos dar uma pequena idéia de como montar uma rotina de tratamento de
erro padrão para toda a aplicação.

11.1. Os Objeto Err e Error do Visual Basic


O Visual Basic tem seu próprio mecanismo de erros que trata os problemas à medida que
eese ocorrem. Quando um erro é gerado no VB, as infirmações sobre o erro são armazenadas no
objeto Err (e o objeto Error se for um erro DAO). As propriedades desses objetos podem ser
verificadas para determinar qual tipo de erro ocorreu. Alguns erros são resuperáveis, outros não.

11.1.1. Propriedades dos ObjetosErr e Error


As propriedades dos objetos Err e Error armazenam dados sobre o erro mais recente que
ocorreu. Esses objetos podem ser usados para personalizar um arotina de tratamento de erro que
guiará os usuários nos problemas. As propriedades dos objetos Err e Error incluem: Description,
HelpFile, HelpContext, Number, Source e LastDLLError.

11.1.1.1. Propriedade Description


A propriedade Description armazena a descrição definida do sistema de um erro que
acabu de ocorrer. Essa descrição é normalmente uma explicação técnica do problema voltada para
os programadores, de modo que é melhor não exibir a propriedades sozinh para o usuário. Uma
explicação mais detalhada é muito conveniente.

11.1.1.2. Propriedades HelpFile/HelpContext


A propriedades HelpFile armazena o nom do arquivo de ajuda onde pode ser encontrada
assistência sobre um erro. Esse arquivo de ajuda será carregado pelo sistema da ajuda quando a
tecla F1 for pressionada. HelpContext é uma referência de páginado arquivo de ajuda que pode
ser usada para levar o usuário diretamente à página onde o texto especificado de ajuda está
localizado.

11.1.1.3. Propriedades Number


A propriedade Number armazena um valor numérico que identifica, de forma exclusiva,
um erro dentro da coleção de erros definidos pelo Visual Basic. Por exemplo, o erro divisão por
zero retorna o número 11.

11.1.1.4. Propriedades Source


Indica o nome do objeto que gerou um erro.

11.1.1.5. Propriedades LastDLLError


Retorna o código de erro produzido por uma função DLL (Dynamic Link Libary- Biblioteca
de Vínculo Dinâmico). Se a função falhar, um código de erro é armazenado na propriedade
LastDLLError, que pode então ser consultada para determinar o tipo ou causa da falha.

11.1.2. Métodos do Objeto Err


Como mancionado anteriormente os objetos Err e Error compartilham propriedades mas
não métodos. Os dois métodos a seguir – Clear e Raise –somente se aplica ao objeto Err.

11.1.2.1. Método Clear


O método Clear renicializa todas as propriedades do objeto Err para uma condição de
nenhum erro. Todos os valores numéricos são definidos como zero e as propriedades do texto
76 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

como strings de tamanho zero. Clear dever ser chamada sempre que uma condição de erro for
tratada pela rotina de tratamento de erros para evitar que o mesmo erro seja disparado duas
vezes.

11.1.2.2. Método Raise


Raise gera um erro de execução. Ele é usado para testar as condições de erro.

11.2. Erros Relacionado a Banco de Dados


Relacionar aqui todos os erros tratáveis do Visual Basic seria difícil, mas vamos tentar listar
os principais fornecendo o seu número e descrição, vamos lá:
Para tratamento de erros do banco de dados é recomendada a leitura do arquivo
JETERR35.HLP. O caminho deste arquivo no disco rígido em geral é "C:\Arquivos de
programas\DevStudio\VB\Help\jeterr35.hlp". Caso você possua o Microsoft® Office em português
instalado ou somente o Microsoft® Access, não há necessidade de traduzir as mensagens, leas
estãolistadas em português.
Abaixo segue os principais erros relacionados à banco de dados
Naturalmente você deve estar preparado para prever os erros potenciais e planejar o seu
tratamento, para isso devera conhecer os principais erros relacionados ao seu ambiente de
trabalho.

Tabela 18. Erros genéricos relacionados à operação de banco de dados


Número Mensagem
3005 Database Name' isn't a valid database name.
3006 Database 'name' is exclusively locked.
3008 Table 'name' is exclusively locked.
3009 Couldn't lock table 'name'; currently in use.
3010 Table 'name' already exists.
3015 'Index name' isn't an index in this table.
3019 Operation invalid without a current index.
3020 Update Or CancelUpdate without AddNew Or Edit.
3021 No current record.
3022 Duplicate value In index, primary key, Or relationship. Changes were
unsuccessful.
3023 AddNew Or Edit already used.
3034 Commit Or Rollback without BeginTrans
3036 Database has reached maximum size.
3037 Can't open any more tables or queries.
3040 Disk I/O Error during read.
3044 'Path' isn't a valid path.
3046 Couldn't save; currently locked by another user.

Tabela 19. Erros relacionados a bloqueio de registros


Número Mensagem
3027 Can't update. Database or object is read-only.
3158 Couldn't save record; currently locked by another user.
3167 Record is deleted.
3186 Couldn't save; currently locked by user 'name' on machine 'name'.
3187 Couldn't read; currently locked by user 'name' on machine 'name'.
3188 Couldn't update; currently locked by another session on this machine.
3189 Table 'name' is exclusively locked by user 'name' on machine 'name'.
Microsoft Visual Basic – Tratando erros em sua aplicação 77

Número Mensagem
3197 Data has changed; operation stopped.
3260 Couldn't update; currently locked by user 'name' on machine 'name'.
3261 Table 'name' is exclusively locked by user 'name' on machine 'name'. The
database Is opened by user 'name' on machine 'name'.

Tabela 20. Erros relacionados a Permissões


Número Mensagem
3107 Record(s) can't be added; no Insert Data permission on 'name'.
3108 Record(s) can't be edited; no Update Data permission on 'name'.
3109 Record(s) can't be deleted; no Delete Data permission on 'name'.
3110 Couldn't read definitions; no Read Definitions permission for table Or query
'name'.
3111 Couldn't create; no Create permission for table or query 'name'.
3112 Record(s) can't be read; no Read Data permission on 'name'.

11.3. Erros Relacionado a Arquivo21


Os principais erros relacionados aos arquivos são:

Número Mensagem
52 Nome ou número de Arquivo inválido
53 Caminho do arquivo Errado. Arquivo não encontrado
54 Modo de arquivo errado
55 Arquivo aberto por outro aplicativo
57 Erro de dispositivo Entrada e Sáida do disco (HardDisk)
58 Arquivo já existente
59 Tamanho incorreto de registro
61 Disco cheio. Espaço insuficiente para gravar o arquivo ou outra coisa
62 A entrada ultrapassou o final do arquivo. EOF foi utilizado incorretamente
63 Número de registro errado
64 Nome de Arquivo errado as regras de nomenclatura de arquivo não foram
respeitadas
67 Vários arquivo abertos ao mesmo tempo
68 Dispositivo não disponível. Erro de leitura de mídia ou disquete não inserido no
drive
70 Permissão negada ou o disco ao qual você deseja acessar está protegido contra
gravação ou o arquivo está aberto por outra aplicação
71 O disco não está pronto ou disquete não inserido no drive
72 Erro de mídia de disco. Disquete ou disco rígido com problemas
74 Permisão negada para renomear o arquivo entre unidades diferentes
75 Erro de acesso oa arquivo ou caminho do mesmo
76 Caminho não encontrado. Arquivo não existente ou caminho incorreto.

11.4. Rotina para Tratamento de Erros


Agora que os principais erros foram apresentados, iremos criar uma rotina de como
interceptar erros e salva-los em um arquivo para posterior consulta pelo suporte técnico ou pelo
próprio programador, para verificar onde o erro foi ocasionado e sanar os bugs. Obviamente o
Visual Basic exibe as mensagens de erro em inglês, portanto traduzi-las é uma mão de obra
inacabável.

21
Consulta ao Visual Basic 5 - Completo e Total - Gary Cornell, Makron Books - 1998
78 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

'Em um módulo insira a seguinte rotina


Public Sub Erros_App()
'Inicia um laço de decição Select Case e a cada erro interceptado um
amensagem será exibida ao usuário
Select Case Err.Number
Case 3020
MsgBox "Nenhum registro foi inserido inicialmente!",
vbExclamation, Titulo
Case 3022
MsgBox "Este registro já foi cadastrado!", vbExclamation,
Titulo
Case 3040
MsgBox "Erro durante a leitura do Disco!", vbExclamation,
Titulo
Case 3058
MsgBox "O campo primário está vazio!", vbExclamation, Titulo
Case 3008
MsgBox "O Banco de dados está bloqueado exclusivamente!",
vbExclamation, Titulo
Case 3009
MsgBox "Não é possível fechar a tabela; atualmente em uso!",
vbExclamation, Titulo
Case 3010
MsgBox "A tabela que você está tentando criar já existe!",
vbExclamation, Titulo
Case 524
MsgBox "As mudanças que você requeriu para a tabela não foram
bem sucedidas porque elas criariam valores de duplicados no índice, chave
primária, ou relação. Mude os dados no campo ou campos que contenham
dados duplicados. E tente novamente.", vbExclamation, Titulo
Case 3211
MsgBox "O gerenciador de base de dados não pode fechar a
tabela porque ela já está em uso por outra pessoa ou processo.",
vbExclamation, Titulo
Case 52
MsgBox "Nome ou número de Arquivo inválido.", vbExclamation,
Titulo
Case 53
MsgBox "Caminho Do arquivo Errado - Arquivo não encontrado.",
vbExclamation, Titulo
Case 54
MsgBox "Modo de arquivo errado.", vbExclamation, Titulo
Case 55
MsgBox "Arquivo aberto por outro aplicativo.", vbExclamation,
Titulo
Case 57
MsgBox "Erro de dispositivo Entrada e Sáida do disco
(HardDisk).", vbExclamation, Titulo
Case 58
MsgBox "Arquivo já existente.", vbExclamation, Titulo
Case 59
MsgBox "Tamanho incorreto de registro. ", vbExclamation,
Titulo
Case 61
Microsoft Visual Basic – Tratando erros em sua aplicação 79

MsgBox "Disco cheio - Espaço insuficiente para gravar o


arquivo.", vbExclamation, Titulo
Case 62
MsgBox "A entrada ultrapassou o final do arquivo - EOF foi
utilizado incorretamente utilizado.", vbExclamation, Titulo
Case 63
MsgBox "Número de registro errado.", vbExclamation, Titulo
Case 64
MsgBox "Nome de Arquivo errado - As regras de nomenclatura de
arquivo não foram respeitadas. ", vbExclamation, Titulo
Case 67
MsgBox "Vários arquivo abertos ao mesmo tempo.",
vbExclamation, Titulo
Case 68
MsgBox "Dispositivo não disponível - Erro de leitura de mídia
ou disquete não inserido no drive.", vbExclamation, Titulo
Case 70
MsgBox "Permissão negada - ou o disco ao qual você deseja acessar
está protegido contra gravação ou o arquivo está aberto por outra
aplicação.", vbExclamation, Titulo
Case 71
MsgBox "O disco não está pronto ou disquete não inserido no
drive.", vbExclamation, Titulo
Case 72
MsgBox "Erro de mídia de disco - disquete ou disco rígido com
problemas.", vbExclamation, Titulo
Case 74
MsgBox "Permisão negada para renomear o arquivo entre unidades
diferentes.", vbExclamation, Titulo
Case 75
MsgBox "Erro de acesso ao arquivo ou caminho do mesmo.",
vbExclamation, Titulo
Case 76
MsgBox "Caminho não encontrado - Arquivo não existente ou
caminho incorreto.", vbExclamation, Titulo
Case Else
MsgBox "Erro: '" & Err.Number & "'" & vbCrLf _
& vbCrLf & "Descrição: " & vbCrLf & Err.Description, vbCritical,
Titulo
End Select
'Chama a rotina SaveErros para salvar os erros num arquivo específico
Call SaveErros (Err.Description, Err.Number)
End Sub

'Rotina para salvar os error num arquivo específico


Public Sub SaveErros(Optional erDesc As String, Optional erNum As
Integer, Optional erSrc As String)
On Error Resume Next
Dim lArqErro As Long
lArqErro = FreeFile
Dim fnum As Integer
Dim lines As Integer
Dim a_line As String
Dim eMsg As String
If erDesc = Empty Then erDesc = Err.Description
80 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

If erNum = 0 Then erNum = Err.Number


If erSrc = Empty Then erSrc = Err.Source

eMsg = "Descrição: " & erDesc & vbCrLf & _


"Número: " & erNum & vbCrLf & _
"Origem: " & erSrc & vbCrLf & _
"Erro externo nº: " & erNum & vbCrLf & _
"Data e Hora: " & Date & " - " & Time & vbCrLf & _
"«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»"

ArqErr = sPath & "Error.dat"


Open ArqErr For Append As #lArqErro
Print #lArqErro, eMsg
Close #lArqErro
MsgBox "Erro: '" & Err.Number & "'" & vbCrLf & vbCrLf & _
"Descrição: " & Err.Description & vbCrLf & _
"Origem: " & erSrc, vbExclamation, Titulo
End Sub

'Agora a rotina para chamar o erro


'Para chamar os erros e exibi-los em português
Call Erros_App e depois salva-los
'Para Salvalos direto e exibir a mensagem original do Visual Basic
Call SaveErros, , "Erro ao tentar exportar dados em: " & Me.Name
Código 39. Rotina completa para interceptação, exibição e armazenamento de erro de uma
aplicação22

22
Código extraídos do programa Entomologistas do Brasil® v1.1
Microsoft Visual Basic – Distribuindo sua aplicação 81

12. DISTRIBUINDO SUA APLICAÇÃO


O Visual Basic 5 e 6 vem com ferramentas próprias cada um para distribuir o aplicativo
criado. Porém estas ferramentas possuem muitas restrições que podem ser samada com a
utilização por exemplo, do Inno Setup Compiler (www.innosetup.com) de autoria de Jordan Rusel
e possui código aberto, porém o código foi criado em Borland Delphi. A Microsoft ainda liberou
uma ferramentas de distribuição de aplicativo é o Microsoft Windows Installer hoje na versão 1.1.
e é freeware.
Existe uma série de ferramentas para distribuição de aplicativos, tais como: Install Wizard;
Setup Generator, Turbo SFX, Winn-Zip Self Extractor, InstallKit, Install Wise, CreateInstall, entre
outros.

12.1. Compilando o Projeto


Para compilar o projeto, basta clicar em File|Make. Selecione o local a ser compilado e
clique em OK.

12.2. Setup wizard (Visual Basic 5.0)


Apesar de ser restrito o Setup Wizard dá conta de distribuir aplicação mais simples,
entretanto as telas do programa exibem o texto em inglês, mas é possível traduzir o arquivo
Setup.rc e compila-lo novamente para Setup.res (arquivo de recurso) e recompilar o projeto
Setup1.vbp que se encontra em "C:\Arquivos de programas\DevStudio\VB\setupkit\setup1\".
Para maiores detalhes recomenda-se verificar a documentação disponível em
www.macoratti.net.

Figura 31. Tela inicial do Setup Wizard que acompanha o Visual Basic 5.0.

12.3. Package and Deployment Wizard (Visual Basic 6.0)


Apaser de ser muito parecido com o Setup Wizard, a interface do P & D Widzard é bem
diferente. Algumas funções foram alteradas, melhorads e outras adicionadas, para melhorar a
distribuição dos aplicativos, mas a Microsoft não acertou desta vez ainda. Acredito que o Microsoft
Windows Instaler seja melhor que o Setup Wizard e o P & D Wizard. Para maiores detalhes sobre
visite www.macoratti.net.
82 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 32. Tela inicial do Package and Deployment Wizard que acompanha o Visual Basic 5.0

12.4. Inno Setup Compiler


É possível fazer o download do Inno Setup em www.innosetup.com. A versão 3.0.18 tem
aproximadamente 2.0 MB. Enquanto escrevo este tutorial, versões mais aprimoradas estão sendo
desenvlvida.
Após fazer o download basta clicar no arquivo Self-extract que o programa se instalará em
poucos segundos.
A utilização do sistema é simples e bem intuitiva, você basicamente irá gerar um arquivo de
script que conterá toda a informação para instalar o seu sistema. Como estamos focando
aplicações Visual Basic, você deverá informar quais arquivos deseja instalar (nem tudo é perfeito).
No final você irá compilar o seu arquivo de script e em seguida já pode testar a sua instalação.
O Inno Setup é muito rápido e enxuto. Vale a pena ver se você se adapta a sua filosofia,
afinal não custa nada.
12.4.1. Dicas para Visual Basic
12.4.1.1. Gerando as Mensagens de Instalação em Português.
Para gerar as mensagens de instalação você não precisa alterar nada, basta apenas fazer o
download do arquivo já traduzido no endereço www.innosetup.com/files/istrans, procure em
Language por Português e clique duas vezes na versão 3.x, o nome do arquivo baixado será
BrazilianPortuguese.isl. Após o download do arquivo para fazer com que o compilador o utilize no
script altere a seção [Setup] como abaixo:
[Setup]
MessagesFile=compiler:MyTranslation.isl
É só substituir o nome MyTranslation.isl para o nome Do arquivo traduzido -
BrazilianPortuguese.isl.

12.4.1.2. Instalando Arquivos OCX.


Para instalar arquivos OCX , informe o nome Do arquivo no script como a seguir. (Como
exemplo estamos instalando a Comctl32.ocx).Obs: A linha abaixo é uma linha única.
Microsoft Visual Basic – Distribuindo sua aplicação 83

Source: "ComCtl32.ocx"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace sharedfile regserver

12.4.1.3. Instalando Arquivos do Visual Basic


Para a versão 3.0 e anteriores apenas copie o arquivo VBRUN???.DLL apropriado para o
diretório System Do usuário.
Para a versão 5.0 e 6.0 você vai precisar usar os arquivos Do sistema. Para fazer o
download clique no links abaixo:
VB 5.0 (Service Pack 3) system files - vb5sp3sys.zip [1.1 MB] (Visite o site para realizar os
downloads)
VB 6.0 (Service Pack 5) system files - vb6sp5sys.zip [1.1 MB]. Source of files: Q290887
(Visite o site para realizar os downloads)
Após fazer o download e descompactar os arquivos acima , copie e cole As linhas abaixo na
seção [Files] Do script:

; begin VB system files


; (Note: Scroll To the right To see the full lines!)
Source: "c:\vbfiles\stdole2.tlb"; DestDir: "{sys}"; CopyMode:
alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile regtypelib

Source: "c:\vbfiles\msvbvmXX.dll"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile regserver

Source: "c:\vbfiles\oleaut32.dll"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile regserver

Source: "c:\vbfiles\olepro32.dll"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile regserver

Source: "c:\vbfiles\asycfilt.dll"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile

Source: "c:\vbfiles\comcat.dll"; DestDir: "{sys}"; CopyMode:


alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall
sharedfile regserver
; End VB system files

12.4.1.4. Usando o SETUP.LST Gerado pelo P & D Wizard.


Você pode usar o P & D Wizard para gerar o arquivo Setup.lst e a seguir aceitar os
arquivos de sistema Do VB indicados na seção [Bootstrap Files] ( Não precisa incluir o arquivo
VB6STKIT.DLL ). A seguir você vai criar entradas de seções [Files] para todas As linhas da seção
[Setup1 Files] alterando segundo a tabela abaixo:

Tabela 21. Strings utilizadas pelo arqivo Setup.lst as strings equivalntes no Inno Setup Compiler
Seção no Setup.Lst Alterar para no arquivo de script do Inno Setup
$(AppPath) = {app} Constant
$(WinSysPathSysFile) = {sys} Constant
$(WinSysPath) = {sys} Constant
84 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Seção no Setup.Lst Alterar para no arquivo de script do Inno Setup


$(DLLSelfRegister) = regserver flag
$(Shared) = sharedfile flag
$(TLBRegister) = regtypelib flag
$(MSDAOPath) = {dao} Constant
$(EXESelfRegister) = use the [Run] section For "MyApp.exe /RegServer" use the
[UninstallRun] section For "MyApp.exe /UnregServer

12.4.1.5. Instalando ADO, DCOM e MDAC


Para saber como instalar ADO e DCOM e MDAC faça o download do arquivo
VB_DCOM_MDAC.iss (visite o site para fazer o download) depois é só copiar e colar para o seu
arquivo de script.

Figura 33. Figura do editor de script do Inno Setup Compiler v2.0.

12.5. IsTool
Quem inicialmente tem contato com Inno Setup logo toma um susto pois escrever código
por código de um script de distribuiçao de aplicação não é mole, pois eis que entra o IsTool um
programa FrontEnd que escreve os scripts de forma intuitiva e com a inteface de janelas
(windows). Assim fica mais fácil criar os scripts.E a partir da versão 3.0 o FrontEnd, possui suporte
a script de libguagem, ou seja, ele pode falar Português (BR), basta instalar o script da linguagem
ou traduzir o original em Inglês.
A documentação (em Inglês) tanto do Inno Setup compiler e do ISTool são bem completas
e simples de entender. Caso ainda fique alguma dúvida o usuário poderá saná-la no site do
fabricante.
Microsoft Visual Basic – Distribuindo sua aplicação 85

Figura 34. Interface do programa ISTool 3.0 em português (BR)


86 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues
Microsoft Visual Basic – Trabalhando com API's 87

13. TRABALHANDO COM API'S


As API's são nada mais que Interface de Programação de Aplicativo (Application
Programming Interface), que vem junto com o sistema operacional, ou seja, são linhas de
comandos contidas nas bibliotecas e outros arquivos do sistema.
Junto com o Visual Basic 5 e 6 vem o aplicativo API Viewer, que fornece as Constantes,
Declarações e Tipos. Vale a pena utilizar está ferramenta é de grande utilidade.
Outra opção muito mais plausível e fazer o download do programa APIGuide no site
www.allapi.net e verificar que nele além das API's conhecidas existem algumas não documentadas
pela Microsoft e o melhor de tudo é que este programa é gratuito (freeware), pequeno e bem
elaborado onde além da sintaxe das API's os autores exemplificam cada uma. Outra saída e
realizar o download do banco de dados de dicas Lizaro Visual Basic Dicas no site da Lizaro Soft
(www.lizarosoft.cjb.net) e apesar de não possuir tantas API's quanto o anterior, mas possui várias
outras dicas que pode ser bastante utilizadas.
Detalhar API's seria uma tarefa muito árdua, pois as documentações da Microsoft contendo
as API do sistema operacional Windows giram em torno de cinco livros ou mais de
aproximadamente 1000 páginas cada, portanto a Internet e sua maravilhosa capacidade de
difusão de informações poderá ajudá-lo a resolver as dúvidas mais freqüentes no que diz respeito
a Visual Basic, pois existem uma centena de milhares de páginas de Visual Basic espalhadas pelo
mundo, portanto prepare-se para navegar horas a fio atrás de informações para sanar suas
dúvidas e adquirir novos conhecimentos desta que é a linguagem de programação mais utilizada
no mundo.

13.1. Abrindo arquivo de Ajuda através de API


Para abrir arquivos de ajuda é de praxe que utilizemos o conhecido controle ActiveX
Commom Dialog, porém se você não quiser utiliza-lo, basta inserir a seguinte API num módulo.

Public Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd
As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData
As Long) As Long
Public Const HELP_CONTEXT = &H1 'Exibe o tópico de ajuda pelo Número ID
Public Const HELP_HELPONHELP = &H4 'Exibe a ajuda do Windows de como
utilizar ajuda
Public Const HELP_INDEX = &H3 'Exibe o Índice da Ajuda
Public Const HELP_QUIT = &H2 'Termina a juda
Public Const HELP_MULTIKEY = &H201& 'Procura por palavras-chave na tabela
alternativa da ajuda

Public Sub Exibir_AjudaAjuda(X As Form)


Dim Hlp As Long
Hlp = WinHelp(X.hwnd, "C:\Windows\Windows.hlp", HELP_HELPONHELP,
CLng(0)) 'Exibe o arquivo de ajuda sobre ajuda do Windows
End Sub

'No evento Click do Form digite:


Private Sub Form_Click()
Exibir_AjudaAjuda Me
End Sub

'Para finalizar o arquivo de ajuda juntamente com o aplicativo insira as


seguinte linhas de código no evento Unload do From:

Private Sub Form_Unload(Cancel As Integer)


Dim Hlp As Long
88 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Hlp = WinHelp(Me.hwnd, "Arquivo de ajuda", HELP_QUIT, CLng(0))


End Sub
Código 40. Exemplo de como abrir um arquivo de Ajuda através de API

13.2. Abrindo o Browser ou Editor de e-mail padrão


Sempre necessitamos acessar a Internet através de nosso aplicativo seja através do
Browser ou através do editor de e-mail padrão, portanto veja como é simples acessar a Internet
através desta API.
'Para abrir o browser e email faça o seguinte
'Num módulo insira a seguinte API
Public Declare Function ShellExecute Lib "shell32.dll" Alias
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal
lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As
String, ByVal nShowCmd As Long) As Long
'No evento Click do controle (Botão) associado digite
'Abre o browser
Call ShellExecute(0, vbNullString, "http://www.lizarosoft.hpg.com.br",
vbNullString, vbNullString, 0)
'ou para abrir o editor de e-mail
Call ShellExecute(0, vbNullString, "mailto:saclizarosoft@ieg.com.br",
vbNullString, vbNullString, 0)
Código 41. Exemplo de como abrir o Browser ou Editor de e-mail padrão

13.3. Encontrando o diretório de instalação do Windows e de Sistema


Em geral o diretório de instalação do Windows é 'C:\Windows', e o do sistema é
'C:\Windows\System', no entanto a sempre alguém que prefere dar uma cara nova a seu
computador e muda o diretório de instalação e você programador poderá ficar a ver navios se
especificar numa linha de comando o diretório padrão da instalação. Para evitar este tipo de coisa
existe a seguinte API:
'Num módulo insira as seguintes API's
'Diretório de Instalação do Windows
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias _
"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As
Long
'Diretório do sistema "System"
Public Declare Function GetSystemDirectory Lib "Kernel32" Alias _
"GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As
Long

'Em seguida escreva as seguintes funções


Public Function QualDirWin() As String
Dim Buf As String
Dim Rc As Long
Buf = Space$(255)
Rc = GetWindowsDirectory(Buf, 255)
If Rc > 0 Then
Buf = Left$(Buf, Rc)
QualDirWin = UCase(Buf) & "\"
Else
QualDirWin = ""
End If
End Function
Microsoft Visual Basic – Trabalhando com API's 89

Function SysDir() As String


Dim Buf As String
Dim Rc As Long
Buf = Space$(255)
Rc = GetSystemDirectory(Buf, 255)
If Rc > 0 Then
Buf = Left$(Buf, Rc)
SysDir = UCase(Buf) & "\"
Else
SysDir = ""
End If
End Function

'Num evento Load do Form insira as seguinte linhas de comando


Private Sub Form_Load()
Me.Print "Diretório de Instalação do Windows: " & QualDirWin
Me.Print "Diretório de Sistema do Windows: " & SysDir
End Sub
Código 42.Exemplo de como Encontrar o diretório de instalação do Windows e de Sistema

13.4. Drive do CD
Se a aplicação necessita buscar informações a partir do driver do CD-Rom e você especifica
a letra padrão como D:, pode entrar em uma enrascada. Pois a maquina onde o aplicativo está
rodando poderá ter de uma a vários discos rígidos. Desta forma a API seguinte resolve o
problema.
'Detectando o drive do CD. Num módulo insira as seguintes API's e os
seguintes códigos:
Public Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA"
(ByVal nDrive As String) As Long
Public Declare Function GetLogicalDriveStrings Lib "kernel32" Alias
"GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As
String) As Long
Public Const DRIVE_REMOVABLE = 2
Public Const DRIVE_FIXED = 3
Public Const DRIVE_REMOTE = 4
Public Const DRIVE_CDROM = 5
Public Const DRIVE_RAMDISK = 6

Function StripNulls(startStrg$) As String


Dim c%, item$
c% = 1
Do
If Mid$(startStrg$, c%, 1) = Chr$(0) Then
item$ = Mid$(startStrg$, 1, c% - 1)
startStrg$ = Mid$(startStrg$, c% + 1, Len(startStrg$))
StripNulls$ = item$
Exit Function
End If
c% = c% + 1
Loop
End Function

Num Form insira um Label com o nome Label1 e insira as seguintes


linhas de comando:
90 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Private Sub Form_Load()


Dim r&, allDrives$, JustOneDrive$, pos%, DriveType&
Dim CDfound As Integer
allDrives$ = Space$(64)
r& = GetLogicalDriveStrings(Len(allDrives$), allDrives$)
allDrives$ = Left$(allDrives$, r&)
Do
pos% = InStr(allDrives$, Chr$(0))
If pos% Then
JustOneDrive$ = Left$(allDrives$, pos%)
allDrives$ = Mid$(allDrives$, pos% + 1, Len(allDrives$))
DriveType& = GetDriveType(JustOneDrive$)

If DriveType& = DRIVE_CDROM Then


CDfound% = True
Exit Do
End If
End If
Loop Until allDrives$ = "" Or DriveType& = DRIVE_CDROM
If CDfound% Then
Label1.Caption = " O drive de CD-ROM no sistema é drive " &
UCase$(JustOneDrive$)
Else
Label1.Caption = " Nenhum drive de CD-ROM foi encontrado no
sistema. "
End If
End Sub
Código 43. Exemplo de como detecta r aletra do drive do CD

13.5. Ecrevendo e Obtendo Informações de um Arquivo INI


Mesmo podendo utilizar o registro do Windows para armazenar informações da aplicação,
convenhamos que inserir muitas informações no registro poderá deixar o sistema Operacional
lento. Para resolver este problema podemos lançar mão da antiga e bastante utilizada tecnologia
de arquivos de configuração, muito utilizada nos aposentado Windows 3.11 e Windows 95 e ainda
utilizada largamente no Windows 9x, NT, ME e XP.

'Example by Robin (rbnwares@edsamail.com.ph)


'Visit his site at http://members.fortunecity.com/rbnwares1
'In Form
Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias
"WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString
As String, ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias


"GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal
lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As
String) As Long
Private Sub Form_Load()
' We will create a new section in the INI-file
' It's output will be:
'
' [SectionName]
' Key=Value
'
Microsoft Visual Basic – Trabalhando com API's 91

' Note that used this ONLY if you are creating a new
' section on the INI file, unless you wanted to erase
' its existing keys.
Call WritePrivateProfileSection("SectionName", "Key=Value",
App.Path & "\sample.ini")
Dim szBuf As String * 255
Call GetPrivateProfileSection("SectionName", szBuf, 255, App.Path &
"\sample.ini")
MsgBox szBuf
End Sub
Código 44. Exemplo de como escrever e obter informações de um arquivo INI.
92 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues
Microsoft Visual Basic – Criando arquivos de ajuda basedo em arquivos HTML 93

14. CRIANDO ARQUIVOS DE AJUDA BASEDO EM ARQUIVOS HTML


Um sistema de ajuda bem elaborado possibilita menores gastos com suporte técnico, pois
resulta num maior esclarecimento de dúvidas por parte do usuário, além do que um arquivo de
ajuda é sempre bem vindo, tornando seu software mais profissional.
Vamos ver como criar um arquivo de ajuda usando arquivos HTML (Hyper Text markup
language) e integrá-los com suas aplicações em Visual Basic de forma clara e objetiva. Se você
ainda não tem idéia de como é a interface de um arquivo de ajuda de uma olhada no arquivo de
ajuda do Internet Explorer v4.0 ou superior, ou mesmo no arquivo de ajuda do Windows 98.
Inicialmente será necessário criar os arquivos HTML, para isto você poderá usar, o
FrontPage Express, HotMetal, Microsoft Word, OpenOffice, StarOffice e até mesmo o Bloco de
Notas. Você irá necessitar baixar o arquivo de instalação do HTML Help Workshp, no site da
Microsoft.
Para que um arquivo de ajuda contendo página da internet é necessário que na máquina
onde o arquivo de ajuda irá ser executado possua o Internet Explorer 4.x ou superior. Além dos
componentes necessários para execução do arquivo de ajuda. Desta forma aos realizar o
download do programa existe um pacote pré-pronto com todos os componentes básico, exceto o
Internet Explorer. O arquivo em geral possui o nome hhupd.exe, possui 465KB e fica localizado no
diretório redist, dentro do diretório de instalação do programa.
Para você ter uma idéia os tipos de arquivos usados no HTML HELP são:
Extensão do Arquivo Tipo do Arquivo
HHP Projeto do HELP
HHC Tabela de conteúdo
HHK Índice
CHM Help Compilado
HTM Os arquivos HTM
H Arquivo de Cabeçalho.

14.1. Criando um Arquivo de Ajuda


Antes de qualquer coisa, você deverá planejar bem os arquivos HTML e o arquivo de ajda
final, para que o seu projeto de ajuda não dê dor de cabeça.
Inicie o HTML Help Workshop e escolha File|New , na janela de diálogo a seguir selecione
a opção Project e clique OK. (Figura abaixo).

Figura 35.Janela para iniciar um novo arquivo.


Após escolher a opção Projeto, o Wizard para novo projeto é iniciado, agora você segue os
seguintes passos para as próximas telas do Wizard:
Tela 1 - Clique em avançar.
Tela 2 - Informe o nome do diretório e o nome do seu projeto. No exemplo D:\Temp\InsectA.HHP.
(Figura abaixo)
94 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 36. Tela do Wizard para especificar o caminho e o nome do projeto.


Verifique que a figura anterior possui um botão 'Browse...', ele poderá ser utilizado para
abrir um arquivo de ajuda preexistente.
Clique em avançar e selecione a opção HTML Files (.htm) e novamente clique em avançar.
E será exibida a tela para que você possa adicionar os arquivo de HTML que irão fazer do seu
arquivo de ajuda (Figura abaixo).

Figura 37. Listagem de arquivos HTML, que irão fazer parte do arquivo de ajuda.
Clique em avancar e após clique em concluir. Será exibida a janela do projeto de ajuda que
foi criado (Figura abaixo).
Microsoft Visual Basic – Criando arquivos de ajuda basedo em arquivos HTML 95

Figura 38. Janela do projeto recém criado, com as opções e listagem de arquivos criados.

14.1.1. Arquivo de Conteúdo


Agora iremos criar um arquivo de conteúdo onde serão listadas as opções de acesso aos
arquivos HTML compilados, dentro do arquivo de ajuda. Para realizar esta tarefa clique na aba
Contents a seguir selecione 'Create a new contents file' (Figura abaixo).

Figura 39. Janela de opção para criação ou abertura de uma rquivo de conteúdo.
Digite o nome do arquivo de conteúdo e salve-o. A seguir a aba Contents estará em
branco, clique no botão 'Insert a heading' (2º botão) na barra de ferramntas lateral da aba
contents e será exibida a janela para criação do arquivo de conteúdo (Figura abaixo).
96 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 40. Janela de adição de tópicos e de ligamento (link) com o arquivo correspondente.
Para criar o link com o arquivo HTML, clique no botão 'Add...' e em seguida será exibida a
lista de arquivos HTML adicionados ao projeto da ajuda (Figura abaixo).

Figura 41. Janela de "linkagem" de arquivo ao tópico do conteúdo. A listagem é exibida por título
do arquivo.
Microsoft Visual Basic – Criando arquivos de ajuda basedo em arquivos HTML 97

Figura 42. Aba de Contents, com sua aparência final listando todos os tópicos criados.

14.1.2. Arquivo de Índice


A aba seguinte é a Index, que cria um índice do arquivo de ajuda, possibilitando o usuário
localizar um tópico por palavras-chaves, está opção é sempre bem vinda em qualquer sistema de
ajuda. Desta forma, evite deixar de lado esta opção.
Para criar um índice clique na aba Index e em seguida escolha a opção 'Create a new
index file', salve o arquivo e em seguida clique no botão 'Insert a keyword'(2º botão) da barra
de ferramentas lateral, para exibir a janela de link de arquivo, semelhante a janela de link do
arquivo de conteúdo. Digite o título a ser exibido no arquivo de ajuda. A listagem de arquivos que
serão ligados (linkados) ao tópico indica que é possível ligar vários arquivos a um só tópico. Está
mesma opção é válida para a contrução do arquivo de conteúdos (contents). Repita a operação de
adição de tópicos tantas vezes necessários para adicionar ao seu arquivo de índice os tópicos a
sere exibidos.

14.1.3. Aparência da Janela do Arquivo de Ajuda


Para definir a aparência, clique na aba 'Project' e em seguida clique no ícone
'Add/ModifyWindows Definitions' (4º botão) e informe o nome da janela (no exemplo
usaremos Main)do arquivo de ajuda e aseguir configure ao seu modo. Para maiores informações
acesse o arquivo de ajda do programa.

14.1.4. Configurar Sensibilidade ao Contexto


Quando estamos navegando por telas de um programa em geral podemos acessar a ajuda
deste e ir direto ao tópico pertinente à aquela tela. Entretanto no projeto da ajuda tais tópicos
deverão ser especificados para que o usuário ao clicar na tecla F1, o tópico possa ser exibido.
Vamos configurar o projeto para tornar o arquivo de ajuda sensível ao contexto. Para tal
clique no botão 'HTML Help API Information' da barra de ferramentas da aba 'Project', após a
exibição da tela clique no botão 'Header file...', para adicionar um arquivo de cabeçalho, que
deverá ser criado em um editor de textos comum (Bloco de Notas) e deverá possui a extenção
98 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

".h", isso mesmo com uma letra. Em seguida adicione ao projeto. É possível adiconar vários
arquivos de cabeçalho a um mesmo projeto da ajuda.
A estrutura do arqivo de cabeçalho deverá ser a seguinte:
#define IDH_Main 10001
#define IDH_Menu 10002
#define IDH_Metodos 10003
#define IDH_Info 10004
Código 45. Estrutura de uma arquivo de cabeçalho, contendo os tópicos sensíveis ao contexto e
sua identificação numérica.

Figura 43. Janela HTMLHelp API Information com a adição do arquivo de cabeçalho InsectA.h.
Agora devemos realizar a aoperação de identificar e indicar a que contexto os arquivos
estarão ligados. Para tal, ainda na mesma janela, clique na aba Alias e clique em 'Add...', para
exibir a janela de ligação digite no primeiro campo uma das definições (ex: IDH_Main) e em
seguida no campo seguinte selecione o arquivo de HTML relacionado (Figura abaixo).

Figura 44. Janela de ligação da definição (IDH_Main), como o arquivo HTML (insecta.htm).
A seguir clique em OK e verifique que na janela 'HTML Help API Information', aba
'Alias', estará listado cada definição e o arquivo referenciado.
Microsoft Visual Basic – Criando arquivos de ajuda basedo em arquivos HTML 99

14.1.5. Compilando o Projeto da Ajuda


Para compilar, acesse o menu 'File' e em seguida 'Save Project' e por fim menu 'File' e
'Compile...' ou se preferir clique no botão 'Save all files and compile' (último), da barra de
ferramenta da Aba 'Project'.
A janela a direita da janela do programa irá exibir as informações pertinentes à compilação
dos arquivos para a criação do arquivo de ajuda.

14.1.6. Nota Final


Bom no geral é isto outras opçoes poderão ser utilizadas, consultando o próprio arquivo de
ajuda do programa que é bem elaborado e detalhado, detalhe em inglês.

14.2. Acessando o Arquivo CHM, Através do Visual Basic


No projeto do Visual Basic crie uma Classe Module como o nome clsHelpCHM (por
exemplo). Insira o seguinte código na declaração (General Declarations):
'Classe clsHelpCHM
'Author: William Costa Rodrigues
'Date: 05-15-2004
'Desciption: Module class to call HTML compiled help file
'//Constants Declarations
Private Const HH_DISPLAY_TOPIC = &H0
Private Const HH_HELP_CONTEXT = &HF

'//API Declarations
Private Declare Function HtmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" _
(ByVal hwnCaller As Long, ByVal pszFile As String, _
ByVal uCommand As Long, ByVal dwData As Long) As Long

'A seguir crie uma função com o nome ShowHelp


Public Function ShowHelpCHM (helpFile As String, Optional WindowPane As
String, Optional ContextID as Long)
Dim strFile As String
strFile = helpFile

If Len(WindowPane) Then
Call HtmlHelp (0, strFile, HH_DYSPLAY_TOPIC, ByVal 0&)
Else
Call HtmlHelp (0, strFile, HH_DYSPLAY_CONTEXT, ContextID)
End If
End Function
Código 46. Classe clsHelpCHM, criada para acessar através de API ao arquivo de ajuda CHM,
pelo Visual Basic

Para realmente exibir o arquivo de ajuda atrav;es de um formulário, seja por meio de
menu, botão, etc, é necessário a seguinte rotina (código):
Private Sub cmdHelp_Click()

Dim sFile As String


Dim objHelp As clsHelpCHM

Set objHelp = New clsHelpCHM


sFile = App.Path & "\Ajuda\InsectA.chm"
Call objHelp.ShowHelpCHM (sFile, "Main")
Set objHelp = Nothing
100 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

End Sub
Código 47. Codígo para exibir o arquivo de ajuda através do evento Click, de um
CommandButton, chamado cmdHelp.
Se você queiser utilizar o sensibilidade ao contexto, será necessário referenciar a
identificação do contexto que deseja chamar. Desta forma para chamar o contexto desejado você
irá precisar da seguinte rotina.
Private Sub cmdHelp_Click()

Dim sFile As String


Dim objHelp As clsHelpCHM

Set objHelp = New clsHelpCHM


sFile = App.Path & "\Ajuda\InsectA.chm"
Call objHelp.ShowHelpCHM (sFile, "Main",10001) 'O ID '10001', está
relacionado com o arquivo 'insecta.htm'
Set objHelp = Nothing

End Sub
Código 48. Codígo para exibir o contexto específco do arquivo de ajuda através do evento Click,
de um CommandButton, chamado cmdHelp.

Bom como já dito outras opções que por ventura você deseje utilizar, deverá consultar o
arquivo de ajuda do programa.
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 101

15. GERANDO RELATÓRIOS COM O CRYSTAL REPORTS23


O Crystal Reports é uma ferramenta geradora de relatórios, que acompanha as versões 5 e
6 do Visual Basic. Tem uma grande vantagem que é gerar relatórios de forma rápida e fácil e por
outro lado apresenta as devantagens de necessitar da distribuição junto ao aplicativo cerca de 5,0
MB de bibliotecas, não possuir flexibilidade na alteração dos relatórios em run-time. Apesar de
apresentar estas vantagens, vamos no prender as vantagens.

15.1. Inicializando o Crystal Reports


Par inicilizar o Crystal, basta clicar no menu Add-Ins e selecionar a opção Report Designer
ou no ícone correspondente na pasta de trabalho do Visual Basic.

Figura 45. Ícone do Crystal Reports v4.6.

15.2. Criando um Novo Relatório


Inicialmente iremos gerar um relatório (exemplo) a partir de uma base de dados do MS
Access 97, cujo nome é: Administer.mdb e a tabela a ter o relatório gerado é tbCadastro.
O relatório a ser gerado deverá possuir os seguintes parâmentros:
1. Imprimir os seguintes campos: nome, matricula, rg, orgao, dataemi, natural, fone1 e
endereco;
2. O relatório deverá ser ordenado pelo campo 'nome';
3. Deveremos permitir a visualização, impressão e exportação do relatório no formato do Word
(2.0);
4. O nome do relatório será 'cadastro.rpt'.

Selecione a opção no menu 'File/New' então teremos a figura abaixo.

Figura 46. Janela para criação de um relatório novo no Crystal Reports.

Note que na janela Create New Report, temos nove opções de relatórios exibidas e mais
três ocultas que poderão ser acessadas através do botão 'Custom>>', mas será explorado em
nosso pequeno tutorial.
Para iniciar o nosso novo relatório, clique em 'Standard'. Em seguida será exibida a janela
como segue, dando a opção de selecionar uma base de dados através de uma arquivo ou através
de comando SQL (Structure Query Language).

23
A versão apresntada neste tutorial é a versão 4.6. Hoje já existe a versão 8.0 nomercado, porém com um
custo elevado para pequenas empresas e mesmo para um programador autônomo.
102 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 47. Janela Create Report Expert, com a opção o passo 1: seleção de tabelas no Crystal
Reports
Selecionamos para o exemplo somente a tabela tbCadastro, para que possamos criar um
relatório baseado nesta tabela. Portanto excluimos todas os nomes das outras tabelas listadas.
Clieu em Next e será exibido passo 3: Campos (Fields). Note que saltamos o passo 2, Links
(lgação). Esta opção somente seria explorada e configurada se e somente se duas ou mais tabelas
fossem escolhidas. Seleciona-se nesta opção os campos a serem exibidos no relatório como mosta
a figura a seguir, mas não se preocupe, caso você esqueça algum campo ou inseriu um por
acidente poderá incluir e mesmo excluir um campo em modo de desenho (design-mode).
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 103

Figura 48. Passo 3: seleção de campos a serem exibidos no relatório do Crystal Reports.
Após selecionar os campos a serem exibidos, clique em Next >> e em seguida iremos
escolher a opção de ordenação dos dados e a forma de ordenação – se crescente ou decrescente -
como segue a janela abaixo.

Figura 49. Passo 4: seleção dos campo de ordenação do relatório e tipo de ordenação no Crystal
Reports.
Selecione o(s) campo(s) a serem utilizados como parâmentro de ordenação dos dados para
o relatório, podendo o usuário selecionar mais de um, porém caso seja selecionado mais de uma
ordenacão seguira o critério da ordem de inserção. Ex.: nome e matricula, a ordenação primeiro
será nome e depois matricula.
O tipo de ordenação poderá selecionado através da opção Order, que possui as seguintes
opções:
ª In ascending order – ordena crescentemente respeitando a ordem listada no campo Group
Fields.
ª In descending order – ordena decrescentemente respeitando a ordem listada no campo
Group Fields.
ª In specified order – ordena através dos dados originais do campo da tabela (esta opção
não será trabalhada neste tutorial).
ª In original order – ordena crescentemente através da lista de campos original da tabelas,
respeitando a ordem de criação dos campos (esta opção não será trabalhada neste
tutorial).

Iremos saltar os passo 5 e 6, e iremos direto para o passo 8, onde iremos definir o tíitulo e
estilo do relatório. Daremos ao tituo o seguinte texto 'Lizaro Administer – Cadastro' e o estilo será
o padrão Standard, como podemos ver na figura seguinte.
Verifique que no canto direito da janela teremos duas opções de finalização da geração do
relátorio: Preview Report (visualizar o relatório) e Preview Sample (visualizar o "modelo").

Caso deseje incluir uma imagem cliue no botão e em seguida selecione um tipo de
figura válida. O Crystal Reports v 4.6, suporta somente os seguites padrões de figuras: bitmap
104 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

windows (bmp), CompuServe (gif), PC paitbrush (pcx), TIFF (tif), e Targa (tga). Adicionamos no
exmplo uma pequena figura (bmp) para exemplificar.

Figura 50. Passo 8: especificação de título e seleção se estilo do relatório no Crystal Reports.

Para visalizarmos o relatório em modo de desenho, basta selecionar a opção Preview


Sample e em seguida iremos verificar a disposição dos campos como mostra figura seguinte.

Figura 51. Janela do modo de desenho do Crystal Report.

Nesta janela veremos quatro seções no lado esquerdo do relatório. São elas:
ª Title – especifica o título do relatório a ser exibido no inicio da primeira página somente.
ª Page header – Exibe o conteúdo no inicio de cada página, com exceto na primenira que
será exibido abaixo do campo Title.
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 105

ª Details – contém os campos a serem exibido e impressos a partir dosdados contidos no


banco de dados.
ª Page footer – refere-se ao rodapé da página, onde entre outros dados poderá conter uma
campo com o nome da aplicação, data de impressão do relatório, campo de ditreitos
autorias, etc. somente não abuse nas informações do rodapé pois tomará espaço no
relatório, reduzindo a quantidade de dados a partir do banco de daso a ser exibida e
impressa.
ª Summary – impressão de resumso do relatório. Uma seção pouco utilizada e prontamente
substituída pela seção Page footer.

15.3. Inserindo novos campos a partir da tabela.


Para selecionar-mos novos campos aser inseridos na tabela, basta seleciona a opção
'Insert/Database Field...' como mostra a figura seguinte.

Figura 52. Janela par inserção de novo(s) campo(s) ao relatório no Crystal Reports.

Para inserir um novo campo, basta clicar e arrastar o campo para o seção Details e em
seguida organiza-lo na melhor posição.

15.4. Formatando campos, inserindo figuras, linhas e caixas


15.4.1. Formatando Campos
Podemos formatar os campos inseridos no relatório em mode de desenho (Design Mode). A
formatação diz respeito ao tipo de letra, tamanho, nome da fonte, itálico, negrito, alinhamento do
texto, etc.

Figura 53. Barra de ferramentas de formatação do texto dos campos no Crystal Reports.
Outras formatações a serem realizadas, podem ser acessadas através do menu suspenso
que pode ser acionado com um clique no botão direito em cima do campo a ser formatado.
106 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Figura 54. Menu suspenso para formatação do campo (fonte, formato, bordas, etc.) no Crystal
Reports
ª A opção Change Font... dá acesso a caixa de selção de fonte e suas variantes.
ª A opção Change Format... dá acesso a janela de formatação abaixo:

Figura 55. Janela de alteração do formato do campo no Crystal Reports.


onde:
• Suppress if Duplicated: suprime se o campo é duplicado;
• Hide when Printing: oculta na impressão do relatório;
• Alignment: Alinhamento do texto do campo;
• Print on mutiple lines: Imprimir em linhas mútiplas. Nesse caso será necessário
limitar o nº máximo de linha especificar no campo 'Maximum number of lines
(Enter 0 for no limit:)' o valor padrão para este campo é 0 (zero).
ª Opção Change Border and Colors... dá acesso a janela de mudança da borda, cor do
texto, tipo de linha da borda, tamanho da(s) borda(s), etc.

Figura 56. Alteração de borda e cores de borda e texto do campo do Crystal Reports.
ª Opção Edit Text Field... dá acesso a caixa de alteração do texto exibido no campo.

15.4.2. Inserindo Figuras, Linhas e Caixas


Dois passos poderão ser seguidos para a inserção de qualquer um destes objetos, através
do menu Insert: Picture (figura), Line (linha) ou Box (caixa). Ou acessar os seguintes botões
seguintes.
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 107

Figura 57. Barra de ferramentas para inserção de figura, linha e caixa (respectivamente) do
Crystal Reports.

15.5. Trabahando com Fórmulas


O Crystal Reports, possibilita a utilização de formulas, para permitir uma maor flexibilidade
de selecionar os dados, por exemplo, para exibir o número da página ou a data atual, etc. além de
permitir a utilização dos operadores If-Then-Else.
Para inserir uma fórmula, clique em Inset/Formula e em seguida digite o nome da fórmula.
Será exibida a seguinte janela a baixo. Digite o seguinte texto no campo Formula Text:
If {tbCadastro.nome} <> "João da Silva" Then
"Não é João da Silva"
Else
"É João da Silva"
Código 49. Texto da fórmula "nome" inserida no relatório do Crystal Reports.

Figura 58. Janela de edição de fórmula do Crystal Reports


Note que o nome da formula presenta-se como @nome, mas na verdade o caractere @ é
somente uma string de referência do programa.
A fórmula "nome" no exemplo acima verifica se o nome do campo nome é igual a 'João da
Silva' e em seguida retorna o resultado verdadeiro ou falso. Cuidado que a comparação realizada e
Case Sensitive, ou seja, diferencia maiúscula ou minúscula.
Na janela de edição de fórmulas existem dois botões importantes: Accept e Check. O
primeiro aceita a fórmula do modo que foi contruída e caso exista erro(s) uma mensagem será
exibida "There is an error in this formula. Do want to exit anyway?" (Existe um erro nesta formula.
Deseja sair de qualquer jeito?). O segundo botão checa a autenticidade da formula e caso seja
exibida a mensagem 'No errors found', a formula não apresenta erros ou pendências.
108 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

15.5.1.1. Especificando o valor de uma fórmula através do Visual Basic


É sempre comum se setar valor do Visual Basic para um relatório do Crystal Reports, dais
lanca-se mão das fórmulas, que são "uma mão na roda". No exemplo seguinte veremos a
passagem do nome, versão e direitos autorais do aplicativo para o cristal. Incialmente crie uma
fórmula com o nome Aplicativo, que irá receber o valor, ela deverá de preferência ser insirida no
rodapé do relatório (Page footer).
NomedoControle.Formulas(0)="Aplicativo='" & App.Title & " v" & App.Major
& "." & App.Minor & " Copyright" & App.LegalCopyright & "'"
'Neste caso não é permitido o uso da constante de quebra de linha vbCrLf,
já que o o valor a ser enviado deverá ser feito em uma única linha. A
formatação de multi linhas, veja no tópico Formatando Campos (15.4.1)
Código 50. Envio de valor para uma fórmula do CrystalReport
Outro modo de especificar ou mesmo filtrar dados através de uma fórmula a apartir do
Visual Basic é utilizando a propriedate SelectionFormula, como segue o exemplo seguinte, que lista
somente o nomes começados coma letra B.
NomedoControle.SelectionFormula="{tbCadastro.Nome>='}" & "B" & "" & "'"
Código 51. Filtragem de dados no CrystalReports através do Visual Basic.

15.6. Imprimindo, Visualizando e Exportando um Relatório a partir do Visual Basic.


Neste caso devemos definir alguns parâmentro a ser passado para o relatório e dados a ser
definido na janela.

15.6.1. Imprimindo
Nesse caso devemos fazer algumas considerações: você deverá definir no modulo de
desenho: a impressora, tamanho da página (A4, carta, etc.), margens, etc. Abaixo segue um
exemplo de código para imprimir o relatório que acabamos de criar.
Private Sub Command1_Click()
With CrystalReport1
'define o camino do relatório, podendo ser App.Path &
"\nomedorelatório.rpt"
.ReportFileName = App.Path & "\tut_test.rpt"
'especifica qual o campo irá ordenar os dados no relatório
.SortFields(0) = "+{tbcadastro.nome}"
'enviar os dados do aplicativo para a fórmula aplicativo do relatório
.Formulas(0) = "Aplicativo='" & App.Title & " v" & App.Major & "." &
App.Minor & " Copyright" & App.LegalCopyright & "'"
'define o destino do relatório
.Destination = crptToPrint
'aciona o mecanismo de destino escolhido
.Action = 1
End With
End Sub
Código 52. Código para impressão direta do relatório sem visualização prévia no Crystal Reports.
15.6.2. Visualizando
A visualização de um relatório possui algumas vantagens em relação à impressão ditreta,
pois possibilita o usuário além de visualizá-lo, como também imprimi-lo e/ou exporta-lo com
arquivo suportados pelo CrystalReport (HTML, RTF, WinWord, CSS, Lotus 1-2-3, Excel, etc.) e/ou
envia-lo por e-mail.
Na janela de visualização do relatório, veremos uma barra de ferramentas alinhada da base
da janela que posui os seguintes botões como a ordem que segue: voltar para a primeira página;
retornar uma página; avançar uma página; avançar para a última página; Cancelar uma operação,
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 109

zoom do relatórios, imprimir relatórios, exportar relatorio para arquivo; exportar arquivo como
anexo ao e-mail e fechar janela de visualização.

Figura 59. Barra de ferramentas na janela de visualização do Crystal Reports.


Verifique que o código abaixo possui um destaque para algumas propriedades do contrle
do Crystal Reports (WindowState, WindowTitle e Destination).
Private Sub Command1_Click()
With CrystalReport1
'define o camino do relatório, podendo ser App.Path &
"\nomedorelatório.rpt"
.ReportFileName = App.Path & "\tut_test.rpt"
'especifica qual o campo irá ordenar os dados no relatório
.SortFields(0) = "+{tbcadastro.nome}"
'enviar os dados do aplicativo para a fórmula aplicativo do relatório
.Formulas(0) = "Aplicativo='" & App.Title & " v" & App.Major & "." &
App.Minor & " Copyright" & App.LegalCopyright & "'"
'define a janela do aplicativo commo maximizada
.WindowState = crptMaximized
'define o título da janela do relatório
.WindowTitle = "Relatório de cadastro"
'define o destino do relatório
.Destination = crptToWindow
'aciona o mecanismo de destino escolhido
.Action = 1
End With
End Sub
Código 53. Código para visualizar um relatório.

Figura 60.Janela de visualização de um relatório pelo CrystalReport ActiveX Control.

15.6.3. Exportando (para arquivo e por e-mail)


15.6.3.1. Exportando para arquivo formato do Word
Private Sub Command1_Click()
110 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

With CrystalReport1
'define o camino do relatório, podendo ser App.Path &
"\nomedorelatório.rpt"
.ReportFileName = App.Path & "\tut_test.rpt"
'especifica qual o campo irá ordenar os dados no relatório
.SortFields(0) = "+{tbcadastro.nome}"
'enviar os dados do aplicativo para a fórmula aplicativo do relatório
.Formulas(0) = "Aplicativo='" & App.Title & " v" & App.Major & "." &
App.Minor & " Copyright" & App.LegalCopyright & "'"
'define o destino do relatório
.Destination = crptToFile
'define o tipo de arquivo a ser exportado (WinWord no exemplo)
.PrintFileType = crptWinWord
'aciona o mecanismo de destino escolhido
.Action = 1
End With
End Sub
Código 54. Código para exportar um arquivo no formato do Word.
15.6.3.2. Enviando um relatório em anexo por e-mail24
O código abaixo não permite a visualização da mensagem pelo usuário do programa ela é
especificada em design-time (tempos de construção do aplicativo) e é prontamente enviada pelo
editor de e-mail padrão do computador.
Private Sub Command1_Click()
With CrystalReport1
'define o camino do relatório, podendo setr App.Path &
"\nomedorelatório.rpt"
.ReportFileName = App.Path & "\tut_test.rpt"
'especifica qual o campo irá ordenar os dados no relatório
.SortFields(0) = "+{tbcadastro.nome}"
'enviar os dados do aplicativo para a fórmula aplicativo do relatório
.Formulas(0) = "Aplicativo='" & App.Title & " v" & App.Major & "." &
App.Minor & " Copyright" & App.LegalCopyright & "'"
'define o destino do relatório
.Destination = crptMapi
'define o tipo de arquivo a ser enviado em anexo
.PrintFileType = crptWinWord
'define o e-mail ou nome do destinatário da ista de endereços do editor
de e-mail
.EMailToList = "saclizarosoft@hotmail.com"
'especifica o texto que deverá compor o corpo da mensagem
.EMailMessage = "Prezado Senhor," & vbCrLf & _
"Estamos enviando em anexo o relatório de cadastro do programa:" &
vbCrLf & _
"Relatório do programa Lizaro Administer" & vbCrLf & _
"Atenciosamente," & vbCrLf & _
"William Costa Rodrigues"
'define o assunto da mensagem
.EMailSubject = "Relatório de cadastro"
'aciona o mecanismo de destino escolhido
.Action = 1
End With
End Sub

24
É necessário conexão com a Internet, para envio de e-mails.
Microsoft Visual Basic – Gerando relatórios com o Crystal Reports 111

Código 55. Exportando um arquivo para uma mensagem de e-mail.

15.7. Outros códigos úteis para trabalhar com relatótios.25


Abaixo segue alguns códigos úteis para trabalhar com relatórios do Crystal Reports
15.7.1. Abrindo um relatório, cujo banco de dados possuui senha
With CrystalReport1
.ReportFileName = App.Path & "\arquivo.rpt"
.Connect = ";pwd=SuaSenha"
.DataFiles(0) = App.Path & "\arquivo.mdb"
.Action = 1
End With

15.7.2. Alterar via código o caminho da base de dados do relatório


Report1.DataFiles(0) = "c:\diretorio\bdados1.mdb"
Report1.DataFiles(1) = "c:\diretorio\bdados2.mdb"

15.7.3. Como direcionar a impressão do Crystal para a porta LPT2?


CrystalReport1.PrinterPort = "LPT2"
CrystalReport1.PrinterName = "HP LaserJet 6L PCL"
CrystalReport1.PrinterDriver = "PCL5EMS3.DRV"

15.7.4. Fazendo com que a janela de impressão do Crystal Reports fique como filha
(MDIChild) de um MDI?
Insira o objeto Crystal Report no MDI Form e altere a propriedade ReportFileName para o
caminho do seu relatório.
No evento Activate do seu MDIForm, utilize a seguinte rotina:
Private Sub MDIForm_Activate()
CrystalReport1.WindowParentHandle = MDIForm1.hWnd
CrystalReport1.WindowState = 2 'Abre o relatório em formato
maximizado
CrystalReport1.Action = 1
End Sub

15.7.5. Inserir uma quebra de página no Crystal Reports?


Acesse o menu Format|Section no Crystal Reports e selecione a seção desejada e escolha uma das
seguintes opções:
» New Page Before; ou
» New Page After.

15.7.6. Modificar as margens de um relatório em modo de execução?


Utilize as propriedades MarginLeft e MarginRight:
Private Sub Command1_Click()
With CrystalReport1
.MarginLeft = 100
.MarginRight = 100
End With
CrystalReport1.Action = 1
End Sub

25
Exemplos retirados do programa Lizaro Visual Basic Dicas v3.0
112 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

15.7.7. Outra forma de especificar a senha do banco de dados utilizado pelo relatório.
Altere a propriedade Connect, do objeto Crystal para algo como a
expressão abaixo:
CrystalReport1.Connect = App.Path & "\DataBase.mdb", False, False,
";PWD=senha"
Microsoft Visual Basic – Criando um ActiveX 113

16. CRIANDO UM ACTIVEX26


Iremos neste capítulo final construir um controle ActiveX (OCX) para exibir arquuivos de
ajuda no formato hlp, de modo simples veremos como contruir este componente.
Inicie um novo projeto, escolhendo a opção ActiveX Control. Em seguida será criada uma
janela de um UserControl, personalize-a como a figura abaixo. Inserindo um CommnadButton e
definido uma imagem e texto para ele.

Figura 61. Controle ActiveX em Design-time.


Na janela code deste user controle insira os códigos abaixo:
'Author: William Costa Rodrigues (Lizaro Soft)
'Created date: 2-25-2003
'Modified date: 08-01-2004
'Description: ActiveX Control to access help file in 'hlp' format.

Enum HLPConst
HELP_CONTEXT = &H1 'Exibe o tópico de ajuda pelo Número ID
HELP_HELPONHELP = &H4 'Exibe a ajuda do Windows de como utilizar
ajuda
HELP_INDEX = &H3 'Exibe o CONTEUDO da Ajuda
HELP_QUIT = &H2 'Termina a ajuda
HELP_MULTIKEY = &H201& 'Procura por palavras-chave na tabela
alternativa da ajuda
HELP_KEY = &H101 'Exibe o Índice da Ajuda
End Enum
'especifica a constante a ser utilizada pela API para exibir o arquivo de
ajuda
Dim m_AjudaHLP As HLPConst

Private Sub UserControl_Initialize()


'define o tipo de constante para a variável m_AjudaHLP
m_AjudaHLP = HELP_CONTEXT
End Sub

Private Sub UserControl_Resize()


'ajusta o tamanho do componente quando este for redimensionado, mantendo-
o com um tamanho fixo
cmdCtl.Left = 0
cmdCtl.TOp = 0
UserControl.Width = cmdCtl.Width
UserControl.Height = cmdCtl.Height
UserControl.ScaleLeft = 0
UserControl.ScaleTop = 0

cmdCtl.TOp = 0
cmdCtl.Left = 0

End Sub

26
Código retirado do ActiveX Lizaro HelpOCX v1.00.0007 disponível em www.lizarosoft.cjb.net
114 Desvendando a linguagem de programação mais popular do mundo – W.C. Rodrigues

Public Function Exibir_Ajuda(frm As Object, Ajuda As String, Constante As


HLPConst, Optional Topico As Long)
'função para exibir o arquivo de ajuda
If Constante = TOPICOS And Topico = Empty Then
MsgBox "Especifique o número do tópico que deseja exibir!",
vbExclamation, "Erro: Tópico não especificado"
Else
'chama a finção definida num módulo que utiliza a API WinHelp
ExibirAjudaHLP frm, Ajuda, Constante, Topico
End If
End Function

Public Property Get AjudaHLP() As HLPConst


'retorna a propriedade AjudaHLP do controle
AjudaHLP = m_AjudaHLP
Constante = AjudaHLP
End Property

Public Property Let AjudaHLP(ByVal nAjudaHLp As HLPConst)


'especifica a propriedades AjudaHLP do controle, modificando-a para o
novo valor especificado
m_AjudaHLP = nAjudaHLp
PropertyChanged "AjudaHLP"
End Property
Código 56. Código do controle ActiveX para especificar e retornar as propriedades.
Agorma iremos trabalhar com a API WinHelp parapodermos chamar o arquivo de ajuda
atrav;es do controle ActiveX.
Public Declare Function WinHelp Lib "USER32" Alias "WinHelpA" _
(ByVal hwnd As Long, ByVal lpHelpFile As String, _
ByVal wCommand As Long, ByVal dwData As Long) As Long

Public Function ExibirAjudaHLP(X As Object, hlpFile As String, Constante


As HLPConst, Optional cnt As Long)
'x - espeficica a propriedade hwnd do form
'hlpfile – especifica o caminho do arquivo de ajuda
'Constante - especifica a constante a ser utulizada para especifica em
que modo a API devera exibir o arquivo de ajuda
' cnt – especifica o tópico específico que será exibido
'função que exibe o arquivo de ajuda especificado na função Exibir_Ajuda
no código do controle ActiveX UserControl
If Constante = HELP_CONTEXT Then
If cnt = Empty Then cnt = 0
Aju = WinHelp(X.hwnd, hlpFile, Constante, cnt)
Else
Aju = WinHelp(X.hwnd, hlpFile, Constante, CLng(0))
End If
End Function
Código 57. Código para exibir a arquivo de ajuda específico através da API WinHelp no controle
ActiveX.
Microsoft Visual Basic – Bibliografia Consultada 115

17. BIBLIOGRAFIA CONSULTADA

Anônimo, 1998. Guia de Referência do Visual Basic, 65p.


Anônimo, 2003. Crystal Reports – Gerando seus relatórios, www.scriptbrasil.com.br, 11p..
Appleman, D. 1997. Developing Advanced ActiveX Controls With Visual Basic 5.0,
www.desaware.com, 3p.
Cornell, G. 1998. Visual Basic 5 completo e total. Trad. Unonius, L.G.E., Makron Books, São
Paulo, SP, 778p.
Ganz Jr., Carl. 1998. Visual Basic 5 – Desenvolvendo bancos de Dados para a WEB. Tradução e
revisão técnica: Santos, J. R.D.P., Makron Books, São Paulo, SP, 489p.
Ideológica 1999. Modelagem de Dados em Microsoft Access 95. São Paulo, SP, 21p.
Lima, A. S. 1998. Aplicações em Visual Basic 5.0 – Controle de estoque. Érica, São Paulo, SP,
338p.
Machado, F. N. R. & Abreu, M. 1996. Projeto de Banco de Dados: uma visão prática. 2ª Ed.
Érica, São Paulo, SP, 298p.
Marcoratii, J. C. 2000. Usando HTML HELP em suas aplicações Visual Basic.
www.geocities.com/SilliconValleyBay/3994/ajuda.htm, acesso em 05/04/2000.
Marcoratii, J. C. 2003. www.geocities.com/SilliconValleyBay/3994/, consulta em junho de 2003.
Microsoft Corporation. 1991-1997. Visual Basic Books Online v1.0, acompanha o Visual Basic
v 5.0.
Morgado, F. 1998. Visual Basic 5, método rápido. Infobook, Rio de Janeiro, RJ, 181p.
Pires, A. 1996. Microsoft Access 2.0 for windows. Axcel Books, Rio de Janeiro, RJ, 150p.
Rodrigues, W.C. 2000. Microsoft Visual Basic 5.0™ - Tutorial para programadores iniciantes e
intermediários. Ed. do Autor, Rio de Janeiro, RJ. www.lizarosoft.hpg.com.br, 29p.
Rodrigues, W.C. 2003. Lizaro Visual Basic Dicas v3.0, biblioteca de dicas do Visual Basic,
www.lizarosoft.hpg.com.br.
Susviela, C.A.N. 1999. Visual Basic – Curso Básico. Ed. do Autor, Santana do Livramento, RS,
168p.
VBAccelerator.com (Steve McMahon). www.vbaccelerator.com, consulta em junho de 2003.

You might also like