You are on page 1of 210

1

SUMÁRIO SUMÁRIO..............................................................................................................................1 ARQUIVOS........................................................................................................................................8 Carregando um arquivo texto para um ListBox.............................................................................8 Checando se um arquivo texto está em branco..............................................................................8 Copiando Arquivos.........................................................................................................................9 Criando um arquivo texto em branco...........................................................................................10 Descobrindo e Alterando Atributos de Arquivos.........................................................................10 Excluindo Arquivos......................................................................................................................12 Função que Abre um Arquivo Texto e Retorna seu Conteúdo....................................................13 Funçãos para Manipulação de Arquivos INI................................................................................13 Gravar cada informação em uma linha nova de um arquivo........................................................16 Imprimindo Arquivos Texto pelo VB...........................................................................................16 Procurar um arquivo em diretórios e subdiretórios......................................................................16 Salvando o conteúdo de um TextBox num Arquivo Texto..........................................................17 Verificando a Data da Última Alteração de um Arquivo.............................................................18 Verificando a existencia de um arquivo.......................................................................................18 BANCO DE DADOS........................................................................................................................19 Abrindo Bancos de Dados Externos - DAO & ADO...................................................................19 DAO..........................................................................................................................................19 ADO..........................................................................................................................................19 Abrindo Relatórios do Access pelo VB........................................................................................20 Abrir Banco de Dados com Senha - DAO & ADO......................................................................20 DAO..........................................................................................................................................20 ADO..........................................................................................................................................20 Compactar Banco de Dados - DAO & ADO................................................................................21 Compactar banco de dados protegido por senha - DAO & ADO................................................23 Criando Banco de Dados com Tabelas e Índices via VB - DAO.................................................26 Filtrar Recordset já aberto - DAO................................................................................................27 Função que Cria a Clausula Where para Você.............................................................................29 Listando o Nome de Todas as Tabelas de um BD - ADO & DAO.............................................30 Passar parametro para SQL armazenada em DB - ADO.............................................................31 Procurando no Banco de Dados (Find - FindFirst - FindNext) - DAO & ADO..........................32 (DAO).......................................................................................................................................32 (ADO).......................................................................................................................................33 Reparar Banco de Dados - DAO...................................................................................................34 Salvar informações do Access para dBase - DAO.......................................................................34 Solução para a Aspa Simples (') em Strings de SQL...................................................................34 Trabalhando com Recordsets Desconectados - ADO..................................................................35 Trabalhando com Recordsets Dinâmicos - ADO.........................................................................35 Usando o IIF em Consultas SQL..................................................................................................36 Utilizando o ADO - [Básico]........................................................................................................36 A. Abertura de Banco de Dados e de Tabelas..........................................................................37 B. Manipulação de Dados.........................................................................................................38 Utilizar algum programa que compacte os DBs...........................................................................39 CÁLCULOS......................................................................................................................................43 Calcula a idade em anos entre duas datas.....................................................................................43 Calcula a Raiz Quadrada de um Número.....................................................................................43 Calculando a Diferença entre Duas Datas em Dias......................................................................43

2 Calculo de Mensalidades..............................................................................................................43 Contas corretas com ponto fluante...............................................................................................44 Dias úteis entre duas datas............................................................................................................44 Descobrindo Dias no Ano.............................................................................................................45 Descobrindo Dias no Mês.............................................................................................................45 Trabalhando com Data Juliana.....................................................................................................46 CONTROLES...................................................................................................................................47 Alterando Propriedades de Controles (não Array) em um Loop.................................................47 Alterando Propriedades de um Array de Controles em um Loop................................................47 Coordenadas do controle em relaçao a area de trabalho..............................................................48 Criando Objetos em Run Time (VB6.0).......................................................................................48 Determinando a classe de qualquer objeto...................................................................................49 Determinando se um objeto foi definido (Set).............................................................................49 Manipulando Controles num Form Usando-se o Teclado...........................................................50 Testar se um controle existe..........................................................................................................50 ToolTipText personalizado...........................................................................................................50 Verificar se um controle está com o foco.....................................................................................51 Criação de AtiveXs.......................................................................................................................52 Colocando as Tecla de Atalho para Funcionar num OCXs.....................................................52 Manipulando Propriedades do Form onde seu OCX Está.......................................................52 O Projeto está em Run ou Design Time?.................................................................................53 Pegando o hWnd do Verdadeiro Container..............................................................................53 Qual tipo de Compatibilidade devo Usar?................................................................................54 Registrando e Desregistrando ActiveX via Código VB...........................................................54 FlexGrid........................................................................................................................................56 Deixando um FlexGrid Zebrado (com 2 Cores Intercaladas)..................................................56 Exportar dados de FlexGrid para Excel....................................................................................56 Para imprimir o conteudo de um FlexGrid...............................................................................58 ComboBox....................................................................................................................................59 Abrir um ComboBox assim que receber o foco.......................................................................59 Ajustando a Largura do Drop-Down de um ComboBox.........................................................59 Descobrindo a largura atual do Drop-Down............................................................................59 Adicionando itens ao ComboBox em Run-Time.....................................................................60 Adicionando itens ao ComboBox em Design-Time................................................................61 Auto preenche o ComboBox de acordo com o texto encontrado............................................62 Preenchendo um ComboBox com os Registros de um Banco de Dados.................................63 DbGrid...........................................................................................................................................64 Auto Ajustar Colunas no DBGrid............................................................................................64 Destacando uma linha em um DBGrid.....................................................................................64 Mudar de Coluna no DBGrid com TAB..................................................................................64 Preenchendo o DBGrid via Código..........................................................................................64 DriveListBox.................................................................................................................................66 Códigos Erro do DriveListBox.................................................................................................66 Form..............................................................................................................................................67 Animando a Barra de Título de um Form................................................................................67 Arrastar um controle ou Formulário sem Título......................................................................68 Carregar Várias Instancias do Mesmo Formulário..................................................................68 Centralizar um Form MDIChild...............................................................................................68 Criando forms de formatos especiais........................................................................................68 Criando um Form Circular........................................................................................................69

3 Crinado um Form com Cantos Arredondados..........................................................................69 Criando um Form Elíptico........................................................................................................70 Criando um Form em forma de Estrela (Polígono)..................................................................71 Criando um Form em forma de Triângulo...............................................................................72 Criando um Form com forma do Logotipo do Windows.........................................................72 Criando um Form no Formato da Imagem Desejada...............................................................73 Criando uma Tela de Splash para seu Programa......................................................................75 Degradê em Forms....................................................................................................................76 Fazer um form maior que a tela................................................................................................76 Fechando todos os Forms Abertos............................................................................................77 Formulário ficar por cima de todos..........................................................................................77 Pintar um local do formulario com a cor escolhida.................................................................78 Removendo o move..................................................................................................................78 Removendo os Botões MIN-MAX de Forms MDI..................................................................78 Saber se um form está aberto....................................................................................................79 Grid................................................................................................................................................80 Digitação em Grid.....................................................................................................................80 ImageList.......................................................................................................................................81 Alterando o Conteúdo da ImageList sem Desvincula-la da ToolBar......................................81 ListBox..........................................................................................................................................82 Achar uma palavra num ListBox..............................................................................................82 Colocando ScrollBar Horizontal num ListBox........................................................................82 Desmarcar todos os itens de uma lista......................................................................................83 Movendo itens em uma ListBox...............................................................................................83 Multiplas Colunas em um ListBox...........................................................................................84 ListView........................................................................................................................................86 Ordenando Colunas da ListView..............................................................................................86 Masked Edit Box...........................................................................................................................87 Limpar o controle Masked Edit Box........................................................................................87 Menús............................................................................................................................................88 Colocando bitmaps em menus..................................................................................................88 Menus popup em caixa de Texto..............................................................................................89 Microsoft Comm Control..............................................................................................................90 Trabalhando com Microsoft Comm Control............................................................................90 PictureBox.....................................................................................................................................91 Carregando figuras em Pictures................................................................................................91 Dimensões de um bitmap..........................................................................................................91 Rolando textos em PictureBox.................................................................................................92 Salvando e Pintando em cima de figuras..................................................................................92 RichTextBox.................................................................................................................................94 Imprimindo o Conteúdo de um RichTextBox..........................................................................94 Localizando um Texto num RichTextBox...............................................................................94 Uso Geral do Controle RichTextBox.......................................................................................94 TextBox.........................................................................................................................................96 Apenas Números num TexBox.................................................................................................96 Bloqueando funções Copiar e Colar em caixas de texto..........................................................96 Forçando Caracteres Maiúsculos ou Minúsculos.....................................................................96 O Caracter ENTER...................................................................................................................97 Procurando Strings em um TextBox........................................................................................97 Selecionando Texto do TextBox ao Receber Foco..................................................................99

4 Rolar um TextBox linha a linha................................................................................................99 ToolBar........................................................................................................................................100 Deixando a ToolBar (do VB5) no Estilo Flat.........................................................................100 True DbGrid................................................................................................................................100 Como ligar o True DbGrid a um Array..................................................................................100 Deixando um True DBGrid Zebrado (com 2 Cores Intercaladas).........................................101 Detectar a Linha Selecionada num True DBGrid..................................................................101 Navegação de Linha no True DBGrid....................................................................................102 DIRETÓRIOS.................................................................................................................................103 Capturar o caminho DOS de um arquivo...................................................................................103 Criando múltiplos níveis de diretórios........................................................................................103 Como interceptar mudanças em um diretório............................................................................103 Diretório onde o Programa foi Instalado....................................................................................106 Função para Unir um Diretório a um Subdiretório....................................................................107 Pegar o Diretório de Arquivos Temporários (Windows\Temp)................................................108 Pegar o Diretório do System.......................................................................................................108 Pegar o Diretório do Windows...................................................................................................109 CDRom........................................................................................................................................111 Abrir e fechar a gaveta do CDROM.......................................................................................111 Disquetes.....................................................................................................................................111 Formatando um Disquete........................................................................................................111 Drive............................................................................................................................................112 Ler propriedades de drives, pastas e arquivos........................................................................112 Hard Disk....................................................................................................................................121 Saber o Número Serial do HD................................................................................................121 Impressoras.................................................................................................................................122 Imprimindo Direto para a Impressora....................................................................................122 Selecionando a impressora que será usada na impressão.......................................................122 Monitores....................................................................................................................................123 Obter a resolução de tela.........................................................................................................123 Resolução do Monitor.............................................................................................................123 Mouse..........................................................................................................................................123 Capturar a Posição do Mouse.................................................................................................123 USANDO AS APIs GetCursorPos E WindowFromPoint.................................................124 USANDO AS APIs SetCapture E ReleaseCapture............................................................124 Verificando se o cursor do mouse está ou não sobre o Form ...........................................124 Verificando se o cursor do mouse está ou não sobre um controle.....................................125 Como limitar a área de movimento do mouse........................................................................125 Desativamento do mouse........................................................................................................126 Inverter os botões do mouse...................................................................................................126 Mudar a Posição do Mouse via Código (sem Move-lo)........................................................127 Teclados......................................................................................................................................128 Acionar o CAPS LOCK via código........................................................................................128 Internet.............................................................................................................................................129 Acionar o navegador padrão em um URL específico................................................................129 Acionar uma conexão Dial-Up pelo VB.....................................................................................129 Capturar o nome da conexao Dial-Up........................................................................................130 Criar um link para um e-mail......................................................................................................130 Dar um Ping................................................................................................................................131 Desconectar da Internet Via Código no VB...............................................................................131

...................................140 Gravando uma Trilha do CD para um Arquivo Wave..............................................................................................................................................................................................150 Buscar data e hora do servidor..137 Criar tela de apresentação no CD-ROM..........................................153 Validações.....................End If Quando Possível..................................................................155 Validar Cartão de Crédito..........................................................................132 Exibir um arquivo direto da Internet/Intranet num TextBox..........................................147 Usando o Object Browser............................................153 Copiando Textos de Documentos do Word...................................................................................................................................HLP) pelo VB......141 Rodando um Vídeo AVI....................................................166 Valor por Extenso...........151 Mapeando uma Unidade de Rede......148 REDES...........................................................................................147 Usando o Auto Completar............................................................................................................................................................148 Use o With para Atribuir Valores à Propriedades de Objetos...............................................................................................................................................................................................................................................................................................................................................................................................................143 Programação Inteligente.................133 Transferência de arquivos via FTP.........................................................................................................................................................................156 Validar CPF..........................................................................146 Usando a Immediate Window...........................................................................................................................................................................................................134 Verificando se o Computador está Conectado à Internet...........................................................................................................................................................................................................................................146 Saber se o Objeto está Vazio................145 Faça amplo uso das constantes intrínsecas do VB.......140 Detectando se o Micro tem Placa de Som...................................142 Tocar Arquivos WAVE....................................................................................................................................................................................................................................................133 Salvando uma Página HTML...................169 ......147 Usando o DoEvents..................................................................................................................145 Instanciando Objetos Corretamente........157 Validar Datas..........................................................................................................................132 Enviar E-mail pelo VB via MAPI....................................144 Cuidado com Variáveis Tipo Variant!!!................................................................................................................................................................................152 Retornar o nome do usuário logado.............................................................................................................................................................................................................................................................................................................151 Identificando uma unidade de CD em Rede.............................................................................................................................155 Validar CGC..................................144 Executar com Compilação Completa......................................................................................................................................................................................................................................................................169 Acionar um HTML Help pelo VB.................................................................................................................135 Multimídia.............................................................................................................................................................................148 Verificando Valor da Propriedade de um Objeto Mais Rapdamente.................................144 Eliminando o If...........................................................................................................................................152 VBA....................................................................................................157 Validar E-Mail.................................................................................................................................................................................168 Variados.......................................................................................................................................................155 Função para Verificar se um Ano é Bissexto ou Não.....................137 Criando um CD Player..................................166 Verificar a Validade do PIS.......................................150 Devolve o nome do micro na rede......................................160 Validar Informações Fornecidas pelo Usuário.....................................................................141 Tocar Arquivos MIDI...............162 Validar Texto em MaskEditBox...................169 Acionar um Help (*..............................................................................................................................153 Trocar dados com o Excel....................................................................5 Discar com o modem via API..............................................

..........175 Fazer um aplicativo ser acionado silenciosamente.................................................................................................................................................................................... Nome).......................186 Função Replace para VB5........................170 Confirmando o Termino do Programa..............................................................................173 Criando uma Animação no VB.............................................186 Função Split para o VB5............................................190 Abrir a janela propriedades do sistema.175 Programa que dá "Bom dia"...........188 Windows................................................................179 Variáveis................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................175 MsgBox que não seja modal................................................................................................................................................190 Abrir arquivo com o programa que o criou...........................................................................................................................182 Busca Binária..............................6 Cancelando Processos Longos............................................................................................................177 Testar caminho da aplicação.0................................171 Convertendo Identificadores em Rótulos e Cabeçalhos..................197 Impedir que o programa apareça nos processos do windows..................................................................................................................................................182 Capturar o formato da Moeda............................................................176 Tecla ENTER Agindo como TAB...................................................181 Apresentando Corretamente Números no Formato de Moeda..............................................................................................................................................184 Fazendo Alterações em Strings com o Mid.........................................................................................................197 Impedir que o programa seja encerrado com Ctrl+Alt+Del........178 Uso racional do SendKeys........201 ..................................................................................... Desligar ou Reiniciar o Computador pelo VB.................................................................................................................. "Boa tarde" e "Boa noite" nos Horários Corretos..........198 Mudando a Resolução de vídeo................................................................................................................................................................................176 Saber se um programa foi encerrado.....................................................................................174 Dar uma Pausa em seu Programa...........................................185 Função que Inverte Nomes (Sobrenome............................................170 Como Registrar Uma HotKey............................................................................................................................................................................................................................................................191 Como associar uma extensão ao programa......194 Como Fazer Logoff....................................................188 Saber as variáveis do ambiente.............................178 Usando as Setas de Movimento Para Mudar de Controle...................................................173 Criando gráficos sem utilizar OCX nem DLL...............................................................................................185 Função para Tira Acentos de Strings............................183 Criar Arrays com Type definido pelo usuário....................197 Executar um programa DOS...........................................................................................181 Atenção na Declaração de Variáveis!!!.169 Carregando forms do VB4 no VB3.......................................................................196 Criar atalho para arquivo facilmente................182 Classificar um array em ordem alfabética.183 Facilitando a Declaração de Variáveis................................................................................................................................................................................................................................................................176 Recebendo Parâmetros Externos num Programa feito em VB........................................................................................................................................................190 Chamando Telas Específicas do Painel de Controle............................181 Arredondamento numérico........................................................................197 Limpando a Lixeira pelo VB Através de API............................................................................................................................................................................................................................190 Chamando o ScreenSaver Através de API.................................................................................................178 Use o Code Profiler para depuração........................................................................190 Capturar Tela e Salvar em Arquivo...........187 Primeiras Letras das Palavras de uma String em Maiusculo.................179 Verificar o Formato de Data Configurado no Windows....................................................198 Minimizar um Programa Para o System Tray.....................

................206 Usando a Função Environ$.................................................................................202 Ocultar/Mostrar a Barra de Tarefas do Windows.....................202 Mudar a definição de data do Windows.............................209 ...................................................................................................................................................................................................................................207 Verificando se um array foi ou não inicializado................203 Usando a Área de Transferencia.........................................................................................................................................................204 Usando a Caixa "Sobre" Padrão do Windows..7 Mudando o Papel de Parede pelo VB..................................................

Clear Do While Not EOF(iARQ) 'Enquanto ñ chegar ao fim do arq. vbExclamation. MsgBox "O arquivo não existe!"... 1) <> "\" Then sArquivo = App. sLinha As String Dim iARQ As Integer sArquivo = App.TXT" If Right$(App. vbExclamation. sLinha 'Adiciona-a no ListBox: List1. _ "ATENÇÃO!!!" 'Fecha o arquivo Close iARQ Exit Sub End If 'Limpa o ListBox: List1.Path.TXT" End If 'Verificando se o arquivo existe: If Dir$(sArquivo) = "" Then 'O arquivo NÃO existe.TXT" para o nome do arquivo que você deseja abrir e "List1" para o nome do ListBox onde as linhas serão adicionadas. MsgBox "O arquivo está em branco!".AddItem sLinha Loop 'Fecha o arquivo Close iARQ End Sub Detalhe. _ "ATENÇÃO!!!" Exit Sub End If iARQ = FreeFile Open sArquivo For Input As iARQ 'Verificando se o arquivo está em branco: If LOF(iARQ) = 0 Then 'O arquivo está em branco. 'Pega a linha atual: Line Input #iARQ.8 ARQUIVOS Carregando um arquivo texto para um ListBox Private Sub AbreArquivo() Dim sArquivo As String.Path & "MeuTexto. Checando se um arquivo texto está em branco 'Se o Arquivo ainda esta fechado use: If FileLen("NomeDoArquivo") = 0 Then Arquivo está em branco Else Arquivo tem conteúdo End If . você deverá mudar "MeuTexto.Path & "\MeuTexto.

hWnd = 0 FLOP. use a rotina API abaixo: 'Num módulo: Option Explicit Public Declare Function SHFileOperation Lib "shell32.pFrom = Origem & vbNullChar & vbNullChar 'Para copiar TODOS os arquivos. 'Sintaxe: FileCopy ArquivoOrigem. "C:\Windows\" 'Você também pode copiar este arquivo (p/ o mesmo. DiretórioDestino 'Exemplo: FileCopy "C:\Desenho. use: . Ao invés 'de copiar arquivos com o FileCopy. ou 'outro diretório) mudando o nome deste arquivo.9 'Se o Arquivo está aberto use: If LOF(ARQ) = 0 Then Arquivo está em branco Else Arquivo tem conteúdo End If Copiando Arquivos Copiando Arquivos Através de Comandos do VB: 'O comando p/ copiar arquivos é o FileCopy. "C:\Windows\Imagem.BMP".BMP" Copiando Arquivos Através de API: 'O problema do FileCopy do VB é q ele não mostra visualmente a 'operação (barra de progresso e etc) com no Explorer. Exemplo: FileCopy "C:\Desenho.wFunc = FO_COPY 'Arquivo de origem: FLOP. Destino As String) Dim RST As Long Dim FLOP As SHFILEOPSTRUCT FLOP.dll" _ Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) _ As Long Public Const FO_COPY As Long = &H2 Public Const FOF_ALLOWUNDO As Long = &H40 Public Type SHFILEOPSTRUCT hWnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Boolean hNameMappings As Long lpszProgressTitle As String End Type Public Sub CopiarArq(Origem As String.BMP".

BMP" Criando um arquivo texto em branco Dim ARQ As Integer ARQ = FreeFile 'ATENÇÃO!!! Esta próxima linha abre o arquivo 'e.fFlags = FOF_ALLOWUNDO RST = SHFileOperation(FLOP) If RST <> 0 Then 'Erro na cópia MsgBox Err.BMP". "C:\Windows\" 'Ou: CopiarArq "C:\Desenho.*" & vbNullChar & vbNullChar 'Diretório ou arquivo de destino: FLOP. vbCritical Or vbOKOnly End If End If End Sub 'P/ copiar um arquivo.pTo = Destino & vbNullChar & vbNullChar FLOP. DiretórioDestino 'Por exemplo: CopiarArq "C:\Desenho. vbCritical Or vbOKOnly Else If FLOP.LastDllError.10 'FLOP.BMP". TUDO será apagado! Open "NomeDoArquivo" For Output As ARQ 'Faz o que tiver q ser feito com o arquivo 'Fecha o arquivo Close ARQ Descobrindo e Alterando Atributos de Arquivos 'Num módulo: Public Type Attrib Archive As Boolean Hidden As Boolean ReadOnly As Boolean System As Boolean End Type Public Function MudaAtributo(ByVal sNomeArq As _ String. "C:\Windows\Imagem. execute a rotina: CopiarArq ArquivoOrigem.pFrom = "C:\*.fAnyOperationsAborted <> 0 Then MsgBox "Falha na cópia!!!". se ele contiver algo.Archive = True Then AtributoMudar = AtributoMudar + vbArchive End If If m_Attrib. ByRef m_Attrib As Attrib) As Boolean Dim AtributoMudar As Integer If m_Attrib.Hidden = True Then AtributoMudar = AtributoMudar + vbHidden End If .

" & ATR. proceda da seguinte maneira: Private Sub cmdPegar_Click() Dim ATR As Attrib If Not PegaAtributo("C:\Cezar.Print "Erro ao Pegar" Exit Sub End If MsgBox "Atrubutos do Arquivo: C:\Cezar.System = True Then AtributoMudar = AtributoMudar + vbSystem End If If Dir(sNomeArq.Hidden = AtributoReceber And vbHidden m_Attrib.BMP".System End Sub .BMP" & _ vbCrLf & "A .Archive = AtributoReceber And vbArchive m_Attrib." & ATR.Hidden & vbCrLf & _ "R ." & ATR. ATR) Then Debug.System = AtributoReceber And vbSystem PegaAtributo = True Exit Function Erro: PegaAtributo = False End Function 'P/ saber os atributos.ReadOnly = AtributoReceber And vbReadOnly m_Attrib. ByRef m_Attrib As Attrib) As Boolean Dim AtributoReceber As Integer If Dir(sNomeArq.ReadOnly = True Then AtributoMudar = AtributoMudar + vbReadOnly End If If m_Attrib. AtributoMudar On Error GoTo 0 MudaAtributo = True Exit Function Erro: MudaAtributo = False End Function Public Function PegaAtributo(ByVal sNomeArq As _ String. vbReadOnly + vbArchive + _ vbSystem + vbHidden) = "" Then PegaAtributo = False Exit Function End If On Error GoTo Erro AtributoReceber = GetAttr(sNomeArq) On Error GoTo 0 m_Attrib.ReadOnly & vbCrLf & _ "S .11 If m_Attrib.Archive & vbCrLf & _ "H . vbReadOnly + vbArchive + _ vbSystem + vbHidden) = "" Then MudaAtributo = False Exit Function End If On Error GoTo Erro SetAttr sNomeArq." & ATR.

BMP". Detalhe.System => Atributo System (Arquivo de Sistema) Excluindo Arquivos Excluindo Arquivos Através de Comandos do VB (SEM usar a Lixeira): 'O comando p/ excluir arquivos é o KILL.ReadOnly => Atributo ReadOnly (Somente p/ Leitura) ATR. Ou seja.12 Ele retornará da seguinte forma: ATR.Print "Erro ao Pegar" Exit Sub End If Call cmdPegar_Click End Sub Então.System => Atributo System (Arquivo de Sistema) 'P/ mudar os atributos.BMP" Excluindo Arquivos Através de API (USANDO a Lixeira): O comando KILL do VB apaga o arquivo SEM manda-lo p/ a Lixeira. proceda da seguinte 'maneira: Private Sub cmdMudar_Click() Dim ATR As Attrib ATR.Archive = True ATR.Hidden = False ATR..QualquerCoisa 'Exemplo: Kill "C:\Desenho. após ele mudar os atributos. ele irá confirmar (chamando a Sub anterior) e lhe mostrará o resultado (os novos valores p/ os atributos..Hidden => Atributo Hidden (Oculto) ATR.ReadOnly => Atributo ReadOnly (Somente p/ Leitura) ATR.ReadOnly = False ATR. 'Sintaxe: Kill Caminho\NomeDoArquivo. ATR) Then Debug.System = False If Not MudaAtributo("C:\Cezar.Archive => Atributo Archive (Arquivo) ATR.). O código a seguir nos ensina como deletar um arquivo enviando-o para a LIXEIRA do computador: 'Num módulo: Option Explicit Public Declare Function SHFileOperation Lib "shell32. o perdemos para sempre. os parâmetros da função MudaAtributo são: ATR.Hidden => Atributo Hidden (Oculto) ATR.Archive => Atributo Archive (Arquivo) ATR.dll" _ Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) _ As Long Public Const FO_DELETE As Long = &H3 Public Const FOF_ALLOWUNDO As Long = &H40 .

wFunc = FO_DELETE FLOP.fFlags = FOF_ALLOWUNDO 'deletando o arquivo RST = SHFileOperation(FLOP) End Sub 'P/ excluir um arquivo. execute a rotina: ExcluirArq "C:\Desenho.Text = AbreArquivo("C:\Texto. sLinha 'Quebra a linha e concatena (soma) o resultado sResult = sResult + Chr(13) & Chr(10) + sLinha Loop AbreArquivo = sResult 'Fecha o arquivo Close iARQ End Function 'P/ usar: Text1. você precise salvar certas configurações de seu programa em um arquivo INI. Digamos ainda que você tenha que salvar neste arquivo INI os seguintes parâmetros: .pFrom = FileName FLOP.TXT") Funçãos para Manipulação de Arquivos INI Digamos que.BMP" Função que Abre um Arquivo Texto e Retorna seu Conteúdo Function AbreArquivo(sArquivo As String) As String Dim iARQ As Integer Dim sLinha As String Dim sResult As String iARQ = FreeFile Open sArquivo For Input As iARQ Do While Not EOF(iARQ) 'Pega o conteúdo da linha Line Input #iARQ.13 Public Type SHFILEOPSTRUCT hWnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Boolean hNameMappings As Long lpszProgressTitle As String End Type Public Sub ExcluirArq(ByVal FileName As String) Dim FLOP As SHFILEOPSTRUCT Dim RST As Long FLOP. por exemplo.

Então. #iARQ. #iARQ. sLinha Select Case Separa_Parametro(sLinha) Case "Parâmetro1" INI_Parametro1 = Separa_Valor(sLinha) Case "Parâmetro2" INI_Parametro2 = Separa_Valor(sLinha) Case "Parâmetro3" INI_Parametro3 = Separa_Valor(sLinha) Case "Parâmetro4" INI_Parametro4 = Separa_Valor(sLinha) Case "Parâmetro5" INI_Parametro5 = Separa_Valor(sLinha) End Select Loop Close iARQ End Sub Public Sub Salvar_INI(ByVal sArquivoINI As String) Dim iARQ As Integer iARQ = FreeFile Open sArquivoINI For Output As iARQ Print Print Print Print Print Print #iARQ. #iARQ. (Lembre-se que isto é apenas um exemplo!) Muito bem. coloque as seguintes declarações e funções num módulo: Public INI_Parametro1 As Public INI_Parametro2 As Public INI_Parametro3 As Public INI_Parametro4 As Public INI_Parametro5 As Public Sub Ler_INI(ByVal Dim sLinha As String Dim iARQ As Integer String String String String String sArquivoINI As String) If Dir$(sArquivoINI) = "" Then 'O arquivo INI não existe MsgBox "O arquivo INI não existe!!!". _ "ATENÇAO!!!" Exit Sub End If iARQ = FreeFile Open sArquivoINI For Input As iARQ Do While Not EOF(iARQ) Line Input #iARQ.14 * Parâmetro1 => Posição X do Form * Parâmetro2 => Posição Y do Form * Parâmetro3 => Nome do usuário * Parâmetro4 => Senha * Parâmetro5 => Uma opção qualquer. #iARQ. vbCritical. "[Geral]" "Parâmetro1 "Parâmetro2 "Parâmetro3 "Parâmetro4 "Parâmetro5 = = = = = " " " " " & & & & & INI_Parametro1 INI_Parametro2 INI_Parametro3 INI_Parametro4 INI_Parametro5 Close iARQ End Sub . #iARQ.

15

Private Function Separa_Parametro(ByVal Texto _ As String) As String Dim i As Integer For i = 1 To Len(Texto) If Mid$(Texto, i, 1) = "=" Then Separa_Parametro = Trim(Left$(Texto, i - 1)) Exit For End If Next i End Function Private Function Separa_Valor(ByVal Texto As _ String) As String Dim i As Integer For i = 1 To Len(Texto) If Mid$(Texto, i, 1) = "=" Then Separa_Valor = Trim(Right$(Texto,Len(Texto)-i)) Exit For End If Next i End Function Lendo o Arquivo INI: P/ pegar o valor dos parâmetros gravado no arquivo INI: » Ler_INI("Caminho\NomeDoArquivo.INI") Ele * A * A * A * A * A retornará cada parâmetro em sua variável INI_Parametro1 conterá variável INI_Parametro2 conterá variável INI_Parametro3 conterá variável INI_Parametro4 conterá variável INI_Parametro5 conterá variável. Veja: o valor do Parâmetro1 o valor do Parâmetro2 o valor do Parâmetro3 o valor do Parâmetro4 o valor do Parâmetro5

Gravando no Arquivo INI: P/ gravar o valor dos parâmetros no arquivo INI, preencha as variáveis, e: » Salvar_INI("Caminho\NomeDoArquivo.INI") Ele gravará o conteúdo * Parâmetro1 = Gravará * Parâmetro2 = Gravará * Parâmetro3 = Gravará * Parâmetro4 = Gravará * Parâmetro5 = Gravará das variáveis o conteúdo da o conteúdo da o conteúdo da o conteúdo da o conteúdo da em seus respectivos parâmetros. Veja: variável INI_Parametro1 variável INI_Parametro2 variável INI_Parametro3 variável INI_Parametro4 variável INI_Parametro5

Você só deverá modificar os nomes das variáveis dos parâmetro que serão recuperado/gravado no arquivo INI conforme a sua necessidade. O nome dos parâmetros deverá ser modificado nas Subs Ler_INI (no Select Case) e Salvar_INI (no comando Print). As modificações segem esta sintaxe: * Modificações no Select Case: Case "Nome_Do_Parâmetro" * Modificações no comando Print: Print #iARQ, "Nome_Do_Parâmetro = " & INI_Nome_Do_Parâmetro O nome das variáveis deverão seguir a seguinte sintaxe:

16
INI_Nome_Do_Parâmetro ATENÇÃO!!! Caso algum parâmetro não tenha sido preenchido na hora de gravar, NADA SERÁ GRAVADO (ficará algo como "Parâmetro1 = ")!!! Caso, na hora de ler o arquivo INI, ele não encontre o valor de certo parâmetro (foi gravado algo como "Parâmetro1 = "), ele não avisará. Então, é bom verificar estas variáveis depois de preenchidas com a Sub Ler_INI.

Gravar cada informação em uma linha nova de um arquivo
'Você deverá abrir o arquivo com a instrução Open e: Print #ARQ, "O que se deseja grava" 'Depois é só fechar o arquivo: Close ARQ

Imprimindo Arquivos Texto pelo VB
O modo mais fácil de se imprimir um arquivo texto é este: 'Num módulo: Public Function ImprimeArq(ByVal sArq As String) As _ Boolean Dim lArq As Long Dim sTexto As String If Dir$(sArq) = "" Then 'O arquivo não existe ImprimeArq = False Exit Function End If iArq = FreeFile() Open sArq For Binary Access Read As iArq sTexto = Space$(LOF(iArq)) Get #iArq, , sTexto Close iArq Printer.Print sTexto Printer.EndDoc ImprimeArq = True End Function 'Aí, chame-a assim: Dim bRet As Boolean bRet = ImprimeArq("C:\Caminho\Do\Arq\NomeDoArq.TXT")

Procurar um arquivo em diretórios e subdiretórios
Private NumFiles%, FilesNames$() Private FilesDates() As Date, FilesSizes&() Sub ScanPath(ByVal Path$, ByVal Files$) Dim i%, DirCount%, Buf$, DirName$, Dim FileName$, SubDir$() Const ATTR_DIRECTORY = 16 On Error Resume Next 'Le os arquivos locais FileName$ = Dir(Path$ + Files$) Do While FileName$ <> "" 'Esta inferior ou igual a data solicitada

17
NumFiles% = NumFiles% + 1 ReDim Preserve FilesNames$(NumFiles%), _ FilesDates(NumFiles%), FilesSizes&(NumFiles%) FilesNames$(NumFiles% - 1) = LCase(Path$ + _ FileName$) FilesDates(NumFiles% - 1) = FileDateTime(Path$ + _ "\" + FileName$) FilesSizes&(NumFiles% - 1) = FileLen(Path$ + _ "\" + FileName$) FileName$ = Dir Loop 'Identifica os subdiretorios DirName$ = Dir(Path$ + "*.*", ATTR_DIRECTORY) DirCount% = 0 Do While DirName$ <> "" 'Ignora "." e ".." If DirName$ <> "." And DirName$ <> ".." Then 'E diretorio??? If (GetAttr(Path$ + DirName$) And _ ATTR_DIRECTORY) = ATTR_DIRECTORY Then 'Sim, adiciona DirCount% = DirCount% + 1 ReDim Preserve SubDir$(DirCount%) SubDir$(DirCount% - 1) = DirName$ End If End If DirName$ = Dir Loop For i% = 0 To DirCount% - 1 'Faz uma recursividade, varrendo subdiretorios 'deste diretorio Call ScanPath(Path$ + SubDir$(i%) + "\", Files$) Next End Sub

Salvando o conteúdo de um TextBox num Arquivo Texto
Public Sub SalvaArq(ByVal sArquivo As String, _ ByVal sTexto As String) Dim iARQ As Integer, iRet As Integer iARQ = FreeFile If Dir$(sArquivo) <> "" Then iRet = MsgBox("O arquivo já existe. Você " & _ "deseja sobrescreve-lo?", vbQuestion + _ vbYesNo, "ATENÇÃO!!!") If iRet = vbNo Then Exit Sub End If End If Open sArquivo For Output As iARQ Print #iARQ, sTexto Close iARQ End Sub 'P/ usar, chame-a passando o nome do arquivo e 'o texto. Veja: SalvaArq "C:\Texto.TXT", Text1.Text

18

Verificando a Data da Última Alteração de um Arquivo
'Num módulo: Public Function DataArq(ByVal sArq As _ String) As String If Dir$(sArq) <> "" Then DataArq = FileDateTime(sArq) Else DataArq = "ERRO" End If End Function 'P/ chamar, no evento que você quizer: Private Sub Command1_Click() Dim sVar As String sVar = DataArq("C:\Quadrado 02.BMP") If sVar <> "ERRO" Then Text1.Text = sVar End If End Sub

Verificando a existencia de um arquivo
If Dir$("X:\XXXX\XXXXX.XXX") <> "" Then 'O arquivo existe Else 'O arquivo não existe End If

Paradox 5.Path & "\Plan. DATABASE=database.Jet. Veja este exemplo: DAO Sub DAOAbrirBDExterno() Dim DB As DAO.OLEDB. PWD=password.Path & _ "\Plan. UID=user. dBase 5.0. ODBC . "Excel 5. DSN=datasourcename. HTML Import.XLS. Base de Dados dBase III dBase IV dBase 5 Paradox 5. como um arquivo do Excel (por exemplo). Excel 8." & _ "Data Source=" & App.0.0. Excel 97. False.OpenDatabase(App. Text. os principais tipos de chaves de conexão usadas. HTML Export.0." & _ "Extended " & "Properties=Excel 5. dBase IV. Excel 5.Open "Provider=Microsoft." CNN. use uma chave de conexão com a base de dados externa.0/Excel 95 Excel 97 Excel2000 HTML Import HTML Export Text Chave de Conexão (String) dBase III.XLS".0.Close End Sub Veja nesta tabela. False.4.x.Close End Sub ADO Sub ADOAbrirBDExterno() Dim CNN As New ADODB.Connection CNN.0. ODBC.x Excel 5.DAO & ADO Caso você venha a ter a necessidade de abrir uma base de dados externa.Database Set DB = DBEngine.") DB.19 BANCO DE DADOS Abrindo Bancos de Dados Externos .

" & _ "Data Source=" & App." CNN.Close End Sub .MDB" If Right$(App. _ False. pois este código "abre" o Access.Jet " & _ "OLEDB:Database Password=senha. 'No evento desejado: Dim sCaminho As String Dim objAccess As Access.os parâmetros exclusive e 'read-only (2o e 3o parâmetros) devem ser falsos. acViewNormal End With Set objAccess = Nothing ATENÇÃO!!! Para funcionar.Visible = False 'O Access firará invisível .Application 'Caminho do arquivo de banco de dados sCaminho = App.Path & "\SeuBD.0. mostrando o relatório (o Access em si fica invisível).Path &"\SeuBD. ".Path.Open "Provider=Microsoft.Application 'Cria uma instância do Access Set objAccess = New Access.OLEDB.DoCmd.OpenReport "Relatório".MDB" End If With objAccess .MDB. False.OpenCurrentDatabase filepath:=sCaminho .Path & "Banco.pwd=senha") DB.4o parâmetro) é case 'sensitive (diferencia A de a) e .Path & "\Banco.4. abra-o desta maneira: DAO Sub DAOAbrirBDProtegido() Dim DB As DAO.OpenDatabase(App. é necessário fazer uma referência à biblioteca de automação do Access. Set DB DBEngine. em Project/References.1) = "\" Then sCaminho = App.Close End Sub ADO Sub ADOAbrirBDProtegido() Dim CNN As New ADODB.Connection CNN.DAO & ADO Caso você tenha definido uma senha para seu banco de dados.Database 'O parâmetro pwd (q é a senha .Jet.ao contrário do que 'diz a documentação do VB .MDB". a máquina onde você for instalar seu programa DEVE ter o Access instalado.20 Abrindo Relatórios do Access pelo VB Para usar este código. Abrir Banco de Dados com Senha .

. Se houver. Alternativa para a ultima linha acima>>> Name S_DbTemp As S_DbNome 'Se chegamos até aqui.Path & "AdmTmp.Path.. a linha aqui em cima não existiria. Compactar Banco de Dados . If Dir$(S_DbNome) <> "" Then 'deleta Call Kill(S_DbNome) End If 'Aqui.mdb" If Right$(App.. If Dir$(S_DbTemp) <> "" Then 'Se existe. Certifique-se que não ha arquivo igual ao nome do arquivo temporário. S_DbTemp 'Se Arquivo Original existir. pois se estiver aberto por algum usuário vai dar zebra.. vc poderia usar a instrução 'Name (vide *Name lá em baixo) DBEngine. MsgBox "Compactação do Banco de Dados " & _ S_DbNome & " executada com sucesso.CompactDatabase S_DbNome. _ .Path & "Armarinho. 'Se algo der errado. vamos para a linha 'indicada.mdb" S_DbTemp = App. 1) = "\" Then S_DbNome = App. delete. sua sintaxe seria como 'a linha aqui em baixo. S_DbNome Se na linha acima preferir usar a instrução Name.Path & "\Armarinho. Quer dizer.CompactDatabase S_DbTemp.21 Onde "senha" é a sua senha.DAO & ADO Antes de começar: Certifique-se que o banco de dados está fechado. S_DbTemp As String 'Descobrimos o caminho do Arquivo Original 'e do Arquivo Temp S_DbNome = App... On Error Goto ErroCompactar 'Declaramos as variáveis Dim S_DbNome As String.Path & "\AdmTmp. Então vamos lá: 'Usando DAO: Private Sub DAO_CompactarDB() 'Iniciamos o tratamento de erros. subistitua "senha" pela senha do banco de dados. avisa ao usuário que 'tudo correu bem. deletamos (vide *Kill lá em baixo) Call Kill(S_DbTemp) End If 'Compactamos o banco de dados com o 'nome de Arquivo Temp DBEngine.mdb" S_DbTemp = App.".mdb" End If 'Descobrimos se o Arquivo Temp existe. portanto.

" 'Este "Engine Type" no final indica a versão do Access que está 'sendo usada.0.." . Err. MsgBox "Houve um erro inesperado ao compactar o " & _ S_DbNome & " .1 Library" e: Private Sub ADO_CompactarDB() 'Iniciamos o tratamento de erros.".Jet..mdb" If Right$(App. Não é obrigatório mais é de bom 'costume fazer. Avise ao usuário. vc poderia usar a instrução . If Dir$(S_DbTemp) <> "" Then 'Se existe.4." & _ "Data Source=" & S_DbNome & ".Path & "\Armarinho.Path & "\AdmTmp.Jet. _ "Provider=Microsoft.JetEngine Dim S_DbNome As String. vamos para a linha indicada.OLEDB.Path & "Armarinho. 'Se algo der errado." & _ "Data Source=" & S_DbTemp & ".OLEDB.0." & _ "OLEDB:Engine Type = 4. Veja os valores e as versões correspondentes: '5 (Defaut) para Access 2000 '4 para Access 97 '3 para Access 95/6 '2 para Access 2 '1 para Access 1 'Se Arquivo Original existir.Path & "AdmTmp.mdb" S_DbTemp = App.Clear End Sub 'Usando ADO: 'Marque nas referências "Microsoft Jet and Replication 'Objects 2. vbOKOnly + vbInformation. _ "Compactação" 'Limpa o erro. deletamos (vide *Kill lá em baixo) Call Kill(S_DbTemp) End If 'Compactamos o banco de dados com o 'nome de Arquivo Temp JR.4. 1) = "\" Then S_DbNome = App. é porque houve erro.Jet.CompactDatabase "Provider=Microsoft. On Error Goto ErroCompactar 'Declaramos as variáveis Dim JR As New JRO. "Compactação" Exit Sub ErroCompactar: 'Se caiu aqui. If Dir$(S_DbNome) <> "" Then 'deleta Call Kill(S_DbNome) End If 'Aqui. S_DbTemp As String 'Descobrimos o caminho do Arquivo Original 'e do Arquivo Temp S_DbNome = App.22 vbOKOnly + vbInformation.Path..mdb" S_DbTemp = App..mdb" End If 'Descobrimos se o Arquivo Temp existe.

_ vbOKOnly + vbInformation. Para usa-la. No lugar do segundo CompactDatabase. Err. vc poderia usar a instrução Name.OLEDB. delete.CompactDatabase "Provider=Microsoft. Avise ao usuário. vbOKOnly + vbInformation. vc deve descobrir o nome e caminho do DB e sua respectiva 'senha'. Antes de começar: Certifique-se que o banco de dados está fechado. Para isto.OLEDB." & _ "Data Source=" & S_DbNome & ". _ "Provider=Microsoft.4.23 'Name (vide *Name lá em baixo) JR. caso contrário dará erro. mais os dois modos funcionam.DAO & ADO Problema: Neste exemplo. Cuidado: como na instrução CompactDatabase. Não é obrigatório mais é de bom 'costume fazer." . Então vamos lá: 'Usando DAO: Private Sub DAO_CompactarDB() 'Iniciamos o tratamento de erros." & _ "OLEDB:Engine Type = 4. _ "Compactação" 'Limpa o erro.4.". Se houver.. MsgBox "Houve um erro inesperado ao compactar o " & _ S_DbNome & " . Certifique-se que não ha arquivo igual ao nome do arquivo temporário. copia um arquivo para outro local com 'outro nome'. MsgBox "Compactação do Banco de Dados " & _ S_DbNome & " executada com sucesso. Este arquivo deletado NÃO será armazenado na lixeira.Jet. na instrução Name o arquivo que será copiado tem que existir. chama a instrução CompactDatabase com o nome temporario. Compactar banco de dados protegido por senha . "Compactação" Set JR = Nothing Exit Sub ErroCompactar: 'Se caiu aqui. mais deve ser usada com cuidado. avisa ao usuário que 'tudo correu bem. . vc tem um banco de dados que quer compactar e este banco de dados é protegido por senha Solução: Ao usar a instrução "CompactDatabase". Então.Jet. vc fornece um nome temporário para o DB. é porque houve erro.Clear End Sub Kill >>> Esta expressão DELETA o arquivo especificado do HD. vc exclui os espaços vazios. Eu coloquei assim como ilustração.".0.Jet. vc deve se certificar que o arquivo realmente exista. o nome original e a senha (vide *Senha lá em baixo) e depois vc renomeia para o nome original. Isto é só uma questão de escolha.0." 'Se chegamos até aqui. pois se estiver aberto por algum usuário vai dar zebra." & _ "Data Source=" & S_DbTemp & ". Name >>> A instrução Name..

Clear End Sub 'Usando ADO: 'Marque nas referências "Microsoft Jet . a linha aqui em cima não existiria. deletamos (vide *Kill lá em baixo) Call Kill(S_DbTemp) End If 'Compactamos o banco de dados com o 'nome de Arquivo Temp DBEngine.Path & "\Armarinho.24 'Se algo der errado. ".". On Error Goto ErroCompactar 'Declaramos as variáveis Dim S_DbNome As String. Err.Path & "Armarinho.. avisa ao usuário que 'tudo correu bem. ".mdb" S_DbTemp = App. portanto. é porque houve erro. MsgBox "Compactação do Banco de Dados " & _ S_DbNome & " executada com sucesso. 1) = "\" Then S_DbNome = App.." . Avise ao usuário. S_DbTemp.. _ vbOKOnly + vbInformation. S_DbTemp As String 'Descobrimos o caminho do Arquivo Original 'e do Arquivo Temp S_DbNome = App.mdb" End If 'Descobrimos se o Arquivo Temp existe. vbOKOnly + vbInformation. vamos para a linha indicada. "Compactação" Exit Sub ErroCompactar: 'Se caiu aqui. _ .PWD=rosakom" Se na linha acima preferir usar a instrução Name. If Dir$(S_DbNome) <> "" Then 'deleta Call Kill(S_DbNome) End If 'Aqui.Path & "\AdmTmp. MsgBox "Houve um erro inesperado ao compactar o " & _ S_DbNome & " . vc poderia usar a instrução 'Name (vide *Name lá em baixo) DBEngine. Alternativa para a ultima linha acima>>> Name S_DbTemp As S_DbNome 'Se chegamos até aqui.Path.Path & "AdmTmp. _ .PWD=rosakom" 'Se Arquivo Original existir..mdb" If Right$(App. .CompactDatabase S_DbTemp.CompactDatabase S_DbNome. If Dir$(S_DbTemp) <> "" Then 'Se existe.mdb" S_DbTemp = App.. .. sua sintaxe seria como 'a linha aqui em baixo. _ "Compactação" 'Limpa o erro. S_DbNome. Não é obrigatório mais é de bom 'costume fazer.

".Jet.OLEDB:Engine Type = 4." 'Se chegamos até aqui.OLEDB.OLEDB.4" & _ ".JetEngine Dim S_DbNome As String. "Compactação" . _ "Provider=Microsoft. If Dir$(S_DbTemp) <> "" Then 'Se existe.0.Jet.mdb" End If 'Descobrimos se o Arquivo Temp existe." & _ "Data Source=" & S_DbTemp & "..mdb" If Right$(App.25 'and Replication Objects 2. _ "Provider=Microsoft. Veja os valores e as versões correspondentes: '5 (Defaut) para Access 2000 '4 para Access 97 '3 para Access 95/6 '2 para Access 2 '1 para Access 1 'Se Arquivo Original existir." & _ "Jet.0.". 1) = "\" Then S_DbNome = App. On Error Goto ErroCompactar 'Declaramos as variáveis Dim JR As New JRO.OLEDB.Path & "Armarinho.Path & "\Armarinho.Path..0. 'Se algo der errado.. vamos para a linha indicada." & _ "Data Source=" & S_DbNome & ".CompactDatabase "Provider=Microsoft.0. MsgBox "Compactação do Banco de Dados " & _ S_DbNome & " executada com sucesso.OLEDB.".OLEDB:Engine Type = 4.. _ vbOKOnly + vbInformation. deletamos (vide *Kill lá em baixo) Call Kill(S_DbTemp) End If 'Compactamos o banco de dados com o 'nome de Arquivo Temp JR. S_DbTemp As String 'Descobrimos o caminho do Arquivo Original 'e do Arquivo Temp S_DbNome = App.4." & _ "Jet OLEDB:Database Password=rosakom." & _ "Jet. vc poderia usar a instrução 'Name (vide *Name lá em baixo) JR.1 Library" e: Private Sub ADO_CompactarDB() 'Iniciamos o tratamento de erros. avisa ao usuário que 'tudo correu bem.CompactDatabase "Provider=Microsoft.Jet." 'Este "Engine Type" no final indica a versão do Access que está 'sendo usada. If Dir$(S_DbNome) <> "" Then 'deleta Call Kill(S_DbNome) End If 'Aqui." & _ "Jet OLEDB:Database Password=rosakom.Path & "AdmTmp.Data Source=" & S_DbNome & ".mdb" S_DbTemp = App.mdb" S_DbTemp = App.4" & _ ".Data Source=" & S_DbTemp & ".Path & "\AdmTmp...4.Jet.

Veja o código a seguir: Dim WRK As Workspace Dim DB As Database Dim TB As New TableDef Dim Campo1 As New Field Dim Campo2 As New Field Dim Campo3 As New Field Set WRK = DBEngine. na instrução Name o arquivo que será copiado tem que existir. No lugar do segundo CompactDatabase. mais deve ser usada com cuidado. expecificando o valor de certas propriedades.CreateDatabaseE("Banco. Para usa-la. MsgBox "Houve um erro inesperado ao compactar o " & _ S_DbNome & " . é porque houve erro. caso contrário dará erro. Nome e DataNasc. _ dbLangGeneral) 'Feche o banco de dados e o Workspace: DB. vc poderia usar a instrução Name. Não é obrigatório mais é de bom 'costume fazer. criaremos uma tabela contendo 3 campos: Código. vbOKOnly + vbInformation. Neste exemplo. onde está rosakom deve ser substituída por sua senha. Criando Banco de Dados com Tabelas e Índices via VB . Cuidado: como na instrução CompactDatabase. Name >>> A instrução Name. mais os dois modos funcionam.OpenDatabase("Banco.Para se criar uma tabela você terá que criar seus campos. vc deve se certificar que o arquivo realmente exista. Este arquivo deletado NÃO será armazenado na lixeira.Clear End Sub Senha >>> No exemplo usamos uma senha qualquer. Isto é só uma questão de escolha.A criação de um banco de dados via código é bastante simples: Dim WRK As Workspace Dim DB As Database Set WRK = DBEngine. Eu coloquei assim como ilustração.Workspaces(0) 'Cria o banco de dados: Set DB = WRK.DAO 1º . Kill >>> Esta expressão DELETA o arquivo especificado do HD.Workspaces(0) 'Abre o banco de dados: Set DB = WRK.Close WRK." . Err.26 Set JR = Nothing Exit Sub ErroCompactar: 'Se caiu aqui. Então.Name = "Tabela" . _ "Compactação" 'Limpa o erro. Avise ao usuário.MDB".Close set DB = Nothing set WRK = Nothing 2º .MDB") 'Atribui nome e utras propriedades à tabela 'e aos campos: TB. copia um arquivo para outro local com 'outro nome'.

Close Set TB = Nothing set DB = Nothing set WRK = Nothing Filtrar Recordset já aberto .Name = "Código" Campo1.Fields. eles requerem menos código para realizar estas buscas.Fields = "Código" Index1.MDB") Set TB = DB.Close DB.Close WRK.Append Index1 TB.Append Campo2 TB.Criando Índices: Os índices são muito úteis em rotinas de procura de dados em tabelas.Type = dbInteger Campo2.Type = dbDate 'Cria os campos na tabela TB.27 Campo1. pois.Append Campo3 'Cria a tabela: DB.OpenDatabase("Banco.Name = "Nom" Index2.Type = dbText Campo2. a tabela e o Workspace: TB.Primary = False 'Cria os indices na tabela: TB.Append Campo1 TB. Veja como criar um índice em um campo de uma tabela já existente: Dim WRK As Workspace Dim DB as Database Dim TB as Table Dim Index1 as New Index Dim Index2 as New Index Set WRK = DBEngine.Indexes.Size = 60 Campo3.Unique = False Index2.Fields.TableDefs.Fields = "Nome" Index2.Primary = True Index1.Append TB 'Feche o banco de dados.DAO Já tentou usar o método FILTER? Ex: .Append Index2 'Feche o banco de dados. além de serem mais rápidos. a tabela e o Workspace: TB.Fields.Indexes.Close WRK.Name = "Nome" Campo2.Close DB.Unique = True Index1.Name = "Cód" Index1.OpenTable("Tabela") 'Atribui nome e utras propriedades aos 'índices: Index1.Workspaces(0) 'Abre o banco de dados e a tabela: set DB = WRK.Name = "DataNasc" Campo3.Close Set TB = Nothing set DB = Nothing set WRK = Nothing 3º .

strMessage = "Pedidos no conjunto de registros " & _ "original: " & vbCr & intPedidos & vbCr & _ "Pedidos no conjunto de registros " & _ "filtrado (País = '" & strPaís & "'): " & _ vbCr & . Observação: Quando você conhece os dados que deseja selecionar.MoveLast intPedidos = rstPedidos. em seguida. strField As _ String.RecordCount MsgBox strMessage .Close End Sub Function FilterField(rstTemp As Recordset.OpenRecordset("Pedidos".Close End With End If rstPedidos. _ "PaísDeDestino". você deve definir sua propriedade Filter e.RecordCount 'Obtém a entrada do usuário. strPaís = Trim(InputBox("Digite um " & _ "país para filtrar em:")) If strPaís <> "" Then 'Abre um objeto Recordset filtrado. 'caso contrário. strFilter As String) As Recordset 'Define um filtro no objeto Recordset especificado e em 'seguida abre um novo objeto Recordset. um erro pode ser gerado.OpenRecordset End Function Observação Para ver os efeitos de filtrar rstPedidos. rstTemp.Filter = strField & " = '" & strFilter & "'" Set FilterField = rstTemp.28 Sub FilterX() Dim dbsNorthwind As Database Dim rstPedidos As Recordset Dim intPedidos As Integer Dim strPaís As String Dim rstPedidosPaís As Recordset Dim strMessage As String Set dbsNorthwind = OpenDatabase("Northwind. Este exemplo mostra como você pode criar apenas um Recordset e obter os registros de um país específico. abrir um segundo objeto Recordset baseado em rstPedidos. _ dbOpenSnapshot) 'Preenche o Recordset. If . Set rstPedidosPaís = FilterField(rstPedidos. rstPedidos.mdb") Set rstPedidos = dbsNorthwind. strPaís) With rstPedidosPaís 'Verifica RecordCount antes de preencher o Recordset.MoveLast 'Imprime o número de registros do objeto Recordset 'original e do objeto Recordset filtrado.Close dbsNorthwind. em geral é mais eficiente criar um Recordset com uma instrução SQL. .RecordCount <> 0 Then .

"\#yyyy/mm/dd hh:nn:ss\#") End If Case vbBoolean If SQL = vbNullStrin Then SQL = " Where " & sFldCriteria & _ CStr(Value) . Set rstPedidos = dbsNorthwind.29 Sub FilterX2() Dim dbsNorthwind As Database Dim rstPedidos As Recordset Set dbsNorthwind = OpenDatabase("Northwind.OpenRecordset("SELECT * " & _ "FROM Pedidos WHERE PaísDeDestino = " & _ "'USA'".Close dbsNorthwind. vbLong If SQL = vbNullStrin Then SQL = " Where " & sFldCriteria & _ Str(Value) Else SQL = SQL & " AND " & sFldCriteria & _ Str(Value) End If Case vbDate If SQL = vbNullStrin Then SQL = " Where " & sFldCriteria & _ Format$(Value. vbInteger. Optional ByVal _ sAMais As String) Select Case VarType(Value) Case vbString If Value <> vbNullString Then If sAMais <> vbNullString Then Value = Left(sAMais. coloque a função Plic e esta 'seguinte: Public Sub CreateSQL(ByRef SQL As String. vbDecimal. vbByte. "\#yyyy/mm/dd hh:nn:ss\#") Else SQL = SQL & " AND " & sFldCriteria & _ Format$(Value. dbOpenSnapshot) rstPedidos.mdb") 'Abre um objeto Recordset que seleciona registros de 'uma tabela baseada no país da remessa. _ ByVal sFldCriteria As String. 1) Value = Trim$(Value) End If If SQL = vbNullStrin Then SQL = " Where " & sFldCriteria & _ Plic(Value) Else SQL = SQL & " AND " & sFldCriteria & _ Plic(Value) End If End If Case vbCurrency. ByVal _ Value As Variant.Close End Function Função que Cria a Clausula Where para Você 'Num módulo. 1) & Value & _ Right(sAMais. _ vbDouble. vbSingle.

Jet. rs. a função testa se tem algo e monta a clausula Where direitinho.1 Debug.Attributes And _ dbSystemObject) <> dbSystemObject Then Print DB...Item(i).. o nome de TODAS as tabelas do banco de dados estará na janela Immediate Windows.MDB..Text'" Se você precisar usar o comando Like. Neste caso.Text' And Campo2 > 'Conteúdo de Text2.0.. "Campo1 = "..TableDefs(i). sMySQL conterá o seguinte: " Where Campo1 = 'Conteúdo de Text1." For i = 0 To ADOXCat.Text CreateSQL sMySQL.4..Name Next i Depois desta rotina ter sido executada.Print ADOXCat. *** Usando DAO *** 'No evento que você desejar: Dim DB As DAO. "%%" Ele retornará: " Where Campo1 Like '%Conteúdo de Text1." & _ "OLEDB.Count .Data Source=" & _ "C:\Banco.TableDefs(i).. use assim: sMySQL = vbNullString CreateSQL sMySQL.Text . Text2..Open "SELECT * FROM Tabela" & sMySQL. Listando o Nome de Todas as Tabelas de um BD .Text. Text1. "Campo1 Like ".30 Else SQL = SQL & " AND " & sFldCriteria & _ CStr(Value) End If End Select End Sub 'Exempos de uso: Dim sMySQL as String sMySQL = vbNullString CreateSQL sMySQL. . .MDB") For i = 0 To DB. Text1. cnn.ADO & DAO *** Usando ADO *** 'No evento que você desejar: Dim ADOXCat As New ADOX.OpenDatabese("C:\Banco.Count .Name End If .Tables. quando o programa chegar na linha rs.ActiveConnection = "PROVIDER=Microsoft..Catalog ADOXCat.Text%' Vantagens: não precisa ficar fazendo testes a cada montagem do SQL.TableDefs.1 If (DB.Database Dim i As Integer Set DB = Workspaces(0).Tables. "Campo2 > "..Open..

Value & ".0." 'Open the catalog cat.Jet.Close 'Apesar da documentação não fazê-lo.ActiveConnection = cnn 'Get the Command object from the Procedure Set cmd = cat.Data Source=C:\nwind. *EU acrescento*. '(chato 8^)) né?) Set rst = Nothing cmd.Command 'Specify the parameter values cmd.".Parameters("Forms!Sales by Year Dialog!" & _ "EndingDate")=#8/31/1993# 'Open the recordset rst.Open cmd..Print fld.Close Set cmd = Nothing 'cat.Print rst.Catalog Dim cmd As ADODB..Open "Provider=Microsoft.Fields Debug. adCmdStoredProc 'Display the records in the debug window While Not rst. .Recordset Dim fld As ADODB.Close Set cnn = Nothing 'Fim do *EU Acrescento* End Sub . adOpenForwardOnly.Close '<< Não achei no Doc.Close Set cat = Nothing '<< Só ACHEI Nothing cnn. referência ao .Connection Dim cat As New ADOX.OLEDB.Procedures("Sales by Year").31 Next Passar parametro para SQL armazenada em DB .mdb. Next Debug. adLockReadOnly.Field 'Open the connection cnn.EOF For Each fld In rst.Parameters("Forms!Sales by Year Dialog!" & _ "BeginningDate")=#8/1/1993# cmd.ADO Sub ADOExecuteParamQuery() Dim cnn As New ADODB.4.Command Dim rst As New ADODB.MoveNext Wend 'Close the recordset rst.

se algum registro tiver sido encontrado. usando o comando FindNext: RS. que o FindLast faz a procura SEMPRE a partir do fim da tabela e os outros dois (FindNext e FindPrevious) fazem a procura SEMPRE a partir do ponto da tabela em que estão.DAO & ADO (DAO) No DAO.FindNext 'Ou: RS. você poderá pesquizar a próxima ocorrencia (próximo registro que contenha aquele valor procurado no campo que se está sendo feita a pesquiza). exite o comando FindFirst que faz a procura a partir do início da tabela.NoMatch then 'Nenhum registro foi encontrado. "Localizar Nome") 'P/ procurar EXATAMENTE o que foi digitado: RS. digite o Nome do " &_ "Cliente:". Else 'Foi encontrado um registro. achando a primeira ocorrencia daquilo a que está sendo procurado. FindLast.NoMatch then 'Nenhum registro foi encontrado. é que o FindFirst faz a procura SEMPRE a partir do início da tabela.32 Procurando no Banco de Dados (Find .FindFirst "NomeCliente like '" & sArg & "*'" 'P/ procurar algum nome que TERMINE com o que 'foi digitado: RS. Endif Bom.FindNext "NomeCliente = '" & sArg & "'" "NomeCliente like '" & sArg & "*'" "NomeCliente like '*" & sArg & "'" "NomeCliente like '*" & sArg & "*'" If RS. a única coisa que você precisa saber para usar os comandos FindFirst. . FindNext e FindPrevious.FindFirst "NomeCliente = '" & sArg & "'" 'P/ procurar algum nome que COMECE com o que 'foi digitado: RS.FindFirst "NomeCliente like '*" & sArg & "'" 'P/ procurar algum nome que tenha o que foi 'digitado em qualquer parte (inicio/meio/fim): RS.FindNext 'Ou: RS.FindNext) . Else 'Foi encontrado um registro. 'Abre o Recordset e então: Dim sArg as String sArg = InputBox ("Por favor.FindFirst .FindFirst "NomeCliente like '*" & sArg & "*'" If RS.FindNext 'Ou: RS. Endif Bem.

Find "[Campo] = [Valor]". "achar a próxima ocorrencia" e etc na minha tabela. [Tipo] Partes da sintaxe: [Campo] => Campo do banco de dados. .Find "NomeCliente = '" & sArg & "'".33 (ADO) No ADO não existe os comandos FindFirst. [Valor] => Aquilo que se está procurando. sendo que eu só tenho o comando Find??? Bem. Depende do tipo de procura que está sendo feita. pois ele não trabalha desta forma. execute o MoveLast antes do Find) FindNext 1 adScarchForward FindPrevious 1 adScarchBackward Veja um exemplo de FindFirst no ADO usando o comando Find: 'Abre o Recordset e então: Dim sArg as String RS. adSearchForward If RS. digite o Nome do " &_ "Cliente:".MoveFirst '<<<. adSearchForward 'P/ procurar algum nome que TERMINE com o que 'foi digitado: RS. adSearchForward 'P/ procurar algum nome que tenha o que foi 'digitado em qualquer parte (inicio/meio/fim): RS. [Tipo] => Constante que indica como a procura deverá ser feita. mas existe o comando Find. FindFirst 0 execute o MoveFirst antes do Find) adScarchBackward (se não estiver posicionado no último FindLast 0 registro. "Localizar Nome") 'P/ procurar EXATAMENTE o que foi digitado: RS.Find "NomeCliente like '*" & sArg & "'". Veja esta tabela para saber o que colocar em [SkipRows] e em [Tipo] conforme a sua procura: Método DAO ADO-SkipRows ADO . FindNext e FindPrevious. Usando este comando (Find) você não poderá usar o RS. FindLast. [SkipRows].Find "NomeCliente like '" & sArg & "*'".Search direction adScarchForward (se não estiver posicionado no primeiro registro. veja a sintaxe que você irá entender: RS.Find "NomeCliente like '*" & sArg & "*'".MUITO importante!!! sArg = InputBox ("Por favor.NoMatch. adSearchForward 'P/ procurar algum nome que COMECE com o que 'foi digitado: RS.EOF Then 'Nenhum registro foi encontrado. Mas como eu posso fazer procuras do tipo "achar a primeira ocorrencia". O nome deve ser IDENTICO ao que está no banco de dados. [SkipRows] => Valor entre 0 e 1.

1. adScarchBackward 'FindNext: RS. por exemplo: Text1.Find "NomeCliente like '" & sArg & "'". veja: 'FindLast: RS. _ "DB não Reparado!" End If Salvar informações do Access para dBase . Endif Bem. "Reparar DB?") If PERG = vbYes Then DBEngine.Text) 'No caso.DAO DB. Chr(39) & Chr(39)) & _ Chr(39) Else Plic = Chr(39) & sTexto & Chr(39) End If End Function 'P/ usar.mdb" MsgBox "Operação realizada com sucesso!". _ vbQuestion + vbYesNo. 1. seguindo essa filosofia.DAO 'Reparar banco de dados Dim PERG PERG = MsgBox("Deseja reparar o banco de dados agora?".34 Else 'Foi encontrado um registro. Chr(39)) Then Plic = Chr(39) & Replace(sTexto. se for p/ passar p/ uma string SQL.' SELECT * FROM Tabela" Solução para a Aspa Simples (') em Strings de SQL Public Function Plic(ByVal sTexto As String) As _ String If InStr(sTexto.Find "NomeCliente like '" & sArg & "'". _ "DB Reparado!" Else MsgBox "Operação cancelada".Text = Plic(Text1. veja: Dim MySQL As String MySQL = "Select * From Clientes Where Nome = " & _ .Find "NomeCliente like '" & sArg & "'".EXECUTE "INSERT INTO Tabela IN 'C:\TEMP' 'dBase III. adSearchForward 'FindPrevious: RS. _ Chr(39). adScarchBackward Reparar Banco de Dados . vbInformation.RepairDatabase "C:\agenda. vbInformation.

0 (ou mais antigo). proceda da seguinte forma: 'Sete o CursorLocation do Recordset como adUseClient: RS.ADO Digamos que em um programa qualquer você precise usar um recordset para guardar dados em memória. Para isso.) ATENÇÃO!!! Se você estiver usando o VB5. Enquanto a venda não é salva.. a qual guarda também o código da venda.Open etc etc etc. AdLockBatchOptimistic 'Desconecta o Recordset: Set RS. ou seja.. Dados que não serão salvos num banco de dados.CursorLocation = adUseClient 'Abra o Recordset com AdLockBatchOptimistic: RS.Recordset No evento Form_Load: Private Sub Form_Load() Set RS = New ADODB.Append "Campo2". programação direcionada a multipos usuários .Append "Campo1". os produtos que estão sendo vendidos nessa venda não serão cadastrados.. AdInteger.35 Plic(Text1. 'P/ setar este Recordset p/ um Grid. Trabalhando com Recordsets Desconectados . 100 End With 'No caso. Então veja como fazer: 'No declarations do Form: Dim RS As ADODB.Recordset 'Cria os campos necessários With RS. 100 .Fields . adVarChar.. Um exemplo disso seria num cadastro de vendas. '"Campo1" é do tipo numérico inteiro e .ActiveConnection = Nothing 'Agora sim você pode fechar a conexão e tudo mais. Nesse caso. do banco de dados. o nome dos campos são "Campo1" e '"Campo2". por exemplo: Set Grid..0.Text) (.rede). você pode abrir o Recordset e desconecta-lo da conexão. e goste de abrir e fechar a conexão/Recordset quando necessário (ou seja.. ou que poderão vir a ser salvos mais tarde ou não.DataSource = RS Trabalhando com Recordsets Dinâmicos . aí sim isto seria salvo numa tabela de produtos da venda.ADO Digamos que você faça uma tela de pesquiza do seu cadastro (com um Grid e etc). nele NÃO tem a função Replace. Quando a venda for salva. P/ corrigir isto veja a dica Função Replace para VB5.

fazer procuras nele com o Find. Digamos que você precise fazer uma consulta SQL. RS.. Veja como ficaria: SELECT Nome. _ "X é menor ou igual a 1") Depois disso."Reprovado") AS Status FROM Alunos Utilizando o ADO .. ou então "Reprovado".36 '"Campo1" é do tipo caracter de 100 espaços. pode-se utilizar o comando IIF. IIF(Média>=5. com o Seek.Text RS![Campo2] = Text1. Por exemplo. "X é maior que 1". onde tenha que testar o conteúdo de um campo e retornar valores diferentes conforme o conteúdo deste campo. sRet As String iX = 3 sRet = IIF(X > 1. Este comando retornará [Valor Verdadeiro] no caso da [Condição] ser verdadeira ou [Valor Falso] no caso da [Condição] ser falsa.MovePrevious. RS.Open End Sub Bom. ele seja preenchido com o texto "Aprovado". dependendo do conteúdo de outra (inseri um valor ou outro). se a média do aluno for maior ou igual a 5.Update Você pode até salvar esse Recordset num arquivo e depois abri-lo novamente. RS. adiciona e atualizar registros. [Valor Verdadeiro]. veja: 'Salvando RS.MoveFirst.Save "c:\temp\arq. . Num caso como este."Aprovado". Syntaxe: IIF([Condição].MoveNext. Neste caso. Veja: RS. Média.Text RS. digamos que você fará uma consulta na tabela de alunos e você quer criar um campo onde. podese utilizar o comando IIF.MoveLast). RS. sRet conterá a String "X é maior que 1". [Valor Falso]). Ex: Dim iX As Integer. apagar.[Básico] Esta dica mostra os passos básicos p/ se usar o ADO ao invés do DAO. Você pode usar o IIF fácilmente numa consulta SQL.dat" Usando o IIF em Consultas SQL Digamos que você precise atribuir um determinado valor a uma variável.AddNew RS![Campo1] = Text1. depois disso você poderá navegar por este Recordset (RS.

Recordset Set Tabela = New ADODB. Padrão.o provedor . embora os registros excluídos por outros usuários sejam inacessíveis a partir do recordset. [CursorType]. Adições. Cursor dinâmico. Um valor CursorTypeEnum que determina o tipo de cursor que o provedor deve usar ao abrir o Recordset.0. Somente leitura . registro por registro .Abrir o Recordset (Tabela) Tabela. Cursor do conjunto de teclas. Idêntico ao cursor estático exceto pelo fato de que é possível somente efetuar rolagem progressiva pelos registros. em geral.OLEDB. Como um cursor dinâmico. Abertura de Banco de Dados e de Tabelas '1º . exceto pelo fato de que não é possível consultar os registros que outros usuário adicionaram. adOpenKeyset adOpenDynamic adOpenStatic [LockType]: Opcional.Criar uma Conexão Dim Conexão As ADODB.Data Source=" & _ App.37 A.Open SQLString.4. Isso melhora o desempenho em situações em que é necessária somente uma passagem pelo recordset.Definir o Valor Inicial para a Variável de SQL SQLString = "Select * From Tabela" '6º .o provedor faz o que for necessário para garantir o êxito da edição dos registros.Abrir o Banco de Dados (Definir o SGBD a ser Utilizado) Conexão.não é possível alterar os dados.Connection Set Conexão = New ADODB. Pode ser uma das seguintes constantes: Constante adLockReadOnly adLockPessimistic adLockOptimistic Descrição Padrão. Adições.Criar uma Recordset Dim Tabela As ADODB. Bloqueio otimista. alterações e exclusões feitas por outros usuários são visíveis e todos os tipos de movimentos pelo recordset são permitidos.Open "Provider=Microsoft. Cursor estático. alterações ou exclusões feitas por outros usuários não são visíveis. Um valor LockTypeEnum que determina qual tipo de bloqueio (simultaneidade) o provedor deve usar ao abrir o Recordset.Connection '2º . Bloqueio pessimista.Jet. registro por registro . Pode ser uma das seguintes constantes: Constante adOpenForwardOnly Descrição Cursor somente progressivo. As alterações nos dados feitas por outros usuários permanecem visíveis. [LockType] Explicações: [CursorType]: Opcional.Recordset '3º .Path & "\Banco. se o provedor não der suporte a eles. bloqueando-os na fonte de dados imediatamente acima de uma edição.MDB" '5º . Conexão.Criar uma Variável para SQL Dim SQLString As String '4º . exceto indicadores. Uma cópia estática de um recordset que pode ser usada para localizar dados ou gerar relatórios.

"<". "Excluir???") If RES = vbYes Then Tabela. bloqueando os registros somente quando o método Update for chamado.MovePrevious If Tabela.Update Excluindo um Registro: Dim RES RES = MsgBox("Deseja excluir o registro atual?".MoveNext .EOF Then Tabela. com a diferença de não existir mais o metodo Edit. com Captions "|<". todos com o nome cmdMove. coloque o seguinte código: Private Sub cmdMove_Click(Index As Integer) Select Case Index Case 0 Tabela. _ 48 + vbYesNo.Delete If Not Tabela. formando assim um array de botões de indices 0 à 3.necessárias para o modo de atualização em lotes em oposição ao modo de atualização imediata.AddNew Tabela![Campo1] = Valor1 Tabela![Campo2] = Valor2 Tabela![Campo3] = Valor3 Tabela![Campo4] = Valor4 Tabela. Veja os exemplos: Adicionando um Registro: Tabela.38 usa o bloqueio otimista.MoveFirst Case 1 If Not Tabela. Atualizações em lotes otimistas . ">" e ">|".BOF Then Tabela.BOF Then Tabela. Manipulação de Dados A manipulação continua idem ao do DAO. adLockBatchOptimistic B. No evento Click deste array de botões.Update Alterando um Registro: Tabela![Campo1] = NovoValor1 Tabela![Campo2] = NovoValor2 Tabela![Campo3] = NovoValor3 Tabela![Campo4] = NovoValor4 Tabela.EOF Then Tabela.MoveFirst End If Case 2 If Not Tabela.MoveFirst 'Sub que joga os valores dos campos da 'tabela p/ os TextBoxes MostraDados End If End If Movendo entre Registros: Coloque 4 botões no Form.

EOF Then adoPrimaryRS. ByVal _ bInheritHandles As Long. ByVal _ lpProcessAttributes As Long. Data_BaseExt$ Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type Private Declare Function WaitForSingleObject Lib _ "Kernel32" (ByVal hHandle As Long. Data_BaseName$. ByVal _ lpCurrentDirectory As Long.MoveLast End If Case 3 Tabela.MoveLast End Select End Sub Utilizar algum programa que compacte os DBs Option Explicit Private WinZipPath$ Private Data_Path$. ByVal _ lpThreadAttributes As Long. ByVal _ lpEnvironment As Long. ByVal lpCommandLine As String.39 If Tabela. ByVal _ dwMilliseconds As Long) As Long Private Declare Function CreateProcessA Lib _ "Kernel32" (ByVal lpApplicationName As _ Long. lpStartupInfo _ As STARTUPINFO. ByVal _ dwCreationFlags As Long. lpProcessInformation As _ PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "Kernel32" _ (ByVal hObject As Long) As Long Private Declare Function GetDiskFreeSpace Lib _ .

OutFile$.Caption = "Aguarde!" ' .Font = . _ lpSectorsPerCluster As Long.Refresh Call ZipCopyFile(SourceFile$.Visible = False ' .Visible = True ' .Caption = "Copactando Base de Dados.bak" Name Data_Path$+"\"+OutFile$+OutExt$ As _ Data_Path$+"\"+Data_BaseName$+Data_BaseExt$ End If 'Unload FormMsgBox Call AbreDataBase End Sub Private Sub mnu_UtilitariosEnviarDisquete_Click() Dim i%.pnl_Flood.Label2. _ RetErrNbr&.bak" Name Data_Path$+"\"+Data_BaseName$+Data_BaseExt$ As _ Data_Path$+"\"+Data_BaseName$+".Visible = False ' Set .Refresh 'End With SourceFile$ = CompressBD(OutFile$.Visible = False ' Set .OutExt$) If SourceFile$<>Data_Path$+"\"+OutFile$+OutExt$ Then Err.Show ' ." 'FormMsgBox.Label3. SourceFile$.Refresh 'End With SourceFile$ = CompressBD(OutFile$.Label2.Visible = False ' . lpBytesPerSector _ As Long. _ lpTtoalNumberOfClusters As Long) As Long Private Private Private Private Private Private Private Private Const Const Const Const Const Const Const Const NORMAL_PRIORITY_CLASS = &H20& INFINITE = -1& SW_NORMAL = 1 SW_HIDE = 0 SW_SHOW = 5 SW_SHOWMINNOACTIVE = 7 SW_SHOWNA = 8 STARTF_USESHOWWINDOW = 1& Private Sub mnu_UtilitariosBaseDadosCompac_Click() Dim SourceFile$.Show ' .Label3.Label2." ' . RetErrDesc$) .Caption = "Zipando Base copiada.Visible = True ' .Caption = "Aguarde!" ' .Label1. lpNumberOfFreeClusters As Long.Label1.Label2. OutFile$.Clear Kill Data_Path$+"\"+Data_BaseName$+".Font = .Label3.Label1. OutExt$ On Error Resume Next 'With FormMsgBox ' .Caption = "Copactando Base de Dados.OutExt$) 'FormMsgBox.Font ' .pnl_Flood.Label1.RetErrDesc$ On Error Resume Next 'With FormMsgBox ' .OutExt$.40 "Kernel32" Alias "GetDiskFreeSpaceA" ( _ ByVal lpRootPathName As String. OutExt$.RetErrNbr&. OutFile$." ' .Label3.Font ' . "a:".Label2.

MousePointer = vbHourglass Err.MousePointer = vbNormal End Function Function ZipCopyFile(ByVal InFile$.cb = Len(StartProc) If CreateProcessA(0&. 1&.". ErrDesc$) As Boolean Dim i%. OutExt$) Dim i% On Error Resume Next If FileDateTime(Data_Path$+"\"+Data_BaseName$ + _ Data_BaseExt$)>FileDateTime(Data_Path$+"\COMPAC" + _ Data_BaseExt$) Then ' For i% = Forms. szCommandLine$ Dim lDiskFree&.Name <> "FormFlyOver" Then ' Unload Forms(i%) ' End If ' DoEvents: DoEvents ' Next Call CloseDataBase Screen. _ . lBytes&. szCommandLine$.Name <> "MDIForm" And _ ' Forms(i%). 0&. lClust&.Clear If WinZipPath$ <> "" Then Screen. OutPath$. OutFile$. 0&. vbInformation Else MsgBox "Arquivo '" & OutFile$ & OutExt$ & _ "' copiado para o disquete." Err. lRet&.Clear ChDir Data_Path$ If "COMPAC" <> Data_BaseName$ Then Kill "COMPAC" + Data_BaseExt$ End If CompactDatabase Data_Path$ + "\" + Data_BaseName$ + _ Data_BaseExt$. lTot& Dim ProcInfo As PROCESS_INFORMATION Dim StartProc As STARTUPINFO On Error Resume Next ErrNumber& = -1 ErrDesc$ = "Erro desconhecido.41 'Unload FormMsgBox If RetErrNbr& <> 0 Then Kill "a:\" & OutFile$ & OutExt$ MsgBox RetErrDesc$. vbInformation End If Call AbreDataBase End Sub Function CompressBD$(OutFile$.Number = 0 Then CompressBD = Data_Path$+"\COMPAC"+Data_BaseExt$ Else CompressBD = Data_Path$+"\"+Data_BaseName$+Data_BaseExt$ End If Screen. lSect&. _ OutExt$.MousePointer = vbHourglass szCommandLine$ = Aspas(WinZipPath$) & " -a " & _ Aspas(OutPath$ + "\" + OutFile$) & " " & _ Aspas(InFile$) StartProc.Name <> "FormMsgBox" And _ ' Forms(i%).1 To 0 Step -1 ' If Forms(i%). FreeSpace&.Count . ErrNumber&. Data_Path$ + "\COMPAC" + Data_BaseExt$ End If OutFile$ = "COMPAC" OutExt$ = Data_BaseExt$ If Err.

lBytes.zip" ErrNumber& = 0 ErrDesc$ = "" ZipCopyFile = True Else GoTo ZipStartErro End If Else ZipStartErro: Screen.hThread) CloseHandle (ProcInfo.42 NORMAL_PRIORITY_CLASS.zip") Then GoTo ZipStartErro End If Else GoTo ZipStartErro End If Screen. OutPath$ & OutFile$ & OutExt$ Screen. StartProc. lClust.MousePointer = vbHourglass If Mid(OutPath$.Number ErrDesc$ = Err. """") Then Aspas = "'" & Trim(Value) & "'" Else Aspas = """" & Trim(Value) & """" End If End Function .Number = 0) ErrNumber& = Err. 1) = ":" Then lRet = GetDiskFreeSpace(Left(OutPath$.Clear FileCopy InFile$.hProcess.Description End If End Function Public Sub AbreDataBase() 'Abro a base de dados End Sub Public Sub CloseDataBase() 'Fecho as tabelas.Clear If FileLen(InFile$) > lDiskFree Then ErrNumber& = 0 ErrDesc$ = "Disco cheio.Number = 0 Then OutExt$ = ". _ ProcInfo) Then lRet& = WaitForSingleObject(ProcInfo.Number <> 0 Then lDiskFree = 2147483647 Err.hProcess) If FileDateTime(InFile$) > FileDateTime(OutPath$ + "\" + _ OutFile$ + ". lTot) lDiskFree = (lBytes * lSect) * lClust If Err.MousePointer = vbNormal If Err. 2. 0&." ZipCopyFile = False Exit Function End If End If Err. 2) + "\". 0&. INFINITE) CloseHandle (ProcInfo. recorsets e a basededados/conexão End Sub Public Function Aspas$(ByVal Value) If InStr(Value. lSect.MousePointer = vbNormal ZipCopyFile = (Err.

Dias .Numero. DateToday _ As Date) As Integer If Month(DateToday) < Month(Bdate) Or _ (Month(DateToday) = Month(Bdate) And _ Day(DateToday)<Day(Bdate)) Then Age = Year(DateToday) .Year(Bdate) End If End Function Calcula a Raiz Quadrada de um Número Para fazer o calculo da raiz quadrada de qualquer número.43 CÁLCULOS Calcula a idade em anos entre duas datas Public Function Age(Bdate As Date.ValewZAÇO!!! 8^))) Calculando a Diferença entre Duas Datas em Dias Este cálculo é bem simples de ser feito. seriam 5 parcelas). Veja o código: Private Sub Calcula_DT() Dim dData As Date. Veja este exemplo: Dim iNum As Integer iNum = Sqr(25) Depois desta operação.Data) Intervalos: "d" . Veja: Para isso usaremos a função DateAdd() que tem a seguinte sintáxe: DateAdd(Intervalo. 8^) By Tamanhoni . sMsg As String dData = InputBox("Digite uma data:") sMsg = "Dias até a data escolhida: "& _ DateDiff("d". Now. dData) Msgbox sMsg End Sub Calculo de Mensalidades Digamos que você precise gerar 4 datas a partir de uma data digitada pelo usuário (para um controle de parcelas. No caso.Year(Bdate) . iNum conterá o número 5.1 Else Age = Year(DateToday) . é só usar a função Sqr. por exemplo.

A soma deles incluirá um pequeno erro.51 + (-17.59). A representação da máquina sobre valores numéricos é em binário. Então.9200000000000002. Para exibir o resultado exato para o usuário.Meses "y" . _ dtFinal As Variant) As Integer Dim intSemanas As Integer Dim varDataCont As Variant Dim intFimDias As Integer dtInicio = DateValue(dtInicio) dtFinal = DateValue(dtFinal) intSemanas = DateDiff("w"."ddd") <> "Sat" Then . Isso ocorre. mas nos casos de valores com ponto flutuante. No nosso exemplo. ambos 18. isso não acontece. Observe que o erro é bastante pequeno e essencialmente a soma (quando vista em uma precisão de 14/15 pontos decimais usando a função Format$) é correta. os valores com ponto flutuante são aproximados para o próximo valor que pode ser representado em binário.51 + (-17.59 não podem ser representados exatamente pelo padrão de ponto flutuante. porque no Visual Basic.dtInicio) intFimDias = 0 Do While varDataCont < dtFinal If Format(varDataCont. "###."ddd") <> "Sun" And _ Format(varDataCont.51 e 17. Logo.Anos Então ficaria: Dim MyArray(4) As Date Dim i As Integer MyArray(0) = "14/05/2000" For i = 1 To 4 MyArray(i) = DateAdd("m". eles tendem a causar algum erro nos calculos quando são utilizados.0001 não pode ser representado exatamente em binário (0. i. o decimal 0. "14/05/2000") Next By Maximiliano Damian Rodrigues .#####") Dias úteis entre duas datas Function DiasUteis(dtInicio As Variant. Por exemplo. faça o seguinte: Format$(18. os valores com ponto flutuante são armazenados no formato padrão IEEE.dtFinal) varDataCont = DateAdd("ww".intSemanas.0001 é uma fração repetitiva com um período de 104 bits!). Qualquer valor inteiro pode ser representado "EXATAMENTE" na forma binária.dtInicio.44 "m" .ValewZAÇO!!! 8^)) Contas corretas com ponto fluante Alguém já notou que o Visual Basic não é muito bom em matemática? Tente fazer 18.59) e você irá receber .

. etc. etc.. Descobrindo Dias no Mês * Primeiro Dia do Mês: Data = DateSerial(2000. 1. Now())) 'Now() pode ser substituído por algo como '#04/06/1996#.7 'Now() pode ser substituído por algo como '#04/06/1996#. Now() . 5.. 5 + 1. ou #16/08/2000#. varDataCont) Loop DiasUteis = intSemanas * 5 + intFimDias End Function Descobrindo Dias no Ano * Primeiro Dia do Ano Data = Now() .. . 2000 é o ano e 5 é o mês.Datepart("y". ou #16/08/2000#..Now() .ano. 1._ Datepart("y". * Ultimo Dia do Ano Data = Dateadd("yyyy".mês) podem ser modificados._ Datepart("y". 1. claro. Now() ._ Datepart("y". Now()) + 1 'Now() pode ser substituído por algo como '#04/06/1996#. Now())) . 1) * Último Dia do Mes: Data = DateSerial(2000..: Esses números (2000 . 5 .. 1... 0)) Nesses exemplos. ou #16/08/2000#.. Now() . DateSerial(2000.. Obs. 1. ou #16/08/2000#.. * Número de Dias no Ano Data = Dateadd("yyyy". * Número de Dias até o Fim do Ano Data = Dateadd("yyyy". Now())) . 0) * Número de Dias no Mes Data = Datepart("d"..Now() 'Now() pode ser substituído por algo como '#04/06/1996#. etc. etc. * Número de Dias até o Natal Data = Dateadd("yyyy".45 intFimDias = intFimDias + 1 End If varDataCont = DateAdd("d". Now())) 'Now() pode ser substituído por algo como '#04/06/1996#.Datepart("y". ou #16/08/2000#. Now() . etc.(Now() . _ 5 + 1._ Datepart("y".. Now())) .

_ 1. 31). Dia). Ela faz muito mais coisas. Optional YYYY) As Date If IsMissing(YYYY) Then YYYY = Year(Date) If Not IsNumeric(YYYY) Or _ YYYY \ 1 <> YYYY Or YYYY < 100 Or _ YYYY > 9999 Then Exit Function If JulDay > 0 And JulDay < 366 Or _ JulDay = 366 And YYYY Mod 4 = 0 And _ YYYY Mod 100 <> 0 Or _ YYYY Mod 400 = 0 Then CJulian2Date = DateSerial(YYYY. JulDay) End If End Function . "000") End Function 'Converte de Data Juliana para Data Public Function CJulian2Date(JulDay As _ Integer.46 Recomendo uma olhada BEM de perto na função DateSerial(Ano. Trabalhando com Data Juliana 'Converte para Data Juliana Public Function CDate2Julian(MyDate As Date) _ As String CDate2Julian = Format$(MyDate . 12. 1. Mes._ DateSerial(Year(MyDate) .

Agora.Text1(0). Como você faria. menor.Enabled = False Text1(4). NÃO estaria formando um array). cada um com um nome diferente (quer dizer.Enabled = False Text1(3). vamos dizer que você presice desabilitar (.Enabled = False Text5.Enabled = False Text4. caso você tenha MUITOS TextBoxes. digamos que você queira fazer isto sem expecificar a quantidade de TextBoxes (0 até 4 seriam 5 TextBoxes). Veja: Dim iNum As Integer For iNum = 0 To 4 Text1(iNum). sem dúvida.Enabled = False) todos eles.. Text1(2).Enabled = False Next A vantagem de se usar este método é que. Então. Como você faria? 'Você faria assim?: Text1(0). vamos dizer que você presice desabilitar (.Enabled = False Deste modo até funcionaria.Enabled = False) todos eles. mas tem um modo mais fácil de se fazer isso. Text1(3).Enabled = False Text2. Veja: Dim cObjeto As Control For Each cObjeto In Controls If TypeOf cObjeto Is TextBox Then cObjeto. Text1(4)). Então. Como você faria? 'Você faria assim?: Text1.. usando o 1º . sem dúvida. caso você tenha MUITOS TextBoxes.Enabled = False End If Next A vantagem de se usar este método é que.47 CONTROLES Alterando Propriedades de Controles (não Array) em um Loop Digamos que você tenha 5 TextBoxes.. o código ficaria.Enabled = False Text1(1). Text1(1). um array de TextBoxes . menor..Enabled = False Text3. no caso. Com este método NÃO IMPORTA quantos nem quais são os nomes dos TextBoxes! Ele irá.Enabled = False Text1(2). mas tem um modo mais fácil de se fazer isso.Enabled = False Deste modo até funcionaria. desabilitar TODOS eles! Alterando Propriedades de um Array de Controles em um Loop Digamos que você tenha 5 TextBoxes com um mesmo nome (quer dizer. o código ficaria.

MsgBox "HEI!!! Você me clicou!!!".0) Neste exemplo criaremos uma ScrollBar.HScrollBar". né? Então veja como fazer isso usando o 2º exemplo: Dim iNum As Integer For iNum = 0 To Text1.Count . With MyHSBar . A ScrollBar já está instanciada e 'visível no Form.hWnd.Enabled = False Next Coordenadas do controle em relaçao a area de trabalho Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Declare Function GetWindowRect Lib "user32" Alias _ "GetWindowRect" (ByVal hwnd As Long. como 'já foi comentado antes.Left = 0 .48 exemplo??? Meio complicado. lpRect As RECT _ ) As Long ' Uso: Dim R As RECT GetWindowRect(Controle. _ "HScroll1") 'Agora precisamos alterar algumas propriedades 'para a ScrollBar poder ficar visível. vbCritical End Sub .Height = 255 .Top = 0 .Controls. End Sub Private Sub MyHSBar_Change() 'Podemos até usar os eventos da ScrollBar. Change e etc). precisaremos declarar a variável com a palavra chave WithEvents. R) "R" retornará com as coordenadas do controle (ou qq coisa que tenha hWnd) na tela.1 Text1(iNum).Width = Me.Add("VB. Cuidado que é em Pixel!!! Criando Objetos em Run Time (VB6.Visible = True End With 'Pronto.ScaleWidth . Veja: Private WithEvents MyHSBar As HScrollBar Private Sub Form_Load() 'Cria a instancia da ScrollBar Set MyHSBar = Form1. Para podermos usar seus eventos (Click.

..Number Case 91 'error 91 = object not set IsSomethig = false Case 0 IsSomething = true Case Else '.. End If ..49 Agora coloque este código num Form e teste! 8^) P.Date Print "Preço de Venda: " & YourObject..... Por exemplo: Public Function IsSomething (ob As Object) As Long Dim J as Long Err... Else ' O objeto não foi definido.Price '. Porém..NumberOfLegs ElseIf TypeOf YourObject Is CHouse Then Print "Object Type: Casa" Print "Número de portas: " & YourObject.S. Determinando a classe de qualquer objeto 'Esta rotina imprime informações específicas de objetos Public Sub PrintObjectInfo (YourObject As Object) If TypeOf YourObject Is CDesk then Print "Object Type: Mesa" Print "Número de pernas: " & YourObject. outro erro ocorreu End Select On Error GoTo 0 End Function ' Outra maneira simples seria apenas: If Not MeuObjeto Is Nothing Then ' Se chegou aqui é pq foi definido.Clear On Error Resume Next If TypeOf ob Is TextBox Then J = 1 End If Select Case Err.0. Existem formas de verificar se um objeto já foi definido é através do código de erro (91)..NumberOfDoors End If 'impressão das propriedades de mesmo nome Print "Data de Venda: " & YourObject. um objeto deve ser "setado" (definido) antes de ser referenciado. End Sub Determinando se um objeto foi definido (Set) VB providencia uma série de novas capacidades de uso de objetos...: Só funciona no VB6.

Cima => Move o controle para cima. 20.Name <> vbNullString Then MsgBox "Sim" End If Exit Sub SaiComErro: MsgBox "Nao" End Sub ToolTipText personalizado Este código transforma um formulário retangular em um quadrado de cantos arredondados.Left + 2600) / Screen.TwipsPerPixelY. ByVal X2 As Long. Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As _ Long.Top + 1500) / Screen. ou Click. Testar se um controle existe Private Sub Command1_Click() On Error GoTo SaiComErro If Me("Label1"). ByVal bRedraw As Boolean) As Long Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 _ As Long. as operações acima afetarão todos eles. ByVal Y1 As Long. 20) . ByVal X3 As Long. ByVal Y2 As _ Long.TwipsPerPixelX. 0 RoundRect = CreateRoundRectRgn((Me.TwipsPerPixelY. ByVal Y3 As Long) As Long Private Sub Form_Load() Dim RoundRect As Long Me. Esquerda => Move o controle para a esquerda. de um Unload no Form.50 Manipulando Controles num Form Usando-se o Teclado Se você preferir usar o teclado ao invés do mouse para mover ou alterar o tamanho dos controles num Form. MouseMove. Ponha um Label no formulário para exibir o que você quiser.Move 0.Top + 400) / Screen. _ (Me. _ (Me.TwipsPerPixelX. e no evento Deactivate do Form. ByVal hRgn As Long. para ele sumir. _ (Me. você pode usar as combinações de teclas abaixo durante a criação de suas telas: Para alterar o tamanho dos controles use a tecla Shift e as teclas de setas como segue: Shift+Seta Shift+Seta Shift+Seta Shift+Seta p/ p/ p/ p/ Direita => Aumenta a largura do controle (Width) Esquerda => Diminue a largura do controle (Width) Baixo => Aumeta a altura do controle (Height) Cima => Diminue a altura do controle (Height) Para mover os controles use a tecla Ctrl e as teclas de setas como segue: Ctrl+Seta Ctrl+Seta Ctrl+Seta Ctrl+Seta p/ p/ p/ p/ Direita => Move o controle para a direita. ou qualquer outro. Baixo => Move o controle para baixo. Se você selecionar mais de um controle.Left + 60) / Screen.

Print . True Me. "É um TextBox" Else Debug.ActiveControl Is TextBox Then Debug. (Screen.Name = "txtContrato" Then End If If TypeOf Screen.1100) / 2 End Sub Verificar se um controle está com o foco If Screen.Move (Screen. RoundRect. "Não é um TextBox" End If .ActiveControl.51 SetWindowRgn Me.2550) / 2.Width .hwnd.Print .Height .

Antes de mais nada.: Eu recomendo que você pinte o UserControl TODO no evento UserControl_Paint. pois assim ficará mais fácil de fazer-se um controle sobre todo este processo. 1) End If Next Else SelectKeys = "" End If End Function 'No local onde você "PINTA" o texto no 'UserControl.S. qual será sua ação conforme a propriedade CanGetFocus do UserControl estiver setada: * True .1. 1) = "&" And _ Mid(sTexto. tenho que explicar-lhe o como esta propriedade funcionará. "&") <> 0 Then For iNum = 1 To Len(sTexto) If Mid(sTexto. ele jogará o foco p/ o próximo controle na lista do TabIndex assim como faz o Label). Digamos que você precise verificar se a propriedade KeyPreview do Form está setada como True ou como False. * False . logo após pinta-lo. A menos que você coloque a propriedade ForwardFocus como True (neste caso.AccessKeys = SelectKeys(VarDoCaption) P.NADA. iNum + 1. Então vamos ao código: 'Num Módulo: Public Function SelectKeys(ByVal sTexto As _ String) As String Dim iNum As Integer If sTexto <> "" And InStr(sTexto. iNum + 1. iNum.52 Criação de AtiveXs Colocando as Tecla de Atalho para Funcionar num OCXs Este código será muito útil quando você estiver criando um OCX de um botão. Manipulando Propriedades do Form onde seu OCX Está É muito fácil de se verificar propriedades do Form onde seu UserControl está. 1) <> "&" And _ iNum <> Len(sTexto) Then SelectKeys = SelectKeys & Mid(sTexto. chamando-o das funções que recebem valores para as propriedades. bastaria o seguinte código: If UserControl. Para isto.Parent.KeyPreview Then MsgBox "A propriedade KeyPreview do Form " & _ "está setada como True!!!" Else MsgBox "A propriedade KeyPreview do Form " & _ "está setada como False!!!" .Ele dá um clique no UserControl. de uma espécie de Label ou qqr outro tipo de controle que contenha Caption.Extender. quer dizer. coloque 'esta linha de código: UserControl. 1) <> "&" And _ Mid(sTexto. iNum .

hWnd Ok. Mas você concorda que o usuário do seu UserControl pode coloca-lo dentro de um controle container (um PictureBox.AutoRedraw = False Observação: Tome cuidado quando for alterar propriedades do Form.UserMode Then 'O projeto está em Run-Time. Para isto.AutoRedraw = True 'Ou UserControl. caso não haja um controle container. pois assim você poderá estar alterando personalizações feitas pelo programador que está usando seu OCX.Extender.Extender. 'ele está sendo executado.hWnd) Só finalizando. Para resolver isto basta usar a API GetParent. por exemplo)? Pois é. Digamos que você precise modificar a propriedade AutoRedraw do Form para True ou como False. o hWnd retornado pela API GetParent será do Form. como demonstro a seguir: 'Num módulo: Public Declare Function GetParent Lib _ "user32" (ByVal hWnd As Long) _ As Long 'No seu código: Dim m_hWnd As Long m_hWnd = GetParent(UserControl.Parent. o UserControl está colocado diretamente no Form.Parent. bastaria o seguinte código: UserControl. bastaria usar isto: Dim m_hWnd As Long m_hWnd = UserControl. como eu expliquei na dica "Manipulando Propriedades do Form onde seu OCX está". Acontece que se você usar o código anterior.Parent. Bem. ou seja. . End If Pegando o hWnd do Verdadeiro Container Digamos que você queira pegar o hWnd do Form onde seu UserControl está.53 End If Também é muito fácil de se modificar propriedades do Form onde seu UserControl está. Else 'O projeto está em Design-Time. Pronto. ele SEMPRE vai retornar o hWnd do Form. quer dizer. NUNCA do controle container (caso haja um). Basta um If: If Ambient. O Projeto está em Run ou Design Time? Para saber isto é muito simples.

Estas funções são DLLRegisterServer e DLLUnregisterServer. Depois abra o projeto. Em quase todos os casos o proprio VB irá mostrar uma mensagem enorme explicando que você está mudando a interface e bla bla bla.. ComCtl32. Registrando e Desregistrando ActiveX via Código VB Esta dica descreve como os controles de ActiveX podem ser registados e desregistrados diretamente do VB. copie a ActiveX gerada para o diretorio dos fontes ou em um sub-diretorio (por exemplo para o subdiretório "Versoes"). 2º . Cada controle ActiveX contém duas funções que. (compile sempre pro diretorio do Windows\System). Detalhe. Ai então você pode compilar quantas vezes quiser (sempre no diretorio do Windows\System).que é para onde você compilará novamente). Mas para isto você deve ter alguns cuidados: 1º . porque vai dar problema.. 3º . 'Num módulo: Public Declare Function RegComCtl32 Lib _ "ComCtl32.54 Qual tipo de Compatibilidade devo Usar? A compatibilidade binaria é muito útil em ActiveXs. quando chamadas o registram ou desregistram no sistema.OCX" Alias _ "DllUnregisterServer" () As Long Const ERROR_SUCCESS = &H0 'Num Form coloque dois botões e insira 'este código: Private Sub Command1_Click() 'P/ Registrar: If RegComCtl32 = ERROR_SUCCESS Then . mude para a opção "Binary Compatibility" e na caixa de referencia digite o diretorio/nome da ActiveX que é a "COPIA" (não aquela que está no diretorio do Windows\System . Grave tudo e feche o projeto.Na proxima vez que você chamar o projeto.Quando você compilar o projeto a primeira vez usa a opção "Project Compatibility" e deixa a caixa de referencia em branco. Você também não pode incluir novas propriedades/metodos/eventos na ActiveX. o VB irá olhar para a ActiveX que você referenciou para deixar a proxima compilação "binariamente compativel" (isso significa que a interface publica da ActiveX continuará igual e o usuario da ActiveX não precisará compilar novamente o projeto que a usa).Depois de compilado. caso você altere seus ActiveXs. O seguinte código demonstra como registar e desregistrados os controles Microsoft Common Controls OCX. pois permite que.OCX.. o IID e LIBID serao mantidos entre as versoes. não precise refazer as telas de seus programas que o usamvam. Não esqueça que qualquer alteração que você fizer na interface pública da ActiveX irá resultar na "incompatibilidade" mesmo que você esteja usando a opção dentro do VB. usar a opção "Binary Compatibility" significa que o CLSID.OCX" Alias _ "DllRegisterServer" () As Long Public Declare Function UnRegComCtl32 Lib _ "ComCtl32..

.55 MsgBox "Registration Successful" Else MsgBox "Registration Unsuccessful" End If End Sub Private Sub Command2_Click() 'P/ DESregistrar: If UnRegComCtl32 = ERROR_SUCCESS Then MsgBox "UnRegistration Successful" Else MsgBox "UnRegistration Unsuccessful" End If End Sub Nota: Cada chamada a essa função do ActiveX pode levar um tempo de até 5 segundos.

ColSel = . LstRow%.Add wbExcel. EImpar = (iNum Mod 2) End Function Sub FlexCores(lCorPar As Long.Col = 1 'Seleciona até a última coluna .Cols .1 'Aplica a cor . Buf$.Add .Worksheet On Error Resume Next Set MyExcel = If Err.Row = iLinha If EImpar(iLinha) Then 'Se a linha for impar: 'Seleciona a partir da primeira coluna .Workbook Dim shExcel As Excel. c%. "Excel.CellBackColor = lCorImpar Else 'Se a linha for par: 'Seleciona a partir da primeira coluna .56 FlexGrid Deixando um FlexGrid Zebrado (com 2 Cores Intercaladas) Function EImpar(ByVal iNum As Long) As Boolean 'Verifica se o número é impar 'Se for impar a função retorna True.Application Dim wbExcel As Excel. 'Se for par a função retorna False.Worksheets.Number Set MyExcel End If Set wbExcel = Set shExcel = GetObject(.Workbooks.CellBackColor = lCorPar End If End With Next SeuMSFlexGrid.Col = 1 'Seleciona até a última coluna .Cols .1 'Aplica a cor .Rows .FillStyle = flexFillRepeat For iLinha = 1 To SeuMSFlexGrid. _ ByVal TextoAdicional$) Dim R%.1 With SeuMSFlexGrid . &HC0FFFF) Exportar dados de FlexGrid para Excel Sub CopyToExcel(InFlexGrid As MSFlexGrid. lCorImpar As Long) Dim iLinha As Integer SeuMSFlexGrid. LstCol% Dim FormatMoney As Boolean Dim MyExcel As Excel.FillStyle = flexFillSingle End Sub 'Sintaxe: FlexCores(Cor das linhas pares.Application") MyExcel.ColSel = . Cor das linhas impares) 'Exemplo: FlexCores(&HFFFFFF.Application") <> 0 Then = CreateObject("Excel. Nome$.

csFormatMoneyZero)=Buf$ Then If Err.Clear Buf$ = InFlexGrid.TextMatrix(R%.1 InFlexGrid.WrapText = True ElseIf Format(CDbl(Buf$).LstCol%-1)<>InFlexGrid.Font.Activate LstCol% = 0 For c% = 0 To InFlexGrid.Name = Nome$ shExcel.Cols .Col = c% LstRow% = 0 shExcel.Number = 0 Then Buf$ = Str(CDbl(Buf$)) FormatMoney = True End If End If If Buf$ <> "" Then If InFlexGrid.c%)=InFlexGrid.c%) Then Exit For End If Next If LstCol% <> c% Then shExcel. vbCrLf) Then Buf$ = StrTran(Buf$.Range(Chr(Asc("A")+LstCol%) & (R%+1).CellForeColor If R%<InFlexGrid. vbCrLf. _ Chr(Asc("A")+c%) & (R%+1)).1 InFlexGrid.Columns(Chr(Asc("A")+c%)).Color=InFlexGrid.Bold=True ' shExcel. Len(Buf$) . _ Chr(Asc("A")+c%) & (R%+1)).MergeCells=True shExcel.MergeRow(R%) Then For LstCol% = c% To 1 Step -1 If InFlexGrid.ColWidth(c%)/72 For R% = 0 To InFlexGrid.Range(Chr(Asc("A")+LstCol%) & (R%+1). 1) = vbLf Buf$ = Left(Buf$.FixedCols Then shExcel.1) Loop shExcel.MergeCol(c%) And LstRow% <> R% Then If InFlexGrid.TextMatrix(R%.BorderAround End If End If If InFlexGrid.Font.Row = R% Err.Font.Value=Buf$ If FormatMoney Then .Range(Chr(Asc("A")+c%) & _ ' (r%+1)).Range(Chr(Asc("A")+c%) & _ (R%+1)).Range(Chr(Asc("A")+c%) & (R%+1)).TextMatrix(LstRow%.FixedRows Or c%<InFlexGrid.c %)Then shExcel.ColumnWidth=InFlexGrid.Rows .Range(Chr(Asc("A") + c%)). _ Chr(Asc("A")+c%) & (R%+1)). _ Chr(Asc("A")+c%) & (R%+1)).BackColor = 40 End If shExcel.MergeCells=True shExcel.BorderAround Else LstRow% = R% End If End If shExcel.Range(Chr(Asc("A")+c%) & (LstRow%+1).57 shExcel.TextMatrix(R%.Range(Chr(Asc("A")+c%) & (LstRow%+1).Range(Chr(Asc("A")+c%) & _ (R%+1)). c%) If Buf$ <> "" Then FormatMoney = False If InStr(Buf$.TextMatrix(R %. vbLf) Do While Right(Buf$.

Width = intTamanho . 0.Value = TextoAdicional$ End If MyExcel. 0 Printer.##0.Width MSFlexGrid.##0.00" End If End If End If Next Next If TextoAdicional$ <> "" Then ' shExcel.NumberFormat="#.00.Picture.##0. 1) = vbLf TextoAdicional$ = Left(TextoAdicional$.Width Printer.PaintPicture MSFlexGrid.#.Visible = True Set shExcel = Nothing Set wbExcel = Nothing Set MyExcel = Nothing End Sub Para imprimir o conteudo de um FlexGrid Dim intTamanho as Integer intTamanho = MSFlexGrid.Range("A" & (R% + 2)).#.Range(Chr(Asc("A")+c%) & _ (R%+1)). _ Len(TextoAdicional$) .Delete (xlShiftUp) Do While Right(TextoAdicional$.Width = Printer.58 shExcel.EndDoc MSFlexGrid.00.Rows(Str(r%+2)).1) Loop shExcel.

_ ByVal lParam As Long) As Long Public Function GetDropdownWidth(cbohWnd As _ Long) As Long Dim lRetVal As Long 'Descobrindo a largura atual do Drop Down: lRetVal = SendMessage(cbohWnd. GetDropdownWidth = lRetVal Else GetDropdownWidth = 0 End If End Function 'P/ chamar use assim: Dim iLargura As Integer iLargura = GetDropdownWidth(Combo1. _ lParam As Long) As Long Private Sub Combo1_GotFocus() Const CB_SHOWDROPDOWN As Long = &H14F Dim Tmp As Long Tmp = SendMessage(Combo1.hWnd) 'Pronto. _ ByVal Msg As Long.CB_SHOWDROPDOWN. _ CB_GETDROPPEDWIDTH. .hwnd. ByVal wParam As Long.59 ComboBox Abrir um ComboBox assim que receber o foco Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. 0&. _ ByVal wMsg As Long.ByVal 0&) End Sub Ou no evento GotFocus Private Sub Combo1_GotFocus() SendKeys "%" & "{DOWN}" End Sub Ajustando a Largura do Drop-Down de um ComboBox Descobrindo a largura atual do Drop-Down 'Coloque este código num módulo: Private Const CB_GETDROPPEDWIDTH As Long = &H15F Private Const CB_ERR As Long = -1 Private Declare Function SendMessage Lib "USER32" _ Alias "SendMessageA" (ByVal hwnd As Long. ByVal wParam As Long.1. 0&) If lRetVal <> CB_ERR Then 'Ele retornará a largura do Drop Down 'em pixels. A variável iLargura conterá a 'largura do Drop Down em pixels.

_ newWidth.Right + 5 Set ctl. _ ByVal sNewItem As String.hwnd. Optional ByVal _ dwNewItemData As Variant) As Long Dim RC As Rect Dim newWidth As Long Dim currWidth As Long Dim sysScrollWidth As Long Dim OldFont As StdFont If ctl. CB_SETDROPPEDWIDTH. lpRect As Rect. -1&. 0&) ctl. sNewItem.Font = OldFont If newWidth > currWidth Then Call SendMessage(ctl.Font = ctl. Veja como: 'Coloque este código num módulo: Option Explicit Private Private Private Private Const Const Const Const CB_GETDROPPEDWIDTH As Long = &H15F CB_SETDROPPEDWIDTH As Long = &H160 CB_ERR As Long = -1 DT_CALCRECT As Long = &H400 Public Type Rect Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function DrawText Lib "user32" _ Alias "DrawTextA" (ByVal hDC As Long.Tag <> "" Then currWidth = CLng(ctl.Tag = newWidth End If ctl.AddItem sNewItem If Not IsMissing(dwNewItemData) Then If IsNumeric(dwNewItemData) Then ctl.NewIndex) = dwNewItemData End If .Tag) End If Set OldFont = ctl. _ ByVal lParam As Any) As Long Public Function cboAdiciona(ByRef ctl As Control.ItemData(ctl.Parent.Parent. _ RC. ByVal wFormat As _ Long) As Long Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. ByVal wParam As Long.Parent.Font Call DrawText(ctl.hDC. DT_CALCRECT) newWidth = RC. _ ByVal lpStr As String.60 Adicionando itens ao ComboBox em Run-Time Você pode adicionar itens e atualizar a largura do Drop Down automaticamente.Font Set ctl.Parent. ByVal nCount As _ Long. _ ByVal wMsg As Long.

Font = Combo1. NewWidthPixel. Veja como fazer isto: Dim NovoIndex As Long NovoIndex = cboAdiciona(Combo1. você pode usar esta função 'recebemdo o valor do ListIndex p/ usa-lo de 'alguma forma. Então.AddItem NÃO FUNCIONARÁ!): Call cboAdiciona(Combo1.Text) If iLar1 > iLar2 Then iLar2 = iLar1 End If Next iLar2 = iLar2 + 5 .ListIndex = iNum iLar1 = Me. _ ByVal Msg As Long. "Texto") MsgBox "O Item " & NovoIndex & " foi adicionado!" Adicionando itens ao ComboBox em Design-Time Se você quizer adicionar os itens em Design-Time e atualizar a largura do Drop Down RunTime. 0) If lRetVal <> CB_ERR Then SetDropdownWidth = True Else SetDropdownWidth = False End If End Function 'No Form. _ ByVal lParam As Long) As Long Public Function SetDropdownWidth(cboHwnd As Long. ByVal wParam As Long.NewIndex End Function 'P/ usar.ScaleMode = 3 For iNum = 0 To Combo1. coloque: Private Sub Form_Load() Dim iLar1 As Integer. iLar2 As Integer Dim iNum As Integer. _ CB_SETDROPPEDWIDTH. adicione os itens desta maneira (se 'você usar com Combo1. _ NewWidthPixel As Long) As Boolean Dim lRetVal As Long 'Ajustando a largura do Drop-Down: lRetVal = SendMessage(cboHwnd.1 Combo1.ListCount . "Texto") 'Esta função retorna o valor do ListIndex do 'novo item. faça da seguinte maneira: 'Coloque este código num módulo: Private Const CB_SETDROPPEDWIDTH As Long = &H160 Private Const CB_ERR As Long = -1 Private Declare Function SendMessage Lib "USER32" _ Alias "SendMessageA" (ByVal hwnd As Long. OldFont As StdFont iLar2 = 0 OldFont = Me.61 End If cboAdiciona = ctl.TextWidth (Combo1.Font Me.Font Me.

PS: Declare as variaveis. ByVal wParam As Long.-1.SelLength = j End If End If End With End Sub Private Sub Combo1_LostFocus() With Combo1 if Len(.Font = OldFont End Sub Auto preenche o ComboBox de acordo com o texto encontrado Duas rotinas... OK? Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long.62 Call SetDropdownWidth(Combo1.-1.hwnd.Text) then 'Procura pelo texto digitado strPartial = . retorna o focus para o Combo If I = CB_ERR Then .List(I) 'Compute number of unmatched characters j = Len(strTotal) .Text I = SendMessage(.hwnd.SelStart = Len(strPartial) . adiciona o resto do Texto If I <> CB_ERR Then 'Pega o texto inteiro strTotal = .CB_FINDSTRING.Text I = SendMessage(..CB_FINDSTRING.SelText = Right$(strTotal. _ ByVal wMsg As Long.hWnd.SetFocus End if End With End Sub . iLar2) Me.ByVal strPartial) 'Se não achou. j) 'Marca os caracteres adicionados . _ ByVal strPartial) 'Se achou.. _ lParam As Any) As Long Const CB_FINDSTRING As Long = &H14C Const CB_ERR As Long = (-1) Private Sub Combo1_Change() With Combo1 'Procura pelo texto já digitado strPartial = . a Combo1_Change() que auto preenche o combo de acordo com o texto encontrado e uma outra Combo1_LostFocus() que impede que o Compo perca o focus se o texto digitado não existir.Len(strPartial) If j <> 0 Then 'Adiciona o resto da string encontrada m_bEditFromCode = True .

NewIndex) = RS![Código] RS.ItemData(Combo1.MoveFirst Do While Not RS.AddItem RS![Nome] Combo1. digamos que você queira jogar na variável sNom o Nome selecionado na ComboBox e na variável iCod o código correspondente a este nome selecionado.MoveNext Loop Então.Text End If .AddItem RS![Nome do Campo] RS. depois disso feito. Veja como fazer isto: 'Abre o Recordset.ListIndex <> -1 Then iCod = Combo1. Para isso. coloque isto: Dim sNom As String. execute esta rotina: 'Abre o Recordset..63 Preenchendo um ComboBox com os Registros de um Banco de Dados Bom..ListIndex) sNom = Combo1.. proceda da seguinte forma: 'No evento que você quizer.MoveFirst Do While Not RS.EOF Combo1. por exemplo.. iCod As Integer If Combo1. RS.MoveNext Loop Uma dica interessante seria. primeiro você deve abrir o Recordset (tanto faz se isso é feito em DAO ou ADO) e. exibir na ComboBox o campo Nome e guardar na própria ComboBox o valor do campo Código.ItemData(Combo1. RS.EOF Combo1.

defina a propriedade ROW=2 e Col=3.Value) Then Tamanho = Me. FL As Field Dim Tamanho As Double 'Cada caracter corresponde a 120 twips na horizontal Tamanho = Len(DBGrid1. ByVal LasRow As Integer) If Data1. . basta referenciar a coluna e a linha e passar o valor desejado. é só usar! Preenchendo o DBGrid via Código Para preencher um DBGRID dentro de um código. coluna 3.64 DbGrid Auto Ajustar Colunas no DBGrid Private Sub DBGrid1_ColResize(ByVal ColIndex As Integer. Mude a propriedade WrapCellPointer para True. RS As Recordset. adicione o registro corrente à SellBookmarks Collection: Private Sub DBGrid_RowColChange (LatRow _ As Variant.TextWidth(FL.RecordCount Then DBGrid.Caption) * 120 Set DB = OpenDatabase("C:\Dir Do VB\Biblio. _ Cancel As Integer) Dim DB As Database.mdb") Set RS = DB.TextWidth(FL. defina a propriedade Text com o valor desejado.Fields(DBGrid1.MoveNext Loop DBGrid1.Bookmark End If End Sub Mudar de Coluna no DBGrid com TAB É E bem simples fazer isto.SelBookmarks.Columns(ColIndex).OpenRecordset("Authors") Set FL = RS.EOF 'Verifica o tamanho de cada valor do campo On Error Resume Next If Tamanho < Me. Depois.Width = Tamanho End Sub Destacando uma linha em um DBGrid Para destacar uma linha no controle DBGrid. Basta você mudar algumas propriedades do DBGrid: Mude a propriedade TabAction p/ "2-Grid Navigation".Value) End If RS.Columns(ColIndex).Columns(ColIndex). se você quiser preencher a célula da linha 2.RecordSet.RecordSet.DataField) Do While Not RS. Por exemplo.Add _ Data1.

: 'Limpa TODO o conteúdo do DBGrid1 DBGrid1.Col = 3 'Atribui o texto DBGrid1.Text = "Texto a ser inserido" .65 Ex.Cls 'Seleciona a linha 2 DBGrid1.Row = 2 'Seleciona a coluna 3 DBGrid1.

vbCritical End Sub .Drive Exit Sub ErrorDRV: MsgBox "Não há disco nesta unidade !".Path End Sub Private Sub Drive1_Change() 'tratamento de erro On Error GoTo ErrorDRV 'Indica que os diretórios que irão aparecer no 'DriveListBox serão o da unidade selecionada Dir1.66 DriveListBox Códigos Erro do DriveListBox Private Sub Dir1_Change() 'Faz com que os arquivos que irão aparecer no 'FileListBox serão os do diretório selecionado 'no DirListBox File1.Path = Dir1.Path = Drive1.

" ") & _ "Mensagem do Marquee" iLargT = TextWidth(Texto) iLarg = ScaleWidth . " ") & _ "Mensagem do Marquee" End If Case Else iNum = iNum . Texto As String iTempo = Timer Do While Not bFechado If Timer > iTempo + 0. modifique as linhas onde aparece "Mensagem do Marquee" pelo texto que você quizer que apareça. iLarg As Integer Dim iLargT As Integer.1 If iNum < 1 Then iNum = 1 Texto = "Mensagem do Marquee" bDiminui = False Else Texto = String(iNum.1110 If iLargT >= iLarg Then iNum = iNum . bDiminui As Boolean Dim iNum As Integer.2 bDiminui = True Texto = String(iNum.01 Then iTempo = Timer Select Case bDiminui Case False iNum = iNum + 1 Texto = String(iNum. 'Será usado p/ parar a animação quando o Form 'for fechado. " ") & _ "Mensagem do Marquee" End If End Select Caption = Texto End If DoEvents Loop End Sub Private Sub Form_Unload(Cancel As Integer) bFechado = True End Sub Detalhe. basta você colocar no Form o código abaixo. Coloque no Declarations do Form: Dim bFechado As Boolean Private Sub Form_Activate() Dim iTempo As Single. .67 Form Animando a Barra de Título de um Form Para criar uma animação na barra de título do Form (tipo Marquee).

_ ByVal wParam As Long.68 Arrastar um controle ou Formulário sem Título 'Na parte geral do Form: Private Declare Function SendMessage Lib _ "user32" Alias "SendMessageA" (ByVal _ hWnd As Long. p/ ele aparecer em um ponto qualquer (que 'você tenha escolhido): Private Sub Form_Load() Me.ScaleHeight .hwnd.Top = (MDIForm1. Carregar Várias Instancias do Mesmo Formulário Dim Formulario As Form1 Set Formulario = New Form1 Load Formulario Formulario. ByVal wMsg As Long.Left = (MDIForm1.Show Centralizar um Form MDIChild Para centralizar um Form MDIChild ou colocá-lo em qualquer lugar da tela utilize a seguinte rotina no evento Load: 'P/ centralizar: Private Sub Form_Load() Me. Você pode criar forms de formatos especiais facilmente. 2. 0&) End IF 'OBS.ScaleWidth .Me.Me. ByVal Y1 As _ . Experimente o exemplo abaixo e veja que efeito interessante: ' Declare estas duas APIs na seção General Declarations do form: Private Declare Function CreateEllipticRgn Lib _ "gdi32" (ByVal X1 As Long.Height) / 2 Me.: Esta dica pode também ser usada para arrastar controles (Legal!!!). &HA1.Left = Valor Me.Width) / 2 End Sub 'Ou. lParam As Any) _ As Long Private Declare Function ReleaseCapture Lib _ "user32" () As Long 'No evento Mouse_Down Dim rec& If Button And 1 Then ReleaseCapture rec& = SendMessage(Me.Top = Valor End Sub Criando forms de formatos especiais Esta é uma das mais interessantes.

ByVal Y2 As Long. ByVal bRedraw _ As Boolean) As Long 'No Form_Load: Private Sub Form_Load() Dim hr&.300.hWnd. ByVal hRgn As Long.0. ByVal X2 As Long. hr. 0.Width / Screen. ByVal X2 As _ Long.TwipsPerPixelY x = 0 'Deixa o Form ficar em forma círcular hr& = CreateEllipticRgn(0. useh) dl& = SetWindowRgn(me. _ ByVal bRedraw As Boolean) As Long Private Sub Form_Load() Show 'o form! SetWindowRgn hWnd. Fator As Byte) .True End Sub Criando um Form Circular 'No Declarations do form: Private Declare Function CreateEllipticRgn Lib "gdi32" _ (ByVal X1 As Long.69 Long. 'No Declarations: Private Declare Function CreateRoundRectRgn Lib _ "gdi32" (ByVal X1 As Long.CreateEllipticRgn(0.200). ByVal hRgn As Long. lpRect As Rect) As Long Private Type Rect Left As Long Top As Long Right As Long Bottom As Long End Type Sub Retangulo(m_hWnd As Long. useh& usew& = me. usew. _ ByVal X3 As Long. ByVal Y1 As Long.TwipsPerPixelX useh& = me. ByVal hRgn As Long. ByVal Y2 As Long) _ As Long Private Declare Function SetWindowRgn Lib "user32" _ (ByVal hWnd As Long. dl& Dim usew&. _ ByVal bRedraw As Boolean) As Long Private Declare Function GetClientRect Lib "user32" _ (ByVal hWnd As Long. True) End Sub Crinado um Form com Cantos Arredondados Você pode criar facilmente Forms ou controles usando o código a seguir: 'Coloque num Form coloque um CommandButton 'chamado Command1. ByVal Y3 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" _ (ByVal hwnd As Long. ByVal X2 As Long. ByVal Y1 As _ Long.Height / Screen. ByVal Y2 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal _ hWnd As Long.

lpRect As Rect) As Long Private Type Rect Left As Long Top As Long Right As Long Bottom As Long End Type Sub Eliptico(m_hWnd As Long) Dim RGN As Long Dim RC as Rect Call GetClientRect(m_hWnd.Left. RC.BackColor = &H808080 'Apenas para destacar a cor Eliptico Me.hWnd 'O formulário fica Elíptico Eliptico Command1. 'Coloque num Form coloque um CommandButton 'chamado Command1. Fator) SetWindowRgn m_hWnd.hWnd. ByVal Y2 As Long) _ As Long Private Declare Function SetWindowRgn Lib "user32" _ (ByVal hwnd As Long. RGN.Left. RC) RGN = CreateEllipticRgn(RC. Fator. ByVal hRgn As Long. _ ByVal bRedraw As Boolean) As Long Private Declare Function GetClientRect Lib "user32" _ (ByVal hWnd As Long. 80 Retangulo Command1. True End Sub 'Fator é a distância da curvatura do canto arredondado 'No evento click do CommandButton: Private Sub Command1_Click() Me. 'No Declarations: Private Declare Function CreateEllipticRgn Lib _ "gdi32" (ByVal X1 As Long. _ RC.Bottom. RGN. ByVal X2 As Long. RC.Bottom) SetWindowRgn m_hWnd.BackColor = &H808080 'Apenas para destacar a cor 'Coloca o formulário com os cantos arredondados 'e fator 80 de área Retangulo Me.hWnd 'O botão fica Elíptico . True End Sub 'No evento click do CommandButton: Private Sub Command1_Click() Me.70 Dim RGN As Long Dim RC as Rect Call GetClientRect(m_hWnd. ByVal Y1 As _ Long. 30 End Sub Criando um Form Elíptico Poucos programas utilizam esse recurso do Windows 95 que cria Forms e até mesmmo outros objetos em forma elíptica. RC.Right. RC) RGN = CreateRoundRectRgn(RC.Right.hWnd.Top. RC.Top. _ RC.

Y = 75 Pontos(7).X = 50 Pontos(6).hwnd.Y = 50 RGN = CreatePolygonRgn(Pontos(1).X = 50 Pontos(2).Y = 0 Pontos(2). Até hoje eu só vi o 4 programas com formulários diferentes: O Vibe MP3player 3D.71 End Sub Criando um Form em forma de Estrela (Polígono) Essa API possibilita a criação de um Form de qualquer forma poligonal.Height = 1500 'Determina as oito coordenadas de uma estrela de 'quatro pontas (em Pixel) Pontos(1). Norton Utilities 3 e o RomSoft Photo Collection 10000. Norton CrashGuard.Y = 50 Pontos(5).X = 75 Pontos(4). _ ByVal bRedraw As Boolean) As Long Private Type POINTAPI X As Long Y As Long End Type 'No evento Form_Load: Private Sub Form_Load() Dim Pontos(8) As POINTAPI 'Cria uma matriz de 8 Pontos Dim RGN As Long Me. Veja o Exemplo.X = 25 Pontos(8). que cria um formulário na forma de uma estrela de quatro pontas: 'No Declarations: Option Base 1 Private Declare Function CreatePolygonRgn Lib _ "gdi32" (lpPoint As POINTAPI.Y = 0 Pontos(4). ByVal nCount _ As Long.X = 0 Pontos(1). 0) SetWindowRgn Me.X = 0 Pontos(7).Y = 25 Pontos(3). True End Sub A * * * API CreatePolygonRgn possui os seguintes parâmetros Pontos(1) => Primeiro elemento da matriz 8 => Número de vértices do polígono (Elementos da matriz) 0 => Como ficaria o polígono se as suas linhas se sobrepossem (0 ou 1) .Y = 100 Pontos(8). RGN.X = 100 Pontos(3). 8.X = 100 Pontos(5).Y = 100 Pontos(6). O uso de polígonos é mais complexo que os outros métodos de criação de Forms citados anteriormente. ByVal hRgn As Long. ByVal nPolyFillMode As Long) _ As Long Private Declare Function SetWindowRgn Lib "user32" _ (ByVal hwnd As Long.Width = 1500 Me.

ByVal _ hRgn As Long.P(3).ScaleHeight . ByVal _ nCount As Long.Me.y = 26 z.P(1).x = Me. ByVal nCount As _ Long) As Long Private Declare Function EndPath Lib "gdi32" _ (ByVal hdc As Long) As Long Private Declare Function PathToRegion Lib _ "gdi32" (ByVal hdc As Long) As Long Private Declare Function GetRgnBox Lib "gdi32" _ (ByVal hRgn As Long. _ 3.ScaleLeft z.x = ((Me.x = 26 z. _ ByVal X As Long.y = Me.ScaleLeft z. ByVal _ lpString As String.Me.ScaleMode = vbPixels z.ScaleHeight .P(2). ByVal Y As Long.P(3). True End Sub Criando um Form com forma do Logotipo do Windows 'Coloque o seguinte código no form: Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function BeginPath Lib "gdi32" _ (ByVal hdc As Long) As Long Private Declare Function TextOut Lib "gdi32" _ Alias "TextOutA" (ByVal hdc As Long.Me. ByVal nPolyFillMode _ As Long) As Long Private Declare Function SetWindowRgn Lib _ "user32" (ByVal hWnd As Long.P(1). 3). ByVal bRedraw As Boolean) _ As Long Private Sub Form_Load() Dim z As tP Me.P(1).ScaleLeft SetWindowRgn hWnd.P(2).y = Me. CreatePolygonRgn(z.ScaleHeight .ScaleLeft) / _ 2) + 13 z.Me.ScaleHeight .72 Criando um Form em forma de Triângulo 'Coloque este código num Form: Option Explicit Private Type POINTAPI x As Long y As Long End Type Private Type tP P(1 To 3) As POINTAPI End Type Private Declare Function CreatePolygonRgn Lib _ "gdi32" (lpPoint As POINTAPI. lpRect As RECT) _ As Long Private Declare Function CreateRectRgnIndirect _ Lib "gdi32" (lpRect As RECT) As Long Private Declare Function CombineRgn Lib "gdi32" _ .

1 End Sub Private Sub Form_MouseDown(Button As Integer. X As Single.Name = "Wingdings" Me. _ ByVal 0& End Sub 'Depois é só executar q o Form ficará no formato do 'logotipo do Windows!!! Criando um Form no Formato da Imagem Desejada 'No módulo: Public Declare Function SetWindowRgn Lib "user32" _ (ByVal hwnd As Long. ByVal hSrcRgn2 As Long. WM_NCLBUTTONDOWN. hRgn1.Font. Shift _ As Integer. hRgn. Y As Single) ReleaseCapture SendMessage hwnd. _ lParam As Any) As Long Private Private Private Private Private Const RGN_AND As Long = 1 Private Const WM_NCLBUTTONDOWN As Long = &HA1 Private Const HTCAPTION As Long = 2 Private Function GetTextRgn() As Long Dim hRgn1 As Long.73 (ByVal hDestRgn As Long. ByVal hRgn As Long.Size = 200 hRgn = GetTextRgn() SetWindowRgn hwnd. _ ByVal bRedraw As Boolean) As Long Declare Function ReleaseCapture Lib _ "user32" () As Long Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. ByVal _ nCombineMode As Long) As Long Declare Function DeleteObject Lib "gdi32" _ (ByVal hObject As Long) As Long Declare Function SetWindowRgn Lib "user32" _ (ByVal hwnd As Long. ByVal hRgn As Long. ByVal hSrcRgn1 _ As Long.Font. hRgn2 As Long Dim rct As RECT BeginPath hdc TextOut hdc. ByVal wParam As Long. hRgn2. Chr$(255). rct hRgn2 = CreateRectRgnIndirect(rct) CombineRgn hRgn2. _ ByVal wMsg As Long. _ ByVal bRedraw As Boolean) As Long Public Declare Function DeleteObject Lib "gdi32" _ . 10. 1 EndPath hdc hRgn1 = PathToRegion(hdc) GetRgnBox hRgn1. GN_AND DeleteObject hRgn1 GetTextRgn = hRgn2 End Function Private Sub Form_DblClick() Unload Me End Sub Private Sub Form_Load() Dim hRgn As Long Me. HTCAPTION. 10.

_ ByVal wMsg As Long._ bmHeight) 'Inicia procurando a imagem de cima para 'baixo For Y = 0 To BM. BM As BITMAP 'Cria um novo DC. então procuramos a imagem hdc = CreateCompatibleDC(0) If hdc Then 'Coloca o novo DC na Imagem SelectObject hdc. ByVal wParam As Long. ByVal X2 As Long. tRgn As Long Dim X As Integer. BM hRgn = CreateRectRgn(0. Y As Integer.74 (ByVal hObject As Long) As Long Public Declare Function ReleaseCapture Lib _ "user32" () As Long Public Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. ByVal _ nCombineMode As Long) As Long Private Declare Function DeleteDC Lib "gdi32" _ (ByVal hdc As Long) As Long Private Declare Function GetPixel Lib "gdi32" _ (ByVal hdc As Long. ByVal hSrcRgn1 _ As Long. ByVal nCount As Long. cTransparent As Long) Dim hRgn As Long. X0 As Integer Dim hdc As Long. 0. Len(BM). lpObject As _ Any) As Long Private Declare Function CreateRectRgn Lib _ "gdi32" (ByVal X1 As Long. cPicture 'Pega as dimensões e cria uma nova região 'de retangulo GetObject cPicture.bmHeight . BM. _ lParam As Any) As Long Private Declare Function CreateCompatibleDC Lib _ "gdi32" (ByVal hdc As Long) As Long Private Declare Function SelectObject Lib _ "gdi32" (ByVal hdc As Long. ByVal Y2 As Long) _ As Long Private Declare Function CombineRgn Lib "gdi32" _ (ByVal hDestRgn As Long. ByVal Y1 As _ Long. ByVal hObject _ As Long) As Long Private Declare Function GetObject Lib "gdi32" _ Alias "GetObjectA" (ByVal hObject As _ Long.bmWidth. ByVal hSrcRgn2 As Long. BM. _ ByVal Y As Long) As Long Public Const WM_NCLBUTTONDOWN As Long = &HA1 Public Const HTCAPTION As Long = 2 Private Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type Public Function GetBitmapRegion(cPicture As _ StdPicture. ByVal X As Long.

bmWidth And GetPixel(hdc.75 For X = 0 To BM. siga os seguintes passos: . vbBlack) SetWindowRgn Me. Y) <> cTransparent X = X + 1 Wend 'Marca o Início da linha de píxeis não 'transparentes X0 = X 'Procura uma linha com Píxeis 'transparentes While X <= BM. _ X. Y + 1) CombineRgn hRgn. 'Coloque a imagem na propriedade Picture do Form 'e.Picture.hwnd. Lembrando que se a cor estiver dentro da figura. você pode usar a constante vbBlack e apagar toda a cor preta da figura.bmWidth 'Procura uma linha de píxeis não 'transparentes While X <= BM. Y) = cTransparent X = X + 1 Wend 'Cria uma nova região que corresponda à 'linha dos píxeis transparentes e então 'remove ele da região principal If X0 < X Then tRgn = CreateRectRgn(X0. hRgn. True End Sub Criando uma Tela de Splash para seu Programa Para ter uma tela de splash (aquela que aparece enquanto o programa está sendo carregado) em seu programa. hRgn. X. Y. tRgn. deixando o form transparente naquele lugar. 4 'Libera a memória usada para a nova 'região temporária DeleteObject tRgn End If Next X Next Y 'Volta ao endereço de memória da imagem pronta GetBitmapRegion = hRgn 'Libera memória apagando a imagem DeleteObject SelectObject(hdc. no Form_Load: Private Sub Form_Load() Dim hRgn As Long If hRgn Then DeleteObject hRgn hRgn = GetBitmapRegion(Me. cPicture) End If 'Libera memória apagando o DC criado DeleteDC hdc End Function A função GetBitmapRegion pede dois parâmetros: a figura e uma cor a ser apagada.bmWidth And GetPixel(hdc. ela será apagada também. Se o fundo da sua figura for preto. _ X.

Coloque em seu projeto um novo Form e configure-o conforme o seu gosto para que ele seja sua tela de splash. 150. 2º . _ 130. 3º .MousePointer = 0 End Sub Private Sub Form_Load() 'Esta linha é uma chamada de API. 0. 0)-(k+1. Degradê em Forms 'Degradê se faz utilizando a variação de cores: 'Ex: para fazer num Form (tons de azul) Dim k as integer Form1. Finalmente.line (k.Coloque este código nesse form: Private Sub Form_Activate() Screen. Insira um picturebox no form. 'Para saber mais sobre ela veja a 'dica Formulário ficar por cima de todos Call SetWindowPos(frmSplash.ScaleWidth = 255 Form1.Me.76 1º .hWnd. Se não for colocado o DoEventes o SetWindowsPos não funcionará.k) Next Fazer um form maior que a tela Faça um form com o tamanho da tela.rgb(0.MousePointer = 11 DoEvents 'Troque este "frmPrincipal" pelo nome do 'principal form de seu programa.Show 'Esta linha é uma chamada de API.0. 'Para saber mais sobre ela veja a 'dica Dar uma Pausa em seu Programa Sleep (1000) Unload Me Screen. via código. frmPrincipal.DrawWidth = 2 For k = 0 to 255 Form. 0.height). -1.Form1.AutoRedraw=True Form1.Height .Height) / 10 . aumente o tamanho do picture e ajuste os valores da barra de rolagem.Abra a tela de propriedades do seu projeto e selecione este form que você acaba de criar em "Startup Object:" (para que ele seja o 1º form a aparecer quando seu programa for executado). &H1) End Sub O uso do DoEvents nesse caso é para permitir que o primeiro Form (o frmSplash) apareça sobreposto atraves da chamada da API SetWindowPos.Max = (Picture1. Scroll.

ByVal _ hWndInsertAfter As Long. ByVal cy As Long.&H1 Or &H2) Passe nothing aos forms com cautela 'Use esta função para dar Nothing em seus forms Private Sub Form_Unload (Cancel As Integer) Dim Form As Form For Each Form In Forms If Form Is Me Then Set Form = Nothing Exit For End If Next Form End Sub . ByVal x As _ Long.77 'P/ rolar a barra: Sub Scroll_Change() Picture1.hwnd.Top + Scroll.Count Do While FRM > 0 Unload Forms(FRM-1) If FRM = Forms. qdo quizer que seu programa seja finalizado.Value End Sub Fechando todos os Forms Abertos 'Crie a seguinte função: Public Function Fechar() Dim FRM As Integer FRM = Forms.0.Count Then Exit Do End If FRM = FRM . ByVal cx As _ Long.0.0. 'ao invés de usar o comando "End". ByVal y As Long.Top= -1 * Picture1. ByVal wFlags _ As Long) As Long 'No evento Form_Load do formulário. chame esta função: Fechar Formulário ficar por cima de todos 'Na seção geral do módulo: Public Declare Function SetWindowPos Lib _ "user32" (ByVal hwnd As Long.0.-1.1 Loop End Function 'Então. Call SetWindowPos(Me.

ByVal dwNewLong As _ Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long. 255) 'Set FillColor.hWnd). Line -(200. ByVal nIndex As Long) As Long Private Const WS_MINIMIZEBOX As Long = &H20000 Private Const WS_MAXIMIZEBOX As Long = &H10000 Private Const GWL_STYLE As Long = (-16) 'No evento MDIForm_Load do MDIForm: Sub MDIForm_Load() Dim lWnd as Long lWnd = GetWindowLong(Me.. GWL_STYLE) _ _ _ _ .200. 50) FillStyle = vbFSSolid 'Set FillStyle to solid. 50)-(300.78 Pintar um local do formulario com a cor escolhida Private Declare Function FloodFill Lib _ "gdi32" (ByVal hDC As Long. _ SC_MOVE. 200) Line -(100.ForeColor End Sub Removendo o move Em alguns casos. ForeColor = vbBlack 'Set draw line to black. ByVal nPosition%. 128. é interessante impedir o usuário de mover um form.. Dim Res% Res = RemoveMenu(GetMenu(Form. No VB isto pode ser implementado com APIs: Declare Function GetMenu% Lib "User" _ (ByVal hWnd%) Declare Function RemoveMenu% Lib "User" _ (ByVal hWnd%. ByVal Y As Long. FloodFill hDC.100. MF_BYPOSITION) Removendo os Botões MIN-MAX de Forms MDI 'Coloque o seguinte código num módulo: Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long. Line (100. ByVal _ crColor As Long) As Long Private Sub Form_Click() ScaleMode = vbPixels 'Windows draws in pixels.hWnd. _ ByVal wFlags%) '. FillColor = RGB(128. ByVal _ X As Long. ByVal nIndex As Long. 'Call Windows API to fill. 50) 'Draw a triangle.

hWnd. lWnd) End Sub Saber se um form está aberto dim v as Integer For v = 0 To Forms.Name = "NomeDoForm" Then msgbox "Está aberto!" Exit For End If Next .Count if Forms(v). GWL_STYLE.79 'Tira o botão de minimizar lWnd = lWnd And Not (WS_MINIMIZEBOX) 'Tira o botão de maximizar lWnd = lWnd And Not (WS_MAXIMIZEBOX) lWnd = SetWindowLong(Me.

É possível "simular" a aceitação de teclas através de código.Text) > 0 Then Grid1.80 Grid Digitação em Grid O controle Grid é uma tabela de exibição de dados. 10. .Text = "" End Select End Sub Sub Grid1_KeyPress (keyascii As Integer) Select Case keyascii Case Is <> 8.Text = Grid1.Text & Chr(keyascii) End Select End Sub No evento KeyPress todos os caracteres imprimíveis são acrescentados ao texto da célula ativa do Grid. Basta um clique de mouse na célula e digitar. 9. que não permite a digitação direta de valores em suas células (não estou falando do DBGrid). Shift As Integer) Select Case KeyCode Case &H8 'BACKSPACE If Len(Grid1. (Len(Grid1.1)) End If Case &H2E 'DEL Grid1. O programador deve ter incluído as rotinas abaixo nos eventos KeyDown e KeyPress.Text) . 13'não imprimíveis Grid1.Text = Left(Grid1. Sub Grid1_KeyDown (KeyCode As Integer. O evento KeyDown apaga o último caracter com BACKSPACE ou o texto inteiro com a tecla DEL.Text.

ATENÇÃO!!! Isso PODE não ser útil se houver mudanças nos índices dos botões. em disign-time.81 ImageList Alterando o Conteúdo da ImageList sem Desvincula-la da ToolBar Para fazer isto. . recorte a Toolbar (selecione-a e Ctrl+X) e altere o conteúdo da ImageList (adicionar imagens. cole a Toolbar novamente (selecione o Form e Ctrl+V). excluir imaens e etc). Então.

Text) End Sub Colocando ScrollBar Horizontal num ListBox 'Coloque o seguinte código num módulo: Option Explicit Private Private Private Private Const Const Const Const LB_GETHORIZONTALEXTENT As Long = &H193 LB_SETHORIZONTALEXTENT As Long = &H194 DT_CALCRECT As Long = &H400 SM_CXVSCROLL As Long = 2 Public Type Rect Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function DrawText Lib "user32" _ Alias "DrawTextA" (ByVal hDC As Long. -1.Tag <> "" Then currWidth = CLng(ctl.82 ListBox Achar uma palavra num ListBox Public Const LB_FINDSTRING As Long = &H18F Public Const LB_FINDSTRINGEXACT As Long = &H1A2 Public Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. _ ByVal wMsg As Long. lpRect As Rect. _ LB_FINDSTRING.ListIndex = Sendmessage(ListBox1. Optional ByVal _ dwNewItemData As Variant) As Long Dim RC As Rect Dim newWidth As Long Dim currWidth As Long Dim sysScrollWidth As Long Dim OldFont As StdFont If ctl. ByVal wParam As Long.Tag) End If . ByVal nCount As _ Long. _ ByVal wMsg As Long. _ lParam As Any) As Long Private Sub Text1_Change() ListBox1. _ lParam As Any) As Long Public Function AdicionaItem(ByRef ctl As Control. _ ByVal sNewItem As String. ByVal wParam As Long.hWnd. ByVal wFormat As _ Long) As Long Private Declare Function GetSystemMetrics Lib _ "user32" (ByVal nIndex As Long) As Long Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. _ Byval Text1. _ ByVal lpStr As String.

'declarations: .Font = ctl. "Texto") List1. Call AdicionaItem(List1. mover a localização de um item numa ListBox..Parent.Right + sysScrollWidth If newWidth > currWidth Then Call SendMessage(ctl.selected (-1) = False Isto não funciona em VB4.newIndex) = dwNewItemData End If End If AdicionaItem = ctl.83 Set OldFont = ctl. DT_CALCRECT) Set ctl.Font Call DrawText(ctl. Movendo itens em uma ListBox Para.. _ RC.newIndex End Function 'No form: Private Sub Form_Load() 'Detalhe.hwnd. _ LB_SETHORIZONTALEXTENT. através do mouse. sNewItem. "Ele será exibido. _ ByVal 0&) ctl. "Coloque o texto que será adicionado aqui") Call AdicionaItem(List1.Parent.TopIndex = NovoIndex O resultado isso é que ele irá posicionar a barra de rolagem vertical da ListBox para que este item recem-adicionado possa ficar visível. NÃO use o List1.Parent.Font = OldFont sysScrollWidth = GetSystemMetrics(SM_CXVSCROLL) newWidth = RC. -1&.Parent.hDC. "Não se preocupe se o texto for muito grande") Call AdicionaItem(List1. use o código abaixo.AddItem!!! 'Veja como adiciona algumas linhas. Desmarcar todos os itens de uma lista Uma forma rápida de retirar qualquer seleção de uma listbox é: list1.ItemData(ctl. newWidth.AddItem sNewItem If Not IsMissing(dwNewItemData) Then If IsNumeric(dwNewItemData) Then ctl..Tag = newWidth End If ctl.Font Set ctl. Veja o exemplo: Dim NovoIndex As Long NovoIndex = AdicionaItem(List1. seja como for!!!") End Sub Uma dica legal é usar a propriedade TopIndex.

RemoveItem Old_Index List1. Shift As _ Integer. _ ByVal wMsg As Long. Y As Single) Old_index = List1.ListIndex Tmp_text = List1.hwnd) End Sub P/ adicionar os ítens faça da seguinte maneira: Lista.text End Sub Sub List1_MouseUp (Button As Integer. Shift As _ Integer. iNumColumns. ByVal wParam As Long.ListIndex If Old_index <> New_index Then List1. iListTabs(0)) End Sub 'No Form_Load: Private Sub Form_Load() 'lListHandle é o handle da ListBox Call ListColumns(lstLista.AddItem TmpText. Y As Single) New_index = List1.AddItem "Coluna 1" & vbTab & "Coluna 2" Por exemplo (seguindo o nome da ListBox passado p/ a função no Form_Load): .84 Dim Tmp_Text As String Dim Old_index As Integer Dim New_index As Integer 'mouse events: Sub List1_MouseDown (Button As Integer. NewIndex End If End Sub Multiplas Colunas em um ListBox 'Num módulo: Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. _ LB_SETTABSTOPS. X As Single. _ lParam As Any) As Long Private Const LB_SETTABSTOPS = &H192 Public Sub ListColumns(lListHandle As Long) Dim iNumColumns As Long 'Coloque o nº de colunas que o ListBox 'terá -1 no array a seguir: Dim iListTabs(1) As Long Dim Ret As Long 'O ListBox terá 2 colunas iNumColumns = 2 'A 1º coluna terá 24 caracteres e a 2º 48 '24 caracteres * 4 = 96 iListTabs(0) = 96 ' 96/4 = 24 caracteres '48 caracteres * 4 = 192 iListTabs(1) = 192 ' 192/4 = 48 caracteres Ret = SendMessage(lListHandle. X As Single.

AddItem "Coluna "Coluna lstLista.AddItem "Coluna "Coluna lstLista.85 lstLista.AddItem "Coluna "Coluna lstLista.AddItem "Coluna "Coluna 1 data1" & vbTab & _ 02 data1" 01 data2" & vbTab & _ 02 data2" 001 data3" & vbTab & _ 02 data3" 0001 data4" & vbTab & _ 02 data4" .

Sorted = False .SortKey Then . a ordem será invertida.86 ListView Ordenando Colunas da ListView Dê ao seu controle ListView (32 bits) a funcionalidade de ordenação do Windows 95 Explorer.SortOrder = (.SortOrder + 1) Mod 2 Else . Private Sub ListView1_ColumnClick (ByBal _ ColumnHeader As ColumnHeader) Whith ListView1 If (ColumnHeader.Index -1) = .Sorted = True End If End With End Sub . Este código ordena a lista por qualquer coluna.SortOrder = 0 .1 . Se a lista já estiver ordenada por esta coluna.SortKey = ColumnHeader .

Isto impede o programador de limpar a text do controle diretamente (masked1. Logo.Text = "" MaskEd. algumas possuem o formato # (aceitam somente números).87 Masked Edit Box Limpar o controle Masked Edit Box O controle MS MaskedEditBox apenas aceita entrada de dados dentro da máscara formatada (mask). Por exemplo.Mask MaskEd1. o "" não seria aceito. Depois.text = ""). Uso isto no evento Data1_ValidationError quando adiciono um novo registro. pois o caracter espaço (ou nulo) pode não se encaixar no formato da máscara.Mask = vTemp . vTemp = MaskEd1.Mask = "" MaskEd1. Este problema é resolvido por este código: Removendo a máscara é possível limpar o texto. basta devolver a máscara original ao controle.

ByVal wFlags As Long. coloque nele uma picture box (autosize=true) com um bitmap de tamanho máximo 13x13 e adicione o seguinte código em um botão: Private Sub Command1_Click() 'Recupera o handle do menu formulário hMenu& = GetMenu(Form1. ByVal b As Boolean. 0) . ByVal nPosition _ As Long. incluindo bitmaps nos ítens de menu.hwnd) 'Recupera o handle do 1º menu hSubMenu& = GetSubMenu(hMenu&. ByVal _ hBitmapUnchecked As Long. ByVal un As Long. Coloque o código a seguir em um módulo: Declare Function GetMenu Lib "user32" (ByVal _ hWnd As Long) As Long Declare Function GetSubMenu Lib "user32" (ByVal _ hMenu As Long. ByVal nPos As Long) As Long Declare Function GetMenuItemID Lib "user32" _ (ByVal hMenu As Long. _ lpMenuItemInfo As MENUITEMINFO) As Boolean Public Const MIIM_ID As Long = &H2 Public Const MIIM_TYPE As Long = &H10 Public Const MFT_STRING As Long = &H0& Agora crie um formulário. ByVal _ hBitmapChecked As Long) As Long Public Const MF_BITMAP As Long = &H4& Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Declare Function GetMenuItemCount Lib "user32" _ (ByVal hMenu As Long) As Long Declare Function GetMenuItemInfo Lib "user32" _ Alias "GetMenuItemInfoA" (ByVal hMenu As _ Long. ByVal nPos As _ Long) As Long Declare Function SetMenuItemBitmaps Lib "user32" _ (ByVal hMenu As Long.88 Menús Colocando bitmaps em menus Com esta dica você poderá dar um incremento visual em seus programas.

Enabled = False PopupMenu myMenu Text1. Shift _ As Integer.89 'Pega o menuId do 1º submenu hID& = GetMenuItemID(hSubMenu&.Enabled = True End If End Sub . um menu de sistema (default) será mostrado primeiro e o seu menu só aparecerá quando o menu default for fechado. End Sub Menus popup em caixa de Texto Se você quiser mostrar um menu popup para um texto. Picture1. e outro 'para o não selecionado. MF_BITMAP. X As Single. hID&.Picture. Y as Single) If Button = 2 Then Text1. 0) 'Adiciona o bitmap ao submenu SetMenuItemBitmaps hMenu&. Para contornar este problema: Private Sub Text1_MouseDown(Button As Integer. _ Picture1.Picture 'Você pode colocar dois bitmaps no menu 'Uma para o estado selecionado.

e: 'P/ abra a porta: MSComm1.Input End If DoEvents Wend 'P/ enviar dados: MSComm1.PortOpen = True If MSComm1.Output = Text2 'P/ fechar a conexão: MSComm1. Porta e tudo mais do do MsComm1.90 Microsoft Comm Control Trabalhando com Microsoft Comm Control Defina Settings.PortOpen = False .PortOpen = True 'P/ receber dados: While MSComm1.InBufferCount > 0 Then Text1= Text1& MSComm1.

Height = " & _ Str$(bmp.Picture =ClipBoard.Picture 'COPIAR A FIGURA DA ÁREA DE TRANSFERENCIA (COLAR) Me. é utilizar a API GetObject.Picture = LoadPicture() Dimensões de um bitmap Você pode utilizar o controle PictureBox com a propriedade AutoSize=True. para que o bitmap caiba nele. Len(bmp). as imagens são salvas como binárias em arquivos FRX. Salvando o form com texto(FRM). As propriedades Height e Width deste controle contém as dimensões do bitmap. ByVal nCount%. Note que os valores destas propriedades estão em Twips.Picture = Picture1.GetData() 'ABRIR FIGURA DE UM ARQUIVO Me. (O Bitmap deve ser carregado em um PictureBox chamado Picture1): Dim bmp As BITMAP. Carregue o bitmap no PictureBox. DIB. WMF) que contém a imagem. ICO.bmHeight) . usando a função LoadPicture. Veja o exemplo abaixo: Coloque o seguinte código em um módulo: Type BITMAP '14 bytes bmType As Integer bmWidth As Integer bmHeight As Integer bmWidthBytes As Integer bmPlanes As String * 1 bmBitsPixel As String * 1 bmBits As Long End Type Declare Function GetObjectAPI% Lib "GDI" Alias _ "GetObject"(ByVal hObject%. _ lpObject As Any) Coloque o seguinte código aonde você quer obter as dimensões do bitmap. bmWidth e bmHeight representando as dimensões do bitmap em pixels. 'COPIAR DE OUTRO OBJETO Me. informando o arquivo (BMP. Uma outra forma. bmp) Print "Width = " & Str$(bmp.bmWidth) & ".bmp") 'LIMPANDO FIGURA Me. ret% ret = GetObjectAPI(picture1.Picture. O controle irá ajustar o seu tamanho automaticamente. Esta função retorna a estrutura do Bitmap em dois membros. é possível defini-la em tempo de desenho.Picture = LoadPicture("C:\Windows\Winlogo.91 PictureBox Carregando figuras em Pictures Em qualquer objeto que tenha a propriedade PICTURE.

Assim. PSET. Count).Cls Picture1. Quando transformamos em bitmaps incorporam os pontos (e a cor) de fundo. o truque acima é uma ótima forma de converter ICO e WMF em BMP.Print Mid$(Texto. "C:\Windows\Logo. serve para riscar um arquivo: Dim X As Integer Dim Y As Integer Picture1.Picture = Picture1. Count = Count + 1 If Count > Len(Texto) Then Count = 1 End If End Function 'No Form: 'Coloque uma PictureBox e um Timer com interval=1000. LINE e CIRCLE) em tempo de execução. Detalhe: independente do formato da imagem contida em picture. Ícones e metafiles podem possuir um fundo transparente.Picture = Picture1. a propriedade image contém sempre um bitmap.ico") X = Picture1. Veja o exemplo: . 0)-(X. basta fazer: Picture1. 0) Picture1.Image SavePicture Picture1.Line (0. Texto.image Esta linha de comando atribui o resultado dos gráficos à imagem principal. a picture somente converte o traço após receber a image.bmp" No exemplo acima. Para imcorporar uma imagem à picture. Private Sub Timer1_Timer() MostrarTexto End Sub Salvando e Pintando em cima de figuras A propriedade IMAGE permite pintar com os métodos (PRINT. No exemplo abaixo. RGB(255.92 Rolando textos em PictureBox 'Num módulo: Public Function MostrarTexto() Static Count As Integer Static Texto As String If Len(Texto) = 0 Then Count = 1 Texto = "Rolando texto numa Picture Box!" End If Picture1.ScaleHeight Picture1. 0. Y).Picture = LoarPicture("C:\Windows\Logo.ScaleWidth Y = Picture1.

255) Picture1.Picture = Picture1.bmp" .Picture = LoadPicture("C:\Icons\Mylogo.Image 'CONVERTENDO EM BMP SavePicture Picture1. "C:\Windows\Mylogo.ico") 'ATRIBUINDO COR DE FUNDO Picture1.93 '*** CONVERTENDO ICO EM BMP *** Picture1.BackColor = RGB(255. 255.

sFind) If sFind = "" Then Exit Sub RichTextBox1.SelPrint CommonDialog1. "Procura".SelPrint Printer.hDC Mas e para imprimir numa impressora selecionada num CommonDialog??? Também é simples.hDC Localizando um Texto num RichTextBox Isto é muito simples de ser feito.Find sFind 'Para localizar a próxima ocorrencia do mesmo texto: RichTextBox1. Veja o exemplo: 'No evnto que você desejar: 'Seleciona as Flags necessárias CommonDialog1. .Flags + _ cdlPDAllPages Else CommonDialog1. Uso Geral do Controle RichTextBox 'Para abrir um arquivo: CommonDialog1.Flags = cdlPDReturnDC + _ cdlPDNoPageNums If RichTextBox1. Veja: 'No evnto que você desejar: RichTextBox1. Se o texto digitado existir no RichTextBox.FileName) .LoadFile (CommonDialog1.SelStart + _ RichTextBox1. Veja o código a seguir: 'No declarations do Form: Public sFind As String 'No evento onde você deseja localizar um determinado 'Texto no RichTextBox: sFind = InputBox("Localizar o que?".SelLength = 0 Then CommonDialog1.Flags = cdlFontes.94 RichTextBox Imprimindo o Conteúdo de um RichTextBox Para imprimir o conteúdo de um RichTextBox.Find sFind.SelStart = RichTextBox1.ShowOpen RichTextBox1. Len(RichTextBox1) Pronto.Flags + _ cdlPDSelection End If 'Abre o CommonDialog para seleção/configuração 'de impressoras CommonDialog1.ShowPrinter 'Manda imprimir o conteúdo do RichTextBox na 'impressora selecionada no CommonDialog RichTextBox1.Flags = cdlFontes. ele será selecionado.SelLength + 1 RichTextBox1. basta você passar a ele o hDC da impressora.

95 'Para salvar um arquivo: CommonDialog1.FontUnderline End With .ShowSave RichTextBox1.SelFontName = CommonDialog1.FileName) 'Para mudar a fonte usada (muda apenas p/ o pedaço 'de texto selecionado.SelItalic = CommonDialog1.SelStrikeThru = CommonDialog1.FontBold .Flags = cdlCFBoth + cdlCFEffects CommonDialog1.SelFontSize = CommonDialog1.ShowFont With RichTextBox1 .FontStrikethru .SelUnderline = CommonDialog1. ou para todo o texto que vier 'a ser digitado apartir daquele ponto): CommonDialog1.FontSize .SaveFile (CommonDialog1.SelBold = CommonDialog1.FontItalic .FontName .

GWL_STYLE) ret& = SetWindowLong&(Text1.) e a virgula (. ByVal dwNewLong As Long) Private Const ES_NUMBER As Long = &H2000& Private Const GWL_STYLE As Long = (-16) 'No Click do CommandButton ponha: Private Sub Command1_Click() Dim tmpValue& Dim fAlignment& Dim ret& fAlignment& = ES_NUMBER tmpValue& = GetWindowLong&(Text1. Ele não aceitará nem mesmo o ponto (. estas teclas podem ser capturadas: Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii = 3 Or KeyAscii = 22 Then KeyAscii = 0 'CTRL+C = 3 e CTRL+V = 22. _ ByVal nIndex As Long.). Bloqueando funções Copiar e Colar em caixas de texto Bloqueando funções Copiar e Colar em caixas de texto as funções Copiar (CTRL+C) e Colar (CTRL+V) estão sempre disponíveis para TextBoxes. _ ByVal nIndex As Long) Private Declare Function SetWindowLong& Lib "user32" _ Alias "SetWindowLongA" (ByVal hwnd As Long. 'No Declarations ponha: Option Explicit Private Declare Function GetWindowLong& Lib "user32" _ Alias "GetWindowLongA" (ByVal hwnd As Long. Recurso não documentado End Sub Forçando Caracteres Maiúsculos ou Minúsculos Para facilitar a digitação de caracteres maiúsculos ou minúsculos.Refresh End Sub Quando você executar perceberá que o TextBox permite que você digite QUALQUER coisa. Private Sub Controle_KeyPress (KeyAscII as Integer) 'Converter p/ maiúsculos KeyAscII = Asc(UCase(Chr(KeyAscII))) .hwnd.96 TextBox Apenas Números num TexBox 'Coloque num form um TextBox e um CommandButton. tmpValue& Or fAlignment&) Text1. mas e se você não desejar que estas funções funcionem? Você deve supor que o evento KeyDown consegue detectar CTR+C e CTRL+V. mas quando você precionar o CommandButton ele SÓ receberá números. converta cada caracter no evento KeyPress. mas não detecta. independente do pressionamento de Caps Lock ou do Shift. GWL_STYLE. No evento KeyPress. 'geram estas combinações.hwnd. valores não constantes na tabela ANSI.

Text = = = = "linha 1" text1. text1.Text & Chr$(13) & Chr$(10) & "linha 2" text1. basta gerar o caracter 13. o caracter digitado (parâmetro KeyAscii) vale 10 ou 13 (os dois valores do ENTER na tabela de caracteres ANSI). O Caracter ENTER Ele nunca aparece. Dim vmsg As String vmsg = "linha 1" vmsg = vmsg & Chr$(13) & "linha 2" vmsg = vmsg & Chr$(13) vmsg = vmsg & Chr$(13) & "linha 4" MsgBox vmsg.Text text1. No Word é representado por um .Text & Chr$(13) & Chr$(10) & "linha 4" 4) Numa MsgBox. 2) Em quaisquer consistências (como TextBox_Change ou análise de variáveis string) a função Asc retornará 10 ou 13.Text & Chr$(13) & Chr$(10) text1. mas existe. nas caixas de texto do VB aparece um y (caracter não imprimível). sTitulo As String .1)) If Asc(texto) = 10 or Asc(texto) = 13 then msgbox "Foi digitado um ENTER" 3) Numa textbox. Mas como aceitar e gerar este caracter? 1) No evento KeyPress. "texto 2 Procurando Strings em um TextBox 'No Declarations do Form: Private iLast As Integer Private iFirst As Integer Private sFind As String Private Sub Text1_GotFocus() 'Valor Default p/ as variaveis iLast = 1 iFirst = 1 End Sub Private Sub Text1_KeyUp(KeyCode As Integer.97 'Converter p/ maiúsculos KeyAscII = Asc(LCase(Chr(KeyAscII))) End Sub Para que esta rotina funcione para todos os campos do form. 0.Text text1. _ Shift As Integer) Dim sMensagem As String. é preciso gerar (via função chr) o caracter 10 mais o caracter 13. altere a propriedade KeyPreview do mesmo para True e coloque o código no evento Form_KeyPress. Texto = Left(Texto.Text text1. (Len(Texto) .

SelStart = iPos . Titulo. sFind) iFirst = iPos If iPos = 0 Then iLast = 1 iPos = InStr(iLast.Text.Text. iPos_Fim As Integer bCtrlDown = (Shift And vbCtrlMask) > 0 bProcura = False If KeyCode = vbKeyF And bCtrlDown Then 'A Tecla Ctrl+F foi pressionada sMensagem = "Entre com o Texto a ser procurado!" sTitulo = "Procura" sDefault = "" sFind = InputBox(Mensagem. _ iFirst).Text. entao é verificado se a busca 'será feita "para baixo" (F3) ou "para cima" (Shift+F3) If KeyCode = 114 Then If InStr(Text1.1 Text1. A primeira coisa a ser feita é verificar se 'realmente existe em algum ponto do TextBox a string 'informada no InputBox. 'Existindo a string. vbInformation Exit Sub End If If Shift = 1 Then If iFirst = 0 Or InStr(Mid(Text1.1) To 1 Step -1 If Mid(Text1. KeyCode = 114 'Forca a passagem pela Busca End If 'As rotinas abaixo verificam se a tecla apertada é 'F3.Text. bCtrlDown As Boolean Dim bProcura As Boolean.1) To 1 Step -1 If Mid(Text1. i%.Text.Text. iNum As Integer Dim iPos As Integer. sFind) = 0 Then iFirst = Len(Text1.98 Dim sDefault As String. Default) If sFind = "" Then Exit Sub 'Marca como a tecla F3 tivesse sido pressionada.Text) End If For iNum = (iFirst . _ Len(sFind)) = sFind Then iPos_Fim = Len(sFind) + iNum Exit For End If DoEvents Next iLast = iPos_Fim iFirst = iPos Text1. Text1. Text1. iNum. sFind) = 0 Then MsgBox "Texto não encontrado!".SelLength = iPos_Fim . _ Len(Find_String)) = Find_String Then iPos = iNum Exit For End If DoEvents Next For iNum = (iFirst . 1.iPos Else iPos = InStr(iLast. sFind) .

0.SelLength = Len(Text1.99 End If iPos_Fim = Len(sFind) + iPos iLast_Pos = iPos_Fim Text1. _ lParam As Any) As Long SendMessage(SuaText.SelLength = iPos_Fim . 'por exemplo Text1.Pos End If End If End Sub Selecionando Texto do TextBox ao Receber Foco 'Basta colocar no evento GotFocus do TextBox.SelStart = iPos .1 Text1. 5&) ' Onde o IParam é o numero de linhas a ser rolado. EM_LINESCROLL. . a seguinte rotina: Private Sub Text1_GotFocus() Text1.hWnd. ByVal wParam As Long. ByVal wMsg As Long.Text) End Sub Rolar um TextBox linha a linha Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long.SelStart = 0 Text1.

vbNullString). _ "ToolbarWindow32". no evento Form_Load: Private Sub Form_Load() . Você pode. Para isso. _ 0. 0&) Style = Style Or TBSTYLE_FLAT Or TBSTYLE_TRANSPARENT Res = SendTBMessage(FindWindowEx(theToolbar. _ 0&. vbNullString). _ TB_GETSTYLE. querer ligá-lo a um array ao invés de um banco de dados (ou seja. Então. no evento Form_Load (por exemplo) coloque: Private Sub Form_Load() Call MakeToolbarFlat(Toolbar1) End Sub True DbGrid Como ligar o True DbGrid a um Array O True DbGrid é um controle completo. ByVal lpsz1 As String.hwnd.Altere a propriedade DataMode dele p/ 4 . _ ByVal lParam As Any) As Long Private Private Private Private Private Const Const Const Const Const WM_USER As Long = &H400 TBSTYLE_FLAT As Long = &H800 TBSTYLE_TRANSPARENT As Long = &H8000 TB_SETSTYLE As Long = (WM_USER + 56) TB_GETSTYLE As Long = (WM_USER + 57) Public Sub MakeToolbarFlat(theToolbar As Control) Dim Res As Long Dim Style As Long Style = SendTBMessage(FindWindowEx(theToolbar. _ ByVal lpsz2 As String) As Long Private Declare Function SendTBMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long. siga os passos: 1 .Insira o True DbGrid em seu Form.hwnd.Storage. "ToolbarWindow32". ByVal wParam As Integer. os dados ficarão na memória). _ ByVal wMsg As Long.Refresh End Sub 'P/ chamar. 2 . por exemplo. Style) theToolbar. 0&. própria dele.100 ToolBar Deixando a ToolBar (do VB5) no Estilo Flat 'Num módulo: Private Declare Function FindWindowEx Lib "user32" _ Alias "FindWindowExA" (ByVal hWnd1 As Long. 3 . adicione a biblioteca "APEX XArray Object". _ ByVal hWnd2 As Long. 0&. use o código a seguir: 'No declarations do Form: Dim MeuArray As New XArray 'Então.Em Project/References. TB_SETSTYLE.

Uma coisa bastante interessante seria permitir que o usuário desse um duplo clique em uma linha do True DBGrid para abrir um outro Form com detalhes daquele registro. Coluna 0" MeuArray. mas funciona!!! Eu não tinha o True DBGrid em meu micro. 0) = "Linha 5. 1 'Inseri dados no array: MeuArray. por exemplo. 0) = "Linha 3.OddRowStyle. 1) = "Linha 2.Value(2.AlternatingRowStyle = True End Sub Parece ser simples de mais para ser verdade.ReDim 1.EvenRowStyle.BackColor = &HC0FFFF TDBGrid1.Value(1. onde seriam exibidos dados de um cadastro de clientes. 1) = "Linha 1. 0) = "Linha 1. 1) = "Linha 4.Value(3. 0. 0) = "Linha 2. Veja o exemplo: Private Sub TDBGrid1_DblClick() Call VerDetalhes End Sub Private Sub cmdDetalhes_Click() Call VerDetalhes End Sub Private Sub VerDetalhes() 'Passa para o Form frmDetalhes o conteúdo da . nº de linhas. Coluna 1" MeuArray.Value(4. Coluna 1" MeuArray. Coluna 1" MeuArray.Value(4. então fiz o download só p/ testar e funcionou!!! Detectar a Linha Selecionada num True DBGrid Digamos que você esteja criando um programa. Coluna 1" 'Atribui o array ao True DBGrid: Set TDBGrid1.ReDim 1. 1) = "Linha 3. Se o programador quiser criar também um botão Detalhes. Coluna 0" MeuArray. 0. onde tenha um Form de pesquizas. usando-se o evento DblClick do True DBGrid.Value(2. Isto é possível de ser feito.101 'Redimensiona o array p/ ter 5 linhas (1 à 5) 'e 2 colunas (0 à 1): 'Array. 5.Array = MeuArray End Sub Deixando um True DBGrid Zebrado (com 2 Cores Intercaladas) 'No evento Form_Load: Private Sub Form_Load() TDBGrid1. Coluna 0" MeuArray.Value(5. 0) = "Linha 4. não é? Pois é. Nesse Form teria um um TrueGrid. Coluna 1" MeuArray.BackColor = &HFFFFFF TDBGrid1. Coluna 0" MeuArray. bastando então criar uma sub-rotina que detecte a linha selecionada e abra o Form de detalhes. nº de colunas -1 MeuArray.Value(3.Value(5.Value(1. Coluna 0" MeuArray. basta associar essa sub-rotina ao evento Click do botão. 1) = "Linha 5.

Neste caso o ideal seria que.Columns(0).InsertMode = False .. o Grid selecionasse a linha toda do Grid.ForeColor = vbHighlightText End With End Sub .HighlightRowStyle.EditDropDown = False .Text 'Abre o Form frmDetalhes..Texto = TDBGrid1. Para fazer isto.HighlightRowStyle... por exemplo).BackColor = vbHighlight .) frmDetalhes.AllowColSelect = False .102 'coluna 0 (zero) da linha que estiver 'selecionada (Código do cliente.MultiSelect = 0 .MarqueeStyle = 3 .AllowUpdate = False . por exemplo. usando o True DBGrid.Show vbModal End Sub Navegação de Linha no True DBGrid Digamos que você criou uma tela de pesquisa de um cadastro qualquer no seu programa (usando string de SQL e etc) e queira exibir isto num Grid. mas NÃO quer que o usuário possa selecionar mais de um registro (uma coluna inteira. coloque o seguinte código no seu Form: Private Sub Form_Load() With TDBGrid1 . quando o usuário selecionasse um registro. frmDetalhes...

Podem ser criados diretórios de nomes longos em VB4 32 bits. Instr(2. A rotina abaixo cria qualquer diretório. O ideal (tem outro jeito?) é manter uma lista do status dos arquivos na pasta (e se for o caso. . sDir. MAX_PATH) Criando múltiplos níveis de diretórios Programas de instalação ou outras aplicações podem solicitar ao usuário para que informe onde deseja instalar arquivos ou efetuar alguma operação. conforme sua necessidade. sDir. em 16 bits (inclusive VB3). será criado. "Test\MyApp\MyDir\Long " & _ "Directory Name\") End Sub Como interceptar mudanças em um diretório Claro que apos a ocorrer a mudanca essa funcao nao vai retornar qual o arquivo modificado.3. Você poderá adicionar seu próprio código de manipulação de erros. "\")) If Dir$(sDrive & Sbuild. ByVal cchBuffer _ As Long) As Long Public Const MAX_PATH As Long = 260 Dim sDirLong As String Dim sDirDOS As String Call GetShortPathname(sDirLong. sDir. mas. em todos os níveis. 16) = "" Then MkDir sDrive & sBuild End If Wend End Sub Sub Test() Call CreateLongDir ("C:\". Mas. Basta informar o drive (como C:) e o caminho (como \MYAPP\MYDIR\SUBDIR) a ser criado (se não existir). os nomes serão truncados para a convenção 8. InStr (2.103 DIRETÓRIOS Capturar o caminho DOS de um arquivo Public Declare Function GetShortPathName Lib _ "kernel32" Alias "GetShortPathNameA" _ (ByVal lpszLongPath As String. "\") > 1 sBuild = sBuild & Left(sDir. Depois de receber uma notificacao criar uma nova lista e comparar com a antiga pra descobrir o que mudou. Se o diretório não existir. o usuário poderá informar vários subníveis de diretórios inexistentes que devem ser criados. "\") . sDir as String) Dim sBuild As String While Instr(2. Abaixo temos um exemplo simples da criação de vários níveis de diretórios: Sub CreateLongDir(sDrive as String. subpastas) em uma coleção ou array.1) sDir = Mid$(sDir. ByVal _ lpszShortPath As String. sDirDOS.

ByVal dwNotifyFilter As Long) As Long Public Declare Function FindCloseChangeNotification Lib _ "kernel32" (ByVal hChangeHandle As Long) As Long Public Declare Function FindNextChangeNotification Lib _ "kernel32" (ByVal hChangeHandle As Long) As Long Public Public Public Public Public Public Public Public Public Public Public Public Const Const Const Const Const Const Const Const Const Const Const Const FILE_NOTIFY_CHANGE_ATTRIBUTES As Long = &H4 FILE_NOTIFY_CHANGE_DIR_NAME As Long = &H2 FILE_NOTIFY_CHANGE_FILE_NAME As Long = &H1 FILE_NOTIFY_CHANGE_SECURITY As Long = &H100 FILE_NOTIFY_CHANGE_LAST_WRITE As Long = &H10 FILE_NOTIFY_CHANGE_SIZE As Long = &H8 WAIT_FAILED As Long = &HFFFFFFFF WAIT_OBJECT_0 As Long = &H0 WAIT_ABANDONED As Long = &H80 WAIT_ABANDONED_0 As Long = &H80 WAIT_TIMEOUT As Long = &H102 WAIT_IO_COMPLETION As Long = &HC0 Public Declare Function WaitForSingleObject Lib _ "kernel32" (ByVal hHandle As Long.104 Have fun! 'Declaracoes: Public Declare Function FindFirstChangeNotification Lib _ "kernel32" Alias "FindFirstChangeNotificationA" _ (ByVal lpPathName As String. ByVal cchBuffer As Long) As Long Public Const MAX_PATH As Long = 260 'Em um Form: Option Explicit Private hFind As Long Private bParar As Boolean ' Dois command button com captions "Assistir" e "Parar" ' Uma caixa de texto txtDir para conter o Path a ser monitorado ' Uma listbox List1 para mostrar o que esta acontecendo :-) Private Sub Command1_Click() Dim hEvento As Long Dim sPathParaApi As String * MAX_PATH Dim sPathLongo As String bParar = False ' . ByVal _ ' dwMilliseconds As Long. ByVal bAlertable As _ ' Long) As Long Public Declare Function GetShortPathName Lib _ "kernel32" Alias "GetShortPathNameA" (ByVal _ lpszLongPath As String. ByVal lpszShortPath _ As String. ByVal bWatchSubtree _ As Long. ByVal _ dwMilliseconds As Long) As Long ' Public Declare Function WaitForSingleObjectEx Lib _ ' "kernel32" (ByVal hHandle As Long.

. Nao foi possivel inicializar".Mudança na data de ultima ' gravação ' FILE_NOTIFY_CHANGE_SIZE ...Text If GetShortPathName(sPathLongo. False. 200) Select Case hEvento Case WAIT_FAILED List1.AddItem "WAIT_ABANDONED_0" Call FindCloseChangeNotification(hFind) .MAX_PATH) Then If hFind <> 0 Then Call FindCloseChangeNotification(hFind) hFind = 0 End If ' Atenção nisso ' FindFirstChangeNotification(Path.AddItem "WAIT_FAILED" Call FindCloseChangeNotification(hFind) hFind = 0 Exit Do Case WAIT_ABANDONED List1.sPathParaApi.: Lembre se q WaitForSingleObject irá travar o thread até acontecer alguma coisa :-) hEvento = WaitForSingleObject(hFind.AddItem "WAIT_ABANDONED" Call FindCloseChangeNotification(hFind) hFind = 0 Exit Do Case WAIT_ABANDONED_0 List1. vbInformation. ' criação ou exclusao ' FILE_NOTIFY_CHANGE_SECURITY . Chr(0)) txtDir. _ FILE_NOTIFY_CHANGE_FILE_NAME) If hFind = 0 Then MsgBox "Ops.105 ' Nao sei se ' diretórios ' sPathParaApi sPathLongo = a funcao FindFirstChangeNotification aceita longos entao estou convertendo antes de mandar = String(MAX_PATH.Mudança no nome dos arqs.. _ ' Tipo de monitoracao) ' ' Tipos possiveis ' FILE_NOTIFY_CHANGE_ATTRIBUTES .Mudança de permissão ' FILE_NOTIFY_CHANGE_LAST_WRITE ..Mudança de tamanho ' ' Combinacoes são possivel com OR hFind = FindFirstChangeNotification(sPathParaApi. _ ' Deseja monitorar os subdiretorios?. _ "Erro" End If Do ' ' ' ' ' Estou usando TimeOut pra dar tempo do usuario clicar em PARAR e poder sair desse Loop mas não é obrigatório.Notifica se houve ' mudança no nome dos ' diretorios ' FILE_NOTIFY_CHANGE_FILE_NAME .Notifica se houve ' mudança nos atributos ' FILE_NOTIFY_CHANGE_DIR_NAME . PS.

' Case WAIT_IO_COMPLETION List1.." Call FindCloseChangeNotification(hFind) hFind = 0 Exit Do End If End Select Loop Else MsgBox "Erro ao converter diretório.. mas isso vc pode mudar txtDir.Path) = "\" Then MeuDir = App... _ "Erro" End If End Sub Private Sub Command2_Click() bParar = True End Sub Private Sub Form_Load() ' Setei um default.. ' ' Executa ações ' ' blah blah blah.AddItem "WAIT_OBJECT_0" ' ' Essa é a notificacao que algo aconteceu...AddItem "Problemas.Path If Right$(App."..Text = "C:\WINNT\Profiles\User\Desktop" End Sub Diretório onde o Programa foi Instalado Para saber qual o diretório onde está o executalvel (arquivo *.AddItem "Stopped" Call FindCloseChangeNotification(hFind) hFind = 0 Exit Do End If If FindNextChangeNotification(hFind) = 0 Then List1. vbInformation.EXE) de seu programa proceda da seguinte forma: 'No evendo que você quizer: Dim MeuDir as String MeuDir = App.Path & "\" End If .AddItem "WAIT_IO_COMPLETION" Call FindCloseChangeNotification(hFind) hFind = 0 Exit Do Case WAIT_TIMEOUT DoEvents If bParar Then List1.106 hFind = 0 Exit Do Case WAIT_OBJECT_0 List1.

MDB". Veja: MeuDir = MeuDir & "BancoDeDados.Path NÃO contenha a última barra.Path) = "\" Then 'CASO App. se é assim.Path 'Verifica a existencia da barra If Right$(App. Por isso eu fiz assim: 'Joga p/ MeuDir o conteúdo de App. 1) = "\" Then Junta_Dirs = Dir1 & Dir2 Else Junta_Dirs = Dir1 & "\" & Dir2 End If End If If Right$(Junta_Dirs. _ ByVal sDir1 As String) If Right$(Dir1.MDB"??? Porque o App.Path & "\BancoDeDados.MDB".MDB" Nesse caso a variável MeuDir passará a conter: "C:\Arquivos de Programas\Meu Programa\BancoDeDados.107 MsgBox MeuDir Então. 1) = "\" Then If Left$(Dir2. Len(Dir1) . por exemplo. CASO o endereço não tenha essa última barra. 1) = "\" Then Junta_Dirs = Left$(Dir1. Isto COM CERTEZA causaria um erro na hora de abrir o banco de dados. Mas.Path & "\" End If Função para Unir um Diretório a um Subdiretório 'Coloque esta função num módulo ou mesmo no form: Public Function Junta_Dirs(ByVal sDir1 As String.1) & Dir2 Else Junta_Dirs = Dir1 & Dir2 End If Else If Left$(Dir2.Path MeuDir = App. seu progama tiver sido instalado no diretório "C:\Arquivos de Programas\Meu Programa" ele mostrará na mensagem o seguinte texto: "C:\Arquivos de Programas\Meu Programa\" Esta última barra (\) é necessária no caso de você querer concatenar (somar) à essa variável o nome de um banco de dados. 'soma-a à variável MeuDir MeuDir = App. o resultado seria "C:\Arquivos de Programas\Meu ProgramaBancoDeDados.Path pode vir a já conter essa barra. se. POR QUE não fazer "SIMPLESMENTE" assim: MeuDir = App. 1) <> "\" Then Junta_Dirs = Junta_Dirs & "\" End If End Function 'P/ chamar: Dim Dir As String .

108
Dir = 'OU: Dir = 'OU: Dir = 'OU: Dir = Junta_Dirs(App.Path,"\BMPs\")&"Desenho.BMP" Junta_Dirs(App.Path, "\BMPs")&"Desenho.BMP" Junta_Dirs(App.Path, "BMPs\")&"Desenho.BMP" Junta_Dirs(App.Path, "BMPs")&"Desenho.BMP"

'TODAS as anteriores irão funcionar. Só NÃO use assim: Dir = Junta_Dirs(App.Path, "BMPs")&"\Desenho.BMP" 'Pois não irá funcionar.

Pegar o Diretório de Arquivos Temporários (Windows\Temp)
'NUM MÓDULO: Private Const MAX_PATH As Long = 260 Private Declare Function GetTempPath Lib "kernel32" _ Alias "GetTempPathA" (ByVal nBufferLenght _ As Long, ByVal lpBuffer As String) As Long Public Function GetTempDir() As String Dim strFolder As String Dim lngResult As Long strFolder = String(MAX_PATH, 0) lngResult = GetTempPath(MAX_PATH, strFolder) If lngResult <> 0 Then If Right(Left(strFolder, lngResult), 1) = "\" Then GetTempDir = Left(strFolder, lngResult) Else GetTempDir = Left(strFolder, lngResult) & "\" End If Else GetTempDir = "" End If End Function 'P/ CHAMAR: MsgBox "O Diretório System do Windows é: " & GetTempDir, _ vbOKOnly + 64, "Local do Diretório System do Windows"

Pegar o Diretório do System
'NUM MÓDULO: Private Const MAX_PATH As Long = 260 Private Declare Function GetSystemDirectory Lib _ "kernel32" Alias "GetSystemDirectoryA" _ (ByVal lpBuffer As String, ByVal nSize _ As Long) As Long Public Function GetSysDir() As String Dim strFolder As String Dim lngResult As Long strFolder = String(MAX_PATH, 0) lngResult = GetSystemDirectory(strFolder, MAX_PATH) If lngResult <> 0 Then If Right(Left(strFolder, lngResult), 1) = "\" Then GetSysDir = Left(strFolder, lngResult) Else GetSysDir = Left(strFolder, lngResult) & "\"

109
End If Else GetSysDir = "" End If End Function 'P/ CHAMAR: MsgBox "O Diretório System do Windows é: " & GetSysDir, _ vbOKOnly + 64, "Local do Diretório System do Windows"

Pegar o Diretório do Windows
'NUM MÓDULO: Private Const MAX_PATH As Long = 260 Private Declare Function GetWindowsDirectory Lib _ "kernel32" Alias "GetWindowsDirectoryA" _ (ByVal lpBuffer As String, ByVal nSize As _ Long) As Long Public Function GetWinDir() As String Dim strFolder As String Dim lngResult As Long strFolder = String(MAX_PATH, 0) lngResult = GetWindowsDirectory(strFolder, MAX_PATH) If lngResult <> 0 Then If Right(Left(strFolder, lngResult), 1) = "\" Then GetWinDir = Left(strFolder, lngResult) Else GetWinDir = Left(strFolder, lngResult) & "\" End If Else GetWinPath = "" End If End Function 'P/ CHAMAR: MsgBox "O Diretório do Windows é: " & GetWinDir, _ vbOKOnly + 64, "Local do Diretório do Windows"

110

111

HARDWARE CDROM
Abrir e fechar a gaveta do CDROM
Private Declare Function mciSendString Lib "winmm.dll" _ Alias "mciSendStringA" (ByVal lpstrCommand As _ String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback _ As Long) As Long 'PARA ABRIR Call mciSendString("Set CDAudio Door Open Wait", 0&, _ 0&, 0&) 'PARA FECHAR Call mciSendString("Set CDAudio Door Closed Wait", 0&, _ 0&, 0&)

Disquetes
Formatando um Disquete
Este exemplo chama a caixa de diálogo Formatar Disquete do Windows Explorer. Coloque um botão num Form e coloque o seguinte código: 'Num módulo: Option Explicit Private Declare Function SHFormatDrive Lib _ "shell32" (ByVal hwnd As Long, ByVal _ Drive As Long, ByVal fmtID As Long, _ ByVal options As Long) As Long Private Declare Function GetDriveType Lib _ "kernel32" Alias "GetDriveTypeA" _ (ByVal nDrive As String) As Long Public Public Public Public Public Public Public Public Const Const Const Const Const Const Const Const DRIVE_CDROM = 5 DRIVE_FIXED = 3 DRIVE_RAMDISK = 6 DRIVE_REMOTE = 4 DRIVE_REMOVABLE = 2 SHFMT_ID_DEFAULT = &HFFFF SHFMT_OPT_FULL = 1 SHFMT_OPT_SYSONLY = 2

Public Sub FormatFloppy(hWndOwner As _ Long, ByVal DriveLetter As String) Dim DriveNum As Long, DriveType As Long Dim ret As Long DriveLetter = Left(DriveLetter, 1) & ":\" DriveNum = Asc(UCase(DriveLetter)) - Asc("A") DriveType = GetDriveType(DriveLetter) If DriveType = DRIVE_REMOVABLE Then

Lê propriedades de drives. lpTotalNumberOfClusters As Long) As Long Private Declare Function GetDriveType Lib "kernel32" Alias _ "GetDriveTypeA" (ByVal nDrive As String) As Long Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Private Private Private Const Const Const Const GENERIC_WRITE As Long = &H40000000 OPEN_EXISTING As Long = 3 FILE_SHARE_READ As Long = &H1 FILE_SHARE_WRITE As Long = &H2 Private Declare Function SetFileTimeWrite Lib "kernel32" _ Alias "SetFileTime" (ByVal hFile As Long. estaria mandando formatar o drive A:.hwnd. lpLastWriteTime _ As FILETIME) As Long . "A" 'Neste caso. _ SHFMT_OPT_FULL) Else MsgBox "O drive informado não é um " & _ "drive de discos removíveis". ByVal NullP2 As Long. pastas e arquivos 'Ação: '. _ DriveNum. ByVal _ MullP As Long.112 ret = SHFormatDrive(hWndOwner. pastas e arquivos '. lpSectorsPerCluster As Long. lpNumberOfFreeClusters _ As Long.Modifica data e hora em arquivos Private Declare Function GetDiskFreeSpace Lib "kernel32" _ Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName _ As String. End Sub Drive Ler propriedades de drives. _ vbExclamation. _ lpBytesPerSector As Long. SHFMT_ID_DEFAULT. "Formatar Disquete" End If End Sub 'No evento click do botao: Private Sub Command1_Click() FormatFloppy Me.

vários ou todos os " m$ = m$ & "arquivos de um diretório." & vbCrLf & vbCrLf m$ = m$ & "Data & Hora © 1996-1999 Carlos Machado" MsgBox m$. Clique na etiqueta Atributos para " m$ = m$ & "mais informações sobre os tipos de arquivos. Hora As Integer Dim Minuto As Integer. _ ByVal lpSecurityAttributes As Long. Além disso. ByVal _ dwDesiredAccess As Long. lpFileTime _ As FILETIME) As Long Private Const Tit As String = "Data & Hora" Dim arqAtual As String Dim blnDrvDir As Boolean Private Sub cmdAjuda_Click() ' Mensagem de ajuda Dim m$ m$ = "Este programa lhe permite visualizar informações " m$ = m$ & "sobre drives. A data (dd/mm/aaaa) e a hora (hh:mm:ss) " m$ = m$ & "são indicadas. ByVal _ dwFlagsAndAttributes As Long. Use-o. vbOKOnly. por exemplo. _ lpFileTime As FILETIME) As Long Private Declare Function CreateFile Lib "kernel32" Alias _ "CreateFileA" (ByVal lpFileName As String. " m$ = m$ & "altera data e hora de um. nos campos Nova " m$ = m$ & "Data e Nova Hora. ByVal hTemplateFile _ As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal _ hObject As Long) As Long Private Declare Function LocalFileTimeToFileTime Lib _ "kernel32" (lpLocalFileTime As FILETIME.113 Private Declare Function SystemTimeToFileTime _ Lib "kernel32" (lpSystemTime As SYSTEMTIME. ByVal dwShareMode As Long. pastas e arquivos. Os arquivos para " m$ = m$ & "modificação devem ser selecionados na caixa " m$ = m$ & "Arquivos. Segundo As Integer Dim DataeHora As Variant Dim sArquivo As String Dim x As Integer Dim sData As String Dim sHora As String Dim sReadOnly As String sData = Text1 . ByVal _ dwCreationDisposition As Long. Tit End Sub Private Sub cmdAlterar_Click() ' Dispara a alteração de data e hora On Error GoTo cmdAlterar_Click_Err Dim i As Integer Dim s As String Dim nomePath As String Dim Ano As Integer. Os " m$ = m$ & "tamanhos de drives e arquivos são sempre expressos " m$ = m$ & "em bytes. depois de " m$ = m$ & " trocar um disco no drive A. O botão Atualizar renova as informações " m$ = m$ & "na lista de arquivos. Mes As Integer Dim Dia As Integer. respectivamente.

114 Ano = Year(sData) ' Checa se é CD-ROM If Label2(1) = "CD-ROM " Then MsgBox "Arquivos em CD-ROM não podem ser alterados.Selected(i) Then sArquivo = nomePath & File1.".Segundo) ' Ajusta Path nomePath = Dir1.Path If Len(nomePath) > 3 Then nomePath = nomePath & "\" End If ' Define arquivo.Minuto. DataeHora) End If Next i ' Atualiza lista de arquivos cmdAtualizar_Click ' Desliga ampulheta Screen. vbYesNo + vbQuestion + vbDefaultButton2.List(i) & vbCrLf End If x = AlterarDataHora(sArquivo.". vbCritical .MousePointer = vbDefault .SetFocus: Exit Sub End If End If ' Se data é válida.1 If File1. data e hora: File1 é Seleção múltipla (3) sReadOnly = "" For i = 0 To File1. Dia) + TimeSerial(Hora. segue (a hora já é) s = "Tem certeza de que deseja alterar o(s) arquivo(s) indicado(s)?" i = MsgBox(s.vbCritical. Tit Text1. Tit) If i <> vbYes Then Exit Sub ' Liga a ampulheta: a operação pode demorar Screen.Tit Text1.ListCount .MousePointer = vbHourglass Mes = Month(sData) Dia = Day(sData) Hora = Val(labHora) Minuto = Val(labMinuto) Segundo = Val(labSegundo) DataeHora = DateSerial(Ano. Tit Text1.SetFocus: Exit Sub Else If Ano < 1980 Then MsgBox "O sistema de arquivos não suporta " & _ "datas anteriores a 1980. vbCritical. Mes.List(i) If GetAttr(sArquivo) And vbReadOnly Then ' Lista de arquivos ready-only = não alterados sReadOnly = sReadOnly & File1.SetFocus Exit Sub End If ' Checa validade da data digitada If Not IsDate(sData) Then MsgBox "Data inválida.".

Path = Drive1.Drive .Refresh If File1. vbInformation.Path blnDrvDir = True DefineArquivo Dir1_Change_Fim: Exit Sub Dir1_Change_Err: MsgBox Error$(Err) Resume Dir1_Change_Fim End Sub Private Sub Drive1_Change() On Error GoTo DRChange_Err Err = False Dim m$ ' Atualiza diretório Dir1. Tit cmdAlterar_Click_Fim: Exit Sub cmdAlterar_Click_Err: MsgBox Error$(Err) Resume cmdAlterar_Click_Fim End Sub Private Sub cmdAtualizar_Click() ' Força renovação da lista de arquivos On Error GoTo cmdAtualizar_Click_Err Dir1.SetFocus File1.ListCount > 0 Then File1.Selected(0) = True End If cmdAtualizar_Click_Fim: Exit Sub cmdAtualizar_Click_Err: MsgBox Error$(Err) Resume cmdAtualizar_Click_Fim End Sub Private Sub cmdFechar_Click() End End Sub Private Sub Dir1_Change() ' Atualiza lista de arquivos On Error GoTo Dir1_Change_Err File1.Path = Dir1.115 ' Exibe mensagem ao usuário s = "Alterações realizadas com êxito.Refresh File1." If sReadOnly <> "" Then s = s & vbCrLf & vbCrLf s = s & "Atenção: os arquivos abaixo são do tipo " s = s & vbCrLf & "somente leitura e não foram " s = s & "alterados:" & vbCrLf & vbCrLf s = s & sReadOnly End If MsgBox s.

Path Else m$ = "Erro número" & Str$(Err) & ". Tit End If Resume End Sub Private Sub File1_Click() ' Define arquivo ativo ' quando o usuário clica DefineArquivo End Sub Private Sub Form_Load() ' Força um drive/dir inicial Drive1. não previsto no programa: " & Error$ MsgBox m$.Drive = Dir1.Drive) MsgBox m$.Value = 12 End Sub Private Sub DefineArquivo() ' Checa se o diretório contém arquivos ' Seleciona arquivo 0 ' Exibe atributos Dim nomePath As String Dim TemArquivo As Boolean nomePath = Dir1. DefineArquivo ' Disco InfoDisco ' Defaults: data atual. desselecionando ' o arquivo apontado pelo usuário. vbCritical. Tit ' Volta ao drive anterior ao erro Drive1. a seleção do ' arquivo 0 também seja feita.Selected(0) = True . o arquivo 0 da lista ' é selecionado. 12:00:00 Text1 = Format(Date.116 InfoDisco blnDrvDir = True DefineArquivo DRChange_Fim: Exit Sub DRChange_Err: ' Erros e avisos If (Err = 71) Or (Err = 68) Then Beep '71: sem disco.Path If File1. vbCritical. Desse modo. "dd/mm/yyyy") VScroll1. blnDrvDir = True ' Mostra atributos do arquivo 0 (se houver).Drive = "c:\" ' blnDrvDir avisa que o chamado de DefineArquivo ' é interno. se houver. Evita que quando o ' usuário clique num arquivo. 68: disco inexiste m$ = "Não há disco no drive " & UCase$(Drive1.ListCount > 0 Then 'Tem arquivo If blnDrvDir Then File1.

Tit Else End If End Sub Private Sub Text1_GotFocus() ' Seleciona o texto Text1.Text) End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) ' Só aceita números (48-56) ou / (47) If (KeyAscii < 47 Or KeyAscii > 56) And KeyAscii <> 8 Then KeyAscii = 0 End Sub Private Sub InfoAtributos(blnTemArquivo As Boolean) On Error GoTo InfoAt_Err Dim i As Integer If blnTemArquivo Then ' Se tem arquivo. Tit ElseIf Index = 2 Or Index = 3 Or Index = 5 Then m$ = "Valor em bytes.117 blnDrvDir = False End If If Len(nomePath) > 3 Then Label2(8) = " " & nomePath & "\" & File1. vbOKOnly.SelLength = Len(Text1. hora If blnTemArquivo Then Label2(5) = Format$(FileLen(arqAtual). mostra ' Atributos Label2(4) = "" Label2(4) = LeAtributos() ' Tamanho." & vbCrLf MsgBox m$. "##.Filename Else Label2(8) = " " & nomePath & File1. data.Filename End If arqAtual = Trim$(Label2(8)) TemArquivo = True Else 'Não tem arquivo Label2(8) = "" TemArquivo = False End If Call InfoAtributos(TemArquivo) End Sub Private Sub Label2_Click(Index As Integer) ' Exibe mensagem que esclarece conteúdo ' de alguns campos de informação Dim m$ If Index = 4 Then ' Ajuda/atributos m$ = "Atributos de arquivos:" & vbCrLf m$ = m$ & " A archive (arquivo)" & vbCrLf m$ = m$ & " H hidden (oculto)" & vbCrLf m$ = m$ & " R read-only (somente leitura)" & vbCrLf m$ = m$ & " S system (sistema)" MsgBox m$.##0 ") Call LeDataHora End If .SelStart = 0 Text1. vbOKOnly.

corrige vDataHora = FileDateTime(arqAtual) sDataHora = CStr(vDataHora) iLen = Len(sDataHora) Select Case iLen Case 8 'dd/mm/yy sData = Format$(sDataHora. limpa labels For i = 4 To 7 Label2(i) = "" Next End If InfoAt_Fim: Exit Sub InfoAt_Err: MsgBox Error$(Err) Resume InfoAt_Fim End Sub Private Sub LeDataHora() ' Lê e exibe data e hora do arquivo On Error GoTo LeDataHora_Err Dim vDataHora As Variant Dim sDataHora As String Dim iLen As Integer Dim sData As String. 8) & " " Case 19 'dd/mm/yyyy hh:mm:ss sData = Left$(sDataHora. 10) & " " sHora = Right$(sDataHora. 8). "dd/mm/yyyy ") sHora = Right$(sDataHora. sHora As String ' 1. 8) & " " Case Else sData = "" sHora = "" End Select Label2(6) = sData Label2(7) = sHora LeDataHora_Fim: Exit Sub LeDataHora_Err: MsgBox Error$(Err) Resume LeDataHora_Fim End Sub Private Function LeAtributos() As String ' Fornece lista de atributos do arquivo On Error GoTo LeAttr_Err Dim atribs As String ' Limpa os atributos .118 Else ' Arquivo não existe. Hora 00:00:00 retorna nulo. "dd/mm/yyyy ") sHora = "00:00:00 " Case 10 'dd/mm/yyyy sData = sDataHora & " " sHora = "00:00:00 " Case 17 'dd/mm/yy hh:mm:ss sData = Format$(Left$(sDataHora. Garante data no formato dd/mm/yyyy ' 2.

spaceloc% Dim FreeBytes&. "#. TotalNumberOfClusters) TotalBytes = TotalNumberOfClusters * SectorsPerCluster * BytesPerSector Label2(2) = Format(TotalBytes. elimina volume label spaceloc = InStr(s$. BytesPerSector& Dim NumberOfFreeClusters&. PercentFree& Dim dl&. _ NumberOfFreeClusters. s$.0 ") FreeBytes = NumberOfFreeClusters * SectorsPerCluster * BytesPerSector Label2(3) = Format(FreeBytes. spaceloc . BytesTotal&. "#. SectorsPerCluster. TotalNumberOfClusters& Dim BytesFree&.Drive ' Se há um espaço.0 ") vbNormal Then atribs = atribs & "N" vbAlias Then atribs = atribs & "L" vbArchive Then atribs = atribs & "A" vbDirectory Then atribs = atribs & "D" vbHidden Then atribs = atribs & "H" vbReadOnly Then atribs = atribs & "R" vbSystem Then atribs = atribs & "S" vbVolume Then atribs = atribs & "V" . 1) <> "\" Then s$ = s$ & "\" dl& = GetDiskFreeSpace(s$. " ") If spaceloc > 0 Then s$ = Left$(s$. 2).1) End If If Right$(s$. BytesPerSector. vbVolume) & " " LeTipoDeDrive TamanhoDoDrive InfoDisco_Fim: Exit Sub InfoDisco_Err: MsgBox Error$(Err) Resume InfoDisco_Fim End Sub Public Sub TamanhoDoDrive() ' Obtém tamanho do drive On Error GoTo TamDrive_Err Dim SectorsPerCluster&. TotalBytes& s$ = Drive1.119 atribs = "" ' Lê e mostra atributos If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And If GetAttr(arqAtual) And atribs = atribs & " " LeAtributos = atribs LeAttr_Fim: Exit Function LeAttr_Err: LeAtributos = "" MsgBox Error$(Err) Resume LeAttr_Fim End Function Private Sub InfoDisco() ' Obtém e mostra informações sobre o disco On Error GoTo InfoDisco_Err Label2(0) = "" Label2(0) = Dir$(Left$(arqAtual.

wYear = Year(TimeStamp) . 2) End If nDrive = nDrive & "\" ' Chama a função da API e traduz resultado drvType = GetDriveType(nDrive) Select Case drvType Case DRIVE_UNKNOWN: tipo = "Indeterminado " Case DRIVE_NO_ROOT_DIR: tipo = "Não reconhecido " Case DRIVE_REMOVABLE: tipo = "Removível " Case DRIVE_FIXED: tipo = "Fixo " Case DRIVE_REMOTE: tipo = "Rede " Case DRIVE_CDROM: tipo = "CD-ROM " Case DRIVE_RAMDISK: tipo = "RAM Disk " End Select Label2(1) = tipo LeTipoDeDrive_Fim: Exit Sub LeTipoDeDrive_Err: MsgBox Error$(Err) Resume LeTipoDeDrive_Fim End Sub Function AlterarDataHora(Filename As String.120 TamDrive_Fim: Exit Sub TamDrive_Err: MsgBox Error$(Err) Resume TamDrive_Fim End Sub Private Sub LeTipoDeDrive() ' Obtém o tipo de drive On Error GoTo LeTipoDeDrive_Err Const Const Const Const Const Const Const DRIVE_UNKNOWN = 0 DRIVE_NO_ROOT_DIR = 1 DRIVE_REMOVABLE = 2 DRIVE_FIXED = 3 DRIVE_REMOTE = 4 DRIVE_CDROM = 5 DRIVE_RAMDISK = 6 Dim tipo As String Dim nDrive As String Dim drvType As Long ' O drive para a função deve ser "c:\" nDrive = Drive1. TimeStamp As Variant) As Integer On Error GoTo AlterarDataHora_Err Dim x As Long Dim Handle As Long Dim System_Time As SYSTEMTIME Dim File_Time As FILETIME Dim Local_Time As FILETIME 'Define a estrutura System_Time System_Time.Drive If Len(nDrive) > 2 Then nDrive = Left$(nDrive.

ByVal _ nVolumeNameSize As Long.wDayOfWeek = Weekday(TimeStamp) .wMilliseconds = 0 ' Converte system_time para file_time x = SystemTimeToFileTime(System_Time. "0#") End Sub Private Sub VScroll3_Change() labSegundo = Format$(VScroll3. _ lpVolumeSerialNumber As Long.Value. Local_Time) ' Converte local_file_time para file_time (UTC) x = LocalFileTimeToFileTime(Local_Time. File_Time) ' Abre o arquivo para capturar o handle dele Handle = CreateFile(Filename.1 System_Time. "0#") End Sub Hard Disk Saber o Número Serial do HD 'Num módulo: Private Declare Function GetVolumeInformation Lib _ "kernel32" Alias "GetVolumeInformationA" _ (ByVal lpRootPathName As String. 0. 0) ' Modifica data e hora do arquivo x = SetFileTimeWrite(Handle. ByVal _ lpVolumeNameBuffer As String.Value.wMonth = Month(TimeStamp) System_Time. ByVal 0&. ByVal _ nFileSystemNameSize As Long) As Long . OPEN_EXISTING. _ lpFileSystemFlags As Long. File_Time) CloseHandle Handle x = AlterarDataHora AlterarDataHora_Fim: Exit Function AlterarDataHora_Err: MsgBox Error$(Err) Resume AlterarDataHora_Fim End Function Private Sub VScroll1_Change() labHora = Format$(VScroll1.Value.wHour = Hour(TimeStamp) System_Time. FILE_SHARE_READ _ Or FILE_SHARE_WRITE. ByVal 0&. ByVal 0&.wDay = Day(TimeStamp) System_Time.121 System_Time. "0#") End Sub Private Sub VScroll2_Change() labMinuto = Format$(VScroll2. ByVal _ lpFileSystemNameBuffer As String. _ lpMaximumComponentLength As Long. GENERIC_WRITE.wMinute = Minute(TimeStamp) System_Time.wSecond = Second(TimeStamp) System_Time.

voce deve abrir a impressora com o comando Open e utilizar o Print para realizar a impressão: Open "Lpt1" For Output As #1 Usando o Print direto na impressora. Exemplo: Print Print Print Print #1.1. b.DeviceName. HDNameBuffer. _ 256. #1.8)) then Set Printer=X SelectPrinter = True Exit For End If Next SelectPrinter = False End Function .1. #1.122 Public Function DriveSerial(ByVal Drive As _ String) As Long 'Valor que retornará o serial do HD Dim RetVal As Long Dim Dim Dim Dim HDNameBuffer As String * 256 'Nome do HD FSBuffer As String * 256 'FS do HD a As Long 'auxiliar b As Long 'auxiliar Call GetVolumeInformation(Drive.ideal para emissão de Notas Fiscais e Boletos). Chr(27) & "0" Chr(15) Chr(27) & "E" "" ' ' ' ' Muda o passo p/ 8 LPP Condensado Negrito Salta uma linha Bom. Assim que eu conseguir algo. RetVal. a. #1. coloco aqui!!! Selecionando a impressora que será usada na impressão 'Num módulo Public Function SelectPrinter(byVal Nome as String) As Boolean Dim X as Printer For each X in Printers If Ucase(Mid(X. 256) DriveSerial = RetVal End Function 'P/ usar (no evento que você quizer): Dim lNSerial As Long lNSerial = DriveSerial("C:\") MsgBox "O número seirial do HD é: " & lNSerial Impressoras Imprimindo Direto para a Impressora Para imprimir direto para a impressora (em modo draft . FSBuffer. existem outros comandos para cada impressora.8))=UCase(Mid(Nome. voce poderá enviar os caracteres especias para imprimir condensado ou mudar o passo da impressora.

TwipsPerPixelY YPixels = Screen. YPixels# xTwips = Screen. você necessitará ter o Service Pack 3 do Visual Basic instalado em sua máquina para corrigir um bug do VB.123 'P/ chamar: Dim RET As Boolean RET = SelectPrinter("Epson LX-300") If RET = True Then 'A impressora foi encontrada e selecionada.print "A Resolução é: " & Str$(xPixels) + _ " por " + Str$(YPixels) End Sub Resolução do Monitor Há uma forma simples de se obter a resolução de um monitor de vídeo usando uma API. Declare Function GetSystemMetrics Lib "User" _ (ByVal nIndex As Integer) As Integer '. yTwips%. End If A função definirá esta impressora ("Epson LX-300". xPixels#. como no exemplo) como padrão para a impressão a ser realizada. Else 'A impressora NÃO foi encontrada.. Sub Form_Resize() dim xRes As Integer dim yRes As Integer xRes = GetSystemMetrics(0) yRes = GetSystemMetrics(1) If xRes < 1024 and yRes < 768 Then 'adicione seu código conforme queira End If End Sub Mouse Capturar a Posição do Mouse Para saber se o mouse está sobre um objeto ou não.TwipsPerPixelX yTwips = Screen.Height / yTwips xPixels = Screen. ATENÇÃO!!!! Para que essa função funcione.Width / xTwips Debug. Monitores Obter a resolução de tela Private Sub Obtem() Dim xTwips%. podemos usar de duas formas: ..

Shift _ As Integer. Y As Single) Label1. ByVal _ yPoint As Long) As Long Private Type POINTAPI X As Long Y As Long End Type Private Controle_MouseMove(. P.X.Hwnd End Sub Private Sub Command1_Click() ReleaseCapture End Sub Private Sub Form_MouseMove(Button As Integer.124 USANDO AS APIs GetCursorPos E WindowFromPoint 'Use um Timer e proceda da seguinte forma: 'No Declarations Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINTAPI) As Long Private Declare Function WindowFromPoint Lib _ "user32" (ByVal xPoint As Long.Caption = Y End Sub ..Caption = X Label2.. 'No Declarations Private Declare Function SetCapture Lib "user32" _ Alias "SetCapture" (ByVal hwnd As Long) _ As Long Private Declare Function ReleaseCapture Lib _ "user32" Alias "ReleaseCapture" () As Long Private Sub Form_Load() SetCapture Me.Y) <> Controle.Enabled = True 'O mouse está sobre o controle End Sub Private Sub Timer1_Timer() Dim P as POINT If GetCursorPos(P) Then If WindowFromPoint(P.hWnd then Timer1.) Timer1.Enabled = False 'O mouse NÃO está mais sobre o controle End If End If End Sub USANDO AS APIs SetCapture E ReleaseCapture Verificando se o cursor do mouse está ou não sobre o Form 'Coloque num form um CommandButton e dois Labels. X As Single.

ReleaseCapture End Sub Private Sub Picture1_MouseMove(Button As Integer. por um motivo qualquer. perceberá que. ele não ficará mais preto. Como limitar a área de movimento do mouse Digamos que. perceberá que.BackColor = vbRed Else Picture1. Quando você clicar no CommandButton ele irá parar de detectar o mouse quando ele estiver fora do PictureBox (o ReleaseCapture "desliga" o SetCapture). quando o mouse estiver sobre o PictureBox ele ficará vermelho e quando não estiver ficará preto. você precise "limitar" a área de movimentação do mouse. mesmo que o mouse não esteja sobre o Form. Quando você clicar no CommandButton ele irá parar de detectar o mouse quando ele estiver fora do Form (o ReleaseCapture "desliga" o SetCapture). Shift _ As Integer. Y As Single) If X > -1 And X < Picture1. Então. os Labels serão atualizados com as posições X e Y do mouse quando você o mover. X As Single.125 Quando você executar. 'No Declarations Private Declare Function SetCapture Lib "user32" _ Alias "SetCapture" (ByVal hwnd As Long) _ As Long Private Declare Function ReleaseCapture Lib _ "user32" Alias "ReleaseCapture" () As Long Private Sub Form_Load() SetCapture Picture1. dois Labels e 'um PictureBox..BackColor = vbBlack EndIf End Sub Quando você executar.. pois o VB não detectará mais quando o mouse "sair" do PictureBox.Hwnd End Sub Private Sub Command1_Click() 'Para de detectar o mouse no form todo.Height Then Picture1. Para isso use a seguinte função: 'Num módulo: Private Declare Function ClipCursor Lib "user32" _ (lpRect As Any) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type . Verificando se o cursor do mouse está ou não sobre um controle 'Coloque num form um CommandButton.Width And Y > -1 And Y < _ Picture1.

Unload Me 'descarrega o form e devolve o mouse End 'garante o fechamento do programa Inverter os botões do mouse 'No Declarations: Declare Function SwapMouseButton(ByVal bSwap as _ Long) As Long 'Para inverter os botões do mouse: SwapMouseButton(1) 'Para voltar ao normal: SwapMouseButton(0) . Se houver movimento e teclas pressionadas. 300. _ Screen. Screen.Right = X2 RC.Left = X1 RC. finalize o programa. X2 As Integer. chame a função passando os 'pontos aos quais o mouse ficará limitado: Private Sub Form_Load() LimitaArea 50. Y1 As _ Integer. _ Y2 As Integer) As Long Dim RC As RECT RC. volte ao normal da seguinte 'forma: Private Sub Form_Unload(Cancel As Integer) 'Volta ao estado Normal LimitaMouse 0.TwipsPerPixelY End Sub 'ATENÇÃO!!! Estas cordenadas devem ser passadas em pixeis!!! Desativamento do mouse 1.TwipsPerPixelX.100.Height / Screen.Bottom = Y2 ClipCursor RC End Function 'No evento Form_Load.Width / Screen. 0.200 'POR EXEMPLO End Sub 'No evento Form_Unload. Crie uma rotina Form_Mouse e Form_KeyDown. Chame-a no form_load: ShowCursor False 'oculta o mouse 3.126 Public Function LimitaArea(X1 As Integer. re-exiba o mouse: ShowCursor True 4. Declare a API que oculta/exibe o mouse (no módulo): Declare Function ShowCursor Lib "user32" Alias _ "ShowCursor" (ByVal bShow as Long) as Long 2.Top = Y1 RC. No form_unload.

SY As Integer SX = Screen.Top / SY + Controle. conforme o resultado do calculo: Posição do Form no vídeo + Posição do controle no Form + largura do controle /2 Veja que no final existe uma soma (+20) que foi feita para compensar a barra de título que não é contada no formulário. 'em seus respectivos eventos.Width / SX / 2). 'P/ testar.127 Mudar a Posição do Mouse via Código (sem Move-lo) Esse recurso é muito útil para posicionar o ponteiro sobre botões e outros objetos sem mover o mouse.Left / SX + Controle. 'Por exemplo: SetCursorPos 200.Left / _ SX + (Controle. 'No Declarations: Private Declare Function SetCursorPos Lib _ "user32" (ByVal X As Long. usando a API SetCursorPos.TwipsPerPixelX SY = Screen.Top / SY + _ (Controle. coloque dois CommandButton no Form e. _ Me. 250 'Use esta Sub para centralizar o ponteiro do 'mouse sobre um objeto no Form: Sub Posiciona(Controle As Control) Dim SX As Integer.Height / SY / 2) + 20 End Sub Obs: A última linha da Sub é que faz com que o ponteiro do mouse se mova para a nova poisição da tela. ByVal Y _ As Long) As Long 'P/ colocar o cursor do mouse em qualquer parte 'do vídeo use o comando: SetCursorPos PosiçãoX. PosiçãoY 'Onde PosiçãoX e PosiçãoY são valores inteiros '(Integer) e são as coordenadas da posição em 'Pixel da tela p/ onde o mouse irá.TwipsPerPixelY SetCursorPos Me. coloque: Private Sub Command1_Click() Posiciona Command2 'Centraliza o ponteiro no Command2 End Sub Private Sub Command2_Click() Posiciona Command1 'Devolve o ponteiro no Command1 End Sub .

CapsLock = False <Enter> '(A luz do Caps Lock Apaga) . Copie o código abaixo e cole na respectiva janela de código: Option Explicit Private Declare Function GetKeyboardState Lib "user32" _ (pbKeyState As Any) As Long Private Declare Function SetKeyboardState Lib "user32" _ (lppbKeyState As Any) As Long Privatr Const KeyCaps = 20 Dim MatrizDoTeclado(128) As Integer Public Property Get CapsLock() As Boolean GetKeyboardState MatrizDoTeclado(0) If MatrizDoTeclado(KeyCaps / 2) Then CapsLock = True Else CapsLock = False End If End Property Public Property Let CapsLock(ATiva As Boolean) GetKeyboardState MatrizDoTeclado(0) 'Em C.CapsLock = True <Enter> '(A luz do Caps Lock Acende) X. Digite: Set X = New Teclado <Enter> X. Tecle Ctrl+G para trazer a janela Depurar b) . True representa 1 e nao -1 If ATiva Then MatrizDoTeclado(KeyCaps / 2) = 1 Else MatrizDoTeclado(KeyCaps / 2) = 0 End If SetKeyboardState MatrizDoTeclado(0) End Property *** 2) Feito ? Agora experimente: a) . Chame-a de Teclado.128 Teclados Acionar o CAPS LOCK via código *** 1) Crie Uma Classe.

"". ByVal _ lpDirectory As String.References e selecione Microsoft internet Controls e então experimente o código a seguir: Private Sub Command1_Click() On Error GoTo Err_IE Dim objIE4 As SHDocVw.InternetExplorer Set objIE4 = New SHDocVw.exe http://www.br/index. ByVal lpOperation _ As String.InternetExplorer With objIE4 .dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long.silicio.Visible = True End With Set objIE4 = Nothing Exit Sub Err_IE: Set objIE4 = Nothing End Sub >> Dica 3 Ou então experimente este código (NÃO funca em Win NT): Shell "start.com.com.br". ByVal nShowCmd _ As Long) As Long Private Const SW_SHOWNORMAL As Long = 1 'Coloque um botão em um form e adicione o código: Private Sub Command1_Click() Dim i As Long i = ShellExecute (hwnd.br" . SW_SHOWNORMAL) End Sub >> Dica 2 'Clique em Project . _ ByVal lpParameters As String."open".129 INTERNET Acionar o navegador padrão em um URL específico >> Dica 1 'Na seção de declarações coloque: Private Declare Function ShellExecute Lib _ "shell32. vbHide Acionar uma conexão Dial-Up pelo VB Use o código a seguir para chamar uma conexão DialUp previamente criada no seu computador. . _ "http://www.com. _ "". ByVal lpFile As String.Navigate2 "www.silicio.silicio.html".

RnaDial " & _ sConect.text. vbNullString. ByVal nShowCmd _ As Long) As Long Private Const SW_SHOWNORMAL As Long = 1 'No evento que você desejar: Call ShellExecute(0&."RemoteAccess". Private Sub ChamarDialUp(ByVal sConect As String) Dim X As Long X = Shell("C:\Windows\rundll32. "RemoteAccess\Profile\" & _ <nome da Default>. Detalhe: Esta conexão deve existir em seu computador. vbNullString. texte esse código: >> Dica 1 'Na seção de declarações coloque: Private Declare Function ShellExecute Lib _ "shell32. _ ByVal lpParameters As String. ..130 Primeiro crie a rotina ChamarDialUp e depois coloque num evento de sua preferência a chamada a esta rotina.exe mailto:" & Text1. Capturar o nome da conexao Dial-Up GetSettingString(HKEY_CURRENT_USER. Presumindo-se que este TextBox terá o nome de Text1. Daí você usa. ByVal lpOperation _ As String. Criar um link para um e-mail Coloque num Form um TextBox onde o usuário vai digitar o endereço de e-mail. ByVal _ lpDirectory As String. _ SW_SHOWNORMAL) >> Dica 2 (NÃO funciona no Win NT) Shell "start.Text. ByVal lpFile As String. vbHide . _ "Default". "mailto:" & _ Text1.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long.exe rnaui....vbNullString) Vai lhe retornar o nome da conexao default. vbNullString.. 1) AppActivate X SendKeys "{enter}" DoEvents End Sub 'No evento que você desejar: Call ChamarDialUp("Minha Conexão") Substitua "Minha Conexão" pelo nome da conexão que você deseja ativar.dll. HKEY_CURRENT_USER.

por exemplo. _ lpcConnections As Long) As Long Public Declare Function RasHangUp Lib _ "rasapi32.dwSize lpcConnections = 0 ReturnCode = RasEnumConnections(lpRasConn(0). Escreva: @echo off Ping >> %1 Após sua execução.Bat " & Nome_do_Arq_de_Destino Lá no Ping. lpcConnections) If ReturnCode = ERROR_SUCCESS Then For i = 0 To lpcConnections . _ lpcb.1 . Desconectar da Internet Via Código no VB 'Num módulo: Public Const Public Const Public Const Public Const Public Const RAS_MAXENTRYNAME As Integer = 256 RAS_MAXDEVICETYPE As Integer = 16 RAS_MAXDEVICENAME As Integer = 128 RAS_RASCONNSIZE As Integer = 412 ERROR_SUCCESS As Long = 0& Public Type RasEntryName dwSize As Long szEntryName(RAS_MAXENTRYNAME) As Byte End Type Public Type RasConn dwSize As Long hRasConn As Long szEntryName(RAS_MAXENTRYNAME) As Byte szDeviceType(RAS_MAXDEVICETYPE) As Byte szDeviceName(RAS_MAXDEVICENAME) As Byte End Type Public Declare Function RasEnumConnections Lib _ "rasapi32. no diretório do seu pgm e ative-o com um simples: Shell App.Bat.Path & "\Ping. lpcb As Long.dll" Alias "RasHangUpA" _ (ByVal hRasConn As Long) As Long Public gstrISPName As String Public ReturnCode As Long Public Sub HangUp() Dim i As Long Dim lpRasConn(255) As RasConn Dim lpcb As Long Dim lpcConnections As Long Dim hRasConn As Long lpRasConn(0).dll" Alias "RasEnumConnectionsA" _ (lpRasConn As Any.dwSize = RAS_RASCONNSIZE lpcb = RAS_MAXENTRYNAME * lpRasConn(0).131 Dar um Ping Crie um .BAT. poderás ter o resultado no respectivo arquivo TXT. para o Ping.

sName As String) Dim lRetVal As Long lRetVal = tapiRequestMakeCall(sNumber.Add objSession." 'Aqui você deve colocar o caminho COMPLETO 'do arquivo que irá em anexo: objMessage. ByVal _ CalledParty As String." objMessage.132 If Trim(ByteToString(lpRasConn(i).Attachments.Messages.Title. Quando o Text tem algo. False objMessage.DLL" (ByVal Dest As String.SESSION") Set objMessage = objSession. _ App. _ ByVal AppName As String..Text = "Texto do e-mail.. _ False.hRasConn ReturnCode = RasHangUp(ByVal hRasConn) End If Next i End If End Sub Public Function ByteToString(bytString() As _ Byte) As String Dim i As Integer ByteToString = "" i = 0 While bytString(i) = 0& ByteToString = ByteToString & Chr(bytString(i)) i = i + 1 Wend End Function 'P/ usar: Call HangUp Discar com o modem via API Public Declare Function tapiRequestMakeCall _ Lib "TAPI32.. . . "") If lRetVal <> 0 Then 'Erro qualquer ou não conseguiu! End If End Sub Crie um controle com um textbox e uma imagem de um telefone ao lado. ByVal Comment _ As String) As Long Public Sub PhoneCall(sNumber As String.Add "Anexo".. Enviar E-mail pelo VB via MAPI 'Coloque este código no evento que você quizer: Dim objSession As Object Dim objMessage As Object Set objSession = CreateObject("MAPI.Inbox. se o usuário clicar na imagem a função é executada. _ .Subject = "Assunto do e-mail.Logon "Your Profile Name". . sName.szEntryName)) _ = Trim(gstrISPName) Then hRasConn = lpRasConn(i).

Para realizar esta tarefa.OpenURL(txtURL.Enabled = False 'txtURL. Ex. separe 'os endereçod de e-mail por virgulas (.133 "C:\anexo.Recipients.Enabled = True Exit Sub Erro: MsgBox "O documento requerido não foi " & _ "encontrado. bVet() As Byte Dim iNum As Integer On Error GoTo Erro Command1. 1) sTxt = "" For iNum = 0 To UBound(bVet) . Parece coisa do "outro mundo".Resolve objMessage. 'txtURL é o TextBox onde o usuário deverá 'digitar o endereço do texto na Internet.: 'http://www. objMessage.Text = sTxt Command1.Recipients. um CommandButton (cmdDownload).Send Exibir um arquivo direto da Internet/Intranet num TextBox Digamos que você precise exibir num TextBox um arquivo .". vbCritical End Sub Salvando uma Página HTML Coloque num Form um Winsock (Winsock1). um CommandButton. Por tanto deverá ter a propriedade 'MultiLine = True.TXT que está num servidor da Internet.Text deverá conter o endereço 'do arquivo texto na Internet. não é? Pois bem. o componente Microsoft Internet Transfer Control e escreva o código à seguir no evento Click do CommandButton: 'Text1 é o TextBox onde o arquivo texto será 'exibido.1 sTxt = sTxt + Chr(bVet(iNum)) Next Text1. coloque num Form dois TextBox.).XLS" 'Se for mais de um destinatário.Add _ "Endereços de e-mail do(s) destinatário(s)" objMessage.site.txt bVet() = Inet1. com esta dica você vai ver que é até simples de se fazer isto.Text.) 'ou ponto e virgula (. Private Sub Command1_Click() Dim sTxt As String. um TextBox (txtSource) e colole nele este código: .com/texto.

icString) .) '***************************** Private Sub Inet1_StateChanged(ByVal State As Integer) On Error GoTo fim_anormal2 Select Case State Case icError.txt" For Binary Access Write As #intFile Put #intFile.Description GoTo Fim_a Case icResponseReceived ' 12 Dim vtData As Variant ' Data variable.GetData cWebData. icDisconnected MsgBox "Erro na comunicação --> " & Err. bData() Close #intFile '***************************** 'Além disso.OpenURL(strURL.txt" intFile = FreeFile() bData() = Inet1.Connect() Dim cCommand as String Dim cPage as String cPage = "http://fybra/index.Connect End Sub Depois é só salvar o conteúdo de txtSource para um arquivo .com.RemotePort = 80 Winsock1. crie no inet1: '(Esse procedimento faz com que o arquivo 'seja copiado integralmente.Text = txtSource.GetChunk(1024.br" & _ "/home/user/mercur/usuario. Transferência de arquivos via FTP 'Crie o controle no seu forms e um botão de 'comando com o seguinte: '***************************** Dim strURL As String Dim bData() As Byte Dim intFile As Integer strURL = "ftp://aaaaa:zzzzzz@ftp.. vbString txtSource. icByteArray) Open "C:\usuario.. .134 Private Sub Winsock1.HTML.mercur.SendData cCommand End Sub Private Sub Winsock1_DataArrival(ByVal _ bytesTotal As Long) Dim cWebData As String Winsock1.Text & webData End Sub Private Sub cmdDownload_Click() 'Winsock1.html" cCommand = "GET " & cPage & " HTTP/1.0" & _ vbCrLf cCommand = cCommand & "Accept: */*" & vbCrLf cCommand = cCommand & "Accept: text/html" & _ vbCrLf cCommand = cCommand & vbCrLf Winsock1.RemoteHost = "fybra/" Winsock1. Dim strData As String: strData = "" Dim bDone As Boolean: bDone = False vtData = Inet1.

Fim.Text1 = 1 End If ProgressBar1.dll" Alias "RegOpenKeyA" _ (ByVal hKey As Long.135 Do While Not bDone strData = Data & vtData vtData = Inet1. vbCritical. ByVal lpValueName As String.Text1 + 1 If Me.Text1 = Me. Loop Fim = Timer ' Define a hora final. lpData As Any. lpType _ As Long. Início. Do While Timer < Início + TempoDePausa DoEvents ' Submete-se a outros processos. phkResult As _ Long) As Long Private Declare Function RegQueryValueEx _ Lib "advapi32. Fim_a: End sub "Erro") Verificando se o Computador está Conectado à Internet 'Num módulo: Private Private Private Private Const ERROR_SUCCESS = 0& Const APINULL = 0& Const HKEY_LOCAL_MACHINE = &H80000002 ReturnCode As Long Private Declare Function RegCloseKey Lib _ "advapi32. icString) If Len(vtData) = 0 Then bDone = True End If Me.GetChunk(1024.dll" Alias _ "RegQueryValueExA" (ByVal hKey As _ Long. TempoTotal TempoDePausa = 1 ' Define a duração.Text1 Dim TempoDePausa. ByVal _ lpSubKey As String.Description.Início ' Calcula o tempo total. Loop End Select GoTo Fim_a fim_anormal2: Dim a a = MsgBox("Erro de copia! " & Err.dll" (ByVal hKey As Long) _ As Long Private Declare Function RegOpenKey Lib _ "advapi32.Text1 > 100 Then Me. TempoTotal = Fim . Início = Timer ' Define a hora inicial. lpcbData _ As Long) As Long Public Function EstaConectado() As Boolean Dim hKey As Long Dim lpSubKey As String Dim phkResult As Long Dim lpValueName As String Dim lpReserved As Long .Value = Me. _ ByVal lpReserved As Long.

lpData. lpReserved. lpReserved. _ lpValueName. lpcbData) lpcbData = Len(lpData) ReturnCode = RegQueryValueEx(hKey. _ lpSubKey. ByVal lpData. lpcbData) If ReturnCode = ERROR_SUCCESS Then If lpData = 0 Then ActiveConnection = False Else ActiveConnection = True End If End If RegCloseKey (hKey) End If End Function 'P/ chamar a função. _ lpValueName. phkResult) If ReturnCode = ERROR_SUCCESS Then hKey = phkResult lpValueName = "Remote Connection" lpReserved = APINULL lpType = APINULL lpData = APINULL lpcbData = APINULL ReturnCode = RegQueryValueEx(hKey.136 Dim lpType As Long Dim lpData As Long Dim lpcbData As Long ActiveConnection = False lpSubKey = "System\CurrentControlSet\" & _ "Services\RemoteAccess" ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE. _ lpType. _ lpType. no evento que você quizer: If EstaConectado = True Then 'Está conectado Else 'NÃO Está conectado End If .

0. 0. mude seu nome para CDAudio e codifique: Private Declare Function mciGetErrorString Lib _ "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String. 0. 0. 0 End Function Function SetFormat_tmsf() mciSendString "set cd time format tmsf wait". 0 End Function Function PausePlay() mciSendString "pause cd". 0. 0. Insira um Class module. 0. _ 0. 0. 0 End Function Function StopPlay() mciSendString "stop cd wait". 0 End Function Function SetCDPlayerReady() mciSendString "open cdaudio alias cd wait " & _ shareable". 0 End Function Function CloseCD() mciSendString "set cd door closed". 0. 0 End Function Function SetFormat_milliseconds() mciSendString "set cd time format " & _ . 0 End Function Function EjectCD() mciSendString "set cd door open". ByVal uLength As Long) As Long Private Declare Function mciSendString Lib _ "winmm.137 MULTIMÍDIA Criando um CD Player Coloque um textBox e cinco botoes no form. 0 End Function Function SetTrack(Track As String) mciSendString "seek cd to " & Str(Track). 0.dll" Alias "mciGetErrorStringA" _ (ByVal dwError As Long. ByVal _ uReturnLength As Long. 0. ByVal lpstrBuffer _ As String. 0. 0 End Function Function UnloadAll() mciSendString "close all". _ 0. 0. ByVal _ hwndCallback As Long) As Long Function StartPlay() mciSendString "play cd". 0. 0. 0. ByVal _ lpstrReturnString As String.

138
milliseconds", 0, 0, 0 End Function Function CheckCD() As Integer Dim s As String * 30 mciSendString "status cd media present", s, _ Len(s), 0 CheckCD = CInt(s) End Function Function GetNumTracks() As Integer Dim s As String * 30 mciSendString "status cd number of tracks " & _ wait", s, Len(s), 0 GetNumTracks = CInt(Mid$(s, 1, 2)) End Function Function GetCDLength() As String Dim s As String * 30 mciSendString "status cd length wait", s, _ Len(s), 0 GetCDLength = s End Function Function GetTrackLength(TrackNum As Integer) As _ String Dim s As String * 30 mciSendString "status cd length track " & _ TrackNum, s, Len(s), 0 GetTrackLength = s End Function Sub GetCDPosition(ByRef Track As Integer, ByRef _ Min As Integer, ByRef Sec As Integer) Dim s As String * 30 mciSendString "status cd position", s, Len(s), 0 Track = CInt(Mid$(s, 1, 2)) Min = CInt(Mid$(s, 4, 2)) Sec = CInt(Mid$(s, 7, 2)) End Sub Function CheckIfPlaying() As Integer CheckIfPlaying = 0 Dim s As String * 30 mciSendString "status cd mode", s, Len(s), 0 If Mid$(s, 1, 7) = "playing" Then CheckIfPlaying = 1 End If End Function Function SeekCDtoX(Track As Integer) StopPlay SetTrack Track StartPlay End Function Function ReadyDevice() UnloadAll SetCDPlayerReady SetFormat_tmsf End Function

139

Function FastForward(Spd As Integer) Dim s As String * 40, Ply As Integer SetFormat_milliseconds mciSendString "status cd position wait", s, _ Len(s), 0 Ply = CheckIfPlaying If Ply = 1 Then mciSendString "play cd from " & _ CStr(CLng(s) + Spd), 0, 0, 0 Else mciSendString "seek cd to " & _ CStr(CLng(s) + Spd), 0, 0, 0 End If SetFormat_tmsf End Function Function ReWind(Spd As Integer) Dim s As String * 40, Ply As Integer SetFormat_milliseconds mciSendString "status cd position wait", s, _ Len(s), 0 Ply = CheckIfPlaying If Ply = 1 Then mciSendString "play cd from " & _ CStr(CLng(s) - Spd), 0, 0, 0 Else mciSendString "seek cd to " & _ CStr(CLng(s) - Spd), 0, 0, 0 End If SetFormat_tmsf End Function 'No form coloque: Dim Snd As CDAudio Private Sub Command1_Click() Snd.SeekCDtoX Val(Text1) End Sub Private Sub Command2_Click() Dim s As String s = Snd.GetCDLength MsgBox "Total de minutos do CD: " & s, , _ "CD len" End Sub Private Sub Command3_Click() Snd.CloseCD End Sub Private Sub Command4_Click() Snd.EjectCD End Sub Private Sub Command5_Click() Snd.StopPlay End Sub Private Sub Form_Load() Set Snd = New CDAudio

140
Snd.ReadyDevice End Sub Private Sub Form_Unload(Cancel As Integer) Snd.StopPlay Snd.UnloadAll Set Snd = Nothing End Sub

Criar tela de apresentação no CD-ROM
- Crie um programa VB SEM USAR NENHUMA OCX QUE NÃO FAÇA PARTE DO 'PACOTE' PADRÃO. Não inclua nenhum componente na palete, trabalhe com os que aparecem originalmente; - Compile o programa e crie o EXE; - Coloque o EXE no CD e, NO MESMO DIRETÓRIO, coloque o arquivo MSVBVM50.DLL, que se encontra no diretório \windows\system (ele é instalado junto ao VB). AUTO-RUN Se quiser que o seu programa seja executado automaticamente quando a pessoa inserir o CD no drive (e o sistema estiver configurado para isso, é claro), é só criar, no diretório raiz do CD, um arquivo chamado AUTORUN.INF, com o conteúdo: [Autorun] OPEN=PROGRAM.EXE ICON=CDICON.ICO Onde você deve substituir PROGRAM.EXE pelo nome do seu executável (com path completo, mas normalmente esse tipo de arquivo deve ser colocado na raiz do CD) e CDICON.ICO é opcional, e indica um arquivo ICO com o ícone que você deseja que apareça no lugar do ícone padrão para o CD-ROM.

Detectando se o Micro tem Placa de Som
'Num módulo: Private Declare Function waveOutGetNumDevs Lib _ "winmm.dll" Alias "waveOutGetNumDevs" () _ As Long Public Function HaveSoundCard() As Boolean Dim i As Integer i = waveOutGetNumDevs() If i > 0 Then HaveSoundCard = True Else HaveSoundCard = False End If End Function 'P/ usar: If HaveSoundCard Then MsgBox "Seu micro tem placa de som!", _ vbInformation, "Sound Card Test" Else MsgBox "Seu micro NÃO tem placa de som!", _ vbInformation, "Sound Card Test" End If

141

Gravando uma Trilha do CD para um Arquivo Wave
Esta função usa o multimedia control interface (MCI) para controlar o drive de CD. 'Num módulo: Private Declare Function mciSendString Lib _ "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As String, ByVal _ uReturnLength As Long, ByVal _ hwndCallback As Long) As Long Public Sub RecordWave(TrackNum As Integer, _ Filename As String) ' Tracknum: Trilha a ser gravada ' Filename: Arquivo Wave a ser gerado On Local Error Resume Next Dim i As Long, RS As String, cb As Long, t# RS = Space$(128) i = mciSendString("stop cdaudio", RS, 128, cb) i = mciSendString("close cdaudio", RS, 128, cb) Kill filename RS = Space$(128) i = mciSendString("status cdaudio position track " & TrackNum, RS, 128, cb) i = mciSendString("open cdaudio", RS, 128, cb) i = mciSendString("set cdaudio time format milliseconds", RS, 128, cb) i = mciSendString("play cdaudio", RS, 128, cb) i = mciSendString("open new type waveaudio alias capture", RS, 128, cb) i = mciSendString("record capture", RS, 128, cb) t# = Timer + 1: Do Until Timer > t#: DoEvents: Loop i = mciSendString("save capture " & filename, RS, 128, cb) i = mciSendString("stop cdaudio", RS, 128, cb) i = mciSendString("close cdaudio", RS, 128, cb) End Sub O método é bastante simples. Veja o que ele faz: 1º - Para o CD (caso ele esteja tocando, claro); 2º - Toca a trilha selecionada; 3º - Grava um novo arquivo wave com a informação do CD (obs: isso tambem grava MIDI e sons do microfone, na verdade qualquer coisa que saia pelos alto falantes) 4º - Salva o som Wave; 5º - Para o CD novamente.

Rodando um Vídeo AVI
Esta dica demonstra como tocar um vídeo AVI sem usar o Multimedia (MCI) Control. 'Num módulo: Public Declare Function mciSendString Lib _ "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As String, ByVal _ uReturnLength As Long, ByVal _ hwndCallback As Long) As Long

142
'Num Form, adicione dois botões e coloque este 'código: Dim returnstring As String, erg As Long Private Sub Command1_Click() 'Este código abre o vídeo AVI Dim FileName As String FileName As String returnstring = Space(127) 'Arquivo AVI a ser tocado. FileName = "C:\Videos\Sei Lá\Welcome1.avi" erg = mciSendString("open " & Chr$(34) & _ FileName & Chr$(34) & _ " type avivideo alias video", _ returnstring, 127, 0) erg = mciSendString("set video time format ms", _ returnstring, 127, 0) erg = mciSendString("play video from 0", _ returnstring, 127, 0) End Sub Private Sub Command1_Click() 'Este código fecha o vídeo AVI erg = mciSendString("close video", _ returnstring, 127, 0) End Sub

Tocar Arquivos MIDI
'Num módulo: Public Declare Function mciExecute Lib "winmm.dll" _ (ByVal lpstrCommand As String) As Long Public Sub TocarMID(File As String, Optional Wait _ As Boolean) If File = "" Then Call mciExecute("close Musica") Else Call mciExecute("open " & File & " type " & _ "sequencer alias Musica") If Wait Then Call mciExecute("play Musica wait") Else Call mciExecute("play Musica") End If End If End Sub 'P/ abrir a música MIDI (já tocando-o): TocarMID "C:\Musica.MID" 'P/ dar uma pausa: TocarMID "C:\Musica.MID", True 'P/ voltar a tocar a música MIDI: TocarMID "C:\Musica.MID", False 'P/ fechar a música: TocarMID ""

dll" _ Alias "sndPlaySoundA" (ByVal lpszSoundName As _ String.: Quando for tocar um som. * SND_NODEFAULT => Não usa o som padrão.143 Tocar Arquivos WAVE Public Declare Function sndPlaySound Lib "winmm. * SND_ASYNC => Toca o WAVE sem sincronismo.S. Optional Flags _ As SndPlayFlags) If File = "" Then Call sndPlaySound(0&. * SND_LOOP => Toca o WAVE em looping. utilize: "" P. . As opções são: * SND_SYNC => Toca o WAVE sincronizado (default).WAV" o som. 0) Else Call sndPlaySound(File. Até q você mande-o parar. utilize: "C:\Som. Flags) End If End Sub 'P/ tocar PlaySound 'P/ parar PlaySound o som. * SND_NOSTOP => Não para o som que estiver tocando. ByVal uFlags As Long) As Long Public Enum SndPlayFlags SND_SYNC = &H0 SND_ASYNC = &H1 SND_NODEFAULT = &H2 SND_MEMORY = &H4 SND_LOOP = &H8 SND_NOSTOP = &H10 End Enum Public Sub PlaySound(File As String. você pode passar alguma opção no parâmetro Flags. * SND_MEMORY => Direciona o IpszSoundName para o lugar de um arquivo na memória.

144 PROGRAMAÇÃO INTELIGENTE Cuidado com Variáveis Tipo Variant!!! Evite usar as variáveis do tipo Variant a todo custo. internamente.. Seu uso quase que só é aprovado em funçoes onde você não tem como antecipar o tipo de variável que irá receber.. Veja que as conversões são feitas automaticamente.End If Quando Possível 'Ao invés de: If sDados = "S" then bVar = True Else bVar = False End If 'Use: Dim bVar As Boolean bVar = (sDados = "S") Outra coisa que alguns programadores usam e é TOTALMENTE desnecessário são verificações como esta: Dim bVar As Boolean '.. If bVar = True Then '. Por exemplo.. 16 bytes + 1 byte por caracter. se você colocar numa variável Variant uma data e concatenar (somar) uma string ela aceita sem dar NENHUM tipo de erro. Pode ver que várias declarações de APIs usão parâmetros Variant. o dobro do maior valor requisitado dos outros tipos. O uso de variants como variáveis globais ou estáticas deve ser evitado a todo custo e nem deve ser empregada em qualquer tipo de loop (o desperdício e a queda de desempenho seria multiplicado por cada passagem pela referência.. uma Variant requisita.. todos os métodos e tratamentos dos outros tipos de dados. Também tem o detalhe de este tipo de variável não faz validação de nenhum tipo. uma Long requisita 4 bytes e uma Double ou Date requisita 8 bytes. enquanto uma variável String requisita 1 byte. uma Integer requisita 2bytes.. no mínimo. .) O motivo disso tudo é que o tipo Variant tem que ter. Eliminando o If... A única vantagem das variáveis tipo Variant é que elas pode conter valores especiais. 'Comandos '. Error e Empty. como Null. pois elas consomem MUITO mais memória. Até mesmo um objeto de OLE requisita apenas 4bytes! O uso de uma variável Variant sacrifica um pouco o desempenho do programa exatamente pela requisição mais acentuada da memória e pelo fato do consumo mínimo da estrutura (16 bytes para variants com números e 22 bytes mais o comprimento da string para variants com strings). Para se ter uma idéia. ou seja..

.145 'Comandos '. Ps: Declare também suas próprias constantes (num módulo .. porém com 2 setas. End If Eu digo que é desnecessário. e comparem o tamanho final do EXE. Com a Compilação Completa.. temos vbInformation + vbYesNo. vbYes. pois você pode usar SIMPLESMENTE não colocando o " = True".. Ele ficará com uma imagem como a do Run. ele será detectado. Para facilitar..... 'Comandos '. vbCrLf..###\/####\-##" vbNumViado = 24 . vbNullString. Else 'bVar é igual a False. procure usar as constantes intrínsecas do VB.###\-##" vbCGCMask = "##. se houver algum erro em qualquer parte de seu programa.BAS) Public Public Public Public Const Const Const Const vbDbName = "NomeDoDB.###. If bVar Then 'bVar é igual a True.MDB" 'O path adiciona depois vbCPFMask = "###. Para MsgBoxes.. 'Comandos '. como vbNull. pois dá na mesma... E uma paulada de outras (verifique-as no Object Browser F2). etc . o compilador verifica seus erros de programação a medida que os comandos vão sendo executados. precionando F5 ou clicando no menu "Run"/"Start". clicando no botão "Start" da ToolBar do VB.###. End If Executar com Compilação Completa Quando você executa um programa pela IDE do VB.. você pode criar na barra de ferramentas do VB um botão com a opção do menu "Run"/"Start With Full Compile". por exemplo. Else '. Já fiz o teste (repitam por favor). Substituam todos os seus "" por vbNullString e outros penduricalhos repetitivos como Chr(10)+Chr(13) por vbCrLf.. Faça amplo uso das constantes intrínsecas do VB Quando for necessário. Veja: Dim bVar As Boolean '. Você também pode simplesmente precionar Ctrl+F5. não estarás redundando a declaração do que já existe e está disponível. Além de tornar seu código mais legível (até pra você).

Confuso? Veja: Dim varObj As New Objeto 'O VB não instanciou o objeto.Propriedade = 7 'Aqui o VB verificou se o objeto já estava instanciado. 'Isto causa lentidão! 'E o pior: Set varObj = Nothing 'Descarregou-o da memória If varObj Is Nothing Then Msgbox "Objeto destruído!" End If Ele NÃO vai mostrar a mensagem "Objeto destruído!". Quer dizer.Metodo 100 'Aqui o VB também verificou se o objeto ja estava instanciado. o VB irá verificar se ele já foi instanciado ou não. é possível usar uma estrutura condicional usando o "Is Nothing". P/ isso use Nothing: Set varObj = Nothing Saber se o Objeto está Vazio Não é possível comparar um objeto (como Form ou outro controle) com IsEmpty para saber se ele possui um valor ou não. Como ele 'notou que nao. Entretando. gera uma lentidão neste processo. pois o objeto não será totalmente descarregado da memória!!! Para evitar tudo isso. declare apenas como "Objeto". O problema disto é que a cada vez que você referenciar este objeto.. Veja: If Not frmMenu Is Nothing Then 'NÃO Está vazio Else 'ESTÁ vazio End If .146 Public DataVazia As Date 'Só use para comparação Instanciando Objetos Corretamente Evite fazer declarações de objetos com "New". pois quando você faz isso o VB NÃO está criando uma referencia. ele instanciou varObj. varObj.. 'Forma correta (recomendada): Dim varObj As Objeto Set varObj = New Objeto Não esqueça de liberar sua memória após usar o objeto. Ele só irá instanciar (criar a referencia) quando você referencia-lo pela 1º vez (usar um método ou alterar uma propriedade deste objeto).

pois esta necessita ficar por cima de toda as outras janelas (e isto é conseguido com o uso da API SetWindowPos).).Loop. P/ faze-la aparecer é só prescionar [CTRL+G]. OutraVariavel As String . Loop Outra utilidade do DoEvents é em uma tela de Splash. Na janela.. Experimente.Next. digitar: nomed + [CTRL+{Espaço}] outr + [CTRL+{Espaço}] Usando o DoEvents Quando seu programa tiver a necessidade de realizar um processamento longo (utilizando loops como Do. Para evitar isto utilize SEMPRE a funçao DoEvents.. For.. que permite que o seu programa realize este processamento enquanto o usuário realiza outras tarefas. seu programa (ou mesmo seu computador) poderá travar. Outros comandos . com as seguintes variáveis. Além do que fica uma coisa deselegante o seu programa ficar travando a cada comando que o usuário manda executar. experimente: ? Nome_da_sua_variável (não esqueça do escopo) ? Seu_Recordset!Nome_do_Campo ? Err. . 'Utilize o DoEvents desta maneira: Do 'Entra no Loop DoEvents '<--.. por exemplo.. O problema é que sem o DoEvents ela NÃO fica por cima das outras MESMO usando essa API.description Usando o Auto Completar O recurso de Auto Completar [CTRL+{Espaço}] do VB é muito útil quando você quer digirar o MÍNIMO possível......147 Usando a Immediate Window Durante um BreakPoint de execução (Pausa) [CTRL+{Break}].. Dim NomeDaVariavel As String. ou se tem nomes longos de variáveis.. use a Immediate Window para obter informações sobre suas variáveis e o ambiente do VB.

" Label1..AutoSize = True . blá. Comandos . Então. 'Então. mais rápido.Enabled = True Label1. ele carrega na memória...Refresh End With Motivo: No exemplo 01. Por este motivo. Verificando Valor da Propriedade de um Objeto Mais Rapdamente Quando você cria um objeto (classe. ficando assim.. Comandos .Caption = "Blá. no caso." .Refresh '(02) Use: With Label1 . Comandos .... A função que usa "Property Get" é chamada quando você verifica o valor contido na propriedade e a função "Property Let" é chamada quando você atribui um novo valor a essa propriedade (a função "Property Set" é usada quando esta propriedade aceita um objeto uma imagem. blá. ele cria APENAS uma instância... blá.. veja: '(01) Ao invéz de: Label1.. Já na segunda. prefira acessar várias vezes uma variável do que uma propriedade.AutoSize = True Label1. ElseIf txtOpção. por exemplo . ActiveX Control ou ActiveX DLL).Caption = "Blá.Enabled = True . você tem que criar duas funções para cada propriedade: uma usando "Property Get" e outra usando "Property Let" (ou "Property Set"). uma instância do objeto para cada atribuição..Text = "Tudo" And Var = "S" Then . Basta prescionar [F2] que ele aparecerá.148 Usando o Object Browser Tens dúvidas sobre que eventos/métodos/propriedades de determinado objeto já adicionado à seu projeto? Use-o..Visible = True . blá. um Label por exemplo.e não um valor). cria 5 instâncias..Text = "Tudo" And Var = "N" Then . Use o With para Atribuir Valores à Propriedades de Objetos Digamos que você necessite mudar as propriedades de um objeto. ElseIf txtOpção.. End If .Text = "Nada" Then . ao invés de usar desta maneira: If txtOpção.Visible = True Label1..

End If . Comandos ..... ElseIf sTexto = "Tudo" And Var = "N" Then .149 'Use assim: Dim sTexto As String sTexto = txtOpção..Text If sTexto = "Nada" Then ...... ElseIf sTexto = "Tudo" And Var = "S" Then ... Comandos . Comandos .

(t.150 REDES Buscar data e hora do servidor Para chamar: Data = ServerTime("\\NomedaMaquina") ou Data = ServerTime("NomedaMaquina"). 1.vbUnicode) Else szServer = StrConv("\\" & pServerName. buffer As Any) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" (hpvDest As _ Any. ByVal tPtr. Private Declare Function NetRemoteTOD Lib _ "NETAPI32.DLL" (ByVal server As _ String.t_elapsedt / 60 / 60 / 24) ServDate = ServDate . 1) + _ (t. hpvSource As Any. 'Coloque isso em um módulo. Len(t)) ServDate = DateSerial(70. 2) = "\\" Then szServer = StrConv(pServerName. ByVal cbCopy _ As Long) Private Declare Function NetApiBufferFree Lib _ "NETAPI32.DLL" (buffer As Any) As Long Private Type TIME_OF_DAY t_elapsedt As Long t_msecs As Long t_hours As Long t_mins As Long t_secs As Long t_hunds As Long t_timezone As Long t_tinterval As Long t_day As Long t_month As Long t_year As Long t_weekday As Long End Type Public Function ServerTime(ByVal pServerName _ As String) As Variant Dim t As TIME_OF_DAY Dim tPtr As Long Dim Result As Long Dim szServer As String Dim ServDate As Date If Left(pServerName. _ vbUnicode) End If Result = NetRemoteTOD(szServer. tPtr) If Result = 0 Then Call CopyMemory(t.t_timezone / 60 / 24) NetApiBufferFree (tPtr) ServerTime = ServDate Else 'erro End If End Function .

HPFS ou CDFS (CD File System). Entretanto. NTFS. nSize As _ Long) As Long Public Function GetComputer() As String Dim Buffer As String Dim Size As Long Dim dl As Long Size = 199 Buffer = String$(200. Isto é uma verdade. A chamada indica o sistema de arquivos: FAT. plngMaxFileNameLen. apenas como DRIVE_REMOTE (de rede). a função GetDriveType mostra os Drives CDs em Rede. Size) Else GetComputer = "" End If End Function 'Vc chamada a função assim: Dim Var as String Var = GetComputer() Identificando uma unidade de CD em Rede A API de 32 bits é bem mais rica que a de 16 bits. _ plngVolSerialNum. de rede e CD.. pstrRootPath = "E:\" pstrVolName = Space$(256) pstrSystemType = Space$(32) plngSysTypeSize = Clng(Len(pstr(SystemType)) plnVolNameSize = Clng(Len(pstrVolName)) plngRtn = GetVolumeInformation (pstrRoothPath. plngSysTypeSize) .. ao mesmo tempo. mas não completa. Declare Function GetVolumeInformation Lib "Kernel32" _ Alias "GetVolumeInformationA" (ByVal _ lPRootPathName as String ByVal lpVolumeNameBuffer _ As String ByVal nVolumeNameSize As Long ByVal _ lpVolumeSerialNumber As Long ByVal _ lpMaximumComponentLenght As Long ByVal _ lpFileSystemFlags As Long ByVal _ lpFileSystemNameSize As Long) As Long '. plngVolNameSize. 0) dl = GetComputerName(Buffer.151 Devolve o nome do micro na rede Public Declare Function GetComputerName Lib _ "kernel32" Alias "GetComputerNameA" _ (ByVal lpBuffer As String. Combine a chamada a GetDriveType com uma chamada a GetVolumeInformation para determinar se o drive é. Size) If dl <> 0 Then GetComputer = Left$(Buffer. _ pstrVolName. _ plngSysFlags. pstrSystemType.

dll" Alias "WNetGetConnectionA" _ (ByVal lpszLocalName As String. ByVal bForce As Long) As Long 'No evento desejado: Dim sCaminho As String. sCaminho.dll" Alias _ "WNetCancelConnectionA" (ByVal lpszName As _ String.dll" Alias "GetUserNameA" _ (ByVal lpbuffer As String. 255) 'Desconecta WNetCancelConnection Unidade. _ sUnidade 'Consulta caminho de uma determinada conexão. sUnidade as String sCaminho = "\\Computador\Caminho" sUnidade = "I:" 'Realiza a conexão WNetAddConnection sCaminho.dll" Alias "WNetAddConnectionA" _ (ByVal lpszNetPath As String. lSize If lSize > 0 Then sUserID = Left$(sBuffer. na variável caminho será 'armazenado o local do caminho atual referente 'a unidade WNetGetConnection sUnidade. digite á aqui". ByVal _ lpszPassword As String. 'neste caso. True Retornar o nome do usuário logado Public Declare Function GetUserName Lib _ "advapi32. cbRemoteName _ As Long) As Long Public Declare Function WNetCancelConnection _ Lib "mpr.152 Mapeando uma Unidade de Rede 'Num módulo: Public Declare Function WNetAddConnection Lib _ "mpr. _ "Se tiver senha. lSize . ByVal _ lpszRemoteName As String. ByVal _ lpszLocalName As String) As Long Public Declare Function WNetGetConnection Lib _ "mpr. nSize _ As Long) As Long Public Function sUserID() As String Dim sBuffer As String Dim lSize As Long sBuffer = Space$(255) lSize = Len(sBuffer) GetUserName sBuffer.1) MsgBox sUserID End If End Function .

strDois.") If strDecimal <> 0 Then . pois utilizando-o é possível selecionar palavras. Ou seja.DOC"). strUm.Application") 'Abre o documento Word. Text1. tabelas. strDois. qualquer parte do documento.Text = Word. parágrafos.DOC" 'Seleciona o documento inteiro Word.Offset(0. 1). strTres ActiveCell.Selection.Select 'Joga o conteúdo da seleção numa caixa de Texto. ".Documents.Select lngArquivo = FreeFile Open strArquivo For Input As lngArquivo Do While Not EOF(lngArquivo) Input #lngArquivo. etc.Value = strUm ActiveCell.Activate 'Obtem o ponto strDecimal = InStr(1. Trocar dados com o Excel Sub Importa(strArquivo As String) 'Número do arq Dim lngArquivo As Long 'Dados da 1º coluna Dim strUm As String 'Dados da 2º coluna Dim strDois As String 'Dados da 3º coluna Dim strTres As String 'Usada na substituição do ponto Dim strDecimal As Variant Range("A1").153 VBA Copiando Textos de Documentos do Word 'No evento desejado: Dim Word As Object Set Word = CreateObject("Word.Documents("NomeDoDocumento.Text Pesquise o VBA.Open "C:\Meus Documentos\" & _ "NomeDoDocumento.

Activate ActiveCell. _ columnOffset:=-2).SaveAs "c:\SeuArquivo. 1) = ".Offset(rowOffset:=1. 1). strDecimal.Column = 3 Then 'Se coluna atual = 3(C) 'Muda de linha ActiveCell.Offset(0.Activat End If Loop Close lngArquivo ThisWorkbook.154 'Se houver valor de retorno 'Substitui o ponto por vírgula Mid(strDois. .Value = CCur(strDois) Else 'Senão 'Não altera a string ActiveCell.Value = strDois End If ActiveCell.xls" End Sub Você pode usar a rotina dentro de um loop passando como parâmetro o nome do arquivo texto a ser aberto." 'Converte para moeda ActiveCell.Value = strTres If ActiveCell.

155 VALIDAÇÕES Função para Verificar se um Ano é Bissexto ou Não 'Num módulo: Public Function IsBissexto(Year As Integer) _ As Boolean IsBissexto = (Month(DateSerial(Year.Print Counter. Answer Counter = Counter + 1 End If Wend Answer = Answer Mod 10 If Answer = 0 Then CheckCard = True End Function .9 End If Answer = Answer + TmpInt 'Debug. Counter. Counter. TmpInt. 1)) If Not IsEven(Counter) Then TmpInt = TmpInt * 2 If TmpInt > 9 Then TmpInt = TmpInt . 1)) If IsEven(Counter) Then TmpInt = TmpInt * 2 If TmpInt > 9 Then TmpInt = TmpInt . Answer Counter = Counter + 1 Else TmpInt = Val(Mid$(CCNumber. TmpInt.Print Counter.9 End If Answer = Answer + TmpInt 'Debug. TmpInt As Integer Dim Answer As Integer Counter = 1 TmpInt = 0 While Counter <= Len(CCNumber) If IsEven(Len(CCNumber)) Then TmpInt = Val(Mid$(CCNumber. _ 29)) = 2) End Function 'P/ usar: Private Sub Command1_Click() Dim bRet As Boolean bRet = IsBissexto(txtAno) If bRet Then MsgBox "O Ano É Bissexto!!!" Else MsgBox "O Ano NÃO É Bissexto!!!" End If End Sub Validar Cartão de Crédito Function CheckCard(CCNumber As String) As Boolean Dim Counter As Integer. 2.

9) Next i a = a Mod 11 d1 = IIf(a > 1. i. 1)) And d2 = Val(Mid(cgc. i. a. i. 0) If (d1 = Val(Mid(cgc. 0) a = 0 i = 0 j = 6 For i = 1 To 13 Step 1 a = a + (Val(Mid(cgc.(j Mod 10). 11 . 10 . 0) If d1 = Val(Mid(cgc.a. d2 If Len(cgc) = 8 And Val(cgc) > 0 Then a = 0 j = 0 d1 = 0 For i = 1 To 7 a = Val(Mid(cgc.1. 13. 11 . d1. 9) Next i a = a Mod 11 d2 = IIf(a > 1. _ 14.156 Validar CGC 'Num módulo: Public Function FU_ValidaCGC(cgc As String) As Boolean Dim retorno. j .1. i.a. 1)) * j) j = IIf(j > 2. 1))) Then FU_ValidaCGC = True Else FU_ValidaCGC = False End If Else FU_ValidaCGC = False End If End If End Function 'P/ chamar: . j. 1)) If (i Mod 2) <> 0 Then a = a * 2 End If If a > 9 Then j = j + Int(a / 10) + (a Mod 10) Else j = j + a End If Next i d1 = IIf((j Mod 10) <> 0. 1)) Then FU_ValidaCGC = True Else FU_ValidaCGC = False End If Else If Len(cgc) = 14 And Val(cgc) > 0 Then a = 0 i = 0 d1 = 0 d2 = 0 j = 5 For i = 1 To 12 Step 1 a = a + (Val(Mid(cgc. 8. 1)) * j) j = IIf(j > 2. j .

i) Next i Resto = 11 .545.(soma . 11.284.(Int(soma / 11) * 11)) If Resto = 10 Or Resto = 11 Then Resto = 0 If Resto <> Val(Mid$(CPF. 1)) * (11 .(Int(soma / 11) * 11)) If Resto = 10 Or Resto = 11 Then Resto = 0 If Resto <> Val(Mid$(CPF.157 Dim RET as Boolean RET = FU_ValidaCGC "15. Optional ByVal sFormato _ As String) As Boolean .974/5489-28" 'É APENAS um Exemplo! If RET = True Then 'O CGC é válido Else 'O CGC NÃO é válido End If Validar CPF 'Num módulo: Public Function FU_ValidaCPF(CPF As String) As Boolean Dim soma As Integer Dim Resto As Integer Dim i As Integer 'Valida argumento If Len(CPF) <> 11 Then FU_ValidaCPF = False Exit Function End If soma = 0 For i = 1 To 9 soma = soma + Val(Mid$(CPF.i) Next i Resto = 11 .(soma .565-28" 'É APENAS um Exemplo! If RET = True Then 'O CGC é válido Else 'O CGC NÃO é válido End If Validar Datas 'Num módulo: Public Function ValidaData(ByVal sData _ As String. 1)) * (12 . 1)) Then FU_ValidaCPF = False Exit Function End If FU_ValidaCPF = True End Function 'P/ chamar: Dim RET as Boolean RET = FU_ValidaCPF "518. 10. i. 1)) Then FU_ValidaCPF = False Exit Function End If soma = 0 For i = 1 To 10 soma = soma + Val(Mid$(CPF. i.

Temp As String sBst As Boolean If IsMissing(sFormato) Then sFormato = "DD/MM/YYYY" 'OU então. 1)) = "M" Then If MMOk > 2 Then ValidaData = False Exit Function Else MMOk = MMOk + 1 If Mes_Pos = 0 Then Mes_Pos = Dia_Pos + Ano_Pos + 1 End If End If ElseIf UCase(Mid(sFormato. MMOk As Integer YYOk As Integer. End If Temp = Replace(sData. i. "Y". i. você pode pegar o formato 'que estiver configurado no Windows. i. i. 1)) Case "D". i As Integer m As Integer.158 Dim Dim Dim Dim Dim Dim Dim Dia As Integer. "/") sData = Temp Temp = Replace(sFormato. Ano_Pos As Integer DDOk As Integer. "/") sFormato = Temp Temp = "" DDOk = 0 MMOk = 0 YYOk = 0 For i = 1 To Len(sFormato) If UCase(Mid(sFormato. "-". Dia_Pos As Integer Mes As Integer. "M". "/" Case Else ValidaData = False Exit Function . Mes_Pos As Integer Ano As Integer. "-". 1)) = "D" Then If DDOk > 2 Then ValidaData = False Exit Function Else DDOk = DDOk + 1 If Dia_Pos = 0 Then Dia_Pos = Mes_Pos + Ano_Pos + 1 End If End If ElseIf UCase(Mid(sFormato. 1)) = "Y" Then If YYOk > 4 Then ValidaData = False Exit Function Else YYOk = YYOk + 1 If Ano_Pos = 0 Then Ano_Pos = Dia_Pos + Mes_Pos + 1 End If End If Else Select Case UCase(Mid(sFormato.

1) = "/" Or _ i = Len(sData) Then If i = Len(sData) Then Temp = Temp & Mid(sData. i. 1) End If Next i Select Case Mes Case 1. 12 If Dia < 1 Or Dia > 31 Then ValidaData = False Exit Function End If Case 4. 1) End If m = m + 1 If m = 3 Then m = 4 If Dia_Pos = m Then Dia = Temp ElseIf Mes_Pos = m Then Mes = Temp ElseIf Ano_Pos = m Then Ano = Temp End If Temp = "" Else Temp = Temp & Mid(sData. i. 8. 7. 9.159 End Select End If Next i If DDOk = 0 Or MMOk = 0 Then ValidaData = False Exit Function End If If YYOk = 0 Or YYOk > 4 Then ValidaData = False Exit Function End If If Not IsDate(sData) Then ValidaData = False Exit Function End If m = 0 For i = 1 To Len(sData) If Mid(sData. 11 If Dia < 1 Or Dia > 31 Then ValidaData = False Exit Function End If Case 2 If Dia < 1 Or Dia > 29 Then ValidaData = False Exit Function ElseIf Dia = 29 Then sBst = False If Ano = 0 Then sBst = True ElseIf Ano Mod 4 = 0 Then . 5. i. 3. 10. 6.

c) If Len(sEMail) < 5 Then 'O e-mail é inválido. 1) = "@" Then 'OPA!!! Achou uma arroba!!! 'Soma 1 ao contador Count = Count + 1 End If . pois tem menos 'de 5 caracteres ValidEMail = False MsgBox "O e-mail digitado tem menos de 5 " & _ "caracterec!!!" Exit Function End If 'Verificar a existencia de arrobas (@) no e-mail For nCharacter = 1 To Len(sEMail) If Mid(sEMail. no evento desejado: VariávelBoolean = ValidaData(Data. Formato) 'Exemplo: Dim bRESP As Boolean bRESP = ValidaData("31/03/2000". "M/D/Y") If bRESP Then MsgBox "A data é válida!!!" Else MsgBox "A data NÃO é válida!!!" End If 'Ele exibirá "A data é válida!!!" Validar E-Mail 'Num módulo: Public Function ValidEMail(sEMail As String) As Boolean Dim nCharacter As Integer Dim Count As Integer Dim sLetra As String 'Verifica se o e-mail tem no MÍNIMO 5 'caracteres (a@b. nCharacter.160 sBst = True If Ano Mod 100 = 0 Then sBst = False If Ano Mod 400 = 0 Then sBst = True End If End If Else sBst = False End If If sBst = False Then ValidaData = False Exit Function End If End If Case Else ValidaData = False Exit Function End Select ValidaData = True End Function 'P/ chamar.

If Count < 1 Then 'O e-mail é inválido. nCharacter." Then 'OPA!!! Achou um ponto!!! 'Soma 1 ao contador Count = Count + 1 End If Next 'Verifica o número de pontos.)!!!" Exit Function ElseIf InStr(sEMail. pois começa 'com uma @ ValidEMail = False MsgBox "O e-mail foi iniciado com uma " & _ "arroba (@)!!!" Exit Function ElseIf InStr(sEMail. ValidEMail = False MsgBox "O e-mail termina com um ponto (.161 Next 'Verifica o número de arrobas. ". 'TEM que ter PELO MENOS UM ponto.) no e-mail For nCharacter = 1 To Len(sEMail) If Mid(sEMail. pois termina 'com uma @ ValidEMail = False MsgBox "O e-mail termina com uma arroba (@)!!!" Exit Function End If End If nCharacter = 0 Count = 0 'Verificar a existencia de pontos (. ". 'Verificar a posição da arroba If InStr(sEMail. pois começa 'com um ponto ValidEMail = False MsgBox "O e-mail foi iniciado com um ponto (. pois tem 0 ou 'mais de 1 arroba ValidEMail = False MsgBox "O nº de arrobas (@) do e-mail é " & _ "inválido!!!" Exit Function Else 'O e-mail tem 1 arroba. pois não tem pontos.") = 1 Then 'O e-mail é inválido. "@") = Len(sEMail) Then 'O e-mail é inválido. "@") = 1 Then 'O e-mail é inválido. 1) = ". pois não contém " & _ "pontos (.)!!!" Exit Function . pois termina 'com um ponto.)!!!" Exit Function Else 'O e-mail tem pelo menos 1 ponto. 'TEM que ter """UMA""" arroba If Count <> 1 Then 'O e-mail é inválido. ValidEMail = False MsgBox "O e-mail é inválido. 'Verificar a posição do ponto: If InStr(sEMail.") = Len(sEMail) Then 'O e-mail é inválido.

ValidEMail = False MsgBox "O e-mail não tem nenhum ponto (. então.sEMail." Or sLetra = "-" Or _ sLetra = "_" Or IsNumeric(sLetra)) Then 'O e-mail é inválido.. pois termina 'com um ponto..") > InStr(sEMail. claro.162 ElseIf InStr(InStr(sEMail. "@") Then 'O e-mail é inválido. ValidEMail = False MsgBox "O e-mail contém pontos consecutivos " & _ "(.) após o arroba (@)!!!" Exit Function End If 'Verifica se o e-mail tem caracteres 'inválidos For nCharacter = 1 To Len(sEMail) sLetra = Mid$(sEMail. nCharacter. se a verificação chegou até aqui 'é porque o e-mail é válido. Validar Informações Fornecidas pelo Usuário PARA GARANTIR A DIGITAÇÃO CORRETA .) após a arroba (@). 1) If Not (LCase(sLetra) Like "[a-z]" Or sLetra = _ "@" Or sLetra = ".. ValidEMail = True End Function 'P/ chamar a função: Dim VALID As Boolean VALID = ValidEMail(Text1. tem pontos 'consecutivos após o @."@").Text) If VALID = True Then MsgBox "Tudo Ok na verificação!!!" Else MsgBox "Houve algum problema na verificação!!!" End If 'Quando você for colocar esta função num programa você pode tirar as MsgBoxes. ".. pois tem 'caracteres inválidos ValidEMail = False MsgBox "Foi digitado um caracter inválido " & _ "no e-mail!!!" Exit Function End If Next nCharacter = 0 'Bem..".") = 0 Then 'O e-mail é inválido.) após " & _ "a arroba (@)!!!" Exit Function End If End If nCharacter = 0 Count = 0 'Verifica se o e-mail não tem pontos 'consecutivos (. If InStr(sEMail.

Montamos. se você comparar o padrão "\d" com a string "\d" irá obter um resultado False. quase sem nenhuma programação.com/scripting. Além de usar as expressões em arquivos texto do tipo VBS. então.com/scripting/downloads/ws/x86/ste50ptb. Mais informações sobre o tema podem ser encontradas no site dedicado ao Windows Scripting: http://msdn. O JOGO DA STRING E DO PADRÃO (por Andrew Camargo Francis) Não importa se você está desenvolvendo para a Internet ou para uso local no Windows. uma das linguagens que usam os serviços do Windows Script.0 e nos ambientes de programação VBA. Por exemplo. para ativar as expressões regulares. ou seja. Assim.microsoft. disponível no Windows 98. podemos fazer exatamente isso. já conhecemos o suficiente para validar uma string como sendo um número de telefone ou não. o seguinte padrão: "\d\d\d-\d\d\d\d" Falta apenas um detalhe. você precisa fazer o download da versão atualizada do Windows Scripting Host.0 do VBScript traz um recurso conhecido como Expressões Regulares. do VBScript. Elas são simplesmente strings em que alguns caracteres (ou combinações de caracteres) têm um significado especial. mas se você o comparar com a string "6" irá obter True. Com a expressão regular correta. Para experimentar os exemplos em sua máquina. Digamos que seu programa peça ao usuário que digite um número de telefone. As expressões regulares mostradas fazem parte do VBScript. Não é o que queremos. Como saber se ele realmente forneceu um número de telefone ou apenas digitou "1234" no lugar? Poderíamos escrever uma rotina que percorresse a string verificando caractere a caractere se aquilo parece ser um número de telefone. Como? Primeiro.163 Como validar informações fornecidas pelo usuário usando as Expressões Regulares do VBScript. a combinação "\d" significa um dígito. Em especial quando se trata de erros do usuário. a nova versão 5. Um aplicativo que formata o disco rígido e reinicia o micro toda vez que o usuário comete um erro certamente jamais receberia cinco estrelas do INFOLAB na categoria facilidade de uso. de tal maneira que os caracteres especiais "batam" com aquilo que eles representam. Muito bem. no endereço http://www. acione o comando Ferramentas/Referências e marque a opção Microsoft VBScript Regular Expressions. Nestes últimos. seguido por mais 4 dígitos. na verdade estamos buscando o padrão dentro da string. Com elas é possível validar a entrada de dados feita pelo usuário de uma forma bastante prática. como nos aplicativos do Office 97 ou 2000. se aquele padrão existir em algum lugar dentro da string. vamos entender o que são as expressões regulares. Não algum dígito em particular mas qualquer um dos dez dígitos. pois "qwer555-1234zxcv" apesar de não ser um número válido seria "aceito" pelo padrão. Essas strings (mais conhecidas como padrões) são comparadas com outras strings comuns. Para auxiliar os programadores nesta árdua tarefa. você pode também usá-las no Visual Basic 5.exe (676 KB). Portanto. Vamos combinar que um telefone válido tem 7 dígitos. uma das características mais importantes de um bom programa é a capacidade de lidar elegantemente com situações de erro. 3 dígitos seguidos por um traço. Quando comparamos um padrão com uma string.0 ou 6. a comparação será verdadeira. Precisamos de mais alguns caracteres .microsoft.

só precisamos de uma propriedade e um método desse objeto. Na primeira parte (antes do "@") precisamos do "\w" que representa qualquer letra maiúscula ou minúscula.que haja uma seqüência de "\w" seguida por um ".0 da nossa expressão regular. Podemos fazer um pequeno teste com o seguinte código: Dim oExpr. n vezes). . Assim. resultado Set oExpr = New RegExp oExpr.Test("1234") MsgBox resultado A primeira string é comparada com sucesso e a segunda não. Como não sabemos quantos caracteres serão. A propriedade Pattern armazena o padrão que será usado na comparação e o método Test verifica se o padrão é encontrado na string fornecida. Podemos melhorar isso da seguinte forma: "^\d{3.4}-\d{4}$" Mudou tudo! Espero que para melhor. Neste primeiro momento. Para isso. Assim. podemos acrescentar alguns recursos. O "^" é usado para representar o começo da string e o "$" o seu fim. . pois não permite nenhum outro caractere entre o começo da string e o primeiro dígito (idem para o fim). não? Vamos supor agora que tenhamos de validar um endereço de e-mail em vez de um telefone. Novamente vamos combinar um padrão: uma seqüência de letras ou números. O usuário pode ter um telefone de oito dígitos.com. O sufixo "{n}" é parecido com o "?" mas permite que você diga quantas vezes o caractere anterior deve ser repetido (ou seja. Como fazemos para validar os dois tipos de números? O ponto de interrogação "?" funciona como uma espécie de "sufixo" dizendo que o caractere anterior (especial ou não) é opcional. O "+" nos garante que haverá uma ou mais letras e números (pelo menos um é necessário): "\w+" A segunda parte é um pouco mais complicada. existe o objeto RegExp.Test("555-1234") MsgBox resultado resultado = oExpr. exatamente como queríamos. Fácil. Em outras palavras: .164 especiais. Já o "{3. . temos um padrão pronto. qualquer dígito e também o "_". o padrão "^\d\d\d-\d\d\d\d$" resolve o nosso problema. Só precisamos saber agora como usá-lo no VBScript. precisamos definir qual é a "cara" de um e-mail. Ótimo.Pattern = "^\d\d\d-\d\d\d\d$" resultado = oExpr.". Para tanto. Agora que já temos funcionando a versão 1.br".4}" diz que o "\d" anterior deve se repetir no mínimo 3 e no máximo 4 vezes. um "@" e mais outra seqüência de letras e números entremeada com pontos. podemos ter três ou quatro dígitos antes do traço: "^\d?\d\d\d-\d\d\d\d$" Essa seqüência muito grande de "\d"s torna a leitura (e compreensão) da expressão um pouco difícil.que isso se repita quantas vezes forem necessárias. vamos usar mais um sufixo.e que no final tenhamos mais uma seqüência de "\w". como fizemos para o telefone. Precisamos garantir que seja algo como "infoexame.

Observe que o "-" só tem um significado especial quando se encontra entre colchetes.com") MsgBox resultado resultado = oExpr. deve ter percebido um "\" a mais antes do ". Juntando as partes. obtemos: "\w+@(\w+\.)+\w+" Usamos os parênteses para agrupar a primeira seqüência e o ". ele era um caractere normal. Nestes casos usamos o prefixo "\" antes de um caractere especial quando queremos representar o próprio caractere e não o seu significado." também é especial. Criamos uma classe colocando colchetes em volta de uma seqüência de caracteres: "[0123456789]" Esse padrão representa qualquer dígito.)+\w+" resultado = oExpr. a classe das letras (minúsculas e maiúsculas) ficaria assim: "[a-zA-Z]" Acrescentando essa classe ao nosso padrão temos: "[a-zA-Z]+@(\w+\. Se quisermos aceitar apenas endereços em que a primeira parte não contenha números. o primeiro teste é verdadeiro e o segundo não.". O "\d" é apenas uma forma bem mais curta de dizer a mesma coisa! Podemos reescrever isso de uma maneira mais sintética: "[0-9]" Ou seja.Test ("asdf") MsgBox resultado Novamente. Portanto. No exemplo do telefone. criamos a classe dos caracteres de "0" até "9"." e fazer com que isso se repita com o segundo "+".Test ("eu@aqui.)+\w+" "pereira@(\w+\. Para que isto? Acontece que o caractere ".165 Parece difícil? Veja como se faz: "(\w+\. Uma classe é simplesmente uma forma de agrupar caracteres de maneira que o grupo represente qualquer caractere da classe. como fica o padrão correspondente? Uma possível solução usa o que se chama classe de caracteres.)+\w+" Podemos testar o padrão com um código similar ao anterior: Set oExpr = New RegExp oExpr.)+\w+" Também podemos usar o caractere "|" que permite separar duas coisas num padrão de maneira que uma das duas deva aparecer na string comparada: .)+\w+" Como faríamos para validar apenas os endereços de pessoas chamadas "Rosa" ou "Pereira"? Poderíamos usar dois padrões diferentes: "rosa@(\w+\. Se você prestou atenção.Pattern = "\w+@(\w+\. Ele representa qualquer caractere! Mas aqui queremos apenas o ponto final.

Test ("PEREIRA@aqui. contamos com a propriedade IgnoreCase: Set oExpr = New RegExp oExpr. "Oito".)+\w+" oExpr. "Dois". O importante é que. tendo dominado os seus fundamentos. "Quinze". "Nove". "Sete". "Um". PotenciasSingular Dim PotenciasPlural Negativo = (Valor < 0) Valor = Abs(CDec(Valor)) If Valor Then Unidades = Array(vbNullString. o programador terá ao seu alcance uma poderosa ferramenta de manipulação de strings. Unidades Dim Dezenas. É muito fácil se perder em meio a tantas letras. as expressões podem ser usadas para outros fins. "Doze". nesses casos. _ "Dez". "Quatro". bem como outras propriedades e métodos do objeto RegExp que não discutimos aqui. "Onze".com") MsgBox resultado Ambos os testes acima têm resultado True. Negativo As Boolean Dim Buf As String. geralmente desejamos que a comparação seja feita ignorando se as letras são maiúsculas ou minúsculas. _ "Quatorze". ByVal MoedaPlural As _ String.Test ("Rosa@aqui. "Cinco". O mais importante é que. "Treze". "Dezesseis". _ "Seis". Parcial As Integer Dim Posicao As Integer. Há vários outros caracteres especiais das expressões regulares.IgnoreCase = True resultado = oExpr. ByVal MoedaSingular As _ String) As String Dim StrValor As String.com") MsgBox resultado resultado = oExpr. Centenas.as expressões regulares são apenas enxutas e práticas! Validar Texto em MaskEditBox Private Sub Mask1_Validate(Cancel as Boolean) Cancel = Not IsDate(Mask1.)+\w+" Até agora havíamos usado quase exclusivamente caracteres especiais. Para isso. ninguém disse que elas eram bonitas -. como a busca e a substituição em textos. mas observe que os caracteres normais (representando a si mesmos) também são perfeitamente válidos num padrão.Pattern = "(rosa|pereira)@(\w+\. Além da validação. _ "Três". _ . afinal.FormattedText) End Sub Valor por Extenso 'Num módulo: Public Function Extenso(ByVal Valor As _ Double. Lembre-se de que muitas vezes há mais de um jeito de escrever a mesma coisa e que é sempre importante testar a expressão para garantir que ela faça exatamente o que você deseja. Mas.166 "(rosa|pereira)@(\w+\. barras e outros símbolos de significado pouco intuitivo.

3)) If Parcial Then If Parcial = 1 Then Buf = "Um" & PotenciasSingular((18 . String(18. _ " Milhão". 18) For Posicao = 1 To 18 Step 3 Parcial = Val(Mid(StrValor.000"). " Mil". _ " Trilhão"._ Posicao) \ 3) ElseIf Parcial = 100 Then Buf = "Cem" & PotenciasSingular((18 . "Trezentos". "Cento". "Sessenta". "Trinta". " Quatrilhões") StrValor = Left(Format(Valor. "0") & _ ". _ " Trilhões"._ Posicao) \ 3) Else Buf = Centenas(Parcial \ 100) Parcial = Parcial Mod 100 If Parcial <> 0 And Buf <> vbNullString Then Buf = Buf & " e " End If If Parcial < 20 Then Buf = Buf & Unidades(Parcial) Else Buf = Buf & Dezenas(Parcial \ 10) Parcial = Parcial Mod 10 If Parcial <> 0 And Buf <> vbNullString Then Buf = Buf & " e " End If Buf = Buf & Unidades(Parcial) End If Buf = Buf & PotenciasPlural((18 . " Mil".167 "Dezessete". " Bilhão". _ "Duzentos". " End If End If Extenso = Extenso & Buf End If End If Next If Extenso <> vbNullString Then . "Quinhentos". "Noventa") Centenas = Array(vbNullString. "Novecentos") PotenciasSingular = Array(vbNullString. "Setecentos". vbNullString. "Dezenove") Dezenas = Array(vbNullString. _ "Vinte". _ "Seiscentos". "Setenta". _ "Cinqüenta". " Quatrilhão") PotenciasPlural = Array(vbNullString. _ " Milhões". Posicao. _ "Oitenta". "Dezoito". 3)) If Posicao = 16 And (Parcial < 100 Or _ (Parcial Mod 100) = 0) Then Extenso = Extenso & " e " Else Extenso = Extenso & ".Posicao) \ 3) End If If Buf <> vbNullString Then If Extenso <> vbNullString Then Parcial = Val(Mid(StrValor. "Quarenta". Posicao. " Bilhões". _ "Quatrocentos". _ "Oitocentos".

Int(Valor)) * _ 100 + 0. I.168 If Negativo Then Extenso = "Menos " & Extenso End If If Int(Valor) = 1 Then Extenso = Extenso & " " & MoedaSingular Else Extenso = Extenso & " " & MoedaPlural End If End If Parcial = Int((Valor . 1)) Next I RESTO = Int(TOT Mod 11) If RESTO <> 0 Then RESTO = 11 . 1)) Then PISPASEP = False Exit Function End If PISPASEP = True End Function . I.1) If Parcial Then Buf = Extenso(Parcial. "Reais". "Centavos". _ "Centavo") If Extenso <> vbNullString Then Extenso = Extenso & " e " End If Extenso = Extenso & Buf End If End If End Function 'P/ chamar a função: Dim sRet As String Dim dValor As Double dValor = 1500.RESTO End If If RESTO <> Val(Mid(Fcamp. 11.50 sRet = Extenso(dValor. 1)) * Val(Mid(FTAB. Verificar a Validade do PIS Public Function PISPASEP(Fcamp As String) Dim FTAP As String Dim TOT As Integer Dim I As Integer If Val(Fcamp) = 0 Then PISPASEP = False Exit Function End If If Len(Fcamp) <> 11 Then PISPASEP = False Exit Function End If FTAB = "3298765432" TOT = 0 For I = 1 To 10 TOT = TOT + Val(Mid(Fcamp. sRet conterá "Um Mil e Quinhentos Reais e Cinqüenta Centavos". "Real") MsgBox sRet Então.

hwnd. que permite que o usuário realize outras tarefas enquanto o processo é executado (clicar no botão "Cancelar". Outros comandos .. impedindo assim que o seu programa trave. É bastante simples de criar este botão de cancelamento. HELP_CONTENTS. ByVal wCommand As Long. Acionar um Help (*. For. ByVal psfile _ As String. CLng(0)) Cancelando Processos Longos Quando você for trabalhar com processamentos longos (utilizando loops como Do. Loop ..169 VARIADOS Acionar um HTML Help pelo VB Public Declare Function HtmlHlp Lib "hhctrl.. ou trave seu computador. ByVal dwData _ As Long) As Long Private Const HELP_CONTENTS As Long = &H3& Private Const HELP_QUIT As Long = &H2 'P/ chamar (no evento que você quizer): Dim CONF As Long Dim DIR As String DIR = App. Veja: 'No Declarations: Dim bParar As Boolean 'Na Rotina onde irá utilizar o Loop: bParar = False Do DoEvents 'A linha a seguir força a saída do Loop 'quando o botão "Cancelar" for precionado: If bParar = True Then Exit Do 'Ou Exit Sub . ByVal command As Integer.1) <> "\" Then DIR = App. ByVal lpHelpFile _ As String. ByVal data _ As Long) As Long lngRet = HtmlHlp(Me.ocx" Alias _ "HtmlHelpA" (ByVal wHandle As Long. procure criar um botão de cancelameno p/ este processo.Path & "\help.HLP) pelo VB 'No Declarations do Form: Private Declare Function WinHelp Lib "user32" Alias _ "WinHelpA" (ByVal hwnd As Long.HLP" CONF = WinHelp(hwnd..chm".. &HF.Path & "SeuHelp.Loop.Path.HLP" If Right(App.. por exemplo). Utilize SEMPRE também a função DoEvents.Next). App. 1000) Onde &HF significa sensível ao contexto e 1000 é uma âncora (id) que você cria dentro do HtmlHelp Workshop.. DIR.Path & "\SeuHelp..

_ vbQuestion + vbYesNo. "Sair???") If RES = vbNo Then 'O usuário NÃO deseja finalizar o programa. a variável bParar passara a ter o valor True. remova todos os sufixos VB.00 Mude a versão 4. por estar se usando o DoEvents. . proceda da seguinte forma: Private Sub Form_QueryUnload(Cancel As Integer. A definição do form deve ser alterada em um editor de texto (ASCII). _ UnloadMode As Integer) Dim RES As VbMsgBoxResult 'Pergunta ao usuário se ele realmente deseja finalizar 'o programa RES = MsgBox("Você deseja finalizar o programa???". o comando Begin Form. Salve o arquivo e abra-o no VB3. Carregando forms do VB4 no VB3 Você não poderá ler um form do VB4 diretamente no VB3. Então. mude o valor da variável 'bParar p/ True: Private Sub Command1_Click() bParar = True End Sub Então. quando ele fizer isto.00 para VERSION 2.Form Form1 Caption = "Form1" ClientHeight = 5940 'demais propriedades End Attribute VB_Name = "Form1" Attribute VB_Creatable = False Attribute VB_Exposed = False Option Explicit Private Sub Form_Load() '. para nossa sorte existe o evento QueryUnload em todo Form. se o usuário clicasse nele perguntaríamos? Mas e se o usuário clicasse no botão "X" q fica no lado direito da barra de títulos? Bem. remova todas as declarações Attribute. parando assim o processo. End Sub Confirmando o Termino do Programa Como faríamos para perguntar ao usuário se ele "realmente" deseja finalizar o programa? Colocaríamos um botão ou menu com o caption "Sair" e. Remova também a cláusula Private de algumas rotinas (eventos). Cancel = 1 Else 'O usuário DESEJA finalizar o programa. Begin VB..170 'No botão Cancelar..00. VERSION 4. o usuário poderá clicar no botão "Cancelar" e.

ByVal dwNewLong As Any) _ As Long Public Declare Function GetWindowLong Lib _ "user32" Alias "GetWindowLongW" _ (ByVal hwnd As Long.. ByVal nIndex _ As Long) As Long #Else Public Declare Function SetWindowLong Lib _ "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long. como salvar registros. ByVal wMsg _ As Long. 'por exemplo. ByVal nIndex _ As Long. ByVal fsModifiers As _ Long. End If End Sub Private Sub Form_Unload(Cancel As Integer) Set frmMenu = Nothing End Sub Como Registrar Uma HotKey 'Num modulo: Option Explicit Private Const WM_HOTKEY = &H312 Public Declare Function RegisterHotKey Lib _ "user32" (ByVal hwnd As Long. ByVal _ id As Long.171 'Aqui coloque comandos. ByVal wParam As Long. ByVal dwNewLong As Any) _ As Long Public Declare Function GetWindowLong Lib _ "user32" Alias "GetWindowLongA" _ . ByVal _ lParam As Long) As Long Public Declare Function SendMessage Lib _ "user32" Alias "SendMessageA" _ (ByVal hwnd As Long. ByVal nIndex _ As Long.. ByVal wParam As Long. _ lParam As Any) As Long #If UNICODE Then Public Declare Function SetWindowLong Lib _ "user32" Alias "SetWindowLongW" _ (ByVal hwnd As Long. ByVal vk As Long) As Long ' ' Modificadores ' Public Const MOD_ALT = &H1 Public Const MOD_CONTROL = &H2 Public Const MOD_SHIFT = &H4 ' Tecla que será nossa hotkey Public Const VK_F2 = &H71 Public Declare Function DefWindowProc Lib _ "user32" Alias "DefWindowProcA" _ (ByVal hwnd As Long. ByVal wMsg As _ Long.

hwnd. ByVal uMsg As Long. lParam As _ Any) As Long Public Const GWL_USERDATA = (-21) Public Const GWL_WNDPROC = -4 Public Function WindowProc(ByVal hwnd As _ Long. MOD_ALT.hwnd.OldWndProc <> 0 Then WindowProc = CallWindowProc(Form1. GWL_WNDPROC.172 (ByVal hwnd As Long. ByVal lParam) End If End Function 'Agora em um Form chamado Form1: Option Explicit Public OldWndProc As Long Private Sub Form_Load() Dim Ret As Long 'Registra hotkey com ID 1 'Essa hotkey sera aciona com ALT + F2 'Se Ret <> 0 entao beleza. AddressOf _ WindowProc) End Sub Private Sub Form_Unload(Cancel As Integer) Cancel = False Call SetWindowLong(Me. 1. ByVal _ hwnd As Long.hwnd.OldWndProc. uMsg.BahMetodo WindowProc = 1 Exit Function End If If Form1. se = 0 já 'existe uma hotkey dessa definida Ret = RegisterHotKey(Me. _ OldWndProc) End Sub ' ' Metodo chamado pela Hotkey ' Public Sub BahMetodo() MsgBox "Opa !" . _ GWL_WNDPROC. ByVal nIndex _ As Long) As Long #End If Private Declare Function CallWindowProc Lib _ "user32" Alias "CallWindowProcA" _ (ByVal wndrpcPrev As Long. wParam. ByVal uMsg As Long. _ ByVal wParam As Long. ByVal lParam As _ Long) As Long On Error Resume Next If uMsg = WM_HOTKEY And wParam = 1 Then 'wParam informa o ID da hotkey Form1. _ VK_F2) ' 'Inicia subclassing ' OldWndProc = SetWindowLong(Me. ByVal _ wParam As Long. _ hwnd.

PosY!.Meta pré-definida: Crie um projeto novo. tgt As String tgt = Left$(src. PosY1! Const ValorMaior% = 100 'traça o fundo do gráfico FillColor = &HFFFFFF Line (0. 1) Next i SpaceName = tgt End Function Criando gráficos sem utilizar OCX nem DLL Um gráfico nada mas é que uma representação visual de um valor em relação a outros valores ou a uma meta pré-definida. CargoAnterior será convertido para Cargo Anterior. A função abaixo insere espaços. Item% Dim PosX!. ValorMaior% + 20). Coloque o código abaixo em Form1 e execute o programa. por exemplo) por fusão de palavras como SobreNome ou CargoAnterior. 1) Case "A" to "Z" tgt = tgt & " " End Select End Select tgt = tgt & Mid$(src. Assim.173 End Sub Rode o projeto. PosX1!. &H0&. i-1. Para gerar esta representação o processo é bastante simples: Caso 1 . "quebrando" os identificadores a cada inicial maiúscula. minimize a janela. 0)-((UBound(Valor) + 1) * 20 + 10. Form1 será criado por padrão. clique em outra janela. Function SpaceName (src As String) As String Dim i as Integer.1) For i = 2 to Len(src) Select Case Mid$(src. i. B 'carrega valores aleatórios no gráfico For Item = 0 To UBound(Valor) Valor(Item) = (Rnd * ValorMaior%) .-) Convertendo Identificadores em Rótulos e Cabeçalhos Programadores possuem o hábito de criar identificadores (nomes de variáveis. É possível usar alguns destes nomes para se criar labels (rótulos) e descrições diversas. esqueca da janela e impulsivamente pressione ALT + F2 . Private Sub Form_Load() AutoRedraw = True FillStyle = 0 ScaleMode = 3 'Dim Valor%(9) é o mesmo que 'Dim Valor(0 to 9) As Integer Dim Valor%(9). 1 Case "a" to "z" Select Case Mid$ (src. i.

B Next End Sub Este código irá gerar um gráfico de colunas baseado em valores aleatórios onde o valor limite é definido por ValorMaior e cada cor representa um nível de aproximação deste valor. sendo que o limite mínimo é 1 e cada cor representa um nível de aproximação do maior valor ou de 1 caso todos os valores sejam nulos. PosY1! 'carrega valores aleatórios no gráfico e encontra o maior ValorMaior = 1 'Define o valor mínimo For Item = 0 To UBound(Valor) Valor(Item) = (Rnd * 100) ValorMaior = IIf(Valor(Item) > ValorMaior. Caso 2 . B 'traça o gráfico For Item = 0 To UBound(Valor) PosX = (Item * 10) + ((Item + 1) * 10) PosY = ValorMaior + 10 PosX1 = (Item * 10) + ((Item + 1) * 10) + 10 PosY1 = ValorMaior . ValorMaior% + 20). PosY)-(PosX1. &H0&.Meta relativa: Private Sub Form_Load() AutoRedraw = True FillStyle = 0 ScaleMode = 3 'Dim Valor%(9) é o mesmo que Dim Valor(0 to 9) As Integer Dim Valor%(9). 0)-((UBound(Valor) + 1) * 20 + 10. Item%. PosY)-(PosX1.Valor(Item) + 10 FillColor = Valor(Item) * (&HFFFFFF / ValorMaior) Line (PosX. B Next End Sub Este código irá gerar um gráfico de colunas baseado em valores aleatórios onde o valor limite é o maior dos valores carregados. coloque o seguinte código no Form: Dim iAnim As Integer . Criando uma Animação no VB Crie um novo projeto. ValorMaior% Dim PosX!. Valor(Item). &H0&. Então. PosX1!. PosY1). PosY!.Valor(Item) + 10 FillColor = Valor(Item) * (&HFFFFFF / ValorMaior) Line (PosX. pois esta não recebe foco). coloque no Form uma ImageList. ValorMaior) Next 'traça o fundo do gráfico FillColor = &HFFFFFF Line (0.174 Next 'traça o gráfico For Item = 0 To UBound(Valor) PosX = (Item * 10) + ((Item + 1) * 10) PosY = ValorMaior + 10 PosX1 = (Item * 10) + ((Item + 1) * 10) + 10 PosY1 = ValorMaior . PosY1). um Timer (com Interval = 100. &H0&. um PictureBox (ou ImageBox. pelo menos) e coloque as figuras da animação na ImageList.

coloque 'esta linha: Sleep (2000) Pronto. basta adicionar seu caminho na chave: "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" À partir deste momento ele será acionado na abertura do Windows. ByVal lpText$.Picture iAnim = iAnim + 1 If iAnim > ImageList1. _ ByVal wType%) Const MB_OKCANCEL As Long = &H1 Dim ret% ret = MessageBox(0.Count Then iAnim = 1 End If End Sub Dar uma Pausa em seu Programa 'No declarations do Form onde você 'deseja colocar essa "pausa": Private Declare Sub Sleep Lib "kernel32" _ (ByVal dwMilliseconds As Long) 'Então. Aí será dada uma pausa de 2000 milesegundos.ListImages. . Fazer um aplicativo ser acionado silenciosamente Para fazer um aplicativo ser acionado silenciosamente na abertura do Windows.: É possível também criar um formulário com as mesmas características de um MessageBox e exibí-lo de forma não modal. _ "Modeless MessageBox ". altere este 2000 pelo número que você quizer. Set Img1. Detalhe: Cada 1000 milesegundos correspondem a 1 segundo. é possível fazer usando a função API MessageBox. MsgBox que não seja modal A função MsgBox do Visual Basic não contempla esta opção. no evento que você desejar. ByVal lpCaption$. Declare e chame a API como segue (código VB 3. MB_OKCANCEL) Obs. "I am a Modeless MessageBox". Caso você queira que essa pausa seja de mais ou menos tempo.175 Private Sub Form_Load() iAnim = 1 Call Timer1_Timer End Sub Private Sub Timer1_Timer() 'Img1 é a ImageBox e ImgLst1 é a ImageList.ListImages(iAnim).Picture = ImgLst1.0): Declare Function MessageBox% Lib "User" (ByVal _ hWnd%. Porém.

de manha tarde e seja bem vindo!!!" . _ vbInformation ElseIf Time$ > "00:00:00" Then MsgBox "Bom dia e seja bem vindo!!!".de noite Recebendo Parâmetros Externos num Programa feito em VB Para fazer com que um programa feito em VB receba parâmetros externos (como o %1. etc dos arquivos .176 Programa que dá "Bom dia". %2. _ vbInformation ElseIf Time$ > "12:00:00" Then MsgBox "Boa tarde e seja bem vindo!!!". * "Bom * "Boa * "Boa ele lhe dirá: dia e seja bem vindo!!!" .BAT). _ vbInformation End If End Sub Assim. "Boa tarde" e "Boa noite" nos Horários Corretos 'No evento Form_Load() do Form principal: Private Sub Form_Load() Me.de tarde noite e seja bem vindo!!!" . Veja o código: Private Sub Form_Load() Dim sParametro as String sParametro = Command$ End Sub Saber se um programa foi encerrado Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long .Show If Time$ > "19:00:00" Then MsgBox "Boa noite e seja bem vindo!!!". use a funcão "Command$" no evento Form_Load.

'WAIT_TIMEOUT e STILL_ACTIVE lRet& = WaitForSingleObject(ProcInfo. ByVal _ bInheritHandles As Long. 0&. _ ByVal lpProcessAttributes As Long. ByVal lpCommandLine As String. ByVal _ lpThreadAttributes As Long.177 hThread As Long dwProcessID As Long dwThreadID As Long End Type Private Declare Function WaitForSingleObject Lib _ "Kernel32" (ByVal hHandle As Long. lpStartupInfo _ As STARTUPINFO. ByVal _ lpEnvironment As Long.hThread) CloseHandle (ProcInfo. _ NORMAL_PRIORITY_CLASS. 'Coloque este código no evento KeyDown do form: Private Sub Form_KeyDown(KeyCode As Integer. szCommandLine$.cb = Len(StartProc) If CreateProcessA(0&. 1&.exe" StartProc. Shift _ As Integer) If KeyCode = vbKeyReturn then . 0&.hProcess) MsgBox "Deu Certo" Else MsgBox "Deu Erro" End If End Sub Tecla ENTER Agindo como TAB 'No Form: 'Sete a propriedade KeyPreview do Form como true. 0&. ByVal _ lpCurrentDirectory As Long. INFINITE) CloseHandle (ProcInfo. lpProcessInformation As _ PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "Kernel32" _ (ByVal hObject As Long) As Long Private Private Private Private Private Const Const Const Const Const NORMAL_PRIORITY_CLASS As Long = &H20& INFINITE As Long = -1& WAIT_FAILED As Long = &hFFFFFFFF WAIT_TIMEOUT As Long = &h102& STILL_ACTIVE As Long = &h103& Private Sub Command1_Click() Dim lRet&. StartProc. szCommandLine$ Dim ProcInfo As PROCESS_INFORMATION Dim StartProc As STARTUPINFO On Error Resume Next szCommandLine$ = "notepad. 0&. ByVal _ dwMilliseconds As Long) As Long Private Declare Function CreateProcessA Lib _ "Kernel32" (ByVal lpApplicationName As _ Long.hProcess. ByVal _ dwCreationFlags As Long. _ ProcInfo) Then 'Tá como INFINITE mas pode ser trocado para um 'valor em milisegundos e IRet& testado com WAIT_FAILED.

178 Sendkeys "{Tab}" KeyCode = 0 End If End Sub Testar caminho da aplicação Testando se o caminho já inclui "\" ou não: Private Sub Form_Load() Dim Teste As String Dim caminho As String Teste = App. Selecione a opção Line Hit Count.Caption = App. um erro de execução se manifesta apenas após a criação de um EXE e não em tempo de debug. O add-in Code Profiler poderá ajudá-lo.Path & "\" & caminho End If End Sub Usando as Setas de Movimento Para Mudar de Controle Para usar as teclas de movimentação como a tecla TAB ou Shift+Tab.Path & caminho End Sub Ou de uma forma mais "enxuta": Private Sub Form_Load() Form1.Caption = App.Path & caminho If Right(App.Path. 1) = "\" Then caminho = "Caminho" Else caminho = "\Caminho" End If Form1. Selecione o add-in Code Profiler. 1) <> "\" Then Form1. coloque a propriedade KeyPreview do Form como True e insira o seguinte código no evento KeyDown: Private Sub Form_KeyDown(KeyCode As Integer.Path If Right(Teste. 1) 2) 3) 4) 5) Faça uma cópia do seu fonte. Selecione o botão Add Profiler Code. .Caption = App. Shift As Integer) If KeyCode = vbKeyUp Then SendKeys "+{Tab}" KeyCode = 0 ElseIf KeyCode = vbKeyDown Then SendKeys "{Tab}" KeyCode = 0 End If End Sub Use o Code Profiler para depuração Algumas vezes. Selecione o(s) arquivo(s) de código a serem analisados.

_ LOCALE_SSHORTDATE. Você terá que executar seu código em modo debug enquanto olha os resultados do Code Profiler. 7) Execute o seu código com erro. 8) Volte ao Code Profiler e selecione View Results No menu File. no evento que você desejar: txtRet.1) Else 'senão atribui vazio para a função GetShortDateFormat = "" End If End Function 'P/ chamar.EXE). A rotina abaixo simplifica o processo. ByVal lpLCData As String. 11) 'se conseguiu If ItWorked Then 'atribui o mesmo para função GetShortDateFormat = Left(FormatString. _ ByVal cchData As Long ) As Long Private Const LOCALE_SSHORTDATE = &H1F Public Function GetShortDateFormat() As String 'usada como buffer da API Dim FormatString As String * 11 Dim ItWorked As Boolean 'retorno da api 'joga o separador decimal no buffer ItWorked = GetLocaleInfo(GetSystemDefaultLCID. ByVal LCType _ As Long. _ InStr(FormatString. Sub SendKeyTo (KeyValue as String.Enabled Then cCnt.179 6) Compile (make EXE) o programa (MYAPP. Veja a última linha que foi executada ao ocorrer o erro.SetFocus SendKeys KeyValue End Sub Verificar o Formato de Data Configurado no Windows 'Num módulo: Private Declare Function GetSystemDefaultLCID _ Lib "kernel32" () As Long Private Declare Function GetLocaleInfo Lib _ "kernel32" Alias "GetLocaleInfoA" ( _ ByVal Locale As Long. Uso racional do SendKeys A função SendKeys (que simula o aperto de teclas) adiciona ótimos recursos de "intervenção" do programador na operação do sistema. cCnt as Control) If cCnt. As teclas podem ser enviadas para um form ou controle (neste caso o controle deverá ter o foco). FormatString.Text = GetShortDateFormat . _ Chr(0)) .

.180 Ele retornará algo como "dd/MM/yy".

Num2.##0. Então. declarando desta forma teremos: => Variável do tipo VARIANT!!! => Variável do tipo VARIANT!!! => Variável do tipo VARIANT!!! => Variável do tipo Integer As variáveis do tipo Variant aceitam QUALQUER tipo de dados. Veja: '1º Forma: Text1. Num4 As Integer Pois Num1 Num2 Num3 Num4 bem.181 VARIÁVEIS Apresentando Corretamente Números no Formato de Moeda Digamos que você. .Text = Format$(RS![Campo]. "$###. Num4 As Integer OU: Dim Dim Dim Dim Num1 Num2 Num3 Num4 As As As As Integer Integer Integer Integer By 3D Man® ----Outra dica é sempre declare suas variáveis com maiúsculas e minúsculas. Então. seu programa perde performance (cerca de 40%! Vide dica "Cuidado com Variáveis Tipo Variant!!!"). lhe dando um input visual de que você escreveu-as corretamente. digite-as completamente em minúsculas (nomedavariavel e outravariavel).0. Num2 As Integer.Text = Format$(RS![Campo]. precise exibir numa TextBox um campo de um banco de dados em formato moeda. Dim NomeDaVariavel As String.00. temos duas formas de fazer isto.00. Após sair da linha alterada o VB automaticamente as transformará para a forma da declaração. por exemplo. "currency") Atenção na Declaração de Variáveis!!! Você já deve ter visto a declaração de variáveis da seguinte forma: Dim Num1. a maneira CORRETA de se vazer essa declaração seria: Dim Num1 As Integer. Num3 As Integer. Num3. OutraVariavel As String Ao digitar seu programa. com elas. No entanto.$ ###.##0.\n\u\l\o") '2º Forma: Text1.

_ pValor As String.5)/100 End Function Function RoundN (X As Interger.OPÇÃO 1 Private Declare Function GetLocaleInfo Lib _ "kernel32" Alias "GetLocaleInfoA" ( _ ByVal Locale As Long. intInicio. _ intFim) End Function Capturar o formato da Moeda ------. Optional pInicio _ As Integer = -1. ByVal LCType _ As Long. N As Interger) Dim Factor As Long Factor = 10 ^ N RoundN = Int(X * Factor + . Optional pFim As _ Integer = -1) As Long Dim intInicio As Integer.5)/ Factor End Function Busca Binária Public Function InArray(pArray As Variant. _ ByVal cchData As Long) As Long . intFim As Integer Dim intMeio As Integer If pInicio = -1 And pFim = -1 Then intInicio = LBound(pArray) intFim = UBound(pArray) Else intInicio = pInicio intFim = pFim End If intMeio = (intInicio + intFim) / 2 If pArray(intMeio) = Val(pValor) Or _ pArray(intInicio) = Val(pValor) Or _ pArray(intFim) = Val(pValor) Then InArray = intMeio Exit Function End If If intMeio = intInicio Or intMeio = intFim Then InArray = -1 Exit Function End If If pValor < pArray(intMeio) Then intFim = intMeio Else intInicio = intMeio + 1 End If InArray = InArray(pArray. ByVal lpLCData As String.182 Arredondamento numérico Function Roun2 (X) Round2 = Int(X * 100 + . pValor.

OPÇÃO 2 Private Sub Form_Click() CurrencyFormat$ = Format(1. ByVal fim) Dim i."1")-1)) End Sub Classificar um array em ordem alfabética Sub OrdemAlfa(sArray().1) Debug.183 Const LOCALE_SCURRENCY As Long = &H14 Const LOCALE_SYSTEM_DEFAULT As Long = 0 Private Sub Form_Click() CurrencyFormat$ = Space(100) i% = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT.Fabricante = "VW" Veiculo(iNum). ByVal ini. sArray(j)."Currency") CurrencyFormat$ = Trim(Left(CurrencyFormat$. aux For i = ini to fim .Pneus = iNum Veiculo(iNum).1 For j = i + 1 to fim If StrComp(sArray(i). i% . Veiculo() As Carro For iNum = 0 To 10 Redim Preserve Veiculo(iNum) Veiculo(iNum). 1) = 1 then aux = sArray(i) sArray(i) = sArray(j) sArray(j) = aux End if Next Next End Sub Criar Arrays com Type definido pelo usuário 'Na seção geral do formulário: Private Type Carro Pneus As Integer Cor As String Fabricante As String Preço As Currency End Type 'No procedimento: Dim iNum As Integer. _ InStr(CurrencyFormat$.Cor = "Preto" Veiculo(iNum). _ LOCALE_SCURRENCY.Preço = iNum Next .Print CurrencyFormat$ End Sub ------. j. 100) CurrencyFormat$ = Left(CurrencyFormat$. CurrencyFormat$.

. argumentos passados a procedimentos e o tipo de retorno para os procedimentos (Function e Property Get) cujos nomes se iniciem pelos caracteres especificados. se tivessemos declarado esta variável com o nome "iAcertos" ela seria declarada como Integer. Por que isso? Simples! Porque NÃO foi declarado um DefType p/ a letra "A".Define que TODAS as variáveis iniciadas pelas letras "I" e "N" serão de determinado tipo. bResposta.. declarando desta forma teremos: iNum sTexto bResposta Acertos => => => => Variável Variável Variável Variável do do do do tipo tipo tipo tipo Integer String Boolean Variant Perceba que não é mais necessário usar o "As Type". Essa instrução funciona a nível de módulo para definir o tipo de dados padrão para variáveis. Então. Veja como colocar o DefType p/ cada tipo de variável: DefBool DefByte DefInt DefLng DefCur DefSng DefDbl DefDate DefStr DefObj DefVar -> -> -> -> -> -> -> -> -> -> -> Tipo Tipo Tipo Tipo Tipo Tipo Tipo Tipo Tipo Tipo Tipo Boolean Byte Integer Long Currency Single Double Date String Object Variant Exemplo: DefInt I DefStr S DefBool B Dim iNum. O argumento "Letra" (que é OBRIGATÓRIO) pode ser usado das seguintes formas: • • DefType I. Sintaxe: DefType Letra. DefType A-E <.184 Facilitando a Declaração de Variáveis Existe a instrução DefType q ajuda muito na declaração de variáveis. Letra . sTexto.Define que TODAS as variáveis iniciadas por letras entre "A" e "E" serão de determinado tipo. N <. . Repare também que a variável "Acertos" foi declarada como Variant. Acertos Pois bem.

. altera um de seus próprios argumentos.: se vc for mudar um caracter. sAcentos(1. 6. Mas. sAcentos(2. 1) 1) 2) 2) 3) 3) 4) 4) 5) 5) 6) 6) 7) 7) 8) 8) = = = = = = = = = = = = = = = = "á" "a" "é" "e" "í" "i" "ó" "o" "ú" "u" "ê" "e" "ô" "o" "ã" "a" TiraAcentos = sTexto 'Coloca o texto original como retorno For i = 1 To Len(sTexto) sCaracter = Mid$(sTexto. você só poderá troca-lo por UM outro caracter. sAcentos(2.185 Fazendo Alterações em Strings com o Mid Você provavelmente já conhece a função e o comando Mid. que retorna uma substring com um número específico de caracteres. uma parte da string usada como parâmetro. sAcentos(1. 1) = "o" 'Substituindo caracter End If Bem. sAcentos(2. ou seja. sAcentos(1. observe: Dim MyString As String MyString = "Todo a Meu Texto" If Mid$(MyString. pois. sAcentos(1. isto economiza uma série de instruções de concatenação. sAcentos(2. depois dessa rotina. sAcentos(2. a variável MyString conterá "Todo o Meu Texto" e não mais "Todo a Meu Texto". 8) As String Dim sCaracter As String Dim bAcentos As Boolean Dim i As Integer. 1) = "a" Then Mid$(MyString. 1) 'Testa cada caracter If Asc(sCaracter) >= 192 And Asc(sCaracter) <= 255 Then bAcentos = True 'Indica a presença de acentos Exit For . Atenção!!!: Este comando só muda um certo número de caracteres pelo mesmo número de caracteres (ex. i. sAcentos(1. sAcentos(1. sAcentos(2.. como no exemplo anterior. j As Integer sAcentos(1. você sabe como usar o Mid para substituir caracteres no meio de uma string? O Mid é uma pequena excentricidade do VB. 6. sAcentos(2. Mas. sAcentos(1. sAcentos(2.)!!! Função para Tira Acentos de Strings 'Coloque esta função num módulo ou mesmo no form: Public Function TiraAcentos(ByVal sTexto As String) As String Dim sAcentos(2.

i. iNum. (Len(sNome) . 1) If Asc(sCaracter) >= 192 And Asc(sCaracter) <= 255 Then If sCaracter = sAcentos(1. _ ByVal PorIsto As String) As String Dim i As Long .1)) Inverte = sNom End Function 'P/ usar: Dim sResult As String sResult = Inverte("José Carlos da Silva") 'Então. ByVal Isto As String. José Carlos da" Função Replace para VB5._ iPos)) & ". j) Then Mid$(sTexto. 1) If sNom2 = " " Then iPos = iNum Exit For End If Next sNom = Right(sNome. " sNom = sNom + Left(sNome. 1) = sAcentos(2. sResult conterá "Silva. (iPos .Text) Função que Inverte Nomes (Sobrenome.Text = TiraAcentos(Text1.186 End If Next If bAcentos = True Then 'Comparamos cada caracter com os elementos da matriz For i = 1 To Len(sTexto) For j = 1 To 8 sCaracter = Mid$(sTexto. Nome) 'Num módulo: Public Function Inverte(ByVal sNome As _ String) As String Dim sNom As String Dim iPos As Integer Dim iNum As Integer sNome = Trim(sNome) For iNum = Len(sNome) To 1 Step -1 sNom2 = Mid(sNome.0 Private Function Replace(ByVal Texto _ As String. j) TiraAcentos = sTexto End If End If Next Next End If End Function 'P/ chamar: Text1. i.

por exemplo: Dim MeuArray As Variant. _ Optional ByVal SearchStr As _ String = " ") As Variant Dim Words() As String. "sei lá". SearchStr) j = 1 Do While i ReDim Preserve Words(0 To k) Words(k) = Mid(Texto. Então. Len(Texto)) Else 'Fica compatível com o Split() do VB6. i As Integer MeuArray = Split("Sei lá|Blá1|Blá2|Blá3". SearchStr) Loop ReDim Preserve Words(0 To k) Words(k) = Mid(Texto. i As Integer Dim j As Integer. você pode fazer algo como Replace("Texto". depois dessa linha: Text1."-/-". i . i.Text Replace(Text1. "não sei") Text1 passará a conter "Eu não sei como isto funciona" Detalhe: Neste replace. k As Integer If Len(Texto) Then k = 0 i = InStr(Texto.1) Else Replace = Replace & Mid(Texto.Text = MeuArray(i) . Texto. j. 1) End If Next i End Function P/ usar.j) k = k + 1 j = i + 1 i = InStr(j. 'retornando Ubound() = -1 ReDim Words(-1 To -1) End If Split = Words End Function 'P/ usar.187 If Len(Isto) < 1 Then Replace = Texto Exit Function End If For i = 1 To Len(Texto) If Mid(Texto. "|") For i = 0 To UBound(MeuArray) txtDestino(i)."*") que ele substituirá sem problemas!!!!!!!! Função Split para o VB5 'Num módulo coloque a seguinte função: Public Function Split(ByVal Texto.Text. j. Len(Isto)) = Isto Then Replace = Replace & PorIsto i = i + (Len(Isto) . i. digamos que o TextBox Text1 contenha um texto como "Eu sei lá como isto funciona".

e. iPosIni. respeitando as exceções da lingua portuguesa como: de.COM (***) Environ("PATH")'OBJETO SELECIONADO (****) Environ("CMDLINE")'WIN (*****) Environ("windir")'Windows (*) * = Caminho do Windows ** = Configuração do Prompt *** = Command. 1)) & _ LCase(Mid(sPalavra.com) . Texto. da. deixando as primeiras letras das palavras em maiusculo. inclusive o caminho do Windows. a.188 Primeiras Letras das Palavras de uma String em Maiusculo Esta função converte o texto para Maiusculo/Minusculo. das.iPosIni) iPosIni = iPosFim + 1 If sPalavra <> "de" And sPalavra <> "da" And _ sPalavra <> "do" And sPalavra <> "das" _ And sPalavra <> "dos" And sPalavra <> _ "a" And sPalavra <> "e" Then sPalavra = UCase(Left(sPalavra. sResult conterá "José Carlos da Silva" Saber as variáveis do ambiente Para saber as variáveis do ambiente.: C:\Windows\command. " ") = 0 iPosFim = InStr(iPosIni. iPosIni As Integer Dim iPosFim As Integer.com do Windows (ex. Public Function MMCase(Texto As String) As String Dim sPalavra As String. 2)) End If sResultado = sResultado & " " & sPalavra Loop MMCase = Trim(sResultado) End Function 'P/ usar: Dim sResult As String sResult = MMCase("JOSÉ CARLOS DA SILVA") 'Ou: sResult = MMCase("josé carlos da silva") 'Ou: sResult = MMCase("jOSÉ cARLOS dA sILVA") Enfim. sResultado As String iPosIni = 1 Texto = LCase(Texto) & " " Do Until InStr(iPosIni. com isso. use ENVIRON MsgBox MsgBox MsgBox MsgBox MsgBox MsgBox MsgBox MsgBox Environ("winbootdir")'Windows (*) Environ("TMP")'Windows\Temp Environ("TEMP")'Windows\Temp Environ("PROMPT")'Prompt (**) Environ("COMSPEC")'COMMAND. Texto. " ") sPalavra = Mid(Texto. iPosFim . do. dos.

CDROM. ***** = Chamada do Windows pela linha de comando >>>>> Se ENVIRON retornar "" é porque a variável do ambiente não foi encontrada.: Dim VarAmbiente() As String. I_Num As Integer For I_Num = 1 To 10 If Environ(I_Num) <> "" Then Redim Preserve VarAmbiente(I_Num) VarAmbiente(I_Num) = Environ(I_Num) End If Next . >>>>> ENVIRON pode ser chamada com argumento numérico por um FOR Ex. etc.189 **** = Mouse.

CaminhoArquivoWord. 0") Abrir arquivo com o programa que o criou Public Const SW_SHOW As Long = 5 Declare Function ShellExecute Lib "shell32."open".AutoSize = True keybd_event vbKeySnapshot. _ ByVal lParam As Long) As Long Const WM_SYSCOMMAND = &H112& Const SC_SCREENSAVE = &HF140& . _ ByVal lpParameters As String.Image. ByVal nShowCmd As Long) As Long Private Sub Button_Click() dim i& i& = ShellExecute(0.Picture = Clipboard.190 WINDOWS Abrir a janela propriedades do sistema Dim lngInfo As Long lngInfo = Shell("rundll32.SW_SHOW) End Sub Capturar Tela e Salvar em Arquivo Adicione num Form um PictureBox (Picture1) e dois CommandButtons (Command1 q vai capturar a tela e Command2 q vai salvar o conteúdo de Picture1 no arquivo "C:\Teste. ByVal wMsg _ As Long.BMP" Chamando o ScreenSaver Através de API 'Num módulo: #If Win32 Then Private Declare Function SendMessage Lib _ "user32" Alias "SendMessageA" _ (ByVal hWnd As Long. 0& DoEvents Picture1. ByVal lpFile As String."". ByVal wParam As Long.dll.cpl. ByVal bScan As _ Byte. "C:\Teste. ByVal dwFlags As Long."". .BMP") e coloque este código: Private Declare Sub keybd_event Lib "user32" _ (ByVal bVk As Byte. ByVal lpDirectory _ As String. ByVal _ dwExtraInfo As Long) Private Sub Command1_Click() 'P/ capturar a tela: Picture1. 1.exe shell32.GetData(vbCFBitmap) End Sub Private Sub Command2_Click() 'P/ salvar a imagem: SavePicture Picture1.Control_RunDLL sysdm. 0&. ByVal _ lpOperation As String.dll" Alias _ "ShellExecuteA" ( ByVal hwnd As Long.

exe.2".exe shell32.dll.hWnd.exe shell32.. _ ByVal wMsg As Integer. _ vbNormalFocus) 'Para chamar a tela Vídeo.cpl.1".Control_RunDLL appwiz.exe shell32.dll.Control_RunDLL appwiz. 0&) Chamando Telas Específicas do Painel de Controle Para chamar qualquer tela do Painel de Controle não se usa necessariamente uma API. mas sim se executa o programa rundll32..cpl.. _ SC_SCREENSAVE.Control_RunDLL desk.dll.2". na aba Aparência: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Adicionar ou Remover Programas.cpl.exe shell32.cpl.Control_RunDLL appwiz.dll. _ vbNormalFocus) 'Para chamar a tela Adicionar ou Remover Programas: Call Shell("rundll32.cpl. na aba Segundo Plano: Call Shell("rundll32.exe shell32. na aba 'Instalação do Windows: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Vídeo. _ vbNormalFocus) 'Para chamar a tela Vídeo. na aba 'Disco de Inicialização: Call Shell("rundll32.Control_RunDLL desk.exe shell32.exe shell32.cpl. _ vbNormalFocus) 'Para chamar a tela Vídeo.0".cpl. Veja as chamadas das principais telas: 'Para chamar a tela principal do Painel de Controle: Call Shell("rundll32.191 #Else Private Declare Function SendMessage Lib _ "User" (ByVal hWnd As Integer. WM_SYSCOMMAND.1".exe shell32.3". _ vbNormalFocus) 'Para chamar a tela Configurações Regionais.. ByVal _ wParam As Integer.dll. De acordo com os parâmetros cada tela é chamada. use o código a 'seguir: Dim result As Long result = SendMessage(Form1.dll... na aba 'Configurações Regionais: .Control_RunDLL". na aba Configuração: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Adicionar ou Remover Programas.dll.Control_RunDLL desk.Control_RunDLL desk.. lParam As Any) _ As Long Const WM_SYSCOMMAND = &H112 Const SC_SCREENSAVE = &HF140& #End If 'Para chamar o ScreenSaver. na aba Proteção de Tela: Call Shell("rundll32.dll.3".

dll.2".dll. _ vbNormalFocus) 'Para chamar a tela Fontes: Call Shell("rundll32.cpl @3". _ vbNormalFocus) 'Para chamar a tela Multimídia.Control_RunDLL main.3".cpl.Control_RunDLL intl.3".cpl.exe shell32.4". _ vbNormalFocus) 'Para chamar a tela Mail e Fax: Call Shell("rundll32.dll. na aba MIDI: Call Shell("rundll32.Control_RunDLL intl.dll.. na aba 'Moeda: Call Shell("rundll32. na aba 'Hora: Call Shell("rundll32...exe shell32. _ vbNormalFocus) 'Para chamar a tela Configurações Regionais.1".cpl @1".exe shell32.Control_RunDLL mmsys.cpl.exe shell32. _ .exe shell32. _ vbNormalFocus) 'Para chamar a tela Impressoras: Call Shell("rundll32.exe shell32.cpl.Control_RunDLL mlcfg32. _ vbNormalFocus) 'Para chamar a tela Teclado: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Configurações Regionais.dll.exe shell32.cpl.dll.cpl @2".dll.dll.exe shell32. _ vbNormalFocus) 'Para chamar a tela Multimídia. _ vbNormalFocus) 'Para chamar a tela Mouse: Call Shell("rundll32.192 Call Shell("rundll32.. _ vbNormalFocus) 'Para chamar a tela Configurações Regionais...Control_RunDLL mmsys.Control_RunDLL mmsys. _ vbNormalFocus) 'Para chamar a tela Joystick: Call Shell("rundll32.Control_RunDLL intl.exe shell32. na aba Vídeo: Call Shell("rundll32.Control_RunDLL main..cpl @0".1".exe shell32.dll.exe shell32.0".0"..cpl".exe shell32.exe shell32.cpl.Control_RunDLL intl.cpl. na aba Audio: Call Shell("rundll32.Control_RunDLL intl.Control_RunDLL joy.exe shell32.Control_RunDLL main. _ vbNormalFocus) 'Para chamar a tela Multimídia.dll. _ vbNormalFocus) 'Para chamar a tela Configurações Regionais.Control_RunDLL mmsys. _ vbNormalFocus) 'Para chamar a tela Multimídia.dll.cpl". na aba 'Data: Call Shell("rundll32.dll.cpl.Control_RunDLL main.dll..cpl.dll.2". na aba 'Número: Call Shell("rundll32. na aba Música de CD: Call Shell("rundll32.dll.exe shell32.

.Control_RunDLL access. na aba Perfis de Hardware: Call Shell("rundll32.dll.exe shell32.exe shell32..cpl. _ vbNormalFocus) 'Para chamar a tela Opções de Acessibilidade.cpl.dll. _ vbNormalFocus) 'Para chamar a tela Sistema..Control_RunDLL access.Control_RunDLL sysdm.cpl.cpl.cpl". _ vbNormalFocus) 'Para chamar a tela Opções de Acessibilidade.dll.2"..dll...cpl".3". _ vbNormalFocus) 'Para chamar a tela Sistema.cpl. _ vbNormalFocus) 'Para chamar a tela Sistema.Control_RunDLL access.dll.dll. _ vbNormalFocus) 'Para chamar a tela Opções de Acessibilidade.exe shell32.4".cpl @1". _ vbNormalFocus) 'Para chamar a tela Senhas: Call Shell("rundll32.3".exe shell32. na aba Dispositivos: Call Shell("rundll32.Control_RunDLL netcpl.dll.Control_RunDLL mmsys. na aba 'Mouse: Call Shell("rundll32.cpl. na aba Performance: Call Shell("rundll32.exe shell32.Control_RunDLL mmsys.dll.cpl. _ vbNormalFocus) 'Para chamar a tela Sistema. na aba 'Teclado: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Rede: Call Shell("rundll32.0".exe shell32..Control_RunDLL password.cpl". _ vbNormalFocus) 'Para chamar a tela Som: Call Shell("rundll32.Control_RunDLL sysdm..Control_RunDLL modem.exe shell32.Control_RunDLL sysdm.1".exe shell32.exe shell32.2".Control_RunDLL sysdm.1".exe shell32. na aba Geral: Call Shell("rundll32. na aba 'Vídeo: Call Shell("rundll32.exe shell32.193 vbNormalFocus) 'Para chamar a tela Multimídia.dll.exe shell32. na aba Gerenciador 'de Dispositivos: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Modem: Call Shell("rundll32.dll.4".dll.cpl. na aba 'Som: Call Shell("rundll32. _ vbNormalFocus) 'Para chamar a tela Opções de Acessibilidade. _ vbNormalFocus) 'Para chamar a tela Opções de Acessibilidade.exe shell32.dll.dll.cpl.. na aba .Control_RunDLL access.

cpl.cpl".Control_RunDLL sysdm. _ vbNormalFocus) 'Para chamar a tela Data e Hora: Call Shell("rundll32.Control_RunDLL timedate. ByVal dwReserved _ As Long.5". _ ByVal cbData As Long) As Long 'Código do Módulo: Public Sub CreateExtension(newfiletype As filetype) Dim IconString As String Dim Result As Long. Result2 As Long. *** 'Coloque num Modulo 'General Declarations Public Type mnuCommands Captions As New Collection Commands As New Collection End Type Public Type filetype Commands As mnuCommands Extension As String ProperName As String FullName As String ContentType As String IconPath As String IconIndex As Integer End Type Public Const REG_SZ As Long = 1 Public Const HKEY_CLASSES_ROOT As Long = &H80000000 Public Declare Function RegCloseKey Lib "advapi32. phkResult As Long) As Long Public Declare Function RegSetValueEx Lib "advapi32" _ Alias "RegSetValueExA" (ByVal hKey As Long.dll.dll" _ (ByVal hKey As Long) As Long Public Declare Function RegCreateKey Lib "advapi32" _ Alias "RegCreateKeyA" (ByVal hKey As Long.. ResultX As Long Dim ReturnValue As Long.exe shell32.cpl @1". _ vbNormalFocus) 'Para chamar a tela DiskCopy: Call Shell("rundll32 diskcopy. _ vbNormalFocus) 'Para chamar a tela do Assistente (Adicionar novo 'Hardware): Call Shell("rundll32. ByVal _ lpszSubKey As String. lpbData As Any. pois estarás mechendo no Registro do Windows.exe shell32.Control_RunDLL access. ByVal fdwType As Long.dll.194 'Geral: Call Shell("rundll32. _ vbNormalFocus) Como associar uma extensão ao programa '*** Sempre tome muito cuidado. HKeyX As Long .DiskCopyRunDll".exe shell32. _ ByVal lpszValueName As String.dll.dll.

Extension End If RegCreateKey HKEY_CLASSES_ROOT.Captions.ContentType.ProperName.newfiletype.LenB(StrConv(newfiletype. REG_SZ. _ REG_SZ. _ vbFromUnicode))) End If RegCreateKey HKEY_CLASSES_ROOT. _ vbFromUnicode))) End If 'Atribuir o valor padrão para a chave ReturnValue = RegSetValueEx(Result.ContentType <> "" Then ReturnValue = RegSetValueEx(Result. _ Result RegCreateKey Result. 0.Result ReturnValue = RegSetValueEx(Result.Commands. 0. REG_SZ. "". _ vbFromUnicode))) RegCreateKey Result. ByVal newfiletype.Result If Not IconString = ".Add "Open" .exe utilize o segunite código: Dim myfiletype As filetype myfiletype. ByVal _ newfiletype. _ ByVal IconString.Commands. Result2 'Cria a chave do "ProperName\DefaultIcon" ReturnValue = RegSetValueEx(Result2.ProperName = "MeuArquivo" myfiletype.195 Dim cmdloop As Integer IconString = newfiletype. _ LenB(StrConv(newfiletype. _ vbFromUnicode))) RegCloseKey Result RegCloseKey Result2 Next RegCloseKey Result2 End Sub 'Então. 0. Result2 Dim CurrentCommand$ CurrentCommand = newfiletype.MEX" ao Notepad." Then newfiletype.ContentType = "AlgumTipoMIME" myfiletype. _ ByVal newfiletype.0" Then RegCreateKey Result. "". REG_SZ.Commands.ContentType).Commands(cmdloop) ReturnValue = RegSetValueEx(Result2.Extension = ". REG_SZ.FullName. ByVal CStr(newfiletype.IconPath & ". ResultX ' Criando as subkeys necessárias para cada comando For cmdloop = 1 To newfiletype. _ vbFromUnicode))) ' Acertando o conteúdo If newfiletype. "DefaultIcon".Commands.FullName." & _ newfiletype. LenB(StrConv(CurrentCommand$.IconIndex If Left$(newfiletype. LenB(StrConv(IconString.Extension.Captions(cmdloop). _ ByVal CurrentCommand$. 0." & _ newfiletype.Count RegCreateKey ResultX. ByVal "Shell".ProperName. "". ByVal "Command".ProperName.Extension = ".Extension.FullName = "Meu Arquivo" myfiletype.newfiletype.Captions. 1) <> ". para associar a Extensão ". _ LenB(StrConv(newfiletype. "Content Type". "". 0.MEX" '<< Sua Extensão myfiletype.

EWX_REBOOT As Long = 2 'Reiniciar o computador. o '"proper name" como o "nome" mesmo e o "fullname" como 'o "título" ou "caption" da exensão. assim quando der um duplo clique sobre o arquivo.Add "c:\windows\notepad. ele 'executará o comando associado ao "Open". 'Esses "Commands" contêm os "verbos" para o seu tipo. que você se referenciará '(não use espaços) 'FullName é a descrição do Tipo 'ContentType é a descrição que verás em seu browser.Commands.196 myfiletype.exe ""%1"" /P" CreateExtension myfiletype 'Extension contem a extensão que se deseja associar.Commands.Add "Print" myfiletype.Add "c:\windows\notepad. evento que você desejar: RET as Long fazer logoff do usuário: = ExitWindowsEx(EWX_LOGOFF.Commands. 0) 'Se você quizer "forçar" a ação a ser executada. 0) desligar o computador: = ExitWindowsEx(EWX_FORCE Or EWX_SHUTDOWN. O "Open" foi atribuido como "verbo" 'padrão. caso 'estivesse para fazer o download de um arquivo deste tipo. EWX_FORCE As Long = 4 'Força a ação desejada.Commands. 0) reiniciar o computador = ExitWindowsEx(EWX_REBOOT. 'Você pode pensar na extensão como um "atalho". 0) reiniciar o computador = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT.Captions. EWX_SHUTDOWN As Long = 1 'Desligar o compitador. _ ByVal dwReserved As Long) As Long Public Public Public Public 'No Dim 'P/ RET 'P/ RET 'P/ RET Const Const Const Const EWX_LOGOFF As Long = 0 'Faz Logoff do usuário. Quando 'você clica com o direito sobre este tipo de arquivo. faça 'da seguinte maneira: 'P/ RET 'P/ RET 'P/ RET 'P/ RET fazer logon com outro usuário: = ExitWindowsEx(EWX_FORCE Or EWX_LOGOFF.Commands. 'Propername é o nome do tipo. Desligar ou Reiniciar o Computador pelo VB 'Num módulo: Public Declare Function ExitWindowsEx Lib "user32" _ Alias "ExitWindowsEx" (ByVal uFlags As Long. você 'verá estas opção (verbos). 0) reiniciar o computador = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT.exe ""%1""" myfiletype. Como Fazer Logoff. 0) . 0) desligar o computador: = ExitWindowsEx(EWX_SHUTDOWN.

" & _ "Calculadora criada via DDE)]" Executar um programa DOS Shell ("Command.hWnd.LinkMode = 2 txtCamNormal.Coloque para false a propriedade ShowInTaskbar do Form 2 . Impedir que o programa apareça nos processos do windows 1 .exe.exe".197 Criar atalho para arquivo facilmente txtCamNormal. 1)] " & _ "[AddItem(c:\windows\calc.RSP_SIMPLE_SERVICE) End Sub 'Depois coloque o seguinte no FORM_LOAD: Private Form_Load() MakeMeService End Sub .No Form_Load adicione: Dim RetValue as Long RetValue = ShowWindow(Me. _ ByVal nCmdShow As Long) As Long Public Const SW_HIDE As Long = 0 3 . _ ByVal dwType As Long) As Long Public Const RSP_SIMPLE_SERVICE As Long = 1 Public Const RSP_UNREGISTER_SERVICE As Long = 0 'Crie a seguinte Sub: Public Sub MakeMeService() Dim pid As Long Dim reserv As Long pid = GetCurrentProcessId() reserv = RegisterServiceProcess(pid.com /C MeuProgramaDOS.LinkTopic = "Progman|Progman" txtCamNormal. vbHide) O /C fecha a janela DOS após o aplicativo rodar e o vbHide mantem a janela oculta durante a execução.Em um módulo declare: Public Declare Function ShowWindow Lib "user32" _ Alias "ShowWindow" (ByVal hwnd As Long. SW_HIDE) Impedir que o programa seja encerrado com Ctrl+Alt+Del 'Declara o seguinte em um Módulo: Public Declare Function GetCurrentProcessId Lib _ "kernel32" () As Long Public Declare Function GetCurrentProcess Lib _ "kernel32" () As Long Public Declare Function RegisterServiceProcess _ Lib "kernel32" (ByVal dwProcessID As Long.LinkExecute "[CreateGroup(Iniciar.

dll" Alias "Shell_NotifyIconA" _ (ByVal dwMessage As Long. _ ByVal dwFlags As Long) As Long 'Execução normal Private Const SHERB_NORMAL = &H0 'Executar sem confirmação Private Const SHERB_NOCONFIRMATION = &H1 'Executar sem mostrar o progresso Private Const SHERB_NOPROGRESSUI = &H2 'Execução sem som Private Const SHERB_NOSOUND = &H4 Private Const SHERB_NOALL = (SHERB_NOCONFIRMATION _ And SHERB_NOPROGRESSUI _ And SHERB_NOSOUND) Dim RetVal As Long Public Sub EmpRecBin() RetVal = SHEmptyRecycleBin(0&. ByVal pszRootPath As String. trocando a constante SHERB_NORMAL.dll" Alias _ "SHEmptyRecycleBinA" (ByVal hwnd As _ Long. _ vbNullString. que é passada à API SHEmptyRecycleBin. pelas outras. Minimizar um Programa Para o System Tray 'Num Módulo: Public Declare Function Shell_NotifyIcon Lib _ "shell32. conforme sua necessidade.198 Limpando a Lixeira pelo VB Através de API 'Num módulo: Private Declare Function SHEmptyRecycleBin _ Lib "shell32. lpData As _ NOTIFYICONDATA) As Long Public Type NOTIFYICONDATA cbSize As Long Hwnd As Long uID As Long uFlags As Long uCallbackMessage As Long hIcon As Long szTip As String * 64 End Type Public Public Public Public Public Public Public Public Public Public Const Const Const Const Const Const Const Const Const Const WM_LBUTTONDOWN = WM_LBUTTONDBLCLK WM_RBUTTONDOWN = WM_RBUTTONDBLCLK NIM_ADD = &H0 NIM_DELETE = &H2 NIM_MODIFY = &H1 NIF_ICON = &H2 NIF_MESSAGE = &H1 NIF_TIP = &H4 &H201 = &H203 &H204 = &H206 . SHERB_NORMAL) End Sub Você pode alterar esta função.

uCallbackMessage = &H200 STray.Hwnd. STray) Case NIM_MODIFY Call Shell_NotifyIcon(NIM_MODIFY. _ Shift As Integer.199 Public Enum Actions TrayAdd = &H0 TrayModify = &H1 TrayDelete = &H2 End Enum Public Sub SysTray(Action As Actions. 'Neste exemplo.WindowState = 0 Call SysTray(TrayDelete. STray) Case NIM_DELETE Call Shell_NotifyIcon(NIM_DELETE. _ Me.hIcon = Icon STray.Caption.Hwnd = Hwnd STray. Case WM_LBUTTONDBLCLK 'Coloque aqui a rotina a ser executada 'quando ocorrer um duplo clique com o 'botão esquerdo no icon do System Tray.TwipsPerPixelX Select Case Msg Case WM_LBUTTONDOWN 'Coloque aqui a rotina a ser executada 'quando ocorrer um clique com o botão 'esquerdo no icon do System Tray.WindowState = 1 Then Call SysTray(TrayAdd. Me.Caption. Me. _ Me.Hwnd.Icon) End If End Sub Private Sub Form_MouseMove(Button As Integer. Y As _ Single) Dim Msg As Long If (Button + Shift + Y) = 0 Then Msg = X / Screen.uID = vbNull STray. Me. STray) End Select End Sub 'No Form. Me. X As Single.szTip = ToolTip & vbNullChar STray. Me. coloque o seguinte código: Private Sub Form_Resize() If Me. ToolTip As String.cbSize = Len(STray) Select Case Action Case NIM_ADD Call Shell_NotifyIcon(NIM_ADD. Hwnd As _ Long.Icon) Me. Icon As _ StdPicture) Dim STray As NOTIFYICONDATA STray.SetFocus Case WM_RBUTTONDOWN 'Coloque aqui a rotina a ser executada 'quando ocorrer um clique com o botão .uFlags = NIF_MESSAGE Or NIF_ICON Or _ NIF_TIP STray. a janela será restaurada 'e o ícone retirado so System Tray.

End Select End If 'Se você precisar colocar algum outro código neste 'evento. _ Shift As Integer. Me.SetFocus Case WM_RBUTTONDOWN 'Coloque aqui a rotina a ser executada 'quando ocorrer um clique com o botão 'direito do rato no icon do System Tray.TwipsPerPixelX Select Case Msg Case WM_LBUTTONDOWN 'Coloque aqui a rotina a ser executada 'quando ocorrer um clique com o botão 'esquerdo no icon do System Tray. proceda da seguinte forma: Private Sub Form_Load() Call SysTray(TrayAdd.Hwnd. Me. pode coloca-lo aqui sem maiores problemas. Me. a janela será restaurada 'e o ícone retirado so System Tray. Case WM_RBUTTONDBLCLK 'Coloque aqui a rotina a ser executada 'quando ocorrer um duplo clique com o 'botão direito do rato no icon do System 'Tray. Y As _ Single) Dim Msg As Long If (Button + Shift + Y) = 0 Then Msg = X / Screen. Me. . Neste caso.Icon) End Sub Private Sub Form_MouseMove(Button As Integer. Me. End Sub PRONTO!!!!! Agora é só executar!!! 8^) Detalhe.200 'direito do rato no icon do System Tray. End Select End If 'Se você precisar colocar algum outro código neste 'evento.Hwnd. pode coloca-lo aqui sem maiores problemas. Case WM_LBUTTONDBLCLK 'Coloque aqui a rotina a ser executada 'quando ocorrer um duplo clique com o 'botão esquerdo no icon do System Tray. Case WM_RBUTTONDBLCLK 'Coloque aqui a rotina a ser executada 'quando ocorrer um duplo clique com o 'botão direito do rato no icon do System 'Tray.Caption.Caption. _ Me. _ UnloadMode As Integer) Call SysTray(TrayDelete. X As Single. 'Neste exemplo.Icon) End Sub Private Sub Form_QueryUnload(Cancel As Integer. Me.WindowState = 0 Me. você também pode adicionar este ícone ao System Tray quando o seu programa iniciar e só retira-lo quando o programa terminar.

ByVal dwflags As Long) _ As Long Private Private Private Private Const Const Const Const CCDEVICENAME = 32 CCFORMNAME = 32 DM_PELSWIDTH = &H80000 DM_PELSHEIGHT = &H100000 Private Type DEVMODE dmDeviceName As String * CCDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type Public Sub ChangeRes(iWidth As Single.201 End Sub Mudando a Resolução de vídeo 'Num módulo: Private Declare Function EnumDisplaySettings Lib _ "user32" Alias "EnumDisplaySettingsA" _ (ByVal lpszDeviceName As Long. lpDevMode As Any) As _ Boolean Private Declare Function ChangeDisplaySettings Lib _ "user32" Alias "ChangeDisplaySettingsA" _ (lpDevMode As Any. ByVal _ iModeNum As Long. iHeight _ As Single) Dim DevM As DEVMODE Dim a As Boolean Dim i As Long Dim b As Long i = 0 Do .

_ ByVal LCType As Long. i&. ByVal lParam As _ Long) As Long Private Declare Function GetSystemDefaultLCID Lib _ "kernel32" () As Long Private Const LOCALE_SSHORTDATE As Long = &H1F Private Const WM_SETTINGCHANGE As Long = &H1A Private Const HWND_BROADCAST As Long = &HFFFF& . SPIF_UPDATEINIFILE Or _ SPIF_SENDWININICHANGE) End Sub 'P/ chamar: Call SetWallpaper NomeDoArquivo 'ATENÇÃO!!! Passe o nome do arquivo com o caminho 'completo! 'Exemplo: Call SetWallpaper "C:\Windows\Desenho. ByVal wParam As Long. senão alguns arquivos poderão ser corrompidos. ByVal wMsg _ As Long. DevM) i = i + 1 Loop Until (a = False) DevM.dmPelsHeight = iHeight b = ChangeDisplaySettings(DevM. ByVal lpLCData As String) _ As Boolean Private Declare Function PostMessage Lib "user32" Alias _ "PostMessageA" (ByVal hwnd As Long.202 a = EnumDisplaySettings(0&. sArquivo.dmPelsWidth = iWidth DevM. ByVal uParam As _ Long.. ByVal lpvParam As String.BMP" Mudar a definição de data do Windows Private Declare Function SetLocaleInfo Lib "kernel32" _ Alias "SetLocaleInfoA" (ByVal Locale As Long. ByVal _ fuWinIni As Long) As Long Public Const SPIF_UPDATEINIFILE As Long = &H1 Public Const SPI_SETDESKWALLPAPER As Long = 20 Public Const SPIF_SENDWININICHANGE As Long = &H2 Public Sub SetWallpaper(ByVal sArquivo As String) Dim RT as long RT = SystemParametersInfo(SPI_SETDESKWALLPAPER. Mudando o Papel de Parede pelo VB 'Coloque isto num modulo Private Declare Function SystemParametersInfo Lib _ "User32" Alias "SystemParametersInfoA" _ (ByVal uAction As Long. 600) Só coloque resoluçoes q o monitor suporta. _ 0&. 0) End Sub 'P/ fazer a chamada: Call ChangeRes(800..dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT DevM.

ByVal hWndInsertAfter As _ Long. WM_SETTINGCHANGE. 0. ele irá exibi-la novamente. ByVal x As Long. 0. ByVal cx As Long. 0. 0. . 0. _ SWP_HIDEWINDOW) End Sub Private Sub Form_Unload(Cancel As Integer) 'Como a variável lRet foi declarada como 'Public e já contém o Handle da barra de 'tarefas do Windows. _ ByVal lpWindowName As String) _ As Long Public Declare Function SetWindowPos _ Lib "user32" (ByVal hwnd As _ Long. _ SWP_SHOWWINDOW) End Sub Quando você iniciar o seu programa.LOCALE_SSHORTDATE. ele esconderá a barra de tarefas do Windows e. 0. quando você finaliza-lo..203 Private Sub Command1_Click() Dim dwLCID As Long dwLCID = GetSystemDefaultLCID() If SetLocaleInfo(dwLCID."dd/mmm/yyyy")=False Then MsgBox "Erro na definição da data. 0 Ocultar/Mostrar a Barra de Tarefas do Windows 'Num módulo: Option Explicit Public Declare Function FindWindow Lib _ "user32" Alias "FindWindowA" _ (ByVal lpClassName As String. 'Restaura a barra de tarefas Call SetWindowPos(lRet. 0. 0. _ ByVal cy As Long. "") 'Esconde a barra de tarefas Call SetWindowPos(lRet.. não será necessário 'usar a API FindWindows de novo." Exit Sub End If PostMessage HWND_BROADCAST. 0. 0. 0. ByVal y _ As Long. ByVal wFlags _ As Long) As Long Public Const SWP_HIDEWINDOW As Long = &H80 Public Const SWP_SHOWWINDOW As Long = &H40 Public lRet As Long 'Insira o cogigo abaixo num Form: Private Sub Form_Load( ) lRet = FindWindow("Shell_traywnd".

Uma constante ou valor que especifique um dos formatos de elementos reconhecidos pelo VB. Se format for 0 ou omitido.Clear Comando: GetFormat <.204 Usando a Área de Transferencia O objeto Clipboard tem algumas funções p/ copiar algo p/ a área de transferencia. Sintaxe: Clipboard.GetFormat(vbCFBitmap) Then Text1. Vejamos então quais são estas funções: Comando: Clear <.Text = "A área de transferencia contém uma imagem Bitmap" EndIf Comando: GetData <. Sintaxe: Clipboard.WMF) Bitmap independente de dispositivo (DIB) Paleta de cores . como também funções p/ se recuperar o que tem nela. Sintaxe: Clipboard. Uma constante ou valor que especifique um dos formatos de elementos gráficos reconhecidos pelo VB. GetData usa automaticamente o formato adequado. A constante ou valor deve estar entre parênteses Constantes do Parametro format: Constante vbCFBitmap vbCFMetafile Valor 2 3 Descrição Bitmap (arquivos . ele retorna False.GetFormat (format) Parametro format: OBRIGATÓRIO.BMP) Metarquivo (arquivos . Constantes do Parametro format: Constante vbCFLink vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Exemplo: If Clipboard.Text = "A área de transferencia contém um texto" EndIf If Clipboard.Retorna um objeto gráfico (imagem) da área de transferencia.GetFormat(vbCFText) Then Text1.GetData (format) Parametro format: OPCIONAL. Caso contrário.Limpa o conteúdo da área de transferencia. Esta constante ou valor deve estar entre parênteses.BMP) Metarquivo (arquivos .Retorna True se um item na área de transferencia corresponde ao formato especificado.WMF) Valor &HBF00 1 2 3 8 9 Descrição Informações de conversação DDE Texto Bitmap (arquivos .

BMP) Metarquivo (arquivos .GetText (format) Parametro format: OPICIONAL. Imagem a ser copiada. Sintaxe: Clipboard.Picture.205 vbCFDIB vbCFPalette 8 9 Bitmap independente de dispositivo (DIB) Paleta de cores Observações: Caso não exista nenhum elemento gráfico na área de transferencia corresponde ao formato especificado. vbCFBitmap . Sintaxe: Clipboard. será retornada um texto de comprimento zero ("").GetData() Comando: GetText <. Constantes do Parametro format: Constante vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descrição Informações de conversação DDE RichText Format (arquivo . Uma constante ou valor que especifique um dos formatos de elementos gráficos reconhecidos pelo VB. Exemplo: Set Pricture1.SetData data.Picture = Clipboard. Constantes do Parametro format: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descrição Bitmap (arquivos . nada será retornado.GetText(vbCFText) Comando: SetData <. Exemplo: Text1.WMF) Bitmap independente de dispositivo (DIB) Paleta de cores Exemplo: Clipboard. Se. Um valor ou constante que especifica um dos formatos reconhecidos pelo VB. na área de transferencia.Coloca uma figura na área de transferencia usando o formato gráfico especificado. SetData determina automaticamente o formato.SetData Picture1. estiver presente somente uma paleta de cores um DIB de tamanho mínimo (1 x 1) será criado. format Parametro data: OBRIGATÓRIO. O valor ou constante deve estar entre parênteses.RTF) (Padrão) texto Observações: Caso não exista nenhum texto na área de transferencia corresponde ao formato especificado. Caso format for omitido. Parametro format: OPCIONAL.Retorna um texto a partir da área de transferencia.Text = Clipboard.

Text. Sintaxe: Clipboard.") If bRET = True Then MsgBox "A tela de About foi exibida " & _ "sem problemas. Parametro format: OPCIONAL. sCopyright.SetText data.dll" Alias "ShellAboutA" _ (ByVal hwnd As Long. Usando a Caixa "Sobre" Padrão do Windows 'Num módulo: Private Declare Function ShellAbout Lib _ "shell32. ByVal szOtherStuff As _ String. format Parametro data: OBRIGATÓRIO.Copia um texto p/ a área de transferencia. Texto a ser copiado. ByVal hIcon As Long) As Long Private Function WinAbout(ByVal l_hWnd _ As Long. ByVal szApp _ As String. Constantes do Parametro format: Constante vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descrição Informações de conversação DDE RichText Format (arquivo .". App.RTF) (Padrão) texto Exemplo: Clipboard.Icon.206 Comando: SetText <. ANTES da cópia. Uma constante ou valor que especifique um dos formatos reconhecidos pelo VB.". limpe-a.ProductName & _ " ". _ vbInformation End If . vbCFText Atenção: * Quando você quizer copiar algo p/ a área de transferencia.hwnd. Optional ByVal _ sCopyright As String) As Boolean Dim lRet As Long lRet = ShellAbout(l_hWnd. * Quando você for recuperar algo da área de transferencia com o comando GetData ou SetData. ANTES verifique qual o formato do conteúdo da área de transferencia com o comando GetFormat. ByRef pIcon As _ StdPicture.SetText Text1. Me. vbInformation Else MsgBox "Houve algum erro e a tela de " & _ "About não foi exibida. pIcon) WinAbout = lRet End Function 'No evento que você desejar chamar a tela 'de About: Dim bRET As Boolean bRET = WinAbout(Me. _ "MinhaMarca Ltda.

Veja: 'No evento que você queira: Dim WinDir As String WinDir = Environ$("WinDir") Ele retorna algo como "C:\WINDOWS"." & EnvString EnvString = Environ(Indx) Indx = Indx + 1 Loop Until EnvString = "" End Sub Usando o Registro do Windows (Registry) Quando nós ouvimos falar em "Registro do Windows" ou "Windows Registry".. Sintaxe: Environ$({EnvString | Number}) EnvString . Para facilitar na manutenção desses registros. GetSetting. A função Environ$() retorna uma string associada a uma variável de ambiente do Windows. pra descobrir o diretório do Windows. Excluir configurações de DeleteSetting programa.207 Detalhe: Para que esta função exiba o nome do programa. Number . as variáveis serão listadas na janela de debug (Immediate).Print Indx & " . GetAllSettings Ler configurações de programa.é o número (índice) da variável de ambiente. é muito simples de se usar o Registro do Windows.É a string q vc vai chamar pra descobrir o seu valor (no exemplo anterior era "WinDir".. Private Sub Form_Load() Dim EnvString As String Dim Indx As Byte Indx = 1 Do Debug. Na verdade. Usando a Função Environ$ Um exemplo de uso desta função seria p/ recuperar o diretório do Windows (sem API). Se você quizer saber todas as variáveis de ambiente e seus respectivos valores. o VB tem 3 funções: Função(ões) Ação Salvar configurações de SaveSetting programa. logo imaginamos que seja algo "de outro mundo". Mas não é. é só criar um Form e colar esse código dentro dele. preencha o campo "Product Name" na aba "Make" da tela de propriedades do projeto. .

Nome da definição de chave sendo salva. _ default := "25") GetAllSettings: =============== Retorna TODAS as chaves e TODOS os valores salvos de determinado programa/seção. [Valor] Vejamos a descrição dos parâmetros: [Nome do Aplicativo]: Obrigatório. vejamos como funcionam essas funções: SaveSetting: ============ Salva informações no registro do Windows seguindo alguns parâmetros. Se for omitido. _ key := "Superior". [Chave]. Sintaxe: GetAllSettings([Nome do Aplicativo]. default será assumido como uma string vazia (""). [Seção] : Obrigatório. _ key := "Esquerda". Nome do aplicativo ou do projeto ao qual se aplica a definição. Sintaxe: SaveSetting [Nome do Aplicativo]. _ section := "Inicialização". 75 GetSetting: =========== Recupera o valor de uma chave salva no registro do Windows. [Chave]. [Seção]. Valor com que será armazenado. Exemplos: SaveSetting appname := "MeuProg". setting := 75 'Ou SaveSetting "MeuProg". _ "Superior". Nome da definição de chave a ser retornada. [Seção]) . [Chave] : Obrigatório. "Inicialização". Nome do aplicativo ou do projeto cuja definição de chave é solicitada. _ section := "Inicialização". [Valor Padrão] : Opcional. [Valor] : Obrigatório. [Seção] : Obrigatório. Nome da seção onde se encontra a definição de chave. Valor a retornar se nenhum valor for definido na definição da chave.208 Então. Exemplo: Dim sRet As String sRet = GetSetting(appname := "MeuProg". [Seção]. [Valor Padrão]) Vejamos a descrição dos parâmetros: [Nome do Aplicativo]: Obrigatório. [Chave] : Obrigatório. Sintaxe: GetSetting([Nome do Aplicativo]. Nome da seção em que a definição da chave está sendo salva.

1) Debug. Exemplo: Dim vRet As Variant. Nome do aplicativo ou projeto ao qual se aplica a seção ou a definição de chave. [Seção]. [Chave] : Opcional. 1) To UBound(vRet. [Chave] Vejamos a descrição dos parâmetros: [Nome do Aplicativo]: Obrigatório.209 Vejamos a descrição dos parâmetros: [Nome do Aplicativo]: Obrigatório.. Obs.Print vRet(iDef. "Inicialização" Verificando se um array foi ou não inicializado Private Sub Command1_Click() Dim lista() As Integer. 0). _ section := "Inicialização") For iDef = LBound(vRet. [Seção] : Obrigatório. "Inicialização". Se forem fornecidos somente [Nome do Aplicativo] e [Seção]. Nome da seção da qual a definição da chave está sendo excluída. Sintaxe: DeleteSetting [Nome do Aplicativo]. _ "Superior" 'Deletar seção INTEIRA (e TODAS as 'chave da mesma): DeleteSetting "MeuProg". [Seção] : Obrigatório. Exemplo: 'Deletar APENAS uma chave da seção: DeleteSetting "MeuProg".: GetAllSettings retorna um Variant cujo conteúdo é uma matriz bidimensional de seqüências de caracters contendo todas as definições de chave da seção especificada e seus valores correspondentes. iDef As Integer vRet = GetAllSettings(appname := "MeuProg". Nome do aplicativo ou projeto cujas definições de chave são solicitadas. Teste As Boolean ‘Experimente este código usando Redim Preserve e depois não usando ‘ReDim Preserve lista(0) .. 1) Next DeleteSetting: ============== Apaga (deleta) uma ou mais chaves de determinado registro. a seção especificada será excluída juntamente com todas as definições de chave relacionadas. Nome da seção cujas definições de chave são solicitadas. vRet(iDef. Nome da definição da chave sendo excluída.

210 Teste = FoiIncializado(lista) End Sub Private Function FoiIncializado(ByRef mVetor() As Integer) As Boolean If ((Not mVetor) = -1) Then FoiIncializado = False Else FoiIncializado = True End If End Function .