Você está na página 1de 199

williamdsilva@aol.com.

br 1

Dicas de Dicas de Dicas de Dicas de Dicas de


Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de

VISUAL
BA S I C
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
williamdsilva@aol.com.br 2

Dicas de Dicas de Dicas de Dicas de Dicas de


Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de
Dicas de Dicas de Dicas de Dicas de Dicas de
Dicas de

1 - Reconhecendo o pressionamento de teclas


Enviado por: Visual Basic Brasil
Declare as constantes que você desejar utilizar em um módulo. Exemplo:
Global Const KEY_F1 = &H70
Global Const KEY_F2 = &H71
Global Const KEY_F3 = &H72
Global Const KEY_F4 = &H73
Global Const KEY_F5 = &H74
Global Const KEY_F6 = &H75
Global Const KEY_F7 = &H76
Global Const KEY_F8 = &H77
Global Const KEY_F9 = &H78
Global Const KEY_F10 = &H79
Global Const KEY_F11 = &H7A
Global Const KEY_F12 = &H7B
Global Const KEY_F13 = &H7C
Global Const KEY_F14 = &H7D
Global Const KEY_F15 = &H7E
Global Const KEY_F16 = &H7F

A listagem de todas as constantes estão no arquivo constant.txt (Uma cópia desse arquivo, que
acompanha o VB, está na página de arquivos do VBB).

Em seguida digite o código no evento KeyDown de qualquer objeto. Exemplo:


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

If KeyCode = KEY_F12 Then Beep

'Quando f12 for pressionado, toque um Beep.


End Sub

2 - Alinhando controles no formulário


Enviado por: Visual Basic Brasil
Para alinhar controles no formulário, basta incluir o seguinte código
no procedimento que você desejar:

Para alinhar horizontalmente:


controle.Left = (Form.Width / 2) - (controle.Width / 2)

Para alinhar verticalmente:


controle.Top = (Form.Height / 2) - (controle.Height / 2)
williamdsilva@aol.com.br 3

controle é o nome do controle que você deseja alinhar, e form é o nome


do formulário onde está o controle.

Se o formulário que contém o controle, for redimensionável, então é


bom que você coloque o
código no procedimento Form_Resize. Assim, sempre que você modificar o
tamanho do formulário, o controle
será automaticamente centralizado.

3 - Carregando o projeto que você quiser


Enviado por: Visual Basic Brasil
O Visual Basic sempre carrega os mesmos arquivos e custom controls automaticamente quando você inicia
um novo
projeto. Na verdade, ele carrega um projeto já existente no seu diretório. Mas você pode criar seu projeto
para ser
carrejado quando iniciar um novo. Basta salvar o projeto como auto32ld.vbp para o VB 32 bits,
auto16ld.vbp
para o VB 4.0 16 Bits ou autoload.mak para o VB 3.0. Estes arquivos estão no diretório principal (raiz) do
VB. É sempre bom que você faça
uma cópia de segurança desses arquivos antes, para qualquer eventualidade...

4 - Formulário MDI Child


Enviado por: André Luís Milaré de Medeiros
Para centralizar um formulário MDI Child ou colocá-lo em qualquer lugar da tela utiliza-se o seguinte
comando no evento Load do MDI child:

rem Centralizar
me.left = (form1.left - me.left) /2
me.top = (form1.width - me.width) /2
rem Aparecer em qualquer lugar:

me.left = (valor)
me.top = (valor)

rem *** fim do form load ***

5 - Converter texto para Maiúsculo/Minúsculo


Enviado por: Lionardo Fonseca Paiva
Aí vai uma função bastante útil...
Public Function MMCase(Texto As String) As String
'Esta função converte o texto para Maiusculo/Minusculo, deixando as
'primeiras letras das palavras em maiusculo.
'respeitando as exceções da lingua portuguesa como: de, da, do, das, dos, a, e

'***** Autor: Lionardo Fonseca Paiva


'***** lionardo@base.com.br

Dim Palavra, PosiçãoInicial, PosiçãoFinal


Dim resultado As String
PosiçãoInicial = 1
Texto = LCase(Texto) & " "

Do Until InStr(PosiçãoInicial, Texto, " ") = 0


PosiçãoFinal = InStr(PosiçãoInicial, Texto, " ")
Palavra = Mid(Texto, PosiçãoInicial, PosiçãoFinal - PosiçãoInicial)
PosiçãoInicial = PosiçãoFinal + 1
If Palavra <> "de" And Palavra <> "da" And Palavra <> "do" And _
Palavra <> "das" And Palavra <> "dos" And Palavra <> "a" And _
Palavra <> "e" Then
Palavra = UCase(Left(Palavra, 1)) & LCase(Mid(Palavra, 2))
End If
williamdsilva@aol.com.br 4

resultado = resultado & " " & Palavra


Loop

MMCase = Trim(resultado)

End Function

6 - Ocultar/mostrar barra de tarefas


Enviado por: Visual Basic Brasil
Coloque na seção de Declarações do formulário:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpexecuta As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As _
Long, ByVal nCmdShow As Long) As Long
Const SW_HIDE = 0: Const SW_SHOWNORMAL = 1

Para Ocultar a barra de tarefas:


Dim aviso As Long
Dim janela As Long
Dim executa As String

executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)

aviso = ShowWindow(janela, SW_HIDE) 'Esconde a barra

Para Mostrar a barra de tarefas:


Dim aviso As Long
Dim janela As Long
Dim executa As String

executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)

aviso = ShowWindow(janela, SW_SHOWNORMAL) 'Mostra a barra

7 - Abrir URL no navegador padrão


Enviado por: Visual Basic Brasil
Para abrir um link através do VB, no navegador padrão, coloque o seguinte código na seçao de
declarações:
#If Win32 Then
Private Declare Function ShellExecute Lib _
"shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

#Else

Private Declare Function ShellExecute Lib _


"shell.dll" _
(ByVal hwnd As Integer, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Integer) As Integer

#End If
williamdsilva@aol.com.br 5

Private Const SW_SHOWNORMAL = 1

No procedimento CLICK de algum controle, digite:


Private Sub label1_Click()
Dim iret As Long

iret = ShellExecute(Me.hwnd, _
vbNullString, _
"http://www.vbbrasil.com", _
vbNullString, _
"c:\", _
SW_SHOWNORMAL)

End Sub

8 - Confirmar término do programa


Enviado por: Visual Basic Brasil
Para perguntar ao usuário se ele realmente deseja sair do programa:
Private Sub Form_Unload(Cancel As Integer)
sair = MsgBox("Tem certeza que deseja sair do programa?", _
vbYesNo + vbExclamation, "Atenção")

If sair = vbYes Then


End
Else
Cancel = True
End If

End Sub

9 - Usando a tecla Enter no lugar da tecla Tab


Enviado por: Almando Menezes Guimarães
Esta Dica é para quem quer que a tecla enter funcione como um tab para mudar de campo.
1º - Mude a propriedade KeyPreview do formulário para true.

2º - Coloque o seguinte código no evento KeyDown do formulário.


If KeyCode = vbKeyReturn then Sendkeys "{Tab}"

Pronto, agora sempre que for pressionado um enter no formulário sera disparado um tab.

10 - Letras Maiúsculas e Minúsculas


Enviado por: André Luís Milaré de Medeiros

No Evento Keypress utilize, Para Maisúculas:


KeyAscII= Asc(Ucase(Chr(KeyAscII)))

Para Minúsculas:
KeyAscII= Asc(Lcase(Chr(KeyAscII)))

Pronto! Não é necessário a utilização de API's

11 - Busca de Strings em um TextBox


Enviado por: Fausto Fiorese

No General do Form:
williamdsilva@aol.com.br 6

Public Last_Pos As Integer


Public First_Pos As Integer
Public Find_String As String
Private Sub Text1_GotFocus()
'Valor Default p/ as variaveis
Last_Pos = 1
First_Pos = 1
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
CtrlDown = (Shift And vbCtrlMask) > 0
If KeyCode = vbKeyF And CtrlDown Then 'Identifica a Tecla Ctrl+F
Mensagem = "Entre com o Texto a ser procurado!"
Titulo = "Procura"
Default = ""
Find_String = InputBox(Mensagem, Titulo, Default)
If Find_String = "" Then Exit Sub
KeyCode = 114 'Forca a passagem pela Busca
End If
'As rotinas abaixo verificam se a tecla apertada é F3
'A primeira coisa a ser feita é verificar se realmente
' existe em algum ponto do TextBox a string informada
' no InputBox.
'Existindo a string, entao é verificado se a busca será feita
' "para baixo" (F3) ou "para cima" (Shift+F3)
If KeyCode = 114 Then
If InStr(Text1.Text, Find_String) = 0 Then
MsgBox "Texto não encontrado!", vbInformation
Exit Sub
End If
If Shift = 1 Then
If First_Pos = 0 Or InStr(Mid(Text1.Text, 1, First_Pos), Find_String) = 0 Then
First_Pos = Len(Text1.Text)
End If
For i% = (First_Pos - 1) To 1 Step -1
If Mid(Text1.Text, i%, Len(Find_String)) = Find_String Then
Pos% = i%
Exit For
End If
DoEvents
Next
For i% = (First_Pos - 1) To 1 Step -1
If Mid(Text1.Text, i%, Len(Find_String)) = Find_String Then
Pos_Fim% = Len(Find_String) + i%
Exit For
End If
DoEvents
Next
Last_Pos = Pos_Fim%
First_Pos = Pos%
Text1.SelStart = Pos% - 1
Text1.SelLength = Pos_Fim% - Pos%
Else
Pos% = InStr(Last_Pos, Text1.Text, Find_String)
First_Pos = Pos%
If Pos% = 0 Then
Last_Pos = 1
Pos% = InStr(Last_Pos, Text1.Text, Find_String)
End If
Pos_Fim% = Len(Find_String) + Pos%
Last_Pos = Pos_Fim%
Text1.SelStart = Pos% - 1
Text1.SelLength = Pos_Fim% - Pos%
End If
End If
End Sub

12 - DoEvents
Enviado por: Fabio

Quando for trabalhar com processamentos longos, procure sempre utilizar uma ProgressBar ou coisa assim
p/ interar o usuário. Você pode também, quando estiver utilizando loops como Do...Loop, For...Next, criar
um Botão Cancelar com a funçao DoEvents, que retorna a atenção p/ o Sistema.
williamdsilva@aol.com.br 7

É simples, declare en General uma variável do tipo Booleana. Na Rotina onde irá utilizar o Loop, comece
atribuindo um valor False p/ a variável : Para = false.
Logo quando começar o Loop, faça o seguinte:

Do

DoEvents

if Para = true then exit sub

No Botão Cancelar, só atribua um valor true p/ a variável:


Para = True

É muito simples, o loop sempre voltará a atenção p/ o sistema, quando o usuário clicar em cancelar ele
muda o valor do Booleano. Isso é muito útil, e vc pode utilizar DoEvents p/ várias outras coisas no intuito
de não travar seu Micro.
Copyright (c) 1996-2001 Visual Basic Brasil

13 - Deixar a Caixa de Texto (TextBox) com o texto selecionado ao entrar


Enviado por: Mateus Zambonatto Pezzin

Basta colocar no evento GOTFOCUS da caixa de texto, por exemplo, TEXT1, a seguinte rotina:
text1.selstart = 0

text1.sellenght = len(text1.text)

Simples e eficaz, funciona sempre!

14 - Ajustando os controles dentro do Formulário


Enviado por: Fabio

Como já dito em uma dica enviada por não sei quem, podemos centralizar os controles no Form usando os
procedimentos já citados. Você pode também, fazer com que o tamanho de seus controle fique
proporcional ao tamanho do Formulário. É fácil, veja o tamanho e altura(Width e Height) do Form e do
controle que vai utilizar. Veja a diferença entre eles, vamos supor que seja 600.
No evento Form_Resize(que ocorre qdo o tamanho da form é alterado), atualize a proporção:
frame1.width = form1.width - 600

frame1.height = form1.height - 600

Qdo vc maximizar a tela o controle se ajustará, e qdo alterar o tamanho também. Nesse evento vc também
pode escrever os procedimentos p/ centralizar os controles como mandou um colega aí, e fazer várias
outras coisas.

15 - Confirmando saida do programa II


Enviado por: Rodrigo Meirelles de Mello

Modificando a dica existente, assim não se precisa declarar mais uma variável:
If MsgBox("Tem certeza que deseja sair do programa?", _

vbYesNo + vbExclamation, "Atenção") = vbYes Then

End

Else

Cancel = True

End If

16 - Salvar Bmp da caixa de imagem


Enviado por: Marcelo Nagy
williamdsilva@aol.com.br 8

Você já conhece o processo de leitura de um bmp para uma caixa de imagem ? É assim:
Image1.picture=loadpicture("c:\Windows\carros.bmp")

Mas você também pode gravar uma imagem que está em uma caixa de imagem e converte-lo para bmp,
gif, etc. É assim

SavePicture image1, "C:\windows\teste.bmp"

fácil ?????!!!!!! Espero que sirva pra alguem falou galera !

17 - Colocar sempre visivel o form como um Tollbox


Enviado por: Armando Estruc

Tem que fazer um mdi ou uma a tela principal que seria um mdi, e colocar um form nao child e na hora de
chamar este form nao child colocar o seguinte comando
Nomedoform.Show , NomedoMid

18 - Colocar Titulos do programa VB para o Crystal


Enviado por: Armando Estruc

Para mandar coisa do VB para o crystal tem que ir ao crystal e colocar uma formula onde deseja cria um
titulo ou mandar outra coisa, na formula colocar o nome e depois a formula que seria assim:
"*"
Depois Acept
No Vb colocar o comando:
NomedoRPT.Formulas(0)=" NomedaFormula=" & NomedaVariavelTitulo

Para cada coisa que deseja mandar para o crystal deve ter um array diferente.

19 - Fechar um Formulário
Enviado por: Cleiton Oliveira da Silva

Para se fechar um formulário não basta usar o comando unload e o nome do mesmo e sim :
Unload
Set = Nothing

Pois assim estarão sendo fechadas também as variáveis pertencentes ao formulário.

20 - Aplicação já iniciada
Enviado por: Hantan

Para você verificar se sua aplicação já está sendo


executada coloque o sequinte código no inicio do form.

If App.PrevInstance Then End

Espero que seja útil.

21 - Arrendondar casas decimais


Enviado por: Hantan

Para arredondar casa decimais crie a seguinte função:


Function Round(Nmr As Double, Casas As Integer) As Double

Round = Int((Nmr * 10 ^ Casas) + 0.5) / 10 ^ Casas

End Function
williamdsilva@aol.com.br 9

Para chamar a função utiliza-se:


Dim Resultado as integer

Resultado = Round([VALOR], [NUMERO DE CASAS])

Text1.Text = Resultado

Espero ter ajudado.

22 - Formulário OnTop
Enviado por: Hantan

Para manter um formulário OnTop ou seja, sempre visível faça o seguinte:

Declare o seguinte em um módulo .BAS:


Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As
Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags_ As Long) As Long

Global Const conHwndTopmost = -1

Global Const conHwndNoTopmost = -2

Public Const SWP_NOMOVE = 2

Public Const SWP_NOSIZE = 1

Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE

Para colocar um Form OnTop coloque o seguinte código:


SetWindowPos [NOMEDOFORM].hwnd, -2, 0, 0, 0, 0, FLAGS

Espero ter ajudado.

23 - Reconhecendo o pressionamento de teclas - Mais simples sem módulo


Enviado por: Tercio Filho

Para reconhecer o pressionamento de teclas mais fácil coloque o seguinte código no evento keyDown ou
keyUp do form ou do objeto:
If (KeyCode = [TECLA]) then Beep

'TECLA significa o valor para a tecla pressionada.

'Os valores estão no HELP do VB em "Keycode Constants"

'Ex.: If (KeyCode = VbKeyF2) then Beep

'Toca um Beep quando a teclar F2 for apertada.

Abraços.

24 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horários.
Enviado por: Márcio Britto®

Neste exemplo, eu usei imagens, mas pode se usar apenas textos...


Dim Agora, BomDia, BoaTarde, BoaNoite As Variant, Nome As String

Agora = Time$

BomDia = "00:00:00"

BoaTarde = "12:00:00"

BoaNoite = "19:00:00"
williamdsilva@aol.com.br 10

If Agora > BoaNoite Then

Pic_Noite.Visible = True

Pic_Tarde.Visible = False

Pic_Dia.Visible = False

ElseIf Agora > BoaTarde Then

Pic_Noite.Visible = False

Pic_Tarde.Visible = True

Pic_Dia.Visible = False

ElseIf Agora > BomDia Then

Pic_Noite.Visible = False

Pic_Tarde.Visible = False

Pic_Dia.Visible = True

End If

25 - Metodo de selecao de registros usando SQL


Enviado por: Rodrigo Meirelles de Mello

Temos como um exemplo um Banco de dados Agenda com os seguintes campos


NOME, TELEFONE, ENDERECO, SEXO

Nao citarei como se deve declarar variaveis visto que ja fiz isso em uma dica
anterior...

Tendo tudo declarado...

Definido anteriormente que o campo sexo recebe "M" ou "H"


Desejo selecionar dentre todo o banco de dados os registros das pessoas do
sexo feminino "M" e que moram no humaita...
--> Set DYNagenda = DBagenda.createdynaset ("select * from agenda where sexo = ' " & TXTprocurasexo & "
' and bairro = ' " & TXTprocuraBairro & " ' ")

Explicando a sintaxe:

("select * from (1)agenda where (2)sexo = ' " & (3)TXTprocurasexo & " ' and (4)bairro = ' " &
(5)TXTprocuraBairro & " ' ")

(1) Tabela agenda do banco de dados agenda.mdb

(2) Campo Sexo

(3) TXTProcuraSexo - é onde eu informo o sexo...

(4) Campo bairro

(5) TXTprocurabairro - é onde eu informo o Humaita

Espero ter ajudado, qquer duvida mail-me...

26 - Metodos de procura, Usando o Find...


Enviado por: Rodrigo Meirelles de Mello - DJOP

Nesta dica, informarei como se encherga o valor de um campo TXT por exemplo na sintaxe dentro do
Find...

Exemplo:
williamdsilva@aol.com.br 11

E em um Módulo declara-se as variaveis...


Global DBagenda as Database

Global DYNagenda as Dynaset

------- No form.Load

Set DBagenda = OpenDatabase("c:\agenda\arquivo.mdb") ' Define o arquivo de banco de dados

Set DYNagenda = DBagenda.OpenTable("agenda") ' Abri a tabela agenda do banco de dados

Set DYNagenda = DBagenda.CreateDynaset("agenda")

-------

Para se procurar por exemplo uma pessoa que more em botafogo

Posso usar a seguinte sintaxe...


DYNagenda.findfirst "bairro = ' " + TXTbairro + " ' "

Desta forma estou procurando no campo bairro o valor do campo


TXTbairro se eu nao fizesse esta sintade ( ' " + ??? + " ' ) e coloca-se
somente "bairro = TXTbairro" o programa iria procurar a frase TXTbairro.

OBS.: O findFist procura o primeiro nome da lista... em seguida coloque uma


rotinhazinha de verificacao... tipo:
if DYNagenda.NoMatch then msgbox "Nao encontrei nenhuma pessoa que more em" & TXTbairro, , "Agenda
eletrônica"

Pode-se tb usar o FindFirst, FindNext, FindPrevious e FindLast


-----

Esta Sintaxe pode ser usada em varias outras formulas, em SQL por exemplo
Onde em uma proxima dica colocarei uma sintaxe de selecao em SQL, que
É muito mais rapido do que o Find, Outro método de pesquisa absurdamente
mais rapido que o Find, é o Seek mas o Find se encaixa perfeitamente para
Banco de dados pequenos...

Espero ter ajudado... Qualquer duvida escreva-me.

27 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horários. 2
Enviado por: Rodrigo Meirelles de Mello - DJOP

Analisando uma dica previamente mandada, percebi


que as pessoas gostam de declarar variaveis
sem necessidade...
If time$ > "19:00:00" Then

Pic_Noite.Visible = True

Pic_Tarde.Visible = False

Pic_Dia.Visible = False

ElseIf time$ > 12:00:00 Then

Pic_Noite.Visible = False

Pic_Tarde.Visible = True

Pic_Dia.Visible = False

ElseIf time$ > 00:00:00 Then

Pic_Noite.Visible = False

Pic_Tarde.Visible = False

Pic_Dia.Visible = True

End If
williamdsilva@aol.com.br 12

Deste modo nao se declara variaveis...

28 - Colocar um "Continua..." em relatórios do Crystal Reports


Enviado por: Uriel Papa

Para quem deseja colocar a expressão "Continua..." no final de cada página do relatório, com excessão da
última, aqui vai a dica:

Escolha um campo da linha de detalhes que nunca receba valores nulos (Campo_A).

Insira a seguinte fórmula no bottom da página:


If NextIsNull({Campo_A}) then "" Else "Continua..."

[]'s,

Uriel

29 - Usando o objeto printer para imprimir formulários.


Enviado por: Cecil Weiss

Coloca o vb no modo de impressâo de caracteres


Printer.ScaleMode = 4

Printer.CurrentX = 0 'coluna

Printer.CurrentY = 0 'linha

Printer.Print "Nome="

Printer.CurrentX = 7 'coluna

Printer.CurrentY = 0 'linha

Printer.Print "Nome="
Experimente estes códigos, usando "scalemode", voce pode imprimir usando medidas por caracteres,
pixels, twips, etc... veja abaixo a tabela.
vbUser = 0: Indica que uma ou mais das propriedades ScaleHeight, ScaleWidth, ScaleLeft e
ScaleTop estão configuradas como valores personalizados.

VbTwips = 1: '(Padrão) Twip (1440 twips por polegada lógica; 567 twips por centímetro lógico).

VbPoints = 2: 'Ponto (72 pontos por polegada lógica).

VbPixels = 3: 'Pixel (menor unidade de resolução de monitor ou impressora).

vbCharacters = 4: 'Caractere (horizontal = 120 twips por unidade; vertical = 240 twips por unidade).

VbInches = 5: 'Polegada.

VbMillimeters = 6: 'Milímetro.

VbCentimeters = 7: 'Centímetro.

30 - Mostrar somente seleção em um banco de dados.


Enviado por: Cecil Weiss

Use os seguintes comandos para selecionar uma parte de uma string, com isso voce filtra o banco de
dados mostrando somente o desejado.
Data1.RecordSource = "Select * from [Clientes]here [Nome] _
like '*" & Text1.Text & "*'Order by [Nome]"

Data1.Refresh
Use os seguintes comandos para selecionar um mês especifico em um campo data, com isso voce filtra o
banco de dados mostrando somente o desejado.
williamdsilva@aol.com.br 13

Data1.RecordSource = "Select * from [Clientes] where month([Nasc]) = _


'" & Val(Text1.Text) & "'Order by [Nome]"

Data1.Refresh

Obs: A função "Month" retorna um valor de 1 a 12, por isso faça com que o usuário só possa digitar na
caixa texto um numero de 1 a 12.

31 - Pesquisa por nome ou sobrenome.


Enviado por: Cecil Weiss

Se voce quiser pesquisar por nome ou sobrenome, ou em qualquer parte da string use o seguinte
comando:
Data1.Recordset.FindFirst "NOME Like '*" & Text1.Text & "*'"

Espero ter ajudado.

32 - Como controlar o MCIwndX e o MCC (para reproduzir arquivos multimídia)


Enviado por: Leonardo Motta

Você pode controlar um objeto MCIwndX ou MCC Control (Microsoft Multimedia Control, que já vem com o
VB) sem precisar tocar na lista de propriedades. Vamos chamar o objeto de mciMedia.
'Especifica as propriedades principais

mciMedia.filename =

mciMedia.visible = True/False

mciMedia.enabled = True/False

Obs.: a propriedade 'visible' refere-se somente ao controle. Animações/filmes/etc serão exibidos


normalmente se o controle estiver oculto.

Os comandos dos objetos MCI:


' Abre o arquivo

mciMedia.Command = "Open"

' Reproduz o arquivo

mciMedia.Command = "Play"

' Pausa

mciMedia.Command = "Pause"

' Para

mciMedia.Command = "Stop"

' Fecha o arquivo (sempre use este comando quando for usar animações ou filmes...)

mciMedia.Command = "Close"

Obs.: existem outros comandos para retornar, voltar ao começo, ir ao final, etc. (Ex.: Prev, Back)

Alguns eventos úteis: Done e NotifyCode são eventos que acontecem quando o objeto termina de
reproduzir o arquivo. A variável "NotifyCode" especifica se o arquivo foi reproduzido com sucesso, se foi
interrompido pelo usuário ou por algum erro do objeto. As constantes referentes ao "NotifyCode" são
mciNotify(CRL+ESPACO para listar).

33 - MsgBox não modal 2


Enviado por: Hantan

Para fazer a msgbox não modal com apenas o botão de OK declare o seguinte no módulo .BAS:
williamdsilva@aol.com.br 14

Public Const MB_OK = &H0&

e substitua em MB_OKCANCEL..

Qualquer coisa veja em Constants no Text API Viewer

34 - MsgBox não modal


Enviado por: Hantan

Para fazer um message box que não seja modal faça o seguinte:

Em um módulo .BAS coloque o seguinte:


Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, _
ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Const MB_OKCANCEL = &H1

Para chamar a função faça:


Dim ret%

ret = MessageBox(0, "Sou uma MsgBox não modal.", "Modeless MessageBox ", MB_OKCANCEL)

Até mais.

35 - Resolução da tela
Enviado por: Hantan

Este exemplo mostra como saber qual é a resolução da tela sem ter que fazer com API.
Dim xTwips%, yTwips%, xPixels#, YPixels#

xTwips = Screen.TwipsPerPixelX

yTwips = Screen.TwipsPerPixelY

YPixels = Screen.Height / yTwips

xPixels = Screen.Width / xTwips

Print "A Resolução é : " & Str$(xPixels) & " por " & Str$(YPixels) & " pixels"

A saida vai ser alguma coisa assim:

A Resolução é : 800 por 600 pixels

Espero ter sido útil.

Algum problema com programação em VB me contacte.

36 - Transformar qualquer valor na moeda corrente


Enviado por: Robson Batista

Dim dado as string

dado = text1.text

text1.text = format(dado,"CURRENCY")

37 - Fundo degradê
Enviado por: Hantan

Para deixar um fundo degrade faça o seguinte:

Crie o seguinte em um módulo .BAS:


williamdsilva@aol.com.br 15

Sub Fundo(Frm As Object, Vermval&, Verdval&, Azulval&, TopToBottom As Boolean)


On Error Resume Next

Dim Step%, Reps%, FillTop%, FillLeft%, FillRight%, FillBottom%, HColor$

Step = (Frm.Height / 63)

If TopToBottom = True Then FillTop = 0 Else FillTop = Frm.Height - Step

FillLeft = 0

FillRight = Frm.Width

FillBottom = FillTop + Step

For Reps = 1 To 63

Frm.Line (FillLeft, FillTop)-(FillRight, FillBottom), RGB(Vermval, Verdval, Azulval), BF

Vermval = Vermval - 4

Verdval = Verdval - 4

Azulval = Azulval - 4

If Vermval <= 0 Then Vermval = 0

If Verdval <= 0 Then Verdval = 0

If Azulval <= 0 Then Azulval = 0

If TopToBottom = True Then FillTop = FillBottom Else FillTop = FillTop - Step

FillBottom = FillTop + Step

Next
End Sub

A variável chamada TopToBottom é se vai do preto para a cor escolhida ou da cor escolhida para o preto.

39 - Ler e escrever arquivos INI


Enviado por: Hantan

Para ler arquivos INI faça o seguinte:

Em um módulo .BAS coloque:


Declare Function GetPrivateProfileString Lib "Kernel32" Alias _

"GetPrivateProfileStringA" (ByVal lpApplicationName As String, _

ByVal lpKeyName As String, ByVal lpDefault As String, ByVal _

lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName _

As String) As Long
Declare Function GetProfileString Lib "Kernel32" Alias _

"GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName _

As String, ByVal lpDefault As String, ByVal lpReturnedString As _

String, ByVal nSize As Integer) As Integer


Declare Function WritePrivateProfileString Lib "Kernel32" Alias _

"WritePrivateProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName _

As String, ByVal lpDefault As String, ByVal lpFileName As String) As Integer

Crie a seguinte função no mesmo módulo .BAS:


Function GetIni(section, key, arq)

'section = É o que está entre []


williamdsilva@aol.com.br 16

'key = É o nome que se encontra antes do sinal de igual (=)

'arq = É o nome do arquivo INI

Dim Val As String

Dim valor As Integer

Val = String$(255, 0)

valor = GetPrivateProfileString(section, key, "", Val, Len(Val), arq)

If worked = 0 Then

GetIni = ""

Else

GetIni = Left(Val, valor)

End If

End Function

No mesmo módulo .BAS crie a seguinte função para escrever no arquivo INI:
Sub WriteIni(section, key, dado, arq)

'section = É o que está entre []

'key = É o nome que se encontra antes do sinal de igual (=)

'dado = É o valor que vai depois do sinal de igual (=)

'arq = É o nome do arquivo INI

Dim Val As String

Dim valor As Integer

Val = String$(255, 0)

valor = WritePrivateProfileString(section, key, dado, arq)

End Sub

Para chamar as funções faça o seguinte:


Text1.Text = GetIni("EntreColchetes", "AntesDoIgual", "ARQUIVO.INI")

WrtArqIni "EntreColchetes", "AntesDoIgual", "ValorPosIgual", "ARQUIVO.INI"

40 - Abrir uma conexão da Rede Dial-Up


Enviado por: Hantan

Para abrir uma conexão da Rede Dial-Up crie a seguinte:


Private Sub AbrirDialUp(Conexão As String)

Dim X

X = Shell("C:\Windows\rundll32.exe rnaui.dll,RnaDial " & Conexão, 1)

DoEvents

End Sub

Na variável Conexão é o nome da conexão que se quer abrir.

41 - Confirmando uma exclusao de registro em banco de dados


Enviado por: Sinister Overrider
williamdsilva@aol.com.br 17

Para voce deletar um registro em um banco de dados basta apenas digitar o codigo abaixo em qualquer
controle que execute a instrucao quando voce manda por exemplo um Botao:
Dim resp As Variant

resp = MsgBox("Voce tem certeza que deseja excluir este registro?", vbYesNo, "Exclusao")

If resp = vbYes Then

NomedoControleData.Recordset.Delete

NomedoControleData.Recordset.MoveNext

End If

42 - Criar multiplos níveis de diretório


Enviado por: Hantan

As vezes vc tem um programa que precisa criar multiplos níveis de diretórios(C:\Dir1\Dir2\Dir3....) esta
rotina faz isso:
Sub LongDir(sDrive as String, sDir as String)

'sDrive = Nome do Drive(C:, D:, E:....)

'sDir = Nível de diretório(Dir1\....)

Dim sBuild As String

While Instr(2, sDir, "\") > 1

sBuild = sBuild & Left(sDir, Instr(2, sDir, "\") - 1)

sDir = Mid$(sDir, InStr (2, sDir, "\")

If Dir$(sDrive & Sbuild, 16) = "" Then MkDir sDrive & sBuild

Wend

End Sub

Call LongDir ("C:", "Dir1\Dir2\Nome Longo\Etc")

(Por Jeffrey Renton, aperfeiçoada por mim.)

43 - O arquivo existe ou não


Enviado por: Hantan

Se vc quiser saber se existe ou não um arquivo insira o código abaixo em qualquer lugar do seu prg.:
If Dir$("X:\XXXX\XXXXX.XXX") <> "" Then

'O arquivo existe

Else

'O arquivo não existe

End If

44 - Modificar caractere de uma string com o comando Mid


Enviado por: Hantan

Para modificar algum caracter de uma string com o comando Mid faça o seguinte:
Dim MinhaString as String
williamdsilva@aol.com.br 18

MinhaString = "Hantan"

If Mid(MinhaString, 2, 1) = "a" Then

Mid(MinhaString, 2, 1) = "A" 'Substituindo o caracter

End If

Abraços a todos, Hantan

45 - "Peneira" de dados
Enviado por: Hantan

Se você quiser retirar todas as letras ou todos os número de uma string faça o seguinte:

Crie a seguinte função para retirar os números:


Function LimpaNumero (campo As String) As String

Dim VA_Posicao As Integer

Dim VA_Caracter As String * 1

Dim VA_Resultado As String

VA_Resultado = ""

VA_Posicao = 1

Do While VA_Posicao <= Len(campo)

VA_Caracter = Mid$(campo, VA_Posicao, 1)

If IsNumeric(VA_Caracter) Then

VA_Resultado = VA_Resultado & VA_Caracter

End If

VA_Posicao = VA_Posicao + 1

Loop

LimpaNumero = VA_Resultado

End Function

Para limpar as letras crie a seguinte função:


Function LimpaAlfa (campo As String) As String

Dim VA_Posicao As Integer

Dim VA_Caracter As String * 1

Dim VA_Resultado As String

VA_Resultado = ""

VA_Posicao = 1

campo = UCase(campo)

Do While VA_Posicao <= Len(campo)

VA_Caracter = Mid$(campo, VA_Posicao, 1)

If Asc(VA_Caracter) > 64 And Asc(VA_Caracter) < 91 Then

VA_Resultado = VA_Resultado & VA_Caracter


williamdsilva@aol.com.br 19

End If

VA_Posicao = VA_Posicao + 1

Loop

LimpaAlfa = VA_Resultado

End Function

Para chamar as funções faça isso:


SemNumero = LimpaNumero("0H1A2N3T4A5N6")

Sairá assim: HANTAN

SemLetra = LimpaAlfa("0H1A2N3T4A5N6")

Sairá assim: 0123456

Espero ter sido útil, abraços.

47 - Fechar todos os forms


Enviado por: Hantan

Para fechar todos os forms abertos crie a seguinte função:


Public Function FecharForms()

Dim f As Integer

f = Forms.Count

Do While f > 0

Unload Forms(f-1)

If f = Forms.Count Then Exit Do

f=f-1

Loop

End Function

48 - Como abrir um site pelo navegador padrão (Mais fácil)


Enviado por: Fabio

Dentro de Windows\Command, existe um programa chamado Start. Basta vc digitar


Shell "c:\windows\command\start http://www.vbbrasil.com/"

Sem nenhuma declaração de API.

OBS: O própio Shell sozinho não consegue abrir o site, não tenho certeza, mas este pode ser um recurso
exclusivo do Internet Explorer 4.0, gostaria que alguém testasse isso em outro navegador e entrasse em
contato comigo.

49 - Saber qual o diretório do Windows


Enviado por: Hantan

Para saber qual é o diretório do Windows declare a seguinte função em um modulo .BAS:
Private Declare Function GetWindowsDirectory Lib "Kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer
As String, ByVal nSize As Long) As Long

Para saber qual é o diretório do windows chame a função assim:


williamdsilva@aol.com.br 20

Dim X$

X = GetWindowsDirectory(Space$(255), 255)

Para saber o diretório System do Windows faça o seguinte:


Dim X$

X = GetWindowsDirectory(Space$(255), 255) & "\System"

50 - Rotina de extenso com várias funções(Para iniciantes)


Enviado por: Hantan
*** ATENÇÃO esta rotina é recomendada para programas simples(Impresão de cheques, etc.), por conter
grande número de comandos ***

Decidi criar uma rotina de extenso mas uma bem simples apenas com comandos básicos(If,Mid,For e
outros) para quem é iniciante em VB conseguir entender.
Para ficar mais fácil entender ao invés de transformar o número em extenso em uma função só criei várias
funções.
Lembrando que esta função é BETA mais funciona perfeitamente com valores até 9999.

Abaixo vai as funções todas detalhadamente comentadas:

(É só copiar e colar dentro de um módulo .BAS ou no General do Form)


'Determinado para que o VB avise qualquer variável não declarada
Option Explicit
'Declarando variáveis
Dim Unidades(19) As String
Dim Dezena(9) As String
Dim Centena(9) As String
Dim Milhares(9) As String
Dim Valor(99) As Integer
Dim Grupos(99) As String
Dim i As Integer
Dim Temp As Boolean
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Centenas(Nmr3 As Integer)
'Determinando os valores das centenas em extenso.
Centena(1) = "Cento": Centena(2) = "Duzentos": Centena(3) = "Trezentos": Centena(4) _

= "Quatrocentos": Centena(5) = "Quinhentos": Centena(6) = "Seicentos": Centena(7) _


= "Setecentos": Centena(8) = "Oitocentos": Centena(9) = "Novecentos"
'Verificando que número é.
For i = 1 To 9
If Nmr3 = i Then Grupos(1) = Centena(i)
Next i
'Determinando valor em extenso da função.
Centenas = Grupos(1)
End Function
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Dezenas(Nmr2 As Integer)
'Determinando os valores das centenas em extenso.
Dezena(2) = "Vinte": Dezena(3) = "Trinta": Dezena(4) = "Quarenta": Dezena(5) = _
"Cinquenta": Dezena(6) = "Sessenta": Dezena(7) = "Setenta": Dezena(8) = "Oitenta": Dezena(9) = "Noventa"
'Verificando que número é.
For i = 2 To 9
If Nmr2 = i Then Grupos(1) = Dezena(i)
Next i
'Determinando valor em extenso da função.
Dezenas = Grupos(1)
End Function
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Extenso(Nmr As Integer)
On Error Resume Next
'Verificando se o número está entre o suportado
If IsNull(Nmr) Or Nmr > 9999 Then Extenso = "Valor não suportado!!!": Exit Function
'Verificando se o número está entre 1000 e 19999
If Nmr > 999 And Nmr < 20000 Then Extenso = Mil(Nmr): Exit Function
'Verificando se é centena inteira(100,200,300,etc.)
For i = 1 To 9
williamdsilva@aol.com.br 21

If Nmr = i & "00" Then Extenso = Centena(i): Exit Function


Next i
'Verificando se o número está entre 1 e 19
If Nmr > 0 And Nmr < 20 Then
'Determinando valor em extenso da função
Extenso = Unitarios(Nmr): Exit Function
ElseIf Nmr > 19 And Nmr < 100 Then
If Mid(Nmr, 2, 1) > 0 Then
'Determinando valor em extenso da função
Extenso = Dezenas(Mid(Nmr, 1, 1)) & " e " & Unitarios(Mid(Nmr, _
2, 1)): Exit Function
ElseIf Mid(Nmr, 2, 1) = 0 Then
'Determinando valor em extenso da função
Extenso = Dezenas(Mid(Nmr, 1, 1)): Exit Function
End If
End If
'Verificando se o número está entre 100 e 999
If Nmr > 99 And Nmr < 1000 Then
If Mid(Nmr, 2, 1) = 0 Or Mid(Nmr, 2, 1) = 1 Then
'Determinando valor em extenso da função
Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Unitarios(Mid(Nmr, _
2, 2)): Exit Function
'Verificando se a segunda casa é maior que 1, ou seja >= 2
ElseIf Mid(Nmr, 2, 1) > 1 Then
'Verificando se a terceira casa é igual a 0
If Mid(Nmr, 3, 1) = 0 Then
'Determinando valor em extenso da função
Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Dezena(Mid(Nmr, _
2, 1)): Exit Function
'Verificando se a terceira casa é maior que 0, _
'ou seja, >= 1
ElseIf Mid(Nmr, 3, 1) > 0 Then
'Determinando valor em extenso da função
Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Dezena(Mid(Nmr, 2, _
1)) & " e " & Unitarios(Mid(Nmr, 3, 1)): Exit Function
End If
End If
End If
End Function
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Mil(Nmr4 As Integer)
'Verifica se o número está entre 1000 e 10000
If Nmr4 > 999 And Nmr4 < 10000 Then
'Determinando os números
Valor(1) = Mid(Nmr4, 1, 1): Valor(2) = Mid(Nmr4, 2, 1): Valor(3) = Mid(Nmr4, _
3, 1): Valor(4) = Mid(Nmr4, 4, 1)
'Verificando se é 2 mil, 3 mil, etc.
For i = 1 To 9
If Valor(1) = i Then Grupos(1) = Unidades(i)
Next i
'Verifica se a segunda casa é 0
If Valor(2) = 0 Then
'Verificando se a terceira casa é 0
If Valor(3) = 0 Then
'Verificando se a quarta casa é 0
If Valor(4) = 0 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil"
'Verificando se a quarta casa é maior que 0, ou seja, >= 1
ElseIf Valor(4) > 0 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil e " & Unidades(Valor(4)): Exit Function
End If
'Verificando se a terceira casa está entre 2 e 9
ElseIf Valor(3) > 1 And Valor(3) > 10 Then
'Verificando se é valor inteiro ou quebrado, _
'ou seja, 20 ou 21,22,23,24...
For i = 2 To 9
If Valor(3) & Valor(4) = i & 0 Then Temp = True
Next i
'Verificando se a variável de valor inteiro é verdadeira
If Temp Then Mil = Grupos(1) & " Mil, " & Dezenas(Valor(3)): Exit Function
'Verificando se a variável de valor inteiro não é verdadeira
If Not Temp Then Mil = Grupos(1) & " Mil e " & Dezenas(Valor(3)) & " _
williamdsilva@aol.com.br 22

e " & Unidades(Valor(4)): Exit Function


'Verificando se a terceira casa é 1
ElseIf Valor(3) = 1 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil e " & Unidades(Valor(3) & Valor(4)): Exit Function
End If
'Verificando se a segunda casa é maior que 0, ou seja, >=1
ElseIf Valor(2) > 0 Then
'Verificando se a terceira casa é igual a 0
If Valor(3) = 0 Then
'Verificando se a quarta casa é 0
If Valor(4) = 0 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil"
ElseIf Valor(4) > 0 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil e " & Centenas(Valor(2)) & Unidades(Valor(4)): _
Exit Function
End If
'Verificando se a terceira casa está entre 2 e 9
ElseIf Valor(3) < 1 And Valor(3) < 10 Then
'Verificando se é valor inteiro ou quebrado, ou seja, _
'20 ou 21,22,23,24...
For i = 2 To 9
If Valor(3) & Valor(4) = i & 0 Then Temp = True
Next i
'Verificando se a variável de valor inteiro é verdadeira
If Temp Then Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & Dezenas(Valor(3)): _
Exit Function
'Verificando se a variável de valor inteiro não é verdadeira
If Not Temp Then Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & " e " & _
Dezenas(Valor(3)) & " e " & Unidades(Valor(4)): Exit Function
ElseIf Valor(3) = 1 Then
'Determinando valor da função em extenso
Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & " e " & Unidades(Valor(3) _
& Valor(4)): Exit Function
End If
End If
End If
End Function
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Unitarios(Nmr1 As Integer)
'Determinando os valores das centenas em extenso.
Unidades(0) = "": Unidades(1) = "Um": Unidades(2) = "Dois": Unidades(3) = "Três": Unidades(4) _

= "Quatro": Unidades(5) = "Cinco": Unidades(6) = "Seis": Unidades(7) = "Sete": Unidades(8) = _

"Oito": Unidades(9) = "Nove": Unidades(10) = "Dez": Unidades(11) = "Onze": Unidades(12) = "Doze": _

Unidades(13) = "Treze": Unidades(14) = "Quatorze": Unidades(15) = "Quinze": Unidades(16) = _

"Dezesseis": Unidades(17) = "Dezessete": Unidades(18) = "Dezoito": Unidades(19) = "Dezenove"


'Verificando que número é.
For i = 1 To 19
If Nmr1 = i Then Grupos(1) = Unidades(i)
Next i
'Determinando valor em extenso da função.
Unitarios = Grupos(1)
End Function

Abraços, Hantan

Ps. Se vc não entender esta função, mande um e-mail.

51 - Como ligar o True DbGrid a um Array


Enviado por: Fabio C.

O true DbGrid é um controle perfeito, as vezes achamos que outros são melhores ou mais fáceis de se
lidar, mas ele é completo. Você pode por exemplo, querer ligá-lo a um array, onde os dados ficarão
temporariamente na memória. Siga os passos:
1 - Insira um true DbGrid em seu Formulário

2 - Altere a propriedade DataMode dele p/ 4 - Storage.


williamdsilva@aol.com.br 23

3 - Em Project - References(VB5), adicione a biblioteca "APEX xarray object", própria dele.

4 - Na Form Load declare:


Dim vetor As New XArray

vetor.ReDim r1, r2, c1, c2

Set TDBGrid1.Array = vetor

Onde vc cria um novo objeto XArray, depois o redimensiona considerando que r1 e r2 é o número de linha
(Rows) e c1 e c2 é o número de colunas. Depois vc seta a propriedade Array do TrueDbGrid a este objeto.

52 - Como criar uma coluna TOTAL no TrueDbGrid


Enviado por: Fabio
Você pode ter várias colunas do TrueDbGrid ligados a um Data ou a um RDC e querer que uma delas não
esteja, e receba um valor qualquer, como a soma de todas as colunas. P/ isso, a propriedade DataMode do
TrueDbgrid tem que estar como 0 - Unbound. Nesta coluna do Total, vc tem que definir um caption, e
deixar a propriedade DataField vazia, assim ele reconhecerá esta coluna como Unbound. Então funciona
assim, os dados do Data ou do RDC são puxadas p/ cada coluna. O valor desta coluna do Total, será
definido pelo evento UnboundColumnFetch. P/ cada linha(ou registro), ele passará por este evento p/ pegar
o valor desta coluna. Vc poderia:
Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal _

Col As Integer, Value As Variant)


Value = TDBGrid1.Columns(0).CellValue(Bookmark) + _

TDBGrid1.Columns(1).CellValue(Bookmark)

End Sub

Onde esta propriedade CellValue(bookmark) é o valor das colunas que estão no mesmo registro que esta
coluna de Total, e Value é o valor desta Coluna.

53 - Como definir um TrueDbGrid com 2 cores


Enviado por: Fabio
Defina na Form Load:
TDBGrid1.EvenRowStyle.BackColor = QBColor(6)

TDBGrid1.OddRowStyle.BackColor = QBColor(14)

TDBGrid1.AlternatingRowStyle = True

54 - Acesso à área de Transferência


Enviado por: Fabio

O Objeto Clipboard é uma referência à Área de transferência, vejam:


Clipboard.gettext

Retorna o conteúdo da área de transferência:


Clipboard.clear
Clipboard.settext "Teste"

Settext adiciona um novo texto p/ a área de transferência, no entanto p/ funcionar á necessário limpá-la
primeiro usando o clear.

55 - Parametros -> Função Command


williamdsilva@aol.com.br 24

Enviado por: Fabio

Quem quer estabelecer parametros ao programa é só usar a função Command. Por exemplo, vc poderia
criar um programa chamado PRG, que qdo vc digitasse PRG executasse o programa, e PRG /? executasse a
ajuda do programa. É simples, vc pode criar um módulo, e na Sub_Main deste coloque:
if command$ = "/?" then

frmAjuda.show

elseif command$ = "" then

meuprograma.show

end if

Não se esqueçam de colocar a sub main p/ ser a primeira coisa a ser executada. Menu Project - Properties.

56 - Operações via SQL


Enviado por: Guilherme João França Soares
A princípio deve-se declarar a variáveis de database e dynaset:
Global DBanco as database

Global DyRec as dynaset

Abrindo o Banco de Dados:


Set DBanco = Opendatabase (app.path & "\banco.mdb")

'onde banco é o banco de dados

Selecionando registros:
Set DyRec = DBanco.Createdynaset("select * from func")

'onde func é uma tabela do banco.mdb

'seleciona todos registros de func

Inserindo registros:
Banco.Execute "insert into func values ('Nome_func',Identidade,'Endereco')

'onde Nome_func,Identidade,Endereco são colunas do banco

'veja que Nome_func e Endereco estão entre aspas simples pois têm atributos do tipo Text

'e Identidade é Number

Excluindo registros:
Banco.Execute "delete from func where Nome_func like 'G*')

'exclui todas as linhas onde Nome_func começa com 'G'

Atualizando registros:
Banco.Execute "update func set

Nome_func = 'Guilherme',

Endereco = 'Rua 1, Qd. 1, Casa 1' where Identidade = "0000000000"

57 - Acesso ao Oracle via Oracle Objects


Enviado por: Guilherme João França Soares

Declarar as variáveis:
Global Banco As Object

Global Secao As Object


williamdsilva@aol.com.br 25

Criar o objeto:
Set Secao = CreateObject("OracleInProcServer.XOraSession")

Abrir o Banco de Dados:


Set Banco = Secao.OpenDatabase(Servidor, Usuario/Senha, 0&)

É necessário ter na máquina os arquivos do Oracle Obejects:


-Oraclb45.dll

-Oraclb4d.dll

-Oraclbj.dll

-Oraclbjd.dll

-Oraclm.dll

-Oraclmd.dll

-Oraipsrv.reg (rodar o reg)


Que se encontram nos discos de instalação do Oracle Objects.

58 - Usando a api GetUserName


Enviado por: Guilherme João França Soares

Declare Function GetUserNameA Lib "advapi32.dll" (ByVal lpBuffer As String, nSize As Long) As Long

m$ = Space$(255)

i% = GetUserNameA(m$, Len(m$))

TxtLogin = Left(m$, InStr(m$, Chr(0)) - 1)

59 - Animações
Enviado por: Henrique Angelo

Crie um novo projeto, coloque no Form uma ImageList, coloque as figuras da animação nesta mesma
Imagelist.

Coloque uma PictureBox e um Timer.

Na Propriedade Form_Load() coloque:

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

Na propriedade Timer1_Timer() coloque:


If Picture1.Picture = ImageList1.ListImages(1).Picture Then

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

Exit Sub

End If
If Picture1.Picture = ImageList1.ListImages(2).Picture Then

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

Exit Sub
End If

No Timer1, coloque um intervalo de 100.


williamdsilva@aol.com.br 26

60 - Cursores Animados em VB
Enviado por: Henrique Angelo

Crie um novo projeto, coloque no Form uma ImageList, coloque os ícones e/ou cursores que farão parte da
animação nesta mesma Imagelist. Coloque também um Timer.

Coloque na propriedade do Form:


MousePointer = 99 - Custom

Na Propriedade Form_Load() coloque:


Set Form1.MouseIcon = ImageList1.ListImages(1).Picture

Na propriedade Timer1_Timer() coloque:


If Form1.MouseIcon = ImageList1.ListImages(1).Picture Then

Set Form1.MouseIcon = ImageList1.ListImages(2).Picture

Exit Sub

End If
If Form1.MouseIcon = ImageList1.ListImages(2).Picture Then

Set Form1.MouseIcon = ImageList1.ListImages(1).Picture

Exit Sub

End If

No Timer1, coloque um intervalo de 100.

61 - Descobrir Path do Aplicativo


Enviado por: Mauro Sakamoto

Para descobrir o Path do aplicativo utilize a função App.Path

Ex:
Dim MeuDiretorio

IF Len(App.Path)>3 THEN

MeuDiretorio=App.Path & "\"

ELSE

MeuDiretorio=App.Path 'Se estiver na raiz

END IF

62 - Condições (IIF) em consultas


Enviado por: Mauro Sakamoto

Para testar o conteúdo de um campo e retornar valores diferentes conforme o conteúdo do campo, pode-se
utilizar o comando IIF(condição,se valor1 se verdade ,valor2 se falso ).

Ex:
Se a média do aluno for maior ou igual a 5, escrever aprovado, senão reprovado.
SELECT Nome, Média, IIF(Média>=5,"Aprovado","Reprovado") AS Status FROM Alunos
williamdsilva@aol.com.br 27

63 - Adicionar conteúdo de uma ou mais tabelas em outra


Enviado por: Mauro Sakamoto

Se você tem duas ou mais tabelas com alguns campos em comum e deseja vê-los em uma única tabela,
utilize essa consulta.
Insert into tabela3(campo1, campo2, campo3) _

select campo1, campo2, campo3 _

from tabela1 _

where campo1>valor1 _

union _

select campo1, campo2, campo3 _

from tabela2 _

where campoS1>valor2

E assim sucessivamente.
Caso você não queira armazenar o valor comece no primeiro SELECT (descartando o INSERT)

64 - Como usar BeginTrans, CommitTrans e Rollback


Enviado por: Mauro Sakamoto

Um problema bastante comum é o micro ser desligado acidentalmente ou a energia acabar, no momento
de uma operação com o Banco de Dados (Inserção, Atualização ou Exclusão).
Para evitar isso você pode utilizar os Métodos BeginTrans (inicia a transação) CommitTrans (Confirma a
inserção) e Rollback (volta ao estado inicial).

Ex:
Sub CmdInserir_Click()

On error goto Err_CmdInserir_Click

WorkSpaces(0).BeginTrans

' executa comandos de (inserção,exclusão ou atualização)

WorkSpaces(0).CommitTrans

Exit_CmdInserir_Click:

Exit Sub

Err_CmdInserir_Click:

MsgBox Error%

WorkSpaces(0).Rollback

Resume Exit_CmdInserir_Click

End Sub

65 - Atualizar conteúdo de ComboBox conforme string digitada


Enviado por: Mauro Sakamoto

Caso você tenha um ComboBox que liste o conteúdo de um campo da tabela e deseja que ao digitar a letra
"a" o combo mostre todos os nomes iniciados por "a" escreva o código no evento DropDown.
Sub CmbNome_DropDown()

Dim MyDB As Database

Dim MyNome As SnapShot


williamdsilva@aol.com.br 28

MySQL$ = "Select Nome from Clientes Where Nome like " Chr(39) & CmbNome.Text & Chr(42) & Chr(39)
'seleciona os nomes

Set MyDB=OpenDataBase("Table.mdb") 'Abre o BD

Set MyNome=MyDB.CreateSnapShot(MySQL$) 'Cria um snapshot

CmbNome.Text = "" 'limpa o texto no combo

CmbNome.Clear 'limpa o conteúdo do combo

If Not MyNome.NoMatch And MyNome.RecordCount>0 then 'verifica se existe nomes

MyNome.MoveLast

Total&=MyNome.RecordCount 'pega o total de nomes

MyNome.First

For i&=1 to Total 'atualiza o combo

If Not Isnull(MyNome("Nome")) then

CmbNome.AddItem(MyNome("Nome"))

CmbNome.MoveNext

End If

Next i&

End if

End sub

66 - Como chamar um arquivo de HELP para sua aplicação


Enviado por: Mauro Sakamoto

Supondo que você já tenha um arquivo de help para sua aplicação, você pode chamá-lo utilizando a função
API WinHelp.
Para isso vá crie um modulo (.bas) e declare as seguintes constantes e funções:
Const Help_File = "File.hlp"

Const Help_Index = &H3

Const Help_Context = &H1

Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, ByVal lpHelpFile As String,
ByVal wCommand As Long, ByVal dwData As Long) As Long

Em seguida vá até o controle em que você deseja chamar o help e digite:


WinHelp hwnd, Help_File, Help_Context, 20

O Primeiro valor hwnd , se refere ao Handle da Janela e deve ser passado como hwnd mesmo. O segundo é
o nome de seu arquivo hlp.
O terceiro parâmetro pode ser utilizado ou para abrir o Help_Index (help padrão do windows, independente
do valor em Help_File) ou Help_Context (que abrirá o arquivo especificado em Help_File).
Já o quarto parâmetro só terá efeito quando o terceiro parâmetro for Help_Context. Esse parâmetro se
refere ao valor do tópico definido em seu arquivo de help (funciona como se fosse um link - abre o aquivo
no tópico escolhido).

Além do Help_Context e Help_Index existem outros parâmetros que podem ser passados. Porém os mais
comuns são esses dois.

67 - Fazer de forma simples um botão do tipo do VB5


Enviado por: Mauro Sakamoto
williamdsilva@aol.com.br 29

Para fazer isso você deve inserir um SSPanel (que vem com o Sheridan 3D).
Em seguida defina a propriedade BevelWidth=0 e retire o caption. Insira uma picture em cima do seu
SSPanel mudando a propriedade apparence para 0-flat e BorderStyle para 0-None.
No evento MouseMove do seu SSPanel e de seu Picture faça:
Sub Picture_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

SSPanel.BevelWidth=1

End Sub

Sub SSPanel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

SSPanel.BevelWidth=1

End Sub

Agora no evento MouseMove do Formulário faça o inverso


Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

SSPanel.BevelWidth=0

End Sub

Dessa forma quando o mouse for posicionado em cima do "botão", este automaticamente ficará em 3D e
quando for movido para fora, ficará chapado.
É possível também trocar a picture, dando um efeito tipo Internet Explorer 4.

68 - Reproduzir um vídeo com MMControl


Enviado por: Mauro Sakamoto

Para reproduzir um vídeo em um formulário, é conveniente antes de mais nada declarar um picture box
onde ele será executado. Em seguida insira um MMControl.

Para reproduzir o avi faça:


MMControl1.Command = "close"

MMControl1.DeviceType = "avivideo"

MMControl1.hWndDisplay = Picture1.hWnd

MMControl1.filename = "File.avi"

MMControl1.Command = "open"

MMControl1.Command = "prev"

MMControl1.Command = "play"

69 - Reproduzir um arquivo wav ou mid


Enviado por: Mauro Sakamoto

Para reporduzir um arquivo de som com do tipo wa ou mid, você precisa utilizar o MMControl.

Ex:
MMControl1.Command = "close"

MMControl1.DeviceType = "WaveAudio"

MMControl1.filename = "File.wav"

MMControl1.Command = "open"
williamdsilva@aol.com.br 30

MMControl1.Command = "prev"

MMControl1.Command = "play"

Se for um arquivo do tipo mid mude a propriedade DeviceType para "sequencer"

Ex:
MMControl1.Command = "close"

MMControl1.DeviceType = "Sequencer"

MMControl1.filename = "File.wav"

MMControl1.Command = "open"

MMControl1.Command = "prev"

MMControl1.Command = "play

70 - Trocar vírgula por ponto em um valor digitado


Enviado por: Mauro Sakamoto

Function trocavírgulaporponto(NúmeroTexto)

Dim Posição, Tamanho

Dim MidWord, Msg, TstStr, SpcPos1, SpcPos2 ' Declaração de variáveis

Tamanho = Len(Trim(NúmeroTexto))

Posição1 = InStr(1, NúmeroTexto, ",") 'Acha a vírgula


If Posição1 <> 0 Then

Posição1 = Posição1 - 1

posição2 = Posição1 + 2 ' Encontra próximo espaço.

trocavírgulaporponto = Mid(NúmeroTexto, 1, Posição1) + "." + Mid(NúmeroTexto, posição2)

Else

trocavírgulaporponto = NúmeroTexto

End If

End Function

71 - Como evitar entrar duas vezes


Enviado por: Felipe Maion Garcia
Já estou no ar?

Algumas aplicações para Windows podem ter várias instâncias, ou seja, podem ser executadas repetidas
vezes ao mesmo tempo no mesmo computador. É o caso do Bloco de Notas, do Paint, da Calculadora e de
outros. Existem programas cuja múltipla execução não é interessante, por questões de produtividade ao
usuário (como o Word, o File Manager e o Excel) ou segurança (como aplicações que usam banco de
dados). Os sistemas comerciais (de banco de dados), em geral, só podem ser executados em uma sessão
ao mesmo tempo. O controle disto no VB é feito através do objeto App.

Dim SaveTitle as string

If App.PrevInstance Then
williamdsilva@aol.com.br 31

SaveTitle = App.Title

App.Title = "... segunda chamada ao mesmo programa."

Me.Caption = "... segunda chamada ao mesmo programa, serei fechado"

'se for a Sub Main, a linha acima, obviamente, não existe

'as linhas abaixo fecham a segunda chamada e alternam para

'a primeira

AppActivate SaveTitle

SendKeys "% R", True

End

End If

O código acima deve ser a primeira coisa a ser executada na sua aplicação. Assim, ao invés de abrir uma
segunda sessão do programa, o Windows irá alternar para a sessão já aberta. Isto também pode ser feito
por APIs (FindWindow, ShowWindow e SetFocus, da bilblioteca User), mas, tem o mesmo efeito e é mais
trabalhoso.

72 - Como evitar o bug do ano 2000


Enviado por: Felipe Maion Garcia

Dim Pdata As Date

Dim Intervalo As String

Dim Qdias As Integer

Intervalo = "d" ' "d" Especifica o dia

Pdata = turini 'data de entrega

Qdias = (Val(TextCarga / 4)) ' - 1 'Quantidade de dias para a soma)

turini.Tag = Format(turini, "w") ' verifica o dia da semana do início do curso

If Val(turini.Tag) = 5 And Qdias > 9 Then Qdias = Qdias + 2

If Val(turini.Tag) = 5 And Qdias = 4 Or Qdias = 5 Then Qdias = Qdias + 1

If Val(turini.Tag) = 4 And Qdias > 9 Then Qdias = Qdias + 3

If Val(turini.Tag) = 4 And Qdias = 4 Or Qdias = 5 Then Qdias = Qdias + 1

If Val(turini.Tag) = 3 And Qdias > 5 Then Qdias = Qdias + 3

If Val(turini.Tag) = 3 And Qdias < 5 Then Qdias = Qdias - 1

If Val(turini.Tag) = 2 And Qdias > 9 Then Qdias = Qdias + 1

turter = DateAdd(Intervalo, Qdias, Pdata)


williamdsilva@aol.com.br 32

73 - Menu PopUp
Enviado por: Felipe Maion Garcia

Crie um menu normal com o caption de "Popup Menu" e o name "mnufile", desmarque a opção "Visible",
agora crie dois submenus do "Popup Menu" o primeiro com o caption que vc quiser e o name "mnusub1" e
o segundo também com o caption que vc quiser e com o name "mnusub2",ATENÇÃO: os dois submenus
são visible true. agora crie o código para que quando o usuario clicar no formulario aparecer o popup:
Private Sub Form_MouseDown(Button As Integer, Shift As _

Integer, X As Single, Y As Single)

If Button = 2 Then PopupMenu mnufile 'Mostra o menu popup _


'se o botão direito for clicado

End Sub

74 - Conexão Dial-Up
Enviado por: Felipe Maion Garcia

Private Sub AbrirDialUp(Conexão as String)

Dim X

X = Shell("C:\Windows\rundll32.exe rnaui.dll,RnaDial " & Conexão, 1)

AppActivate X

SendKeys "{enter}"

DoEvents

End Sub

Ex.:
call AbrirDialUp ("Infolink") 'onde no lugar de Infolink _

'você vai utilizar o nome de sua conexão

75 - Como pegar o nome do computador


Enviado por: Felipe Maion Garcia
No módulo você coloca:
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal sBuffer As
String, lSize As Long) As Long

A função GetComputerName requer dois argumentos. O primeiro argumento, sBuffer, é o buffer que irá
armazenar o nome do computador depois que a função é executada. O tamanho do buffer deve ser grande
o suficiente para que o nome inteiro caiba nele. O segundo argumento, lSize, deve ser inicializado com o
tamanho de sBuffer.

Depois de ter executado a função GetComputerName, a variável lSize conterá o número de caracteres
(contador) armazenados na string sBuffer. Este valor de contagem não inclui o caractere terminador NULL.

Ainda no módulo você coloca:


Public Function NameOfPC(MachineName As String) As Long

Dim NameSize As Long

Dim X As Long

MachineName = Space$(16)

NameSize = Len(MachineName)
williamdsilva@aol.com.br 33

X = GetComputerName(MachineName, NameSize)

End Function

Exemplo de um procedimento:
Private Sub Command1_Click()

Dim PCName As String

Dim P As Long

P = NameOfPC(PCName)

text1.Text = PCName

End Sub

76 - Placa de som?
Enviado por: Felipe Maion Garcia
Como detectar se um computador tem uma placa de som ?

Para realizar tal tarefa, você deverá utilizar a função API waveOutGetNumDevs(). Esta função retorna o
número de devices capazes de tocar sons. Porém, antes de usá-la, declare-a em um módulo de código. Ai
vai a declaração :
Declare Function waveOutGetNumDevs lib "MMSYSTEM" () as integer

Então, crie a função Ver_audio(), escrevendo o seguinte código :


Function Ver_Audio() as string

dim i as integer

i = waveOutGetNumDevs()

if i > 0 then

Ver_Audio = "Sistema capaz de tocar sons"

else

Ver_Audio = "Sistema incapaz de tocar sons"

end if

end function

77 - Arquivos INI
Enviado por: Felipe Maion Garcia
Código - Funções para escrever e ler em arquivos .INI pessoais.

Estas funções (Get_ini e Write_ini) devem ser colocadas em um módulo (.BAS). Troque nome_do_arquivo.ini
pelo nome do seu arquivo .INI pessoal. não esqueça de incluir o caminho completo!

A função get_ini serve para ler em arquivos .INI. Porém, para utiliza-la, é necessário declarar a função
GetPrivateProfileString, na seção de declarações (declarations) de seu módulo. A declaração é a seguinte
( escreva apenas em uma linha ):
Declare Function GetPrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, lpKeyName As Any,
ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As
String) As Integer

Aqui vai o código da função get_ini :


Function get_ini (seção$, chave$) As String

arquiv$ = nome_do_arquivo.ini
williamdsilva@aol.com.br 34

Returns$ = Space$(128)

x% = GetPrivateProfileString(ByVal seção$, ByVal chave$, "Nenhum valor lido", Returns$, Len(Returns$),


ByVal arquiv$)

get_ini = Left$(Returns$, x%)

End Function

A função write_ini serve para escrever informações em um arquivo .INI. Antes de usá-la. declare a função
WritePrivateProfileString na seção "Declarations" de seu módulo.
Declare Function WritePrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, lpKeyName As
Any, lpString As Any, ByVal lplFileName As String) As Integer

Feito isso, escreva :


Function write_ini (ByVal section$, ByVal chv$, ByVal variavel$) As String

arquiv$ = nome_de_arquivo.ini

iRet = WritePrivateProfileString(ByVal section$, ByVal chv$, ByVal variavel$, ByVal arquiv$)

End Function

78 - Tecla tab como enter


Enviado por: Felipe Maion Garcia
Como capturar a tecla TAB nos eventos KeyDown e KeyPress?

Os eventos KeyDown ou KeyPress não estão disparando em resposta a tecla TAB, mesmo com a
propriedade KeyPreview=True. Existe alguma coisa que pode ser feita?

Colocando o propriedade KeyPreview para True, é possível capturar a tecla TAB no evento KeyPress do
formulário, SOMENTE quando não existem controles, OU quando um único controle recebe o focu no
formulário OU, quando a propriedade TabStop é colocada para False para todos os controles no formulário.
Quando existir mais de um controle no formulário, o VB irá capturar a mensagem e mover o focu para o
próximo controle de acordo com a propriedade TabOrder, e o evento KeyPress não será disparado. O
mesmo se aplica para os eventos KeyDown e KeyUp.

No entanto, existe uma forma de saber se a tecla TAB foi pressionada ou não, usando uma API do Windows.
Use a função API GetAsyncKeyState em um controle Timer. Apesar de você conseguir saber quando a tecla
TAB foi pressionada, você não conseguirá evitar que o comportamento padrão ocorra (mover para o
próximo controle). Veja o código abaixo:
' Em um arquivo .BAS

Declare Function GetAsyncKeyState% Lib "User" (ByVal vKey%)

Global Const KEY_TAB = &H9

' Adicione este código no evento Timer no controle Timer (interval=1).

retn% = GetAsyncKeyState(KEY_TAB)

' o último bit menos significativo será 1 quando a tecla TAB for pressionada

retn% = retn% And 1

If retn% = 1 Then print "Tecla TAB foi pressionada"

79 - Macro
Enviado por: Felipe Maion Garcia
O Visual Basic tem macro substituição como o Clipper ?

Macro substituição é um operador, como o operador "&" do Clipper. Em Clipper você pode fazer o seguinte:
Test := "good morning"

? "Hello, &Test"

O resultado do print será "Hello, good morning". Isto pode ser feito no Visual Basic?
williamdsilva@aol.com.br 35

Infelizmente, este recurso não está disponível em VB. O melhor que pode ser feito neste caso, é escrever
uma função que receba alguns nomes de variáveis e devolva o valor associado destas variáveis. Esta
função terá um Select Case com o nome da variável passado por parametro e em cada caso (Case) uma
apropriada variável é acessada.

Veja o código abaixo:


'Na seção general

Dim Test1, Test2

Function MyMacroOperator (given$)

Select Case given

Case "Test1": MyMacroOperator = Test1: Exit Function

Case "Test2": MyMacroOperator = Test2: Exit Function

' e assim com todas as variáveis

Case Else ' Precisa conter alguma outra coisa.

MyMacroOperator = 0 ' valor inválido

End Select

End Function
Sub Form_Click () ' Para testar a função MyMacroOperator

Test1 = "good morning"

Test2 = "bad morning"

MsgBox ("Hello " & MyMacroOperator("Test1"))

MsgBox ("Hello " & MyMacroOperator("Test2"))

End Sub

80 - Message Box 1
Enviado por: Felipe Maion Garcia
Como criar um MsgBox (Message Box) que não seja modal ?

A função MsgBox do Visual Basic não contempla esta opção. Porém, é possível fazer usando a função API
MessageBox. Declare e chame a API como segue (código VB 3.0):
Declare Function MessageBox% Lib "User" (ByVal hWnd%, ByVal lpText$, _

ByVal lpCaption$, ByVal wType%)

Const MB_OKCANCEL = &H1

Dim ret%

ret = MessageBox(0, "I am a Modeless MessageBox", "Modeless MessageBox " _

, MB_OKCANCEL)
Obs.: É possível também criar um formulário com as mesmas características de um MessageBox e exibí-lo
de forma não modal.

81 - FRX
Enviado por: Felipe Maion Garcia
O Visual Basic grava os forms nos formatos: Binário (padrão) or ASCII.

Quando o desenvolvedor escolhe o formato ASCII (Marcando a opção "Save as Text" na janela "Save File
As"; ou no menu "Options", "Environment", marque "Default Save As Format = Text"), o VB então grava os
arquivos no formato ASCII. No entanto, alguns controles tem propriedades cuja informação é binária (Por
exemplo: propriedade Picture de um PictureBox). O VB grava todas estas informações binárias do
williamdsilva@aol.com.br 36

formulário, em um arquivo binário, separado do arquivo ASCII. Estes arquivos são armazenados no mesmo
diretório que os arquivos .FRM, e com o mesmo nome, mas com a extensão FRX.

O VB lê estes arquivos enquanto os arquivos no formato ASCII são carregados. Se um projeto é gravado no
formato ASCII; logo todo o formulário que tiver informações binárias, deverá ser acompanhado de um
arquivo FRX correspondente

82 - Resolução
Enviado por: Felipe Maion Garcia
Eu preciso obter a resolução da tela, onde a minha aplicação está rodando por várias razões, por exemplo
ajustar o tamanho de alguns controles em run-time.

Você pode utilizar algumas propriedades do objeto Screen para calcular a resolução da tela. Veja o
seguinte código (VB 3.0):
Dim xTwips%, yTwips%, xPixels#, YPixels#

xTwips = Screen.TwipsPerPixelX

yTwips = Screen.TwipsPerPixelY

YPixels = Screen.Height / yTwips

xPixels = Screen.Width / xTwips

Print "A Resolução é : " & Str$(xPixels) + " por " + Str$(YPixels)

83 - SQL
Enviado por: Felipe Maion Garcia

A linguagem SQL(Structured Query Language) é uma linguagem de alto nível para manipulação de dados
dentro do modelo relacional. Seu objetivo é fornecer uma interface de alto nível ao usuário. É uma
linguagem não procedural, e, não cabe ao usuário definir como o gerenciador de banco de dados
executará uma tarefa, mas somente o ele que deve fazer.
Uma instrução SQL consiste em três partes:
As declarações de parâmetros
A instrução manipulativa
As declarações de opções
Para termos uma idéia do seu poder, imagine que temos que atualizar o campo valor em 10% de uma
tabela com diversos registros. Na abordagem procedural teriamos os seguintes passoa a seguir:

1. Abrir a tabela

2. Posicionar o ponteiro no início da tabela

3. Atualizar o campo valor em 10%

4. Atualizar tabela

5. Movermos o ponteiro para o próximo registro

6. Continuar a atualização do campo valor até o final da tabela

O código poderia Ter o seguinte aspecto:


Dim db as database

Dim tabela as recordset

set db=workspaces(0).Opendatabase("c:\base.mdb")

set tabela=db.Openrecordset("tabela")

While not tabela.eof

Tabela.edit

Tabela.valor=tabela.valor*1.10

Tabela.update
williamdsilva@aol.com.br 37

Tabela.movenext

Wend

Tabela.close

Agora utilizando uma instrução SQL teriamos o seguinte código:


Dim db as Database

Set db=Workspaces(0).Opendatabase("c:\base.mdb")

Db.execute "UPDATE tabela SET valor=valor*1.10"

Db.close

Observe a utilização da instrução UPDATE, bem mais simples, não é?

Vejamos abaixo as cláusulas manipulativas e suas finalidades:

Instrução
SELECT - Obtém um grupo de registros e insere os registros em um dynaset ou em uma tabela
UPDATE - Define os valores dos campos de uma tabela em uma atualização
TRANSFORM - Cria uma tabela de resumo, utilizando o conteúdo de um campo como cabeçalho de cada
coluna
DELETE FROM - Remove registros de uma tabela
INSERT INTO - Acrescenta um grupo de registros a uma tabela.

Vejamos alguns exemplos da instrução SELECT:

1. Seleciona os campos "Primeiro nome" e "Sobrenome" de todos os registros da tabela Empregados.


SELECT [Primeiro nome],[Sobrenome] FROM Empregados

2. Seleciona todos os campos da tabela Empregados. Note o uso do parâmetro (*) indicando todos os
campos da tabela indicada.
SELECT Empregados.* FROM Empregados

3. Conta o número de registros que têm uma entrada no campo "Código postal" e coloca o título contagem
no topo da coluna.
SELECT Count([Código postal]) AS Contagem FROM Clientes

4. Seleciona os campos "Primeiro nome" e "Sobrenome" de cada registro cujo sobrenome seja Pereira.
SELECT [Primeiro nome],[Sobrenome] FROM Empregados WHERE [Sobrenome]='Pereira'

5. Seleciona os campos "Primeiro nome" e "Sobrenome" para Empregados cujos sobrenomes começam
pela letra S.
SELECT [Primeiro nome],[Sobrenome] FROM Empregados WHERE [Sobrenome] Like 'S*'

FROM - Indica as tabelas utilizadas como fonte de dados


WHERE - Especifica as condições que os registros devem satisfazer para compor o subconjunto de
dados.

84 - Copia o arquivo especificado


Enviado por: Felipe Maion Garcia
Copia o arquivo especificado.
Sintaxe: FileCopy

Exemplo:
Public Function MoveArquivo(Origem As String, Destino As String) As Boolean

On Error GoTo ErroMovendoArquivo

FileCopy Origem, Destino

Kill Origem
williamdsilva@aol.com.br 38

MoveArquivo = True

Exit Function

ErroMovendoArquivo:

MoveArquivo = False

Exit Function

End Funciotn

85 - Form circular
Enviado por: Felipe Maion Garcia

Adicione nas declarações da form:


Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As _

Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd _

As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Agora no form load:


Dim hr&, dl&

Dim usew&, useh&

usew& = me.Width / Screen.TwipsPerPixelX

useh& = me.Height / Screen.TwipsPerPixelY

x=0

hr& = CreateEllipticRgn(0, 0, usew, useh) 'Faz a _

'forma da janela numa forma de um círculo descrito por x1,y1,x2,y2

dl& = SetWindowRgn(me.hWnd, hr, True)

Obs.: mude o nome "Screen" para o nome do seu formulário

86 - Centralizando forms
Enviado por: Felipe Maion Garcia

Centralizar forms é muito útil, além de ser muito fácil e com pouca codificação. Coloque o seguinte código
no evento Form_Load () do form que você quiser centralizar:
Left = (Screen.Width - Width) \ 2

Top = (Screen.Height - Height) \ 2

87 - Bitmap
Enviado por: Felipe Maion Garcia

Você pode utilizar o controle PictureBox com a propriedade AutoSize=True. Carregue o bitmap no
PictureBox, usando a função LoadPicture. O controle irá ajustar o seu tamanho automaticamente, para que
o bitmap caiba nele. As propriedades Height e Width deste controle contém as dimensões do bitmap. Note
que os valores destas propriedades estão em Twips.
williamdsilva@aol.com.br 39

Uma outra forma, é utilizar a API GetObject. Esta função retorna a estrutura do Bitmap em dois membros,
bmWidth e bmHeight representando as dimensões do bitmap em pixels. Veja o exemplo abaixo:

Coloque o seguinte código em um arquivo .BAS


Type BITMAP '14 bytes

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%, ByVal nCount% , lpObject As
Any)

Coloque o seguinte código aonde você quer obter as dimensões do bitmap. (O Bitmap deve ser carregado
em um PictureBox chamado Picture1):
Dim bmp As BITMAP, ret%
ret = GetObjectAPI(picture1.Picture, Len(bmp), bmp)

Print "width = " + Str$(bmp.bmwidth) + ", height = " + Str$(bmp.bmheight)

88 - Como criar um banco de dados Access, contendo tabelas e índices (index)


Enviado por: Felipe Maion Garcia

1. Criando o banco de dados

A criação de um banco de dados é relativamente simples :


CHDRIVE App.Path

CHDIR App.Path

dim db as database

CONST DB_LANG_GENERAL = ";LANGID=0x0809;CP=1252;COUNTRY=0"

SET db = CREATEDATABASE("banco.mdb", DB_LANG_GENERAL)

2. Criando uma tabela

Uma tabela contém vários campos, com várias propriedades. Então, para cada campo, deve-se atribuir
valores a estas propriedades, assim como se você fosse criar um campo em uma tabela usando o Data
Manager, que vem com o VB: Neste exemplo, a tabela conterá dois campos : NOME e IDADE. Veja o código
a seguir :
CONST DB_TEXT = 10

CONST DB_INTEGER = 3

Dim db as database

Dim tb as New TableDef

Dim campo1 as New field

Dim campo2 as New field

set db = OpenDatabase("banco.mdb")

tb.name = "Tabela"

campo1.Name = "NOME"
williamdsilva@aol.com.br 40

campo1.Type = DB_TEXT

campo1.Size = 60

campo2.Name = "IDADE"

campo2.Type = DB_INTEGER

tb.Fields.Append campo1

tb.Fields.Append campo2

db.TableDefs.Append tb

tb.close

set tb = nothing

db.close

set db = nothing

3 - Criando Índices

Índices são muito úteis em rotinas de procura de dados em tabelas. Além de serem mais rápidos, eles
requerem menos código para realizar estas buscas. Veja como criar um índice de um campo em uma
tabela já existente:
Dim index1 as New Index

Dim index2 as New Index

Dim db as database

Dim tb as table
set db = OpenDatabase("banco.mdb")

set tb = db.OpenTable("tabela")

index1.name = "nome"

index1.fields = "NOME"

index1.unique = true

index1.primary = true

index1.name = "idade"

index2.fields = "IDADE"

index2.unique = false

index2.primary = false

tb.Indexes.Append index1

tb.Indexes.Append index2

tb.close

set tb = nothing

db.close

set db = nothing
williamdsilva@aol.com.br 41

89 - BeginTrans e CommitTrans
Enviado por: Felipe Maion Garcia

Use os comandos BeginTrans e CommitTrans para aumentar a velocidade de operações com banco de
dados. O começo de uma transação (operação de atualização de banco de dados) deve ser marcado com o
comando BeginTrans e o fim de uma transação, com CommitTrans. A aumento de velocidade se dá porque
estas transações se dão sem acesso ao disco toda vez que há um comando para atualizar o banco de
dados (o método update). Ao invés disso, as mudanças são armazenadas na memória, até que há o
comando CommitTrans, que é quando ocorre a gravação dos dados no disco. Assim, só há acesso ao disco
uma vez. Observe o exemplo de como se usa estes comandos.
Dim db as database

dim tb as table

set db = OpenDatabase("data_base.mdb")

set tb = db.OpenTable("table")

BeginTrans

for a = 1 to 10

tb.addnew

tb!numero = "número" & a

tb.update

next a

CommitTrans 'as informações serão atualizadas aqui!

tb.close

set tb = nothing 'libera a memória alocada pela tabela

db.close

set db = nothing 'libera a memória alocada pelo banco de dados

90 - Porque o Visual Basic não faz contas corretas com ponto fluante?
Enviado por: Felipe Maion Garcia
Alguém já notou que o Visual Basic não é muito bom em matemática? Tente fazer 18.51 + (-17.59) e você
irá receber .9200000000000002.

Isso ocorre, porque no Visual Basic, os valores com ponto flutuante são armazenados no formato padrão
IEEE. A representação da máquina sobre valores numéricos é em binário. Qualquer valor inteiro pode ser
representado "EXATAMENTE" na forma binária. Mas nos casos de valores com ponto flutuante, isso não é
verdade.

Por exemplo, o decimal 0.0001 não pode ser representado exatamente em binário (0.0001 é uma fração
repetitiva com um período de 104 bits!). Então, os valores com ponto flutuante são aproximados para o
próximo valor que pode ser representado em binário. Logo, eles tendem a causar algum erro nos calculos
quando são utilizados. No nosso exemplo, ambos 18.51 e 17.59 não podem ser representados exatamente
pelo padrão de ponto flutuante. A soma deles incluirá um pequeno erro. 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.

Para exibir o resultado exato para o usuário, faça o seguinte:


Format$(18.51 + (-17.59), "###.#####")
williamdsilva@aol.com.br 42

91 - Banco de dados
Enviado por: Felipe Maion Garcia

Podemos entender por banco de dados qualquer sistema que reúna e mantenha organizada uma série de
informações relacionadas a um determinado assunto em uma determinada ordem.

A lista telefônica é um exemplo, nela percebemos que todos os dados referentes a uma pessoa estão na
mesma linha, a isso chamamos registros.

O tipo ou categoria da informação (nome,telefone,etc.) sobre uma pessoa está separada em colunas, as
quais chamamos campos.

Um Sistema Gerenciador de banco de dados relacionais(SGBDR) é usado para armazenar as informações


de uma forma que permita às pessoas examiná-las de diversas maneiras.

O Gerenciador relacional de banco de dados do Visual Basic e do Access é o Microsoft Jet, ele pertence a
uma categoria diferente dos Gerenciadores tradicionais, como o Dbase e o Paradox, pois possuem
características em comum com os banco de dados cliente-servidor. Tais características comuns são:
Todas as tabelas, indíces, consultas, relatórios e código são armazenados num único arquivo .MDB
Os campos de data suportam informação de hora.
Admite o armazenamento permanente de comandos SQL.
É possível forçar a integridade referencial entre as tabelas.
Os campos suportam valores nulos (Null).
No Dbase/Clipper banco de dados significa um arquivo que contém a estrutura de dados(campos) e os
dados (Arquivo padrão DBF). Para o padrão MDB este conjunto de dados e sua estrutura denomina-se
Tabela.

Portanto aquilo que o Dbase/Clipper considera um banco de dados o Access e o Visual Basic considera
como uma Tabela.

Para o Access e o Visual Basic todos os componentes do sistema estão em um único arquivo com extensão
MDB, a este "pacote" consideramos o banco de dados.

Logo quando abrimos um arquivo MDB temos acesso a todos os componentes do sistema: tabelas,
consultas, macros, relatórios, etc. A esses componentes chamamos objetos do sistema.

92 - Mudar cor do texto conforme resultado


Enviado por: Mauro Sakamoto

Supondo que você esteja tirando uma listagem de alunos. Se a média for menor que 5 imprima em
vermelho reprovado,
senão imprima em preto aprovado. Para fazer isso utilize dois campos fórmula sobrepostos.
No primeiro dê o nome de aprovado e insira o seguinte código:
IF({Tabela.Média}>=5) THEN

"Aprovado"

No segundo faça:
IF({Tabela.Média}<5) THEN

"Reprovado"

Em seguida formate o segundo para vermelho (clique com o botão direito do mouse e escolha change
Font. Escolha a cor Veremlho).
Está pronto quando o valor média da tabela for maior que cinco aparecerá no relatório em preto a palavra
aprovado, caso contrário aparecerá em vermelho reprovado.

93 - Enviando texto para barra de status


Enviado por: Mauro Sakamoto

Suponha que você tenha uma aplicação e ao passar por um botão, você queira que emita uma mensagem
na barra de status.
Para isso primeiramente vá até o menu Project-Componentes e Selecione Microsoft Windows Common
Controls 5.0 (para o vb 5.0)
Em seguida escolha o controle StatusBar. Clicando com o botão direito do mouse é possível personalizado
(Número de paineis, mostrar data, hora, Status do Coaps Lock e Num Lock, etc).
Deixe o segundo painel é o destinado para a mensagem.
williamdsilva@aol.com.br 43

Uma vez personalizada a barra de status vá até o seu botão e insira os seguintes códigos no evento
MouseMove
Sub CmbBotao_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

StatusBar1.Panels(1).Text="Texto desejado" 'inicia no zero

End Sub

Agora vá até o evento MouseMove do seu Form e faça


StatusBar1.Panels(1).Text="" 'inicia no zero

94 - Retornar para formulário valor selecionado no DBGrid


Enviado por: Mauro Sakamoto

Supondo que vc tenha um formulário "Form1" (sem DataControl) e um botão que chama um outro
formulário "Fomr2" que possue um DBGrid.
Esse DBGRid é utilizado para pesquisa, ou seja ao selecionar um registro no DBGrid, quero que ao sair do
"Form2" esse valor seja exibido no "Form1".
Para fazer isso utilize os seguintes códigos no evento Click do botão retornar.
Dim MyDB As Database

Dim MySet As RecordSet 'declaração de variáveis

Set MyDB=OpenDatabase("File.mdb") 'abre o banco de dados

Set MySet=MyDB.OpenRecordSet("MyTable") 'abre a tabela

MySet.Index = "PrimaryKey" 'busca pelo campo chave

MySet.Seek "=",DBGrid.Columns(0).CellValue(DBGrid.GetBookMark(0)) 'valor a ser encontrado

Form1.TxtCampo1.Text=MySet("Campo1")

Form1.TxtCampo2.Text=MySet("Campo2")

Form1.TxtCampo3.Text=MySet("Campo3")

Form1.TxtCampo4.Text=MySet("Campo4")

'e assim sucessivamente

Form1.TxtCampoN.Text=MySet("CampoN")

Unload Me

Obs:

Nesse exemplo estou considerando que a minha coluna 0 tem o valor do índice da minha tabela
(Columns(0)).

Já GetBookMark(0) retorna a linha selecionada.

95 - Tenha uma linha 3D entre um menu pulldown e uma barra de ferramentas


Enviado por: Henrique Angelo

Desenhe um 3DPanel com um tamanho (height) de 30. Este tamanho não é fácil de ser desenhado
manualmente.
Apague a Caption, mude o BevelOuter para 1 (inset), border para 1 e Align para Top.
Desenhe a barra de ferramentas e o menu.

96 - Livre-se dos zeros inúteis


Enviado por: Henrique Angelo

Vamos retirar os zeros inúteis da variável mystring (que contém "00030"). Abaixo, um interessante
williamdsilva@aol.com.br 44

caminho para isto.


Mystring = CStr(CInt(mystring))

Outro caminho é:
Mystring = Str(Val(mystring))

97 - Objetos vazios?
Enviado por: Henrique Angelo

Não se pode usar a função IsEmpty para determinar se uma variável-objeto (como Form ou qualquer
controle) possui valor. É possível, entretanto, usar a implementação abaixo para determinar se uma
variável de form (ou outro objeto) está vazia.
If Not frmChild Is Nothing Then

Unload frmChild

End If

98 - Destacando uma linha em um DBGrid


Enviado por: Henrique Angelo

Para destacar uma linha no controle DBGrid, adicione o registro corrente à SellBookmarks Collection:
Private Sub DBGrid_RowColChange _

(LatRow As Variant, ByVal LasRow As Integer)

If Data1.RecordSet.RecordCount Then

DBGrid.SelBookmarks.Add _

Data1.RecordSet.Bookmark

End If

End Sub

99 - Atualizando Bound Controls por uma List Box


Enviado por: Henrique Angelo

Quando você desejar que os Bound Controls (controles associados a dados) sejam atualizados em eventos
de listas ou combos, adicione este código no evento click (ou double-click) da lista ou combo:
Data1.RecordSet.Bookmark = DBCombo1.SelectedItem

Como resultado, seu registro corrente passará a ser o registro com a chave indicada na lista ou combo.
Todos os Bound Controls são atualizados automaticamente. É necessário definir apenas as propriedades
RowSource e ListField. Assim, economiza-se tempo que seria gasto em conversões de dados e atualização
de campos.

100 - Valores de retorno não requeridos


Enviado por: Henrique Angelo

Você não precisa retornar valores em todas as funções. Mas, é uma implementação um pouco perigosa.
Private Sub Form_Load( )

dice
williamdsilva@aol.com.br 45

End Sub
Function dice ( ) As Integer

dice = Int(Rnd * 6) + 1

MsgBox "Esta é uma rotina que não retorna valor"

End Function

101 - Procurando por nulos retornados por chamadas DLL


Enviado por: Henrique Angelo

Após uma chamada a DLL (API), o valor retornado pode conter um nulo. Um dos meios
de eliminar este nulo é procurar o caracter Chr$(0), como neste exemplo.

'yourstring é a string retornada pela API, e pode conter um nulo

Dim CheckForNull as Integer

CheckForNull = Instr(YourString, Chr$(0))

If CheckForNull > 0 then Left$(YourString, CheckForNull - 1)

102 - Como calcular as coordenadas (x,y) de qualquer posição de um círculo


Enviado por: Henrique Angelo
A rotina abaixo (parte da biblioteca CodeBank) calcula as coordenadas de qualquer ponto, medida em
graus, numa circunferência, num círculo ou numa elipse. Como você pode notar, é uma rotina simples,
mas extremamente útil no desenho de gráficos ou movimentação de objetos.
Public Sub DegreesToXY(CenterX as Long, CenterY as Long, _

Degree as Double, RadiusX as Long, RadiusY as Long, _

X as Long, Y as Long)

Dim Convert as Double

Convert = 3.141593 /180 ' PI/180

X = CenterX - (Sin(-Degree * Convert) * RadiusX)

Y = CenterY - (Sin((90 + Degree) * Convert) * RadiusX)

End Sub

103 - Movendo itens em uma list box


Enviado por: Henrique Angelo

Para, através do mouse, mover a localização de um item numa list box, use o código abaixo.
'declarations:

Dim Tmp_Text As String

Dim Old_index As Integer

Dim New_index As Integer

'mouse events:

Sub List1_MouseDown (Button As Integer, _

Shift As Integer, X As Single, Y As Single)

Old_index = List1.ListIndex

Tmp_text = List1.text
williamdsilva@aol.com.br 46

End Sub
Sub List1_MouseUp (Button As Integer, _

Shift As Integer, X As Single, Y As Single)

New_index = List1.ListIndex

If Old_index <> New_index Then

List1.RemoveItem Old_Index

List1.AddItem TmpText, NewIndex

End If

End Sub

104 - Usando SendKeys


Enviado por: Henrique Angelo

A função SendKeys (que simula o aperto de teclas) adiciona ótimos recursos de "intervenção" do
programador na operação do sistema. As teclas podem ser enviadas para um form ou controle (neste caso
o controle deverá ter o foco). A rotina abaixo simplifica o processo.
Sub SendKeyTo (KeyValue as String, cCnt as Control)

If cCnt.Enabled Then cCnt.SetFocus

SendKeys KeyValue

End Sub

105 - Bloqueando funções Copiar e Colar em caixas de texto


Enviado por: Henrique Angelo

As funções Copiar (CTRL+C) e Colar (CTRL+V) estão sempre disponíveis para text boxes, 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 não detecta. No evento KeyPress, 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, valores não constantes na tabela ANSI,

'geram estas combinações. Recurso não documentado

End Sub

106 - Forçando caracteres maiúsculos


Enviado por: Henrique Angelo

Para facilitar a digitação de maiúsculos, independente do pressionamento de CAPS LOCK, converta cada
caracter no evento KeyPress.
Private Sub Form_KeyPress (KeyAscii as Integer)

KeyAscii = Asc(UCase(Chr(KeyAscii)))

End Sub

Para que esta rotina funcione para todos os campos do form, altere a propriedade KeyPreview do mesmo
williamdsilva@aol.com.br 47

para true.

107 - Bloqueando funções Copiar e Colar em caixas de texto


Enviado por: Henrique Angelo

As funções Copiar (CTRL+C) e Colar (CTRL+V) estão sempre disponíveis para text boxes, 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 não detecta. No evento KeyPress, 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, valores não constantes na tabela ANSI,

'geram estas combinações. Recurso não documentado

End Sub

108 - Forms redimensionáveis sem barra de título


Enviado por: Henrique Angelo

Se você alterar as propriedades (de um form) caption = "" e controlbox = false, uma borderstyle = 3
(fixed) irá ser mostrada. Diferente da borderstyle = 0 (none), as propriedades 3D (VB4) são mantidas.
Utilizando borderstyle = 5 (sizable toolwindows, no VB4), você terá um form redimensionável.
É possível (VB3/VB4) alternar o conteúdo da Caption, limpando-a quando conveniente. E não se esqueça
de acrescentar um botão de Fechar (unload) no seu form!

109 - Removendo o move


Enviado por: Henrique Angelo

Em alguns casos, é interessante impedir o usuário de mover um form. No VB isto pode ser implementado
com APIs:
Declare Function GetMenu% Lib "User" (ByVal hWnd%)

Declare Function RemoveMenu% Lib "User" (ByVal hWnd%, ByVal nPosition%, ByVal wFlags%)
'...
Dim Res%

Res = RemoveMenu(GetMenu(Form.hWnd), SC_MOVE, MF_BYPOSITION)

110 - Economize memória com uma picture box


Enviado por: Henrique Angelo

Mudar a propriedade AutoRedraw para true consiste em redesenhar forms rapidamente e desperdiçar
alguma memória. Se seu form é redimensionável, o desperdício pode ser bem maior, pois, o bitmap
persistente criado pelo AutoRedraw é tão grande quanto as dimensões máximas do form para revelar a
saída oculta, quando o usuário maximiza ou minimiza a janela. Se o gráfico a ser redimensionado
(mantido) for pequeno em relação ao form, você economizará memória se utilizar uma picture box com
AutoRedraw = true e BorderStyle = 0, enquanto o AutoRedraw do form será desativado (false).

111 - Programando de forma diferente em tempo de desenho e execução


Enviado por: Henrique Angelo

Este código habilita ou desabilita funções durante o desenho e teste. O código poderá permanecer durante
o desenvolvimento, sem afetar o usuário final. Verifique se o caminho procurado é o caminho do seu
projeto e não o diretório final de sua aplicação.
If InsStr(App.Path, "VB") Then

'execute os processos próprios

'de debug e não de sistema executável


williamdsilva@aol.com.br 48

End IF

Uma variação é:
If InsStr(App.Path, "VB") Then Stop
Você pode inserir este código para depuração (debug); se você esquecer, isto não causará - repetimos -
problemas ao usuário.

112 - Animação
Enviado por: Felipe Maion Garcia

Agora, você dará um grande passo na programação de jogos. Trata-se da Animação de Personagens. Como
já foi dito anteriormente, encontrei muitos desenhos para animações simples no SpriteLib. Infelizmente,
cada um desses arquivos contém todos os movimentos de um determinado personagem; assim, caberá a
vocês recortar cada posição, salvando-a com um novo nome de arquivo. Depois de feito o recorte, abra o
Visual Basic e comece um EXE normal. Coloque, então, um PictureBox, um Timer e um ImageList (VB 4 ou
superior apenas). No ImageList, selecione as imagens que farão parte da animação. Note que para cada
imagem dessa lista há um número. O PictureBox deverá ter sua própriedade "AutoSize" ajustada para
"True", uma vez que é praticamente impossível recortar todas as imagens com o mesmo tamanho. Lembre-
se também de ajustar, ainda no PictureBox, o estilo normal, e não "3D", que é o padrão. Além disso, você
deve tirar a borda do PictureBox e no Form1, programar a propriedade "BackColor" com uma cor preta.
Depois disso, no evento Form1_Load, insira o seguinte código:

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

Esse comando faz com que a figura que aparecerá no PictureBox seja a mesma com o número 1 do
ImageList (o número entre parênteses é o número da imagem na lista). Depois, ajuste o Timer com
"Interval" de 100 milissegundos. No evento Timer1_Timer, coloque:

If Picture1.Picture = ImageList1.ListImages(1).Picture Then

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

Picture1.Top = Picture1.Top + 50

Exit Sub

End If

If Picture1.Picture = ImageList1.ListImages(2).Picture Then

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

Picture1.Top = Picture1.Top + 50

Exit Sub

End If

Apesar de parecerem complexos, esses comandos são simples: a cada 100 milissegundos, o programa irá
checar qual é a imagem da animação e a trocará para outra. Ao mesmo tempo, esses comandos farão com
que o PictureBox se mova para baixo. Como neste exemplo usei imagens de um homem andando para
baixo na tela, a animação conseguiu mesmo passar esta impressão.

113 - Movimento de objeto através do teclado


Enviado por: Felipe Maion Garcia

Movimentando Objetos Através do Teclado


Isso é simples, apesar de não parecer. Suponhamos que você tenha uma forma (Shape1) em
seu projeto, e quer movê-la pela tela usando as setas do teclado. Crie um relógio (Timer1). No
General_Declarations, digite:
Dim Baixo As Integer

Dim Cima As Integer

Dim Direita As Integer

Dim Esquerda As Integer


williamdsilva@aol.com.br 49

O código acima foi utilizado para declarar as variáveis Baixo, Cima, Direita e Esquerda. Você
pode alterar o nome das variáveis aqui, mas lembre-se de mudar também TODAS as
referências a estas variáveis pelas condições novas. Agora, no evento Form_KeyDown, digite:
If (KeyCode = vbKeyLeft) Then

Esquerda = True

End If

If (KeyCode = vbKeyRight) Then

Direita = True

End If

If (KeyCode = vbKeyUp) Then

Cima = True

End If

If (KeyCode = vbKeyDown) Then

Baixo = True

End If

Este código programa as setas para interagirem com as variáveis declaradas acima. Logo
depois, no evento Form_KeyUp, digite:
If (KeyCode = vbKeyLeft) Then

Esquerda = False

End If

If (KeyCode = vbKeyRight) Then

Direita = False

End If

If (KeyCode = vbKeyUp) Then

Cima = False

End If

If (KeyCode = vbKeyDown) Then

Baixo = False

End If

Repare que este código foi bem parecido com Form_KeyDown. Agora, no evento
Timer1_Timer, digite:
If Esquerda = True Then

Shape1.Left = Shape1.Left - 30

End If

If Direita = True Then

Shape1.Left = Shape1.Left + 30

End If

If Cima = True Then

7Shape1.Top = Shape1.Top - 30

End If
williamdsilva@aol.com.br 50

If Baixo = True Then

Shape1.Top = Shape1.Top + 30

End If

Repare que a propriedade Interval do objeto Timer1 deve estar ajustada para 1. Agora, basta
executar o jogo e ver o funcionamento deste código. NOTA: em todos os lugares onde há algo
como "...Top+30" ou ..."Top-30" ou "...Left+30" ou "...Left-30", você pode mudar o número "30"
de acordo com a velocidade do Shape1. Quanto menor o número, menor a velocidade, e
quanto maior o número, maior a velocidade. Porém, se você aumentar demais a velocidade,
passa a perder muito na suavidade dos movimentos. Preferimos usar 30.

114 - Efeitos sonoros


Enviado por: Felipe Maion Garcia

Também é possível, além de usar os fundos musicais (MID), usar efeitos sonoros (WAV) sem
que seja necessário interromper a música de fundo, porém enquanto este efeito sonoro toca, os comandos
do jogo "travam" até que ele acabe. O código abaixo se refere ao seguinte
exemplo: você quer que, quando o jogo seja fechado, o efeito sonoro "Repique.wav" seja
tocado. Para que isso seja possível, insira este código em um Módulo de seu projeto:

Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String,
ByVal uFlags As Long) As Long

Repare que todo este código deve ser colocado em uma única linha. Depois disso, no evento
Form_Unload, referente ao momento em que o jogo é fechado, coloque o seguinte código:

result = sndPlaySound("C:\Windows\Repique.wav", SND_ASYNC Or SND_NODEFAULT)

PRONTO! Isso é tudo que um jogo precisa para tocar efeitos sonoros. NOTA: você pode
mesclar os tópicos 01 e 02 para ter uma música de fundo e efeitos sonoros ao mesmo tempo,
e o melhor, você não perde velocidade com isso. OBS: Se você estiver usando o Windows
3.1, irá perceber que este código não irá funcionar. Calma, basta mudar, no Módulo, a
palavra "winmm.dll" por "mmsystem.dll".

115 - Musica de fundo


Enviado por: Felipe Maion Garcia

Caso você não saiba, é possível tocar uma música de extensão MID em um programa e realizar outras
tarefas ao mesmo tempo. Basta colocar em um módulo de declarações (*.BAS) o seguinte código. NOTA:
tudo isso é apenas uma linha de texto e não várias, como aparenta).

Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String,
ByVal lpstrReturnString As String, ByVal uRetrunLength As Long, ByVal hwndCallback As Long) As Long

Suponhamos que você queira que esta música toque sempre que o programa se iniciar (Form_Load) e pare
sempre que o mesmo for fechado (Form_Unload). Então, no evento Form_Load, insira o código:

result = mciSendString("open C:\Windows\Canyon.mid type sequencer alias musica", 0, 0, 0)

result = mciSendString("play musica", 0, 0, 0)

Desta vez, são duas linhas mesmo. Assim, quando você iniciar seu programa, o som
"Canyon.mid" irá tocar. Repare, depois da palavra "alias", que a palavra "musica" pode ser
substituida por outra variável, mas não se esqueça de mudar esta variável também na
segunda linha, ou o programa não irá iniciar corretamente. Agora, no evento Form_Unload,
insira o seguinte código:

result = mciSendString("open C:\Windows\Canyon.mid type sequencer alias musica", 0, 0, 0)

result = mciSendString("stop musica", 0, 0, 0)

Novamente são duas linhas de código. Se você mudou a variável "musica" no evento Form_Load, não
esqueça de mudá-la aqui também. PRONTO! Agora, sempre que você iniciar o Jogo, o som escolhido
williamdsilva@aol.com.br 51

começará a tocar, e, na
hora da saída, este som irá parar. NOTA: se você estiver rodando o programa por dentro do
VB, não o pare com o botão "Stop", e sim feche o Form. Se você não fizer isso, o som irá
continuar tocando! OBS: Se você estiver usando o Windows 3.1, irá perceber que este código
não irá funcionar. Calma, basta mudar, no Módulo, a palavra "winmm.dll" por
"mmsystem.dll".

116 - Múltipla seleção numa list box.


Enviado por: Mauro Sakamto

Para conseguir múltipla seleção numa list box basta mudar uma propriedade MultiSelect para

1-Simple (basta um click para selecionar os itens).

2-Extended (é necessário clicar Shift+click or shift + tecla de direção)

Para utilizar os valores selecionados é preciso fazer um for.

Ex:
For n=0 to (List.ListCount-1)

If List.Selected(n)=True then 'se verdadeiro está selecionado

showmessage('o item '+ list.List(n) +' está selecionado')

end if

Next n

117 - Simulando um ToolTipText (VB3 ou VB4)


Enviado por: Mauro Sakamoto

Um ToolTipText é aquele texto com um micro help que aparece quando passamos em cima de algum botão
(na maioria das vezes). No VB5 ele já vem como sendo uma propriedade dos controles, mas no VB3 ou 4
essa propriedade não existe.
Porém existe uma maneira bem simples de criá-la.
Primeiramente insira um label próximo de um botão.
Em seguida mude o texto (esse vai ser o texto do seu micro help), o BackColor para &H00C0FFFF& e
coloque a propriedade visible=false
Agora no evento MouseMove do formulário coloque
If Label1.Visible=True then

Label1.Visible=False

End if
Em seguida vá até o evento MouseMove do Botão e coloque
If Label1.Visible=False then

Label1.Visible=True

End if
Dessa forma quando você posicionar o cursor do mouse sobre o botão o label ficará visível mostrando
seu micro help. E quando você estiver sobre o formulário este ficará invisível.

118 - Imprimindo Relatório do Access a partir do VB


Enviado por: Mauro Sakamoto

Se vc está migrando do Access par o VB saiba que é possível aproveitar seus relatórios feitos em access.
Para isso utilize os seguintes comandos

Dim ObjectAccess As Object

Set ObjectAccess = CreateObject("Access.Application")


williamdsilva@aol.com.br 52

With ObjectAccess

.OpenCurrentDatabase filepath:="File.mdb"

.Visible = True

.DoCmd.OpenReport ReportName:="Report File Name", View:=Access.acPreview

End With 'para visualizar

'E

With ObjectAccess

.OpenCurrentDatabase filepath:="File.mdb"

.DoCmd.OpenReport ReportName:="Report File Name"

End With 'para imprimir sem visualizar

119 - Utilizando o pkzip para fazer backup em vários disquetes


Enviado por: Mauro Sakamoto

Muitas vezes devido ao grando tamanho de um banco de dados é complicado fazer seu backup para um
disquete. Principalmente para usuários leigos. Para simplificar a operação podemos utilizar o pkzip
(compactador de arquivos) e uma função chamada shell.

Então basta colocar os seguintes códigos na opção de backup


Dim X as variant

X=Shell("pkzip.exe a:\file.zip -& c:\path\file.mdb",0) 'executa o pkzip em janela oculta.

SendKeys "%{F4}", True 'fecha a janela

É possivel utilizar outros compactadores como arj ou outro qualquer

Para descompactar utilize o pkunzip:


Dim X as variant

X=Shell("pkunzip.exe a:\file.zip c:\path",0) 'executa o pkunzip em janela oculta.

SendKeys "%{F4}", True 'fecha a janela

120 - Permitir apenas números numa caixa de texto (sem utilizar máscara de entrada)
Enviado por: Mauro Sakamoto

Para permitir que apenas números sejam digitados em uma caixa de texto insira as seguintes linhas de
código no evento KeyPress da caixa de texto.
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then

KeyAscii = 0

Beep

End If

121 - Mudar a impressora em tempo de execução.


Enviado por: Mauro Sakamoto
williamdsilva@aol.com.br 53

Para alterar em tempo de execução a impressora é preciso inserir o Controle Common Dialog.
Em seguida insira o seguinte código:
CommonDialog1.ShowPrinter

122 - Limpar campos (caixa de texto) do formulário


Enviado por: Mauro Sakamoto

Existe uma maneira bem simples e rápida de limpar todos os campos de um formulário de uma única vez.
Para isso utiliza a seguinte sintaxe:
Dim i as integer

For i=1 to Form1.Controls.Count-1

If TypdeOf Form1.Controls(i) Is TextBox then 'verifica são caixa de texto

Form1.Controls(i).Text=""

end if

Next i

123 - Utilizando Grid para Simular DBGrid


Enviado por: Mauro Sakamoto

Para quem é usuário do VB 3.0 e deseja utilizar um DBGrid para visualizar uma tabela ou uma consulta,
isso pode ser feito utilizando-se um Grid.
Primeiramente insira o controle Grid.
Em seguida vá na prpriedade cols e escolha o número igual ao número de colunas que vc deseja exibir
mais um.
Agora vá até o evento Load de seu formulário e insira os códigos

Sub Form_Load()

Dim MyDB As DataBase

Dim MyTable As Table

Dim Linhas As integer 'Declaração de variáveis

Grid1.ColWidth(0) = 100 'formata o Grid

Grid1.ColWidth(1) = 3000

'e assim sucessivamente. Os valores são referentes a largura das colunas no


Grid.
Elas devem ser ajustadas conforme o tamanho do campo a ser exibido.

...

Grid1.ColWidth(N) = 3500 'última coluna

Grid1.Row=0

Grid1.Col=1 'seleciona a primeira linha e a segunda coluna.

Grid1.Text = "Campo1"

Grid1.Col=2 'seleciona a primeira linha e a terceira coluna.


williamdsilva@aol.com.br 54

Grid1.Text = "Campo2"

'e assim sucessivamente. Os são referentes ao nome dos campos da tabela.

...

Grid1.Col=N 'seleciona a primeira linha e a última coluna.

Grid1.Text = "CampoN"

Set MyDB=OpenDataBase("File.mdb")'abre o Banco de dados

Set MyTable=MyDB.OpenTable("TableName") 'abre a tabela a ser exibida

Linhas = 1 'seta o número de linhas (começa em zero)

MyTable.MoveFirst 'move para primeiro registro da tabela

Do Until MyTable.EOF 'enquanto não chegar ao final do arquivo, mostra


registros no Grid

Grid1.Rows = Linhas 'incrementa o número de linhas do Grid

Grid1.Row=Linhas 'seleciona linha

Grid1.Col=1 ' seleciona coluna 1

If Not IsNull(MyTable("Campo1")) then

Grid1.Text=MyTable("Campo1")

Else

Grid1.Text=""

End if

Grid1.Col=2 'seleciona coluna 2

If Not IsNull(MyTable("Campo2")) then

Grid1.Text=MyTable("Campo2")

Else

Grid1.Text=""

End if

' e assim sucessivamente.

Grid1.Col=N 'ultima coluna

If Not IsNull(MyTable("CampoN")) then

Grid1.Text=MyTable("CampoN")

Else

Grid1.Text=""

End if

Linhas=Linhas+1

Loop
williamdsilva@aol.com.br 55

End Sub

124 - Selecionar registros conforme intervalo de datas digitadas em formulário


Enviado por: Mauro Sakamoto

Suponha que vc queira fazer uma consulta que leve em conta todos os registros cujo a Data esteja entre
uma Data Inicial e uma DataFinal.
Escreva o seguinte código.

Dim MyDB As DataBase

Dim MyQuery As SnapShot

Dim MySQL As String 'Declaração de variáveis.

Set MyDB = OpenDatabase("File.mdb") 'Abre o Banco de Dados

MySQL= " SELECT * FROM [Tabela] "

MySQL= MySQL & " WHERE [Tabela].[Data] BETWEEN "

MySQL= MySQL & Chr(35) & Format(TxtDataInicial.Text,"mm/dd/yy") & Chr(35) & " AND " & Chr(35) &
Format(TxtDataFinal.Text,"mm/dd/yy") & Chr(35)

Set MyQuery=MyDB.OpenCreateSnapShot(MySQL)

Supondo que TxtDataInicio="31/01/97" e TxtDataFinal="31/12/97" a Query ficará da seguinte maneira

SELECT * FROM [Tabela] WHERE [Tabela].[Data] BETWEEN #01/31/97# AND #12/31/97#

Obs:- Quando vc utliza campos do tido data é importante observar que a data é no formato mês-dia-ano,
porisso é preciso utilizar a função format.

125 - Reparando Banco de Dados Corrompido


Enviado por: Mauro Sakamoto

Para reparar o banco de dados quando ele está corrompido (erro que ocorre quando o micro é desligado
por algum motivo no momento em que o banco de dados estava sendo acessado) deve utilizar a seguinte
sintaxe:

If Err = 3224 Then 'verifica o número do erro

MsgBox "O Banco de Dados está corrompido ! Pressione Ok para Reparar", 16, "Opção"

DBEngine.RepairDatabase ("c:\path\file.mdb") 'repara o Banco de Dados

DBEngine.CompactDatabase "c:\path\file.mdb","c:\path\fileBack.mdb" 'compacta banco de dados e


renomeia

Kill ("c:\path\file.mdb") 'apaga o BD antigo

Name "c:\path\fileBack.mdb" As "c:\path\file.mdb" 'renomeia o Banco de Dados

End if
É importante compactar o banco de dados após repará-lo devido ao aumento de tamanho do mdb.

126 - Como fazer o mouse desaparecer do form


Enviado por: Henrique Angelo

'declare em general:

Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

'crie um botao para desativar o mouse:

Private Sub "nome do botao"_Click()


williamdsilva@aol.com.br 56

ShowCursor False

End Sub

'para aparecer o mouse crie um botão:

Private Sub "Nome do Botão"_Click()

While ShowCursor(True) < 0

Wend

End Sub

127 - Performance com a SQL Passthrough


Enviado por: Henrique Angelo

Quando você acessa uma base dados via ODBC (Open Database Connectivity), os drivers ODBC atuarão
como tradutores dos seus comandos SQL. A razão disto é que, existe uma linguagem SQL genérica (SQL
ANSI) e dialetos SQL distintos nos vários produtos (linguagens e bancos) disponíveis no mercado. Assim,
cada fornecedor de banco de dados poderá incluir recursos (como storned procedures) e sintaxes
específicas em seus produtos; existem o SQL da Oracle, o SQL da Informix, o SQL da Sybase etc.
Escrevendo seus comandos em SQL ANSI, o ODBC irá "interpretar", em tempo de execução, os comandos
para a sintaxe SQL do banco que seu usuário acessa. Esta operação tem uma vantagem e uma
desvantagem:

1) A vantagem é que um só aplicativo, a priori, poderá ser executado - sem alteração de fontes - em
qualquer banco de dados Client Server, pelo padrão ODBC. Além da portabilidade de código fonte, existe o
ganho em interoperabilidade: o programa poderá acessar, ao mesmo tempo, bases diferentes. A
interoperabilidade é necessária em empresas, por exemplo, que passaram por processos de fusão ou
incorporação com outra empresa (que usa outra "marca" de banco de dados).

2) Desvantagem: a "tradução" impacta consideravelmente na performance do sistema, o aplicativo (que


pode estar rodando em uma grande rede) tornar-se-á muito mais lento.

A solução é pedir ao ODBC que "pule" a tradução que seria realizada pelos seus drivers. Assim, ganha-se
tempo de execução. Veja este exemplo:

Dim VA_Cmd As String 'comando SQL

Dim snapCidade As Snapshop

Dim VA_Cod As Integer 'código da cidade (campo chave)

Const SQLPASSTRHOUGH = 64

'...

VA_Cmd = "Select Cidade, Nome from CIDADE where Cidade = " & VA_Cod

Set snapCidade = db.CreateSnapshop(VA_Cmd, SQLPASSTRHOUGH)


A SQL Passthrough é o parâmetro para "pular" a tradução. No VB4, a constante chama-se
dbSQLPassThrough.

O comando SQL passado deve estar na sintaxe específica do SGBD (ou DBMS) utilizado. Mesmo assim, o
sistema poderá continuar como portável e interoperável, seguindo-se os passos abaixo (código
parametrizado):
williamdsilva@aol.com.br 57

1) Programe todas as consultas em todos os dialetos SQL utilizados pelos seus usuários, escreva o código
de um modo fácil de ser compreendido e alterado.

2) Execute a consulta específica do banco tal no momento tal. A informação de qual banco poderá estar
em entradas de arquivos INI ou no Registry.

128 - Propriedade Count, de Control Array, não documentada


Enviado por: Henrique Angelo

No VB4, cada control array (vetor de controles) é uma collection e possui uma propriedade Count. Isto não
ocorre com o VB3. É possível, então, se criar um loop (laço de repetição) tendo o Count como valor
máximo.
Esta característica não aparece nem nos manuais, nem no help do VB4. Talvez, pelo fato de que uma
control array collection não possui todas as propriedades e métodos das demais collections. A propriedade
Count e o método Item são suportados, enquanto os métodos Add e Remove não o são.
Este pequeno exemplo usa o Count para determinar qual elemento de um vetor de botões de opção foi
selecionado.
Private Sub FindSelectedOption ( )

Dim ij As Integer As Integer

For ij = 0 to Option1.Count - 1

If Option(ij).Value Then

MsgBox str(ij),0, "Opção Selecionada"

End If

Next ij

End Sub
Esta rotina trabalha apenas com números contínuos. Se os elementos forem 0, 1, 3 e 4, ocorrerá um erro
(run time error 340), ao se tentar fazer referência ao item 2.

129 - Solução para bug no DBGrid


Enviado por: Henrique Angelo

Há um sério bug (erro) em VB4, no controle Databound Grid usado com forms modais. Por exemplo, crie
três forms: form1, form2 e form3. Adicione um Command1 (botão) em cada form. No evento click do botão
em form1, chame o form2 como modal. No evento click do botão em form2 chame o form3 como modal.
Adicione um DBGrid no form3. No evento click do botão em form3, use unload form3.
Execute o form1 e aperte nos referidos botões. No clique do terceiro botão, ocorre um erro de pilha (stack
error) com o Visual Basic (tanto em 16 como em 32 bits). Rodando em Windows 3.1x, o sistema trava
completamente.

Solução: não use DBGrid com forms modais. Se, entretanto, você precisar de um form modal, simule-o.
Basta alterar a propriedade do form2 (o que chamou) para false. Você poderá criar uma property para
fazer referência ao form que chamou.
With FormModal

.propCaller = Me

.Show

End With
Agora altere Caller.Enabled = false no evento Load do form "modal". Volte para true no evento Unload.

130 - Identificando uma unidade de CD em Rede


Enviado por: Henrique Angelo

A API de 32 bits é bem mais rica que a de 16 bits. Entretanto, a função GetDriveType mostra os Drives CDs
em Rede, apenas como DRIVE_REMOTE (de rede). Isto é uma verdade, mas não completa. Combine a
chamada a GetDriveType com uma chamada a GetVolumeInformation para determinar se o drive é, ao
williamdsilva@aol.com.br 58

mesmo tempo, de rede e CD.


A chamada indica o sistema de arquivos: FAT, NTFS, HPFS ou CDFS (CD File System).
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

'...

pstrRootPath = "E:\"

pstrVolName = Space$(256)

pstrSystemType = Space$(32)

plngSysTypeSize = Clng(Len(pstr(SystemType))

plnVolNameSize = Clng(Len(pstrVolName))

plngRtn = GetVolumeInformation _

(pstrRoothPath, pstrVolName, _

plngVolNameSize, plngVolSerialNum,

plngMaxFileNameLen, plngSysFlags, _

pstrSystemType, plngSysTypeSize)

131 - Prevenindo interação do usuário, via MousePointer e Enabled


Enviado por: Henrique Angelo

Mudar a propriedade MousePointer do form não impede a ação do usuário, via mouse ou teclado, apenas
altera o desenho do ponteiro.
Para impedir que o usuário interaja com o sistema em algumas operações, desenvolvi esta dica, aplicável a
MDI parent forms (janelas principais de interface múltipla) e seus MDI children forms (janelas filhas). Em
alguns processos demorados (como carga de banco de dados) mude a propriedade enabled de um MDI
child para false, assim:
'antes

Me.Enabled = False

Me.MousePointer = 11 'hourglass (ampulheta)

ExecutarProcessoDemorado

'depois

Me.Enabled = True

Me.MousePointer = 0 'padrão
No caso de um MDI com muitos filhos ativos, crie uma Forms Collection e desative (enabled = false) cada
form. Depois de desativá-los, use MDIForm.Hourglass = false.
williamdsilva@aol.com.br 59

132 - Ordenando Colunas da ListView


Enviado por: Henrique Angelo

Dê ao seu controle ListView (32 bits) a funcionalidade de ordenação do Windows 95 Explorer. Este código
ordena a lista por qualquer coluna. Se a lista já estiver ordenada por esta coluna, a ordem será invertida.
Private Sub ListView1_ColumnClick _

(ByBal ColumnHeader As ColumnHeader)

Whith ListView1

If (ColumnHeader.Index -1) = .SortKey Then

.SortOrder = (.SortOrder + 1) Mod 2

Else

.Sorted = False

.SortOrder = 0

.SortKey = ColumnHeader - 1

.Sorted = True

End IF

End With

End Sub

133 - Limpando Combos Read-Only


Enviado por: Henrique Angelo

Numa ComboBox com a propriedade Style = 2 (dropdown list), a propriedade Text é somente-para-leitura.
Isto impede limpeza e troca de conteúdo por esta propriedade, em construções como estas:
Combo1.text = "" 'ou

Combo1.text = "novo conteúdo"


A solução é limpar a combo com o método clear e adicionar o valor novo.
Combo1.Clear

Combo1.AddItem "novo conteúdo "

134 - Inconsistência no caminho da aplicação (app.path)


Enviado por: Henrique Angelo

Esteja atento quando usar a propriedade path (caminho) do objeto Application (App, aplicação). Se seu
executável está rodando na raiz de um drive, App.Path retornará o nome (letra:) na unidade e uma barra
(algo como C:\). Apareceu quando o executável está em um subdiretório, a barra final não é acrescentada
(C:\SUBDIR). Para testar e acrescentar a barra, use o código abaixo que, retornará C:\SUBDIR\.
MyPath = App.Path

If Not Right(MyPath, 1) = Chr(92) then

'chr 92 = "\"

MyPath = MyPath & Chr(92)

End If

135 - Mantendo constantes


Enviado por: Henrique Angelo

Melhore o uso do arquivo CONSTANT.TXT. Para um novo projeto, copie o arquivo CONSTANT.TXT para
williamdsilva@aol.com.br 60

MYCONST.TXT (para o diretório do seu projeto). Inclua MYCONST.TXT no seu projeto (menu File à Add File).
Substitua (menu Edit à Replace ou CTRL + R) todas as expressões Global por ' Global neste arquivo.
Quando for necessária uma nova constante, basta verificar se a mesma já foi definida pela Microsoft e
remover o a ' do comentário (reverter a substituição).

136 - Painel de Percentual com SQL Count


Enviado por: Henrique Angelo

Complementando a dica anterior: Em uma operação de consulta a um banco de dados (típica de


desenvolvimento comercial), deveremos conhecer o tamanho do retorno da consulta. O número de linhas
que irá retornar é calculado por um Select Count (instrução SQL para contador) igual ao Select que,
posteriormente, será usado para a consulta. O Count é uma operação rápida, principalmente em bancos
Client Server (onde o cálculo é executado no servidor). O retorno do Select Count é um número, contendo
o total de linhas que seria trazido pela consulta. Com o Count, poderão ser impedidas consultas longas
demais, por exemplo.
Para o percentual, já temos o total. O "registro corrente" é obtido dentro do loop. No exemplo abaixo,
carregamos um Grid simples com dados de uma tabela. Utilizamos as rotinas SU_Aguarde e SU_BarraPerc
(explicadas nas dicas anteriores).
Sub SU_CarregarGrid ()

Dim VA_Cmd As String

Dim dynatemp As dynaset

Dim dynacont As dynaset

Dim VA_Cont, VA_Curr

Dim VA_SevErro

On Error GoTo Erro_Carregar_Grid

SU_Aguarde True, "Carregando tabela de cidades..."

'rotina acima explicada na DICA ANTERIOR

'... limpar o Grid

'... formatar TB_Cidade.text

'query

VA_Cmd = "Select * From CIDADE"

If Len(TB_Cidade.Text) > 0 Then

VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' "

VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' "

End If

Set dynatemp = db.CreateDynaset(VA_Cmd, VGl_SQLop)

'query do contador

VA_Cmd = "Select Count(*) From CIDADE"

If Len(TB_Cidade.Text) > 0 Then

VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' "

VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' "

End If

Set dynacont = db.CreateDynaset(VA_Cmd, VGl_SQLop)

If Not dynacont.EOF Then

VA_Cont = dynacont(0)
williamdsilva@aol.com.br 61

Else

VA_Cont = 0

End If
If VA_Cont = 0 Then

MsgBox "Nenhum registro de cidade encontrado."

SU_Aguarde False, ""

Gr_Grid.Row = 1

'... marcar outra linha do grid

Exit Sub

End If
'carga do grid

Gr_Grid.Rows = VA_Cont + 1

VA_Curr = 1

Do While Not dynatemp.EOF

SU_BarraPerc CInt(VA_Curr * 100 / VA_Cont), False

'rotina explicada na DICA ANTERIOR

Gr_Grid.Row = VA_Curr

Gr_Grid.Col = 0

Gr_Grid.Text = dynatemp("CodCidade")

Gr_Grid.Col = 1

Gr_Grid.Text = dynatemp("NomeCidade")

Gr_Grid.Col = 2

Gr_Grid.Text = dynatemp("UF")

VA_Curr = VA_Curr + 1

dynatemp.MoveNext

Loop

'desliga a barra de percentual

SU_BarraPerc 100, false

'... demais lógicas

'... (tratamento de erro e formatações)

End Sub

Como esta rotina de carga de grid é enorme (e no VB4, o DBGrid faz isto sozinho), o código acima apenas
mostra a formação do Select Count e a chamada a SU_BarraPerc.
____________

137 - Painel de Percentual


Enviado por: Henrique Angelo
Para mostrar um percentual, é preciso conhecer o tempo (ou tamanho) total da operação e a que ponto se
está em dado momento de um loop (laço de repetição). Num programa de instalação, por exemplo, se
conhece o tamanho total dos arquivos (ou quantidade de arquivos) a serem instalados e qual o arquivo
atual (no loop). Com isto, o usuário vê X% da instalação completa.
Para usar um 3D Panel como barra de percentual, siga estes passos:

1) Insira um 3D Panel, com nome PA_Status, no MDIForm (aqui chamado de F00). Atribua Align = Alig
williamdsilva@aol.com.br 62

Botton.

2) Insira em um módulo (.BAS) a rotina SU_BarraPerc.


Sub SU_BarraPerc (Perc As Integer, Acum As Integer)

'recebe perc, um número de 0 a 100

'100 = "desliga" a barra

'Acum = boolean, acumula o anterior ou não (true/false)

Static VA_Vez

Static VA_SaveCor As Long

If Acum Then

Perc = Perc + F00.PA_Status.FloodPercent

End If

If Perc > 100 Or Perc < -1 Then

MsgBox "Perc deve estar entre -1 e 100", 16, "Erro de parâmetro _

em SU_BarraPerc"

Exit Sub

End If

If IsEmpty(VA_Vez) Or VA_Vez = 1 Then

'liga barra - altera o painel

F00.PA_Status.Caption = ""

F00.PA_Status.FloodShowPct = True

VA_SaveCor = F00.PA_Status.ForeColor

F00.PA_Status.ForeColor = RGB(0, 0, 0)'preto

F00.PA_Status.BevelOuter = 2 'raised

F00.PA_Status.BevelWidth = 3

F00.PA_Status.BorderWidth = 1

F00.PA_Status.FloodType = 1 'left to right

F00.PA_Status.FontSize = 9.75

End If

If Perc < 100 Then

If Perc > 48 Then

F00.PA_Status.ForeColor = RGB(255, 255, 255)'branco

End If

'mostra perc

F00.PA_Status.FloodPercent = Perc

VA_Vez = 2 'ou mais

Else

'desliga barra - reestrutura painel

F00.PA_Status.BevelOuter = 1 'inset
williamdsilva@aol.com.br 63

F00.PA_Status.BevelWidth = 1

F00.PA_Status.BorderWidth = 3

F00.PA_Status.FloodType = 0 'none

F00.PA_Status.FontSize = 8.25

F00.PA_Status.ForeColor = VA_SaveCor

F00.PA_Status.FloodShowPct = False

VA_Vez = 1

End If

End Sub

Para chamar a rotina, basta passar o valor atual do percentual. O segundo parâmetro, indicará se o
percentual anterior será acumulado com este. No exemplo abaixo, a barra é preenchida de 10% em 10%.
'teste da barra de percentual
Dim i As Integer

For i = 1 To 10

SU_BarraPerc (i * 10), False

MsgBox "Clique em OK para continuar"

Next i

SU_BarraPerc (100), False 'desliga a barra

138 - Melhorando as declarações API (I)


Enviado por: Henrique Angelo

Muitas rotinas API são declaradas como função, mas, o valor de retorno não é sempre utilizado. A função
SendMessage, por exemplo, depende da mensagem enviada, não importando o valor de retorno. Outro
exemplo é a função Shell (se o objetivo for chamar e não monitorar um programa externo, o retorno não
será utilizado).

Ocorrem chamadas assim:

Dim dummy As Integer

dummy = SendMessage(Text1.hWnd, WM_PASTE, 0, 0&)


A variável só foi necessária por causa da declaração. Uma alternativa, é declarar a função como Sub e usar
um alias (apelido).
Declare Sub SUB_SendMessage Lib "User" Alias "SendMessage" (byVal hWnd as _ Integer , byVal
msg as Integer, byVal wParam as Any, byVal lParam As Any)
Agora, chame pelo nome declarado e não pelo original:
SUB_SendMessage Text1.hWnd, WM_PASTE, 0, 0&
Observe que, seu código ficou mais produtivo de ser mantido.

139 - GetModuleUsage em 32 bits


Enviado por: Henrique Angelo

Encontrei uma solução para o problema, da API GetModuleUsage não trabalhar em VB4 a 32 bits. A TaskID
retornada pela função Shell pode ser usada por AppActivate. Assim:
TaskID = Shell("DOSAPP.exe", vbNormalFocus)

On Error GoTo finished

While True
williamdsilva@aol.com.br 64

DoEvents

AppActivate TaskID

Wend

Finished:

On Error GoTo 0

140 - Ativando Num Lock por um código


Enviado por: Henrique Angelo

Coloque isto nas declrações gerais de um módulo .BAS


Public Const VK_NUMLOCK = &H90

Public Type KeyboardBytes

kbByte(0 To 255) As Byte

End Type

Public kbArray As KeyboardBytes

Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long

Public Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

Public Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

No form adicione 3 botões (cmdToggle, cmdTurnOn, cmdTurnOff) e um label. Adicione o seguinte código no
Form:
Private Sub cmdToggle_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1)

SetKeyboardState kbArray

End Sub

Private Sub cmdTurnOn_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_NUMLOCK) = 1

SetKeyboardState kbArray

End Sub

Private Sub cmdTurnOff_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_NUMLOCK) = 0

SetKeyboardState kbArray

End Sub

141 - Ativando Caps lock por um código


Enviado por: Henrique Angelo
Coloque isto nas declarações gerais de um módulo .BAS
Public Const VK_CAPITAL = &H14
williamdsilva@aol.com.br 65

Public Type KeyboardBytes

kbByte(0 To 255) As Byte

End Type

Public kbArray As KeyboardBytes

Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long

Public Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

Public Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

Em um form, coloque 3 command buttons (cmdToggle, cmdTurnOff, cmdTurnOff) e uma label. Coloque oo
seguinte código no form:
Private Function CapsLock() As Integer

CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1

End Function

Private Sub Form_Load()

If CapsLock() = 1 Then Label1 = "On" Else Label1 = "Off"

End Sub

Private Sub cmdToggle_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)

SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")

End Sub

Private Sub cmdTurnOn_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_CAPITAL) = 1

SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")

End Sub

Private Sub cmdTurnOff_Click()

GetKeyboardState kbArray

kbArray.kbByte(VK_CAPITAL) = 0

SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")

End Sub

142 - Já estou no ar?


Enviado por: Henrique Angelo

Algumas aplicações para Windows podem ter várias instâncias, ou seja, podem ser executadas repetidas
williamdsilva@aol.com.br 66

vezes ao mesmo tempo no mesmo computador. É o caso do Bloco de Notas, do Paint, da Calculadora e de
outros. Existem programas cuja múltipla execução não é interessante, por questões de produtividade ao
usuário (como o Word, o File Manager e o Excel) ou segurança (como aplicações que usam banco de
dados). Os sistemas comerciais (de banco de dados), em geral, só podem ser executados em uma sessão
ao mesmo tempo. O controle disto no VB é feito através do objeto App.

Dim SaveTitle as string

If App.PrevInstance Then

SaveTitle = App.Title

App.Title = "... segunda chamada ao mesmo programa."

Me.Caption = "... segunda chamada ao mesmo programa, serei fechado"

'se for a Sub Main, a linha acima, obviamente, não existe

'as linhas abaixo fecham a segunda chamada e alternam para

'a primeira

AppActivate SaveTitle

SendKeys "% R", True

End

End If
O código acima deve ser a primeira coisa a ser executada na sua aplicação. Assim, ao invés de abrir uma
segunda sessão do programa, o Windows irá alternar para a sessão já aberta. Isto também pode ser feito
por APIs (FindWindow, ShowWindow e SetFocus, da bilblioteca User), mas, tem o mesmo efeito e é mais
trabalhoso.

143 - Menu Colar Alternativo


Enviado por: Henrique Angelo

Se você usa alguns controles, como o QuickPack Pro (da Crescent), é impossível atribuir CTRL+V para
Editar-Colar.

Pois, o texto do Clipboard será colado duas vezes.


Para manter a tecla de atalho, atribua:
mnuPaste.caption = "Co&lar" + Chr$(9) + "Ctrl + V"

na Sub Main ou no form_Load.

144 - Listas erradas de API


Enviado por: Henrique Angelo

Os utilitários APILOD16.EXE e APILOD32.EXE acessam o arquivo WIN32API para passar os parâmetros de


tipos de dados (Type Declarations) necessários para chamar funções Win32 API. Porém existem erros. Por
exemplo:
WIN32API.TXT (incorretamente)diz:
Type COMSTAT

fCtsHold As Long 'errado

fDsrHold As Long 'errado

fRlsHold As Long 'errado

fXoffHold As Long 'errado

fXoffSnet As Long 'errado

fEof As Long 'errado

fTxim As Long 'errado

fReserved As Long 'errado

cbInQue As Long
williamdsilva@aol.com.br 67

cbOutQue As Long

End Type
WINT31APITXT, corretamente, diz:
Type COMSTAT

bunch_Of_Bits As Long

cbInQue As Long

cbOutQue As Long

End Type

145 - Validando CGC e CPF


Enviado por: Henrique Angelo

Essa é brasileiríssima. Os números de CGC e CPF possuem dígitos verificadores para... adivinhem ...
verificar!
Isto é obvio. A validação deve ser feita (por qualquer sistema decente) para impedir a digitação por
engano e os CGCs e CPFs falsos ("que coisa feia, tentando passar a perna na gente"). A função abaixo não
é de minha autoria, mas, achei no meu "baú" de código.

Function Fu_consistir_CgcCpf (Vl_CgcCpf As String)


' Esta Rotina Devolverá True Se o Cgc/Cpf Informado For valido
' Para Chamar esta Rotina de Consistência
' 1 ) Atribuir o valor do CgcCpf a uma Variavel String
' 2 ) Chamar a Rotina com : Fu_consistir_CgcCpf (Variavel)
' Uma Forma Simples de fazer a Consistencia
' é Copiando as linhas abaixo (exemplo)
' para dentro do Programa
' Dim Vl_CgcCpf As String
' Vl_CgcCpf = Me.CgcCpf.Text
' If Fu_consistir_CgcCpf(Vl_CgcCpf) = False then
' MsgBox "( Cgc/Cpf Informado Não é um Cgc/Cpf Correto )"
' Me.CgcCpf.SetFocus
' Exit Sub
' End if
Fu_consistir_CgcCpf = False
Dim VA_CgcCpf As String
Static Numero(15) As Integer
Dim VA_Resto As Integer
Dim VA_Resultado As Integer
Dim VA_SomaDigito10 As Integer
Dim VA_resto1 As Integer
VA_CgcCpf = Format(Vl_CgcCpf, "@@@@@@@@@@@@@@")
VA_Digito = Mid(VA_CgcCpf, 13, 2)
Numero(1) = Val(Mid(VA_CgcCpf, 1, 1))
Numero(2) = Val(Mid(VA_CgcCpf, 2, 1))
Numero(3) = Val(Mid(VA_CgcCpf, 3, 1))
Numero(4) = Val(Mid(VA_CgcCpf, 4, 1))
Numero(5) = Val(Mid(VA_CgcCpf, 5, 1))
Numero(6) = Val(Mid(VA_CgcCpf, 6, 1))
Numero(7) = Val(Mid(VA_CgcCpf, 7, 1))
Numero(8) = Val(Mid(VA_CgcCpf, 8, 1))
Numero(9) = Val(Mid(VA_CgcCpf, 9, 1))
Numero(10) = Val(Mid(VA_CgcCpf, 10, 1))
Numero(11) = Val(Mid(VA_CgcCpf, 11, 1))
Numero(12) = Val(Mid(VA_CgcCpf, 12, 1))
Numero(13) = Val(Mid(VA_CgcCpf, 13, 1))
Numero(14) = Val(Mid(VA_CgcCpf, 14, 1))
If Len(Trim(Vl_CgcCpf)) > 11 Then ' Cgc
VA_Resultado = Numero(1) * 2
If VA_Resultado > 9 Then
VA_SomaDigito10 = VA_Resultado + 1
Else
VA_SomaDigito10 = VA_Resultado
End If
VA_Resultado = Numero(3) * 2
If VA_Resultado > 9 Then
williamdsilva@aol.com.br 68

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1


Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End If
VA_Resultado = Numero(5) * 2
If VA_Resultado > 9 Then
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1
Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End If
VA_Resultado = Numero(7) * 2
If VA_Resultado > 9 Then
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1
Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End If
VA_SomaDigito10 = VA_SomaDigito10 + Numero(2) + Numero(4) + Numero(6)
If Mid(Str(VA_SomaDigito10), Len(Str(VA_SomaDigito10)), 1) = "0" Then
VA_Resto = 0
Else
VA_Resto = 10 - Val(Mid(Str(VA_SomaDigito10), _
Len(Str(VA_SomaDigito10)), 1))
End If
If VA_Resto <> Numero(8) Then
Exit Function
End If
VA_Resultado = (Numero(1) * 5) + (Numero(2) * 4) _
+ (Numero(3) * 3) + (Numero(4) * 2) _
+ (Numero(5) * 9) + (Numero(6) * 8) + _
(Numero(7) * 7) + (Numero(8) * 6) + _
(Numero(9) * 5) + (Numero(10) * 4) + _
(Numero(11) * 3) + (Numero(12) * 2)
' Atribui para resto o resto da divisão
' de VA_resultado dividido por 11
VA_Resto = VA_Resultado Mod 11
If VA_Resto < 2 Then
VA_resto1 = 0
Else
VA_resto1 = 11 - VA_Resto
End If
If VA_resto1 <> Numero(13) Then
Exit Function
End If
VA_Resultado = (Numero(1) * 6) + _
(Numero(2) * 5) + (Numero(3) * 4) + _
(Numero(4) * 3) + (Numero(5) * 2) + _
(Numero(6) * 9) + (Numero(7) * 8) + _
(Numero(8) * 7) + (Numero(9) * 6) + _
(Numero(10) * 5) + (Numero(11) * 4) + _
(Numero(12) * 3) + (Numero(13) * 2)
' Atribui para resto o resto da divisão
' de VA_resultado dividido por 11
VA_Resto = VA_Resultado Mod 11
If VA_Resto < 2 Then
VA_resto1 = 0
Else
VA_resto1 = 11 - VA_Resto
End If
If VA_resto1 <> Numero(14) Then
Exit Function
End If
Else ' Cpf
VA_Resultado = (Numero(4) * 1) + _
(Numero(5) * 2) + (Numero(6) * 3) _
+ (Numero(7) * 4) + (Numero(8) * 5) _
+ (Numero(9) * 6) + (Numero(10) * 7)_
+ (Numero(11) * 8) + (Numero(12) * 9)
VA_Resto = VA_Resultado Mod 11
If VA_Resto > 9 Then
VA_resto1 = VA_Resto - 10
Else
VA_resto1 = VA_Resto
End If
If VA_resto1 <> Numero(13) Then
williamdsilva@aol.com.br 69

Exit Function
End If
VA_Resultado = (Numero(5) * 1) _
+ (Numero(6) * 2) + (Numero(7) * 3) _
+ (Numero(8) * 4) + (Numero(9) * 5) + _
(Numero(10) * 6) + (Numero(11) * 7) + _
(Numero(12) * 8) + (VA_Resto * 9)
VA_Resto = VA_Resultado Mod 11
If VA_Resto > 9 Then
VA_resto1 = VA_Resto - 10
Else
VA_resto1 = VA_Resto
End If
If VA_resto1 <> Numero(14) Then
Exit Function
End If
End If
Fu_consistir_CgcCpf = True
End Function

146 - Problemas com o Print


Enviado por: Henrique Angelo

O código abaixo funciona em VB3:


Cls

Print Spc(10); "Informe seu nome:";

currentX = 0

currentY = currentY +1

Print Spc(10); "Informe seu nome:";


Este código falha em VB4. Retirando o último ponto-e-vírgula do primeiro print:
Print Spc(10); "Informe seu nome:"
Acrescente Debug. antes de Print para testar:
Cls

Debug.Print Spc(10); "Informe seu nome:"

currentX = 0

currentY = currentY +1

Debug.Print Spc(10); "Informe seu nome:";

Ou mude o comando para:

Print Space(10); "Informe seu nome:";

147 - Desmarcar todos os itens de uma lista


Enviado por: Henrique Angelo
Uma forma rápida de retirar qualquer seleção de uma listbox é:
list1.selected (-1) = False

Isto não funciona em VB4.

148 - Pinte meu mundo ... nas cores padrão!


Enviado por: Henrique Angelo

Apenas após executar o último "make EXE", troque seu esquema de cores e veja quantos fundos de cores
você possui fora do padrão (escolhido pelo usuário final, via Painel de Controle). Infelizmente, muitos
controles customizados (VBX/OCX) pecam neste detalhe importante.
Através do Painel de Controle, tente o esquema "deserto" no Windows 95, ou "verão" no Windows 3.1x, ou
ainda, crie um outro esquema horroroso. Isto o ajudará a testar suas aplicações de cores.
williamdsilva@aol.com.br 70

O VB4 dispõe de 24 cores de sistema como constantes. No VB Help, procure por "Color Constants" ou
"VBTranslateColor". Copie o valor hexadecimal para a propriedade de cor de seu objeto se ele foi
erroneamente redefinido (fora do padrão). Também é possível copiar os valores de controles que estejam
corretos, mas cuidado, a face do botão por exemplo, pode não ser cinza.
Por Clint Walker*

Na nova paleta de cores do VB4, há um botão Default, que altera as cores do objeto selecionado para o
padrão do Windows. Verifique se a propriedade Appearance é 3D para obter melhores resultados.

Notas do Fórum Access (Charles A. Müller): 1) É uma regrinha antiga. Nunca mude as cores que, o usuário,
que é o cliente, define externamente (no Windows), a menos que isto traga utilidade. Nestes casos, esteja
atento para o significado das cores e sua harmonia (afinal, penteadeiras de camarim na tela não são
desejáveis). 2) No VB3, existem 19 cores de sistema nas constantes de CONSTANT.TXT. 3) Observamos (no
CCE e VBA) que o VB5 terá, em sua paleta de cores, uma lista de alteração automática para as cores
padrão (além do botão default).

149 - Brancos no controle Masked Edit Box


Enviado por: Henrique Angelo

O controle MS Masked Edit apenas aceita entrada de dados dentro da máscara formatada (mask). Isto
impede o programador de limpar a text do controle diretamente (masked1.text = ""), pois, o caracter
espaço (ou nulo) pode não se encaixar no formato da máscara. Por exemplo, algumas possuem o formato
# (aceitam somente números). Logo, o "" não seria aceito. Este problema é resolvido por este código:
vTemp = masked1.mask

masked1.mask = ""

masked1.text = ""

masked.mask = vTemp
Removendo a máscara é possível limpar o texto. Depois, basta devolver a máscara original ao controle.
Uso isto no evento Data1_ValidationError quando adiciono um novo registro.

150 - Piscar ou não piscar


Enviado por: Henrique Angelo

Geralmente, ao criar uma ajuda de barra de situação (status bar help), você irá adicionar código no evento
MouseMove de controles e forms. A barra de status poderá ser uma picture box com um label, um controle
statusbar (VB4-32 bits) ou - como mais usado - um painel 3D. O problema é que o mouse se movimenta
várias vezes no mesmo controle, fazendo a barra de status "piscar". Para resolver este problema, basta
verificar se a frase atual é diferente da frase nova. Criamos ainda uma função que controla a barra de
status.
Global Const CG_EXPLICAPADRAO = "Pressione F1 para obter ajuda."

'...

Sub SU_Explica (oque As String)

'rotina em VB3, usa um painel 3D

oque = Trim(oque)

If oque = "" Then oque = CG_EXPLICAPADRAO

If Len(oque) > 1 And Right$(oque, 1) <> "." Then

oque = oque & "." 'acrescenta ponto final

End If

'muda a inicial para maiúscula

If Len(oque) > 1 Then

oque = UCase(Left(oque, 1)) & Right(oque, Len(oque) - 1)

Else

oque = UCase(oque)
williamdsilva@aol.com.br 71

End If

'altera a barra se o novo conteúdo for diferente

If MainForm.PA_Status.Caption <> oque Then

MainForm.PA_Status.FloodShowPct = False

MainForm.PA_Status.FloodType = 0

MainForm.PA_Status.Caption = oque

End If

End Sub
A função usa uma constante (CG_EXPLICAPADRAO) que, contém uma frase genérica, para quando não
houver o que explicar sobre um form ou objeto.

Para chamar a função:


Sub CmdOK_MouseMove(Button As Integer, Shift As Integer, X As Single, _

Y As Single)

SU_Explica "Grava as alterações no banco de dados."

End Sub
Pode ser utilizado também o evento GotFocus (para resposta ao teclado). Neste caso, o LostFocus deverá
limpar a barra de status (como a frase genérica).
Sub txtNome_LostFocus ( )

SU_Emplica ""

End Sub

151 - F1 e o Help de Contexto


Enviado por: Henrique Angelo

As aplicações Windows acessam Help (ajuda) diretamente através do pressionamento da tecla F1. Muitas
porém, utilizam menus (?à Conteúdo) ou botões (Ajuda). Nestes casos deve aparecer a página de ajuda
indicada na propriedade HelpContextID do form ou controle. A solução ao programador pode ser o uso de
API, com a função WinHelp, na biblioteca User (como sugere o exemplo SAMPLES\ICONWRKS). Uma forma
mais simples, é simular o pressionamento de F1:
Sub AjudaConteudo_Click ()

SendKeys "{F1}"

End Sub

152 - Onde está o fim?


Enviado por: Henrique Angelo

Uma aplicação do Visual Basic pode ser encerrada de várias formas: 1) com o fechamento (unload) do form
principal. 2) com o comando Stop (apenas como interrupção na depuração). 3) com o comando End. Este
último, fecha todos os arquivos e limpa todas as variáveis. O problema do End é que esta palavra faz parte
de outros comandos como End Sub e End If (fechamento de blocos). Imagine se você precisar depurar um
programa para descobrir quais os pontos em que ele é encerrado, como diferenciar o End "puro" dos
outros? Basta chamar sempre uma função pública (codificada em um .BAS) que "substituirá" o End.
Somente esta função terá End, facilitando o controle do código.
Public Sub SU_AbortaSis

End 'único local para o End

End Sub

Private Sub Form_Unload (Cancel As Integer)

...
williamdsilva@aol.com.br 72

SU_GravaConfiguracoes

SU_AbortaSis

End Sub

153 - Capturando parâmetros


Enviado por: Henrique Angelo

Todos se recordam das velhas linhas de comando nos programas DOS: dir /s, pkunzip -v, del /p, mysys /?,
myeditor myfile.txt entre outros. Com estes recursos, os programas já sabiam o que fazer ao serem
chamados. No Windows, este recurso ainda é utilizado, principalmente quando se deseja automatizar
tarefas. O próprio Registry do Windows passa os devidos parâmetros ao executar uma aplicação associada
a um tipo de arquivo. Assim, aplicativos da linha Office podem ser disparados para abertura e impressão
de arquivos ou execução de macros. Para "capturar" a linha de comando com os parâmetros de um
executável em VB, basta utilizar a função Command:
Select Case UCase(Trim(Command$))

Case "/A"

frmAvanc.Show 'usuários avançados

Case "/M"

frmMedios.Show 'usuários médios

Case Else

frmBasico.Show 'default, usuários novatos

End Select

154 - Sub Main, iniciando um projeto sem interface


Enviado por: Henrique Angelo
Sub Main, iniciando um projeto sem interface

Nem sempre é necessário ou útil que um sistema (projeto VB) inicie com uma janela (form). Uma
alternativa, nem sempre utilizada, é o de iniciar o projeto executando uma rotina sem form. Alguns
exemplos:

1) Processo de inicialização muito longo, com abertura de banco de dados, testes para verificar se o
sistema pode ou não ser inicializado, leitura de Registry ou arquivos INI, etc.

2) Quando o sistema rodará em "background", ou seja, em segundo plano. Este sistema não terá janelas
(forms) para interação com o usuário.

No Visual Basic, o recurso é bastante simples. Primeiro, se informa ao VB que o projeto iniciará com uma
Sub Main (esta informação é passada nas opções de projeto - Options à Project à Start Up Form = Sub
Main.) Depois, basta incluir em um dos módulos de código (.BAS), uma rotina com este nome.

Sub Main

'rotinas de inicialização e leitura de opções

'logon, abertura de banco de dados e restante da inicialização

'mostra o primeiro form

form1.show

End Sub

155 - Descarregando DLLs fora de controle


williamdsilva@aol.com.br 73

Enviado por: Henrique Angelo

Quando uso VB em Windows 95, às vezes ocorre que, um programa torne o sistema operacional instável.
Costumava derrubar o Windows 95 e reiniciar para limpar a memória de todos os VBXs e DLLs. Mas
descobri, recentemente, uma forma mais prática:

Criei um arquivo DOS Batch chamado RESTART.BAT, no seu disco rígido, com este conteúdo:

EXIT

No Windows 95, criei um atalho para este BAT. O modo DOS é selecionado, nas propriedades, como
Program / Advanced. Este caminho é muito mais rápido que um reboot.

Por Michael J. Dyer

156 - Evitando Erros de Atualização em Bases Access


Enviado por: Henrique Angelo
Evite o erro de acesso 3260 ("Couldn't update; currently record is locked by user '' on machine ''"), que
ocorre quando duas ou mais aplicações acessam a mesma tabela de uma base de dados Access (Jet). O
acesso é realizado por objetos recordset (como table ou dynaset), sobre uma tabela que contenha uma
chave (primária ou não).
Se uma das aplicações está ociosa (apenas abriu o registro e ainda não o alterou) e outra aplicação tenta
alterar ou adicionar dados, o erro citado ocorre. Para evitar este problema, inclua o método Idle
dbFreeLOcks após o recordset ser aberto. Se for um table recordset, inclua-o após ter definido a
propriedade Index. Veja um exemplo:
Set db = Workspaces(0).Opendatabase("Test.mdb")

Set TB = Db.OpenRecordSet("Customer_Master", dbOpenTable)

TB.Index = "PrimaryKey"

DB.Engine.Idle (dbFreeLocks)

157 - O desafio de criar Add-ins


Enviado por: Henrique Angelo

Escrever add-ins (recursos adicionais) para o VB4 pode ser desafiador, recompensador e melindroso. Se
você não tomar cuidado, o VB poderá "estranhar" algumas coisas e abortar. Podem aparecer várias
mensagens, dependendo do sistema operacional. As mensagens são diversas, mas o resultado é o mesmo.
Por exemplo, no Windows 95, aparecem mensagens como "Este programa causou um erro e vai ser
encerrado" ou "se o problema persistir, contate o fornecedor". No Windows 3.1x, podem ser causados
GPFs.
Este erros ocorrem quando a IDE está sendo descarregada (unloaded) e será executada numa posterior
abertura do VB com o aviso "xxxxx add-in could not be loaded, do you want to remove it from the list of
add-ins?"
Após isto, você terá que executar novamente o add-in para registrá-lo como relacionado ao VB. Vejamos
dois casos destes erros:

1) Referenciando uma propriedade da VBIDE Instance Object, como AcitveProject.FileName no evento


ConnectAddin da Conector Class.

2) Conectando mais menus ou submenus que você desconectou.


Programação é, predominantemente, uma ciência exata e muitas "regras não documentadas" são uma real
necessidade ao se criar um add-in.

158 - Usando o CHR() para ocultar "mensagens"


Enviado por: Gerson Keiti Motoyama
Para quem não sabe, infelizmente, é possível "espiar", ou até mesmo "alterar" o código de um executável
(somente as "mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usuário
de nível intermediário. Para que isso não ocorra, ou pelo menos para dificultar alguma alteração, quando
quiser escrever uma mensagem, por exemplo do tipo:
msgbox "Olá, blz?"

Utilizando o sintaxe: Chr(charcode), faça o seguinte:


msgbox chr(79) & chr(108) & chr(225) & chr(44) & chr(160) & chr(98) & chr(108) & chr(122) & chr(63)

Obs: Consulte os valores para o charcode no Help do VB:

Character Set (0-127)/(128-255)


williamdsilva@aol.com.br 74

159 - Determinando se um objeto foi definido (Set)


Enviado por: Henrique Angelo

VB4 providencia uma série de novas capacidades de uso de objetos. Porém, um objeto deve ser "setado"
(definido) antes de ser referenciado. A única forma de verificar se um objeto já foi definido é através do
código de erro (91).
Por exemplo:
Public Function IsSomething (ob As Object) As Long

Dim J as Long

Err.Clear

On Error Resume Next

If TypeOf ob Is TextBox Then

J=1

End If

Select Case Err.Number

Case 91

'error 91 = object not set

IsSomethig = false

Case 0

IsSomething = true

Case Else

'... outro erro ocorreu

End Select

On Error GoTo 0

End Function

160 - Depure simultaneamente o servidor OLE e a aplicação


Enviado por: Henrique Angelo

O VB4 não apenas permite a criação de servidores OLE, mas, também permite depurar (debug) o servidor
e a aplicação cliente ao mesmo tempo. Se você criar um servidor OLE remoto, altere a propriedade
Instancing para Creatable SingleUse. Isto tornará o debugging muito mais interessante.

Cada vez que a classe for chamada, a aplicação tentará criar outra instância do servidor. O servidor estará
rodando em tempo de desenho, e o VB não iniciará outra cópia de si mesmo para carregar o servidor
novamente. A solução, é, temporariamente, definir Instancing = Creatable MultiUse para uso nos testes.
Não se esqueça de voltar para Creatable SingleUse antes de compilar o servidor OLE.

161 - Passe nothing aos forms com cautela


Enviado por: Henrique Angelo
É uma boa idéia passar o valor nothing a variáveis de form para recuperar memória alocada pelo módulo.
Executando este recurso para um form já carregado, entretanto, irá colocar o módulo em um estado
confuso. Veja:
Form2.show
williamdsilva@aol.com.br 75

Set Form2 = nothing

Form2.show

MsbBox forms.count & " forms carregados"

Unload Form2

Unload Form2
A segunda linha do código tornou form2 nothing, mas o segundo use do form2.show irá mostrar uma
segunda instância do form2. A Forms Collection irá conhecer as duas instâncias, mas apenas uma será
descarregada (Unload Form2).

Para contornar este problema, em VB4, esteja certo que o form está descarregado. Não é possível executar
Set Me = Nothing. Mas, com a estrutura For Each (não existente no VB3) é possível se conseguir o Nothing,
no evento Form_Unload.
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

162 - Adicionando segurança a uma base de dados Jet


Enviado por: Henrique Angelo
Para dar segurança a uma base de dados Jet (.MDB), versão 2.5 (Access 2/VB3/VB4-16 bit) ou versão 3.0
(Access 7/VB4-32 bit), siga estes passos:

1) Use o Access Workgroup Administrator para criar um novo grupo de trabalho, com uma não nula
Workgroup ID.

2) Inicie o Access e altere a senha para o usuário default Admin.

3) Crie um novo usuário, adicione-o no grupo de Administração, com os privilégios de administrador.


Remova a conta Admin do grupo de administradores.

4) Reinicie o Access, conectando-se como novo usuário, e altere a senha.

5) Execute o Access Security Wizard (para o Access 2, copie de www.microsoft.com/accdev).

6) Crie o(s) usuários e o(s) grupo(s) de usuário, definindo seus privilégios.

7) Não defina nenhuma permissão para o Admin.

163 - Eliminando o IF quando possível


Enviado por: Henrique Angelo

Se você atribui true ou false para uma variável (ou propriedade), após testar certas condições, poderia
fazê-lo sem o IF. Veja:
If (age > 18 and sex = "M") and (NecessitaSeContigente = true ) Then ServicoMilitar = true
Pode substituir por:
ServicoMilitar = (age > 18 and sex = "M") and (NecessitaSeContigente)
Outro exemplo:
IF (age > 25 and Category = "M1") or (age > 35 and Category = "C1") or _

(Age > 45 and Category = "P1") then ExecuteDemissao


Poderia ser:
williamdsilva@aol.com.br 76

Dim condicao as Integer 'boolean

condição = (age > 25 and Category = "M1") or (age > 35 and Category = "C1")_ or (Age > 45 and Category
= "P1")

If condicao Then ExecuteDemissao

164 - Simplificando a condição de um IF


Enviado por: Henrique Angelo

Quando você escreve um comando IF (Se) assim:


If Category = "CM" or Category = "M2" or Category = "P1" or Category = "ZZ" then

ProcesseEmpregado

End If
Poderia simplificar para:
Dim ValidValues as string

ValidValues = "CM M2 P1 ZZ"

If (InStr(1, ValidValues, Category)) > 0 then

ProcesseEmpregado

End If
Isto torna o código mais rápido e mais fácil de ser entendido. Note que separei os valores com " " para não
aparecerem strings como "CMM2P1ZZ"; você poderá utilizar espaços ou outros separadores como vírgulas,
ponto-e-vírgulas etc.
Por Jaspreet Singh*
Notas de Redação (Charles A. Müller):
1) Este teste ainda aceitará "C", " P", "2 P" e outras expressões inválidas, por conterem o separador ou
terem tamanho inválido. Para corrigir esta falha, basta usar espaço (apenas) como separador e testar o
tamanho da categoria.

Category = trim(Category)

If (InStr(1, ValidValues, Category)) > 0 and Len(Category) = 2 Then

'...
2) Este truque pode ser usado para várias validações, como ValidValues = "abcdefghijlmnopqrstuvxz".
3) Outra forma, ainda mais fácil, é criar um pequeno Select Case, separando os valores válidos por
vírgulas:

Select Case Category

Case "CM", "M2", "P1", "ZZ"

ProcesseEmpregado

End Select

165 - TAB automático para o próximo campo


Enviado por: Henrique Angelo

Esta dica é útil para desenvolvimento de aplicações VB com a forma de edição de terminais 3270 (IBM
Mainframe). Quando o usuário termina de preencher um campo em um terminal 3270, o foco é
imediatamente transmitido para o próximo campo.
Sub Text1.KeyUp (keycode as integer, shift as integer)

If keycode > 47 and keycode < 123 then

If Len(Me.ActiveControl.Text) = (Me.ActiveControl.MaxLenght) then

Sendkeys "{TAB}"

End If
williamdsilva@aol.com.br 77

End If

End Sub

166 - Onde está o Beep?


Enviado por: Henrique Angelo
Este código elimina o beep quando se tecla ENTER ou TAB em uma text box que atingiu seu número
máximo de caracteres.
Sub Form_KeyPress (keyascii as integer)

If KeyAscii = 13 or KeyAscii = 9 Then

KeyAscii = 0

End If

End Sub

167 - Use o Code Profiler para depuração (debug)


Enviado por: Henrique Angelo
Algumas vezes, 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.

1) Faça uma cópia do seu fonte.

2) Selecione o add-in Code Profiler.

3) Selecione o(s) arquivo(s) de código a serem analisados.

4) Selecione a opção Line Hit Count.

5) Selecione o botão Add Profiler Code.

6) Compile (make EXE) o programa (MYAPP.EXE).

7) Execute o seu código com erro.

8) Volte ao Code Profiler e selecione View Results no menu File.

Veja a última linha que foi executada ao ocorrer o erro. Você terá que executar seu código em modo debug
enquanto olha os resultados do Code Profiler.

168 - Otimizando consultas no Jet 3


Enviado por: Henrique Angelo

Se você precisa analisar a performance de uma query (consulta) no Jet Engine 3.0 (banco .MDB), através
de um plano de execução de consultas, você deve adicionar esta chave de Registry e executá-la no
RegEdit.
\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.0\Engines\Debug
Para a nova chave Debug, adicione o nome JETSHOWPLAN (tudo maiúsculo) e valor ON. O Jet irá gerar um
arquivo chamado SHOWPLAN.OUT, que irá mostrar planos de execução de queries associados com sua
aplicação. Como estes arquivos podem se tornar muito grandes rapidamente, não se esqueça de alterar o
valor para OFF ao terminar.
Queries e bases de dados bem definidas irão gerar planos que, indicarão o uso de índices e/ou a tecnologia
Rushmore. Bases e consultas mal definidas exibem apenas uma leitura de tabela.

169 - Identificando um controle genérico


Enviado por: Henrique Angelo

Quando uma rotina pode trabalhar com muitos tipos de controles diferentes, a função TypeOF pode
detectar o tipo de controle em tempo de execução:
Function MyFunc (ctl as Control)
williamdsilva@aol.com.br 78

If TypeOf ctl Is TextBox Then

'...

ElseIf TypeOf ctl Is CommandButton Then

'...

'...

End If

End Function
Este código funciona em VB3 e VB4. A diferença é que no VB4, além de controles e forms, qualquer objeto
válido pode ser identificado. O VB4 adiciona ainda, a função TypeName que indica (numa string) o nome da
classe do objeto:
Function MyFunc (ctl as Control)

Dim sClassType As String

'typeName é novidade do VB4

sClassType = TypeName(ctl)

Select Case sClassType

Case "TextBox"

'...

Case "CommandButton"

'...

'case ...

End Select

End Function
Os nomes das classes de controle, no ambiente do VB, aparecem na Properties Window (janela de
propriedades, ao lado do nome do controle).

170 - Determinando a classe de qualquer objeto


Enviado por: Henrique Angelo

No VB4, o comando TypeOf trabalha com qualquer objeto válido. Exemplo:


'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.NumberOfLegs

ElseIf TypeOf YourObject Is CHouse Then

Print "Object Type: Casa"

Print "Número de portas: " & YourObject.NumberOfDoors

End If

'impressão das propriedades de mesmo nome

Print "Data de Venda: " & YourObject.Date

Print "Preço de Venda: " & YourObject.Price

'...

End Sub
williamdsilva@aol.com.br 79

171 - Conversão de Nulos


Enviado por: Henrique Angelo

Em consultas a bancos de dados, o retorno de uma variável, quando nula, poderá não ser 0 (numérico) ou
"" (string). Geralmente se resolve assim:
If Not IsNull(myrecordset.myfield) Then

myvar = myrecordset.myfield

Else

myvar = ""

'myvar = 0, no caso de numéricos

End If
Uma forma mais simples é-

myvar = "" & myrecordset.myfield

Ou

myvar = val(0 & myrecordset.myfield) ' para numéricos

172 - Uma história de três beeps


Enviado por: Henrique Angelo

Seus programas não estão executando instruções em VB4 como executavam em VB3? Tente isto , em
Qbasic, VB3 e VB4.
BEEP: BEEP: BEEP
Ao depurar com passo (F8), este mui complexo código, você irá ouvir três Beeps, exceto no VB4. No VB4,
palavras reservadas seguidas de dois pontos (:) são consideradas labels (rótulos de desvio).

Assim funciona:

Beep

Beep

Beep

E você ouvirá os tão esperados três beeps.


173 - Lembra-se do SWAP?
Enviado por: Henrique Angelo

Fiquei surpreso quando notei que no Visual Basic, o comando SWAP do Qbasic não havia sido
implementado. Na rotina abaixo, que usei para ordenar um arquivo, o SWAP é simulado com strings, mas
funciona com outros tipos de dado.
Private Sub Form_Load( )

Dim a,b As String * 4

Dim c As String * 4 ' variável para alternação (Swap)

a = "João"

b = "Francisco"

Debug.Print "Antes do swap: " & a & " " & b

c=a

a=b

b=c

Debug.Print "Após o swap: " & a & " " & b

End Sub
williamdsilva@aol.com.br 80

174 - Posicionando uma Common Dialog


Enviado por: Henrique Angelo
Ficou triste ao ler a documentação do VB, que dizia "Note: you cannot specify where a common dialog is
displayed" (você não poderá especificar onde é mostrada uma common dialog)? Então tente isto:

Inicie um novo form (que será usado apenas para isto) em vez de chamar a abertura do diálogo
diretamente do form principal.

(FrmDummy_OpenSaveAs.Hide)

Defina as propriedades Left e Top conforme desejar e inicie a common dialog deste form. No Windows 95
(VB 4-32 bits) , a common dialog irá aparecer na posição do form que a chamou. Como o form hide
(oculto), isto é imperceptível para o usuário.

176 - Criando senhas para banco de dados


Enviado por: Henrique Angelo

O Jet Engine 3 (exclusivo32 bits) inclui um novo sistema de segurança baseado em senhas de BD mais
complexas e mais seguras que o antigo modelo de grupos. Este sistema disponibiliza uma senha para
abertura da base de dados . Este sistema é mais simples de ser utilizado mas é facilmente comprometido,
pois, todos os usuários possuem a mesma senha. Entretanto, você poderá usar tanto o recurso de DB
Password (senha de BD) como o de workgroup (grupos), ao mesmo tempo (isto é, que dará mais
segurança).
Manipule uma DB Password no VB, usando o novo método NewPassword (database object), com códigos
como este:

Dim wrk As Workspace

Dim db As Database

Set wrk = DBEngine. Workspace(0)

Set db = wrk.OpenDatabase("MYDB.MDB",true)

'note que a base deve ser aberta como exclusiva

'alterando a senha atual (em branco) para "NewPass"

db.NewPassword "","NewPass

177 - Simplificando chamadas API através de funções próprias


Enviado por: Henrique Angelo

Algumas chamadas à função API (DLL) são bastante complexas. Uma dica é criar uma função de código VB
que chama a API. Assim, a complexidade da API só irá aparecer uma vez.

Por exemplo, a função GetPrivateProfileString que, captura uma configuração de arquivo INI.
Declare Function GetPrivateProfileString Lib "Kernel" (ByVal _

lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault _

As String, ByVal lpReturnedString As String, ByVal nSize As Integer, _

ByVal lpFileName As String) As Integer


A chamada da função ficaria assim:
Global Const Ini_File = App.path & "\Myapp.INI)

'...

Dim VA_LastUser

'chamada a API para capturar o conteúdo de "lastuser" na seção "options"

On Error GoTo Erro_INI

Dim VL_Sec As String, VL_Key As String, VL_Size As Integer

Dim VL_Return As String, VL_FileName As String


williamdsilva@aol.com.br 81

Dim VL_SizeHandle As Integer, VL_Valid As Integer

Dim Va_Msg As String

Const CL_Default = "" 'retorno no caso de não encontrar

VL_Sec = "options"

VL_Key = "lastuser"

VL_Size = 30

VL_Return = Space$(VL_Size) 'string a retornar

VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno

VL_FileName = Ini_File 'arquivo no formato INI

VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _

VL_Return, VL_SizeHandle, VL_FileName)

VA_LastUser = Left$(VL_Return, VL_Valid)

Exit Function 'ou Exit Sub

Erro_LeMeuINI:

VA_LastUser = CL_Default

Nota-se uma complexa e grande quantidade de código. A API não retorna a string procurada e sim um
buffer. O conteúdo é retornado por um argumento (!) e precisa ser formatado com o tamanho do buffer
(função left). Para eliminar todo este código a cada necessidade (cada campo INI) foi implementada uma
chamada assim:
Global Const Ini_File = App.path & "\Myapp.INI)

'...

Dim VA_LastUser

'chamada a API para capturar o conteúdo de "lastuser" na seção "options"

Global Const Ini_File = "MYAPP.INI"

...

VA_LastUser = FU_Le_MeuINI ("options", "lastuser", 30)


Abaixo, um exemplo de função "tradutora" de API:
Function FU_Le_MeuIni (VL_Sec As String, VL_Key As String, VL_Size As Integer) As String

'recebe nome da seção e do parágrafo e tamanho da string de retorno

'retorna valor encontrado (string) ou ""

'usa a constante Ini_File e

'a API (Windows 3.1 Kernel) GetPrivateProfileString

On Error GoTo Erro_LeMeuINI

Dim VL_Return As String, VL_FileName As String

Dim VL_SizeHandle As Integer, VL_Valid As Integer

Dim Va_Msg As String

Const CL_Default = "" 'retorno no caso de não encontrar

VL_Return = Space$(VL_Size) 'string a retornar

VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno

VL_FileName = Ini_File 'arquivo no formato INI


williamdsilva@aol.com.br 82

VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _

VL_Return , VL_SizeHandle, VL_FileName)

FU_Le_MeuIni = Left$(VL_Return, VL_Valid)

Exit Function

Erro_LeMeuINI:

FU_Le_MeuIni = CL_Default

Resume Next

End Function
A função usada como exemplo é do VB3, podendo ser usada em VB4 se sua aplicação for em 16 bits. Mas,
o conceito de criar funções "traduzidas" ou "facilitadas" de API é aplicável a qualquer versão do Visual
Basic.

178 - Melhorando as declarações API (II - a volta do SendMessage)


Enviado por: Henrique Angelo

Quando falava de SendMessage (veja dica anterior), lembrei de um outro truque que pode ser interessante
para ser incluído em seus hábitos de programação. Quando uso algumas mensagens em particular, o
argumento lParam é, na verdade, considerado uma combinação de dois valores (words) . A mensagem
EM_LINESCROLL pode rolar uma text box multilinha; a primeira word (low word) contém o número de
linhas para rolar verticalmente e a segunda (hight word), contém o número de linhas para rolar
horizontalmente.
'rola uma caixa de texto em "HO" linhas

'horizontalmente e "VE" linhas verticalmente

'obs.: isto não funciona corretamente

longValue& = HO * 65536 + VE

...

SUB_SendMessage Text1.hWnd, EM_LINESCROLL, 0, longValue


O código acima não trabalha corretamente se HO for positivo e VE for negativo.

A solução é dividir o número long de lParam em dois, na declaração


Declare Sub SUB_SendMessage2 Lib "User" Alias "SendMessage" (byVal hWnd as _ Integer , byVal
msg as Integer, byVal wParam as Any, byVal lParam1%,_ lParam2)
A chamada passa a ser:
SUB_SendMessage2 Text1.hWnd, EM_LINESCROLL, 0, HO, VE
Este truque funciona, pois um valor long integer na "pilha" corresponde a combinação de dois valores word
combinados.

179 - Mova e redimensione controles com precisão


Enviado por: Henrique Angelo

Ao desenhar um form, você pode utilizar mouse e teclado para obter melhor precisão. Esta dica serve
também para Access 2 e 7 (95).
A - Quando você desejar alterar o tamanho de um controle:

1. Selecione-o

2. Pressione SHIFT e use as teclas de navegação para alterar o tamanho.


B - Quando você desejar mover um controle:

1. Selecione-o

2. Pressione CTRL e use as teclas de navegação para alterar a posição.


Por Chris Kunicki, repassada por John Chmela (VB Developer's Network)*

Nota da Redação: Os autores informam que a dica (A e B) se aplica ao VB3, mas, não funciona.
Acrescentamos, ainda, alguns dados abaixo.
C - Evitando acidentes

1. O VB4 possui o recurso de trava (lock) de tamanho e posição em tempo de desenho. Selecione o(s)
williamdsilva@aol.com.br 83

controle(s) e clique no botão "cadeado", na barra de ferramentas.

2. O VB3 não possui o recurso de "cadeado", mas, é possível mover ou selecionar os controles com maior
cuidado (para alterar várias propriedades ao mesmo tempo, por exemplo). Basta selecionar, passando o
mouse no form, uma área em volta dos controles. Isto não se aplica a controles contidos em outros objetos
(como painéis, frames e picture boxes).
D - Maior precisão

Use os valores numéricos de tamanho e posição: left, top, height e width - correspondentes a x, y' (eixo y
do topo para baixo) , h (altura) e b (base), respectivamente - na Janela de Propriedades ou Janela de
Código. Esta tarefa é um pouco árdua, então, desenhe o controle com medidas aproximadas para depois,
ajustar, via digitação de valores.

180 - Alterações com Mid


Enviado por: Henrique Angelo

Você provavelmente já conhece a função e o comando Mid, que retorna uma substring com um número
específico de caracteres, ou seja, uma parte da string usada como parâmetro. Mas, você sabe como usar o
Mid para substituir caracteres no meio de uma string? O Mid é uma pequena excentricidade do VB, pois,
altera um de seus próprios argumentos. Mas, isto economiza uma série de instruções de concatenação,
observe:
Dim mystring as String

mystring = "SOME STRING"

If Mid(mystring, 2, 1) = "O" Then

Mid(mystring, 2, 1) = "A" ' substituindo caracter

End If

181 - Destacando uma linha em um DBGrid


Enviado por: Henrique Angelo

Para destacar uma linha no controle DBGrid, adicione o registro corrente à SellBookmarks Collection:
Private Sub DBGrid_RowColChange _

(LatRow As Variant, ByVal LasRow As Integer)

If Data1.RecordSet.RecordCount Then

DBGrid.SelBookmarks.Add _

Data1.RecordSet.Bookmark

End If

End Sub

182 - Mostra o nome que foi usado pelo usuário para se logar no Win95/NT
Enviado por: Henrique Angelo

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _

(ByVal lpBuffer As String, nSize As Long) As Long

gsUserId = ClipNull(GetUser())

Function GetUser() As String

Dim lpUserID As String

Dim nBuffer As Long

Dim Ret As Long

lpUserID = String(25, 0)
williamdsilva@aol.com.br 84

nBuffer = 25

Ret = GetUserName(lpUserID, nBuffer)

If Ret Then

GetUser$ = lpUserID$

End If

End Function

Function ClipNull(InString As String) As String

Dim intpos As Integer

If Len(InString) Then

intpos = InStr(InString, vbNullChar)

If intpos > 0 Then

ClipNull = Left(InString, intpos - 1)

Else

ClipNull = InString

End If

End If

End Function

183 - Movimentando um label pela tela


Enviado por: Henrique Angelo

Inicie um novo projeto, coloque um label(name=Label1) e um timer(name=Timer1).

Nas prorpiedades do timer coloque:


Interval = 1

Enabled = False
No Form_Load()

timer1.enabled = true

No Timer1_Timer()

While Label1.left <= 5000

Label1.left = label1.left + 2

wend

184 - Apagando todo o conteúdo de todos os campos texto


Enviado por: Henrique Angelo

'Essa rotina varre o formulário e apaga o conteúdo dos campos texto

Public Sub ClearTxt(NomeForm As Form)

Dim Controle As Control

For Each Controle In NomeForm.Controls

If TypeOf Controle Is TextBox Then Controle.Text = ""

Next Controle
williamdsilva@aol.com.br 85

End Sub

185 - Fechando todos os MdiForms abertos


Enviado por: Henrique Angelo

'Varre um MdiForm e fecha as janelas abertas

Sub CloseChild()

Dim i As Integer

While Forms.Count > 1

i = Forms.Count - 1

If Forms(i).MDIChild Then Unload Forms(i)

Wend

End Sub

186 - Abrindo o Bloco de Notas a partir de um programa


Enviado por: Henrique Angelo

1-Coloque um Command Button em um form

2-Coloque o seguinte nas declarações do form:


Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As
String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal
bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As
String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwAccess As Long, ByVal fInherit As Integer,
ByVal hObject As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long)
As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const SYNCHRONIZE = 1048576

Const NORMAL_PRIORITY_CLASS = &H20&

Private Type PROCESS_INFORMATION

hProcess As Long

hThread As Long

dwProcessId As Long

dwThreadId As Long

End Type

Private Type STARTUPINFO

cb As Long

lpReserved As String

lpDesktop As String
williamdsilva@aol.com.br 86

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

3-Agora coloque no Command1_Click:


Dim pInfo As PROCESS_INFORMATION

Dim sInfo As STARTUPINFO

Dim sNull As String

sInfo.cb = Len(sInfo)

success& = CreateProcess(sNull, "notepad.exe e:\anexis\vbpage\vbisland.html", ByVal 0&, ByVal 0&, 1&,


NORMAL_PRIORITY_CLASS, ByVal 0&, sNull, sInfo, pInfo)

MsgBox "Notepad has been started. Click OK to end it."

ret& = TerminateProcess(pInfo.hProcess, 0&)

ret& = CloseHandle(pInfo.hThread)

ret& = CloseHandle(pInfo.hProcess)

MsgBox "Notepad has been shut down."

187 - Usando UNLOAD e HIDE


Enviado por: Gerson Keiti Motoyama

Use o Hide para apenas esconder o formulário, sendo que a propriedade Visible do formulário recebe o
valor False.
Mas se não quiser mais utilizar os dados alterados no formulário pelo usuário, então use o Unload, que
estará realmente descarregando, e voltando aos valores padrões definido no código.

188 - Utilize o Registro do Windows


Enviado por: Gerson Keiti Motoyama

Armazene qualquer informação no registro do Windows, e depois retorne para ser utilizado no programa.

Por exemplo, para salvar o nome e n. de telefone do proprietário do programa, faça assim:
SaveSetting "MyApp","User", "Name", "Gerson"
williamdsilva@aol.com.br 87

SaveSetting "MyApp","User", "Tel", "12345678"


E para retornar este valor ao programa:
Nome = GetSetting("MyApp","User", "Name")

Telefone = GetSetting("MyApp","User", "Tel")

Se quiser excluir:
DeleteSetting "MyApp", "User"

189 - Deixe seu programa menor


Enviado por: Gerson Keiti Motoyama

Algumas dicas para diminuir o tamanho do seu arquivo compilado:

- Evite deixar espaços (caracteres) no código.

- Utilize o 'With Statement' para não ter que repetir nomes de objetos no código.

- Os comentários, embora sejam úteis, são uns ocupadores de espaço. Portanto, se tiver muito deles,
quando for compilar, retire todos os comentários e salve então em um *.exe. Mas não salve no projeto.

- Se seu código possuir estruturas de controle multiniveladas, retire-o ao compilar. Afinal, para o programa,
não tem diferença nenhuma. Mas não salve no projeto.

190 - Como detectar erros inexplicáveis?


Enviado por: Gerson Keiti Motoyama

É comum as pessoas, para quem vc destrubuiu um programa, receber mensagens de erros do tipo: Run-
time error, e em seguida ser finalizado sem saber a origem em que causou o erro. Para isso faça o
programa detectar o erro (embora não aponte específicamente) dessa forma:
Insira o seguinte código no INÍCIO da procedure em que quiser detectar:
On Error GoTo Erro:

Em seguida no final da procedure, coloque:


MsgBox "O (Nome do programa) causou um erro desconhecido. Informe as _

seguintes 'instruções de erro' ao desenvolvedor :" & Chr(10) & _

Err.Number & Chr(10) & Err.Description & Chr(10) & Err.Source & _

Chr(10) & App.Revision, 16, "Erro Desconhecido"

191 - Como saber se o programa está rodando no Windows95 (ou em suas futuras versões)?
Enviado por: Gerson Keiti Motoyama

Insira no módulo .BAS, o seguinte:


Declare Function GetWinPlatform Lib "VB5STKIT.DLL" () As Long
Agora chame a função assim:
Function IsWindows95() As Boolean

Const dwMask95 = &H2&

If GetWinPlatform() And dwMask95 Then

IsWindows95 = True

Else

IsWindows95 = False

End If

End Function
williamdsilva@aol.com.br 88

192 - Usando o CHR() para ocultar "mensagens"


Enviado por: Gerson Keiti Motoyama
Para quem não sabe, infelizmente, é possível "espiar", ou até mesmo "alterar" o código de um executável
(somente as "mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usuário
de nível intermediário. Para que isso não ocorra, ou pelo menos para dificultar alguma alteração, quando
quiser escrever uma mensagem, por exemplo do tipo:
msgbox "Olá, blz?"

Utilizando o sintaxe: Chr(charcode), faça o seguinte:


msgbox chr(79) & chr(108) & chr(225) & chr(44) & chr(160) & chr(98) & chr(108) & chr(122) & chr(63)

Obs: Consulte os valores para o charcode no Help do VB:

Character Set (0-127)/(128-255)

193 - Criar Atalhos no Menu Iniciar usando DDE


Enviado por: Antonio f. Marques Junior

Uma maneira fácil de criar atalhos no menu iniciar é usando os comandos DDE usados anteriormente no
Windows 3.1, que também vale para Win95. Os comandos são:
AddItem, CreateGroup, DeleteGroup, DeleteItem, ShowGroup, ReplaceItem, Reload.

Por exemplo, para se criar uma pasta no menu iniciar, e um atalho dentro dela, faz-se o seguinte:

1. Crie um Form adicione uma TextBox e um CommandButton.

2. No evento Load do Form, escreva o código:


Sub Form_Load

Text1.LinkTopic = "Progman|Progman"

Text1.LinkMode = 2

End Sub
3. No evento Click do Botão, escreva o código:
Sub Command1_Click

cmd = "[CreateGroup(Teste)]"

cmd = cmd & "[AddItem(c:\windows\calc.exe, Calculadora)]"

Text1.linkexecute cmd

Se por acaso você quer exibir uma pasta do menu Iniciar existente defina a string cmd como:
cmd = "[showgroup(" & "Acessórios" & ",1" & ")]"

Se quiser que apareça Minimizada, mude o parâmetro para 2.

194 - Arquivo que guarda as Preferencias do Programa


Enviado por: Anderson Calixto

Faz um tempo que tive difículdade em fazer um programa que guardasse as suas preferencias (local do
banco de dados, cor do form, usuários registrados, e local das imagens, etc). Aí descobri que poderia fazer
um arquivo com a função "open" e assim poderia estar gravando e alterando a qualquer momento as
preferencias do meu programa.
1 - Crie um modulo.bas onde vc vai declarar uma variável de Registro:

'Cria uma varial de gravação

Type record

dbLocalFile As String * 200 'Variavel onde será guardada o local do Banco de Dados

vRegistroDoUsuario As String * 40

vCorDeFundo As String * 10

vImagemDeFundo as String * 200

End Type
williamdsilva@aol.com.br 89

Global vPreferencias As record

2- Sub Rotina Para Gravar as Informações


A=FreeFile

Open "preferencias.dat" For Random As #A Len = Len(vPreferencias) 'Abre o arquivo

vPreferencias.dbLocalFile = RTrim(txtLocalDoBanco.Text)

vPreferencias.vRegistroDoUsuario = RTrim(txtNome.Text)

vPrefetencias.vCorDeFundo = RTrim(txtCorDeFundo.Text)

vPrefetencias.vImagemDeFundo = RTrim(txtImagemDeFundo.Text)

Put #A, 1, vPreferencias ' Faz a Gravaçao do arquivo.

Close #A

3- Sub Rotina Para Ler as Informações


A = FreeFile

Open vArquivo For Random As #A Len = Len(vPreferencias) 'Abre o arquivo

Get #A, 1, vPreferencias ' Faz Leitura do arquivo.

txtLocalDoBanco.Text = RTrim(vPreferencias.dbLocalFile)

txtNome.Text = RTrim(vPreferencias.vRegistroDoUsuario)

txtCorDeFundo.Text = RTrim(vPrefetencias.vCorDeFundo)

txtImagemDeFundo.Text = RTrim(vPrefetencias.vImagemDeFundo)

Close #A

195 - Verificar precisão a resolução do monitor


Enviado por: Anderson Calixto

É muito simples a rotina que verifica com precisão a resolução do monitor para VB4.0 e VB 5.0 usando o
Sistema API:
'Declaração da Função de busca da Resolução
Declare Function GetSystemMetrics Lib "User32" (ByVal nIndex As Integer) as Integer

Sub Form_Resize( )

dim xResolucao As Integer

dim yResolucao As Integer

xResolucao = GetSystemMetrics(0)

yResolucao = GetSystemMetrics(1)

If xResolucao < 1024 and yResolucao < 768 Then

'Rotina que será ativada ao verificar que a resolução do monitor é menor que
1024x768

End If

End Sub

196 - Video .AVI


Enviado por: Felipe Maion Garcia

Como visualizar um vídeo .AVI em tela cheia.


williamdsilva@aol.com.br 90

A função API mciSendString serve para manipular recursos de multimidia, como visualização de vídeos
.AVI, tocar sons MIDI e .WAV. Em relação aos vídeos, pode-se, ainda, visualizá-los em tela cheia. Para obter
este efeito, siga os passos a seguir :

1 - Declare a função mciSenString em um módulo de código:

Declare Function mciSendString lib "MMSystem" (byval lpstrCommand$, byval lpstrReturnStr as Any, Byval
wReturnLen%, byval hCallBack%) as Long

2 - No evento Load do form, escreva o seguinte código :


arquivo$ = InputBox ("Digite o caminho completo e o nome do arquivo a ser visualizado:")

comando$ = "play " & arquivo$ & " fullscreen"

x& = mciSendString (comando$, 0&, 0, 0&)

Rode o programa. Assim que ele for carregado aparecerá uma caixa onde você deverá o nome e o caminho
completo do arquivo .AVI a ser visualizado.

197 - Janela de Sobre


Enviado por: Julio Gavioli

Esta API é muito interessante: ShellAbout. Com ela vc pode abrir a janela padrao de 'sobres' do Windows.

Nas declaracoes gerais vc coloca(se vc colocar em um modulo, remova o "Private"):


Private Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" _

(ByVal hWnd As Long, ByVal szApp As String, ByVal szOtherStuff _

As String, ByVal hIcon As Long) As Long

Esta funcao pede 4 parametros:

1) Handle da janela

2) Nome do aplicativo

3) Algum Oba-Oba que vc queira colocar

4) Um icone

Ex.:
ShellAbout Form1.hWnd, "Meu Programa", "Desenvolvido por: Mim", Form1.Icon
Obs.: vc pode utilizar no ultimo parametro uma imagem(tem que ser no formato .ico) que esteja em um
objeto Picture ou Image. Caso vc coloque um valor nulo, a funcao ira colocar o icone padrao do Windows.

198 - Configurar Porta


Enviado por: Julio Gavioli
Seria muito legal se tivessemos uma area so para API!!

Para vc configurar uma das portas do seu computador, vc precisa utilizar uma API: ConfigurePort(Declare
Function ConfigurePort Lib "winspool.drv" Alias "ConfigurePortA" (ByVal pName As String, ByVal hWnd As
Long, ByVal pPortName As String) As Boolean).

Ela pede 3 parametros:

1) Nome do servidor

2) Handle da janela

3) Nome da porta
Ex.:
ConfigurePort "", Form1.hWnd, "COM1"

Substitua "COM1" pela porta que deseja configurar!

Para certificar se a funcao funcionou, verifique se ela retornou uma valor igual a 1 ou True.

199 - Funções práticas


Enviado por: Sirlon Farnei J. Oliveira
williamdsilva@aol.com.br 91

' Uma função que formata CEP e um If sem um End If


Public Function FormataCEP(Q_Cep As String) As String

FormataCEP = IIf(Len(Q_Cep) > 7, Format(Q_Cep, "@@@@@-@@@"), Q_Cep)

End Function

' Uma função que formata CIC e outro exemplo de If


Public Function FormataCIC(Q_Cic As String) As String

FormataCIC = IIf(Len(Q_Cic) > 11, _

Format(Q_Cic, "@@.@@@.@@@/@@@@-@@"), _

Format(Q_Cic, "@@@.@@@.@@@-@@"))

End Function

' Uma função que testa entrada de teclado para somente números
Public Function Testa_NumAbs(KeyNum) As Integer

' Permite a digitação do BackSpace

If KeyNum = 8 Then

Testa_NumAbs = (KeyNum)

Exit Function

End If

Testa_NumAbs = IIf(KeyNum < 48 Or KeyNum > 57, 0, KeyNum)

End Function

' Uma função que testa entrada de valores ou percentuais

(funciona em conjunto com a função Testa_NumAbs)


Public Function Testa_Moeda(KeyAscii) As Integer

' Permite a digitaçao do ponto como separador decimal

Testa_Moeda = IIf(KeyAscii = 46, KeyAscii, Testa_NumAbs(KeyAscii))

End Function

' Uma função que limpa campos formatados com CIC, CEP e outros
Public Function LimpaCampo(Q_Campo) As String

Dim CampoLimpo As String, X As Integer

For X = 1 To Len(Q_Campo)

If Mid(Q_Campo, X, 1) <> "/" And Mid(Q_Campo, X, 1) <> "-" And _

Mid(Q_Campo, X, 1) <> "." And Mid(Q_Campo, X, 1) <> ":" And _

Mid(Q_Campo, X, 1) <> "," And Mid(Q_Campo, X, 1) <> "_" And _

Mid(Q_Campo, X, 1) <> "," Then CampoLimpo = CampoLimpo & Mid(Q_Campo, X, 1)

Next X

LimpaCampo = IIf(Len(CampoLimpo) = 0, "", CampoLimpo)

End Function

' Uma função que prepara um campo para ser repassado para um Mainframe
Public Function Texto_MainFrame(QTexto As String) As String
williamdsilva@aol.com.br 92

Dim y As Integer

For y = 1 To Len(QTexto)

Select Case Mid(QTexto, y, 1)

Case "á", "ã", "â", "Á", "Ã", "Â"

Mid(QTexto, y, 1) = "A"

Case "ç", "Ç"

Mid(QTexto, y, 1) = "C"

Case "é", "ê", "É", "Ê"

Mid(QTexto, y, 1) = "E"

Case "í", "î", "Í", "Î"

Mid(QTexto, y, 1) = "I"

Case "ó", "õ", "ô", "Ó", "Õ", "Ô"

Mid(QTexto, y, 1) = "O"

Case "ú", "û", "Ú", "Û"

Mid(QTexto, y, 1) = "U"

End Select

Next

Texto_MainFrame = UCase(QTexto)

End Function

' Uma função que monta uma grade utilizando o MsFlexGrid

' Devem ser passados como parametros o Recordset e o Objeto da grade

' Os títulos das colunas assim bem como o seu tamanho serão obtidos

' diretamente no banco de dados

'

Public Sub Faz_Grade(Rs_X As Recordset, Q_Grade As Object)

Dim Linha, Coluna As Integer

Dim DaoRs As DAO.Property

' Define o numero de colunas da grade

Q_Grade.Cols = Rs_X.Fields.Count

' Monta o cabeçalho da grade

Q_Grade.Rows = 1

Q_Grade.Row = 0

For Coluna = 0 To Q_Grade.Cols - 1

Q_Grade.Col = Coluna

For Each DaoRs In Rs_X.Fields(Coluna).Properties

If DaoRs.Name = "Caption" Then


williamdsilva@aol.com.br 93

Q_Grade.Text = DaoRs.Value

Q_Grade.ColWidth(Coluna) = 99 * IIf(Len(Q_Grade.Text) > Rs_X.Fields(Coluna).Size, Len(Q_Grade.Text),


Rs_X.Fields(Coluna).Size) + 200

End If

Next

Next

If Rs_X.RecordCount = 0 Then

Q_Grade.Rows = 2

Exit Sub

End If

Rs_X.MoveFirst

Do Until Rs_X.EOF

Coluna = 0

Linha = Rs_X.AbsolutePosition + 1

With Q_Grade

.Rows = Linha + 1

.Row = Linha

For Coluna = 0 To .Cols - 1

.Col = Coluna

.Text = IIf(Not IsNull(Rs_X.Fields(Coluna)), Rs_X.Fields(Coluna), "")

Next

End With

Rs_X.MoveNext

Loop

End Sub

' Uma função para contar os registros de uma tabela

' O nome da tabela deve ser passado como parâmetro e dever ser uma string
Public Function ContaRegistros(QTab As String)

Dim RsQ As Recordset

Dim Sql As String

Sql = "SELECT Count(*) AS QuantReg FROM " & QTab

Set RsQ = CobDB.OpenRecordset(Sql, dbOpenSnapshot)

ContaRegistros = RsQ!QuantReg

RsQ.Close

End Function

'
williamdsilva@aol.com.br 94

' As funções a seguir trabalham em conjuto e calculam dígitos

' verificadores nas bases 10 e 11, incluindo CGC, CPF

'

' Função de direcionamento para teste de CIC

'

Public Function Valida_CIC(Q_Cic As String) As Boolean

Q_Cic = LimpaCampo(Q_Cic)

Select Case Len(Q_Cic)

Case Is < 11

Valida_CIC = False

Case Is > 14

Valida_CIC = False

Case 12 To 14

Valida_CIC = ValidaCGC(Q_Cic)

Case Else

Valida_CIC = ValidaCPF(Q_Cic)

End Select

End Function

' Testa digito verificador do CPF


Public Function ValidaCPF(CPF As String) As Boolean

Dim Digito, X, Soma, Resto As Integer, Regua As Variant

If Len(Trim(CPF)) < 11 Then

ValidaCPF = False

Exit Function

End If

' Calcula o primeiro dígito verificador

Regua = Array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2)

For X = 1 To 9

Soma = Soma + (Regua(X) * Mid(CPF, X, 1))

Next X

Resto = Soma Mod 11

Digito = IIf(Resto = 0 Or Resto = 1, "0", Trim(11 - Resto))

' Calcula o segundo dígito verificador

Soma = 0

Resto = 0

For X = 0 To 9

Soma = Soma + (Regua(X) * Mid(CPF, X + 1, 1))


williamdsilva@aol.com.br 95

Next X

Resto = Soma Mod 11

Digito = Digito + IIf(Resto = 0 Or Resto = 1, "0", Trim(11 - Resto))

ValidaCPF = IIf(Mid(CPF, 10, 2) <> Digito, False, True)

End Function

' Testa digito verificador do CGC


Public Function ValidaCGC(CGC As String) As Boolean

' Valida primeiro digito

ValidaCGC = TestaDig(Left(CGC, 13), 11)

' Valida segundo digito

If ValidaCGC = True Then ValidaCGC = TestaDig(Trim(CGC), 11)

End Function

' Função que testa outros dígitos verificadores

' O dado a ser testado e a base desejada devem ser passados como parâmetro
Public Function TestaDig(Q_Dado As String, Q_Base As Integer) As Boolean

If Q_Base = 10 Then

' Testa dígito na base 10

TestaDig = IIf(Base_10(Left(Trim(Q_Dado), Len(Trim(Q_Dado)) - 1)) <> Right(Trim(Q_Dado), 1), False,


True)

ElseIf Q_Base = 11 Then

' Testa dígito na base 11

TestaDig = IIf(Base_11(Left(Trim(Q_Dado), Len(Trim(Q_Dado)) - 1)) <> Right(Trim(Q_Dado), 1), False,


True)

End If

End Function

' Calcula dígito no módulo 10


Public Function Base_10(Q_Dado) As String

Dim DadoCalc, Peso, Soma, Resto, X As Integer, Regua As String

DadoCalc = LimpaCampo(Q_Dado)

Peso = 2

For X = Len(DadoCalc) To 1 Step -1

Regua = Regua + Trim((Mid(DadoCalc, X, 1) * Peso))

Peso = IIf(Peso = 1, 2, 1)

Next X

X=1

For X = 1 To Len(Regua)

Soma = Soma + Val(Mid(Regua, X, 1))

Next X

Resto = Soma Mod 10


williamdsilva@aol.com.br 96

Base_10 = Right(Trim(10 - Resto), 1)

End Function

' Calculo do digito modulo 11


Public Function Base_11(QNumero As String) As String

Dim Numero, i, Produto, Multiplicador, Digito As Integer

Numero = Trim(QNumero)

' Calcula digito do modulo 11

Multiplicador = 2

For i = Len(Numero) To 1 Step -1

Produto = Produto + Val(Mid(Numero, i, 1)) * Multiplicador

Multiplicador = IIf(Multiplicador = 9, 2, Multiplicador + 1)

Next

' Exceção

Digito = 11 - Int(Produto Mod 11)

Digito = IIf(Digito = 10 Or Digito = 11, 0, Digito)

Base_11 = Trim(Str(Digito))

End Function

Qualquer sugestão para melhorias das funções acima ou dúvidas com relação ao uso, poderão ser
enviadas para o meu e-mail sirlec@gold.com.br ou pelo
fone abaixo.

200 - Programa com ícone animado


Enviado por: Henrique Angelo

Crie um novo projeto, coloque no Form uma ImageList, coloque os ícones da animação nesta mesma
Imagelist.

Coloque um Timer.

Na Propriedade Form_Load() coloque:

Set Form1.icon = ImageList1.ListImages(1).Picture

Na propriedade Timer1_Timer() coloque:

If Form1.icon = ImageList1.ListImages(1).Picture Then

Set Form1.icon = ImageList1.ListImages(2).Picture

Exit Sub

End If

If Form1.icon = ImageList1.ListImages(2).Picture Then

Set Form1.icon = ImageList1.ListImages(1).Picture

Exit Sub

End If

No Timer1, coloque um intervalo de 100.

201 - Título Animado


Enviado por: Henrique Angelo
williamdsilva@aol.com.br 97

Coloque um Timer no form com intervalo de 1.

No Form_Load coloque:
Form1.caption = "T"
No Timer1_Timer() coloque:
If Form1.caption = "T"

form1.caption = " e"

If Form1.caption = " e"

form1.caption = " s"

If Form1.caption = " s"

form1.caption = " t"

If Form1.caption = " t"

form1.caption = " e"

If Form1.caption = " e"

form1.caption = "T"

endif

202 - Relatórios via código-quebre uma string em x linhas e por n colunas


Enviado por: Mauricio Cunha

Caros amigos, para aqueles que utilizam relatórios programados aí uma dica de como deve ser feito para o
relatório ser impresso:
Sub parag()
'====================================================================
=========
'Cria um parágrafo, para utilizar basta jogar o texto e NL entre os campos
'====================================================================
=========
NL = Chr(13) + Chr(10)
End Sub
Function QuebrarLinhas(ByVal S As String, N As Integer) As String
'====================================
'Esta função alinha o String "s" em linhas de no máximo n caracteres(colunas)
'São utilizadas a função Token e a sub Parag
'====================================
parag
Dim L As String
Dim R As String
Dim P As String
L = ""
R = ""
Do While S <> ""
P = Token(S)
If P = NL Then
R = R & L & NL
L = ""
ElseIf Len(L) + Len(P) > N Then
R = R & L & NL
L=P
Else
L = L & IIf(L = "", P, " " & P)
End If
If S = "" Then
R=R&L
End If
Loop
QuebrarLinhas = R
End Function
Private Function Token(S As Variant) As String
'====================================
williamdsilva@aol.com.br 98

'Esta função quebra as linhas com divisores


'====================================
Dim separadores As String: separadores = "<>/\ " & Chr(13)
Dim divisores As String: divisores = ",;.:!" & Chr(10)
Dim X As Integer
Dim R As String
S = LTrim(S)
X=1
Do
If InStr(1, separadores, Mid$(S, X + 1, 1)) Or InStr(1, divisores, Mid$(S, X, 1)) Then
Exit Do
End If
X=X+1
Loop Until X >= Len(S)
R = Left(S, X)
S = Right(S, Len(S) - Len(R))
Token = R
End Function

Para chamar a função, basta utilizar:


(...)
DETALHE = DETALHE & "Expectativas..: "
Printer.Print DETALHE
TEXTO = IIf(IsNull(RS!EXPEC), "", UCase(RS!EXPEC))
S = TEXTO
c = QuebrarLinhas(TEXTO, 115)
If S = "" Then
Expectativa = "[Nenhuma]"
Else
Expectativa = Expectativa + c
End If
Printer.Print Expectativa

203 - Localizando uma rotina perdida


Enviado por: Cláudio Rocha
Vai aí uma dica simples
Inclua mensagens entre as linhas do seu programa, para identificar um loop, rotina, ou erro não localizado.
Assim o mesmo pode ser monitotado.

EX: msgbox "ERRO 1"

204 - Como Executar Um Aplicativo .EXE Através de Um Command Button


Enviado por: Anderson da S. Nogueira
Coloque em Command1_Click Isso:

Shell "Local do .Exe, Incluindo o Drive e Pastas !!!)

205 - Parametros iniciais VB5


Enviado por: Fabio F. Moreirao
Para fazer com que um programa receba parâmetros externos, use a funcão 'command' no Form_Load. Ex:

Dim sParametro as String

sParametro = Command

206 - Reiniciando o Computador através do seu programa ( BOOT )


Enviado por: Paulo Costa
No Modulo ( General) adicione a seguinte linha :

Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Essa linha seguinte Vai dar o Boot, coloque a em um botão por exemplo :
williamdsilva@aol.com.br 99

Call ExitWindowsEx(2, 0)

207 - Microsoft Internet Transfer Protocol


Enviado por: marcio fritsch
Bem, minha sugestão da transferência automatizada via ftp é o seguinte:

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.mercur.com.br/home/user/mercur/usuario.txt"
*intFile = FreeFile()
*bData() = Inet1.OpenURL(strURL, icByteArray)
*Open "C:\usuario.txt" For Binary Access Write As #intFile
*Put #intFile, , bData()
*Close #intFile
'***************************************************
'Além disso, crie no inet1:
'esse procedimento faz com que o arquivo seja
'copiado integralmente.
'***********************************************
Private Sub Inet1_StateChanged(ByVal State As Integer)
On Error GoTo fim_anormal2
Select Case State
Case icError, icDisconnected
MsgBox "Erro na comunicação --> " & Err.Description
GoTo Fim_a
Case icResponseReceived ' 12
Dim vtData As Variant ' Data variable.
Dim strData As String: strData = ""
Dim bDone As Boolean: bDone = False
vtData = Inet1.GetChunk(1024, icString)
Do While Not bDone
strData = Data & vtData
vtData = Inet1.GetChunk(1024, icString)
If Len(vtData) = 0 Then
bDone = True
End If
Me.Text1 = Me.Text1 + 1
If Me.Text1 > 100 Then
Me.Text1 = 1
End If
ProgressBar1.Value = Me.Text1
Dim TempoDePausa, Início, Fim, TempoTotal
TempoDePausa = 1 ' Define a duração.
Início = Timer ' Define a hora inicial.
Do While Timer < Início + TempoDePausa
DoEvents ' Submete-se a outros processos.
Loop
Fim = Timer ' Define a hora final.
TempoTotal = Fim - Início ' Calcula o tempo total.
Loop
End Select
GoTo Fim_a
fim_anormal2:
Dim a
a = MsgBox("Erro de copia! " & Err.Description, vbCritical, "Erro")
Fim_a:
End.

208 - Gravando e Reutilizando informacões no registry VB5


Enviado por: Fabio F. Moreirao
Você pode manipular suas informacões que ficam armazenadas banco de dados do Windows. Ex:

Para salvar informações:


williamdsilva@aol.com.br 100

Dim sValor as String

SaveSetting "Nome da Aplicacao", "Secao", Chave", sValor

Para recuperar informações 'sValor receberá o retorno':

Dim sValor as String

sValor = GetSetting(AppName:="Nome daAplicacao", section:="Secao", Key:="Chave")

Para excluir informações:

DeleteSetting "Nome da Aplicacao", "Secao", "Chave"

Obs: Se você informar apenas o Nome da aplicacão com a Secão todas as Chaves serão excluídas

209 - Mapear unidade de rede


Enviado por: Fabio P. Araújo

Mapear uma unidade de rede;

Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal _

lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName _

As String) As Long

Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" _

(ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName _

As Long) As Long

Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _

(ByVal lpszName As String, ByVal bForce As Long) As Long

Dim Caminho As String, Unidade as String

Caminho = "\\Computador\Caminho"

Unidade = "I:"

'Realiza conexão

WNetAddConnection Caminho , "Se tiver senha, digite á aqui", unidade

'Consulta caminho de uma determinada conexão, _

'neste caso, na variável caminho será armazenado o local do caminho _

'atual ref. a unidade

WNetGetConnection Unidade, Caminho, 255)

'Desconecta

WNetCancelConnection Unidade, True

210 - Saber qual o nome do Usuário atual e da Máquina


Enviado por: Fabio Pereira Araújo

Para vc verificar qual o usuário atual que logou no windows, basta criar um módulo e adcionar o seguinte:

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As
Long) As Long
williamdsilva@aol.com.br 101

'Depois, crie a variáve usuário

Dim Usuario As String

Usuario = Space(256)

GetUserName Usuario, 256

'Na variável usuário estará guardado o nome do usuário.

'Para vc verificar qual o nome da máquina atual;

'No módulo coloque

Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String,
nSize As Long) As Long

Dim maquina As String

maquina = Space(30)

GetComputerName maquina, 30

'Na variável maquina estará guardado o nome do computador.

211 - Travar Ctrl+Alt+Del


Enviado por: Fabio Pereira Araújo

Travar pressionamento das teclas Ctrl + Alt + Del:

Private Const SPI_SCREENSAVERRUNNING = 97&

Private Declare Function SystemParametersInfo Lib "User32" Alias "SystemParametersInfoA" _

(ByVal uAction As Long, ByVal uParam As Long, _

lpvParam As Any, ByVal fuWinIni As Long) As Long

Dim lngRet As Long

Dim blnOld As Boolean

'Para desabilitar estas teclas:

lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, _

True, blnOld, 0&)

'Para abilitar:

lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, blnOld, 0&)

212 - Calculo do digitos de CGC e CPF


Enviado por: Antonio CArlos e Carlos Gama

Vimos uma função de calculo digito para controle de CPF e CGC muito extensa;
Temos a mesma função mais simples para ler.

Abaixo segue o Código:

Public Function Calc_CGC(VALOR As String) As Boolean


Dim Mult1 As String
Dim Mult2 As String
Dim dig1 As Integer
Dim dig2 As Integer
Dim X As Integer
Mult1 = "543298765432"
williamdsilva@aol.com.br 102

Mult2 = "6543298765432"
For X = 1 To 12
dig1 = dig1 + (Val(Mid$(VALOR, X, 1)) * Val(Mid$(Mult1, X, 1)))
Next
For X = 1 To 13
dig2 = dig2 + (Val(Mid$(VALOR, X, 1)) * Val(Mid$(Mult2, X, 1)))
Next
dig1 = (dig1 * 10) Mod 11
dig2 = (dig2 * 10) Mod 11
If dig1 = 10 Then dig1 = 0
If dig2 = 10 Then dig2 = 0
Calc_CGC = True
If dig1 <> Val(Mid$(VALOR, 13, 1)) Then Calc_CGC = False
If dig2 <> Val(Mid$(VALOR, 14, 1)) Then Calc_CGC = False
End Function
Public Function Calc_CPF(VALOR As String) As Boolean
'Inicializa variaveis
Dim dig1 As Integer
Dim dig2 As Integer
Dim Mult1 As Integer
Dim Mult2 As Integer
Dim X As Integer
Mult1 = 10
Mult2 = 11
For X = 1 To 9
dig1 = dig1 + (Val(Mid$(VALOR, X, 1)) * Mult1)
Mult1 = Mult1 - 1
Next
For X = 1 To 10
dig2 = dig2 + (Val(Mid$(VALOR, X, 1)) * Mult2)
Mult2 = Mult2 - 1
Next
dig1 = (dig1 * 10) Mod 11
dig2 = (dig2 * 10) Mod 11
If dig1 = 10 Then dig1 = 0
If dig2 = 10 Then dig2 = 0
Calc_CPF = True
If Val(Mid$(VALOR, 10, 1)) <> dig1 Then Calc_CPF = False
If Val(Mid$(VALOR, 11, 1)) <> dig2 Then Calc_CPF = False
End Function

Modo de uso:
x = calc_CPf(11111111111)
if x = true then msgbox "CPF Correto"
x = Calc_CGC(11111111111111)
if x = true then msgbox "CGC Correto"

213 - Diretorio da App


Enviado por: Death Angel

Para vc abrir um programa que esteja no mesmo diretório que o seu projeto, sem ter que especificar um
diretório para ele, é soh' fazer o seguinte comando!!
'Abre no mesmo diretório
Shell (".\nome_do_programa.xxx")
'Fim da String

214 - Forçando a caixa de texto a ler somente Valores Numéricos


Enviado por: Klayton Marcio Fratoni
No Módulo crie uma variavel pública chamada - Tecla.

public tecla as integer


williamdsilva@aol.com.br 103

Na propriedade da caixa de texto ( text3 ), deixe a "text = 0".

'****

Private Sub Text3_GotFocus()

Text3.SelStart = 0

Text3.SelLength = Len(Text3)

End Sub

'****

Private Sub Text3_Change()

If Text3.Enabled = True Then

If Tecla = 0 Then

Text3 = Val(Text3)

End If

Tecla = 0

Text3.SelStart = Len(Text3)

End If

End Sub

'****

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

If KeyCode = 96 Or KeyCode = 110 Then

Tecla = 1

End If

End Sub

215 - Abrindo arquivos com senha


Enviado por: Marcos Sixel
Após algum tempo sempre recebendo a mensagem
senha inválida no VB consegui algo no
mínimo interessante. Só faltava eu especificar
os padrões default...

set base = opendatabase("tal.mdb",,,";PWD=SENHA")

' sempre dava errado :(

set base = opendatabase("tal.mdb",false,false,";PWD=SENHA")

' funciona. :o)

Detalhe... os valores false são default :)

Espero ter ajudado alguém...

216 - Como impossibilitar que o form seja fechado.


Enviado por: Ricardo

Ele só é fechado se o micro é renicializado, isso fui eu que descobri, e é bem simples:

Private Sub Form_Unload(Cancel As Integer)


williamdsilva@aol.com.br 104

Dim ReAbre as string

ReAbre = Shell("Nome do Programa em EXE",1)

End Sub

OBS: Atenção para que de certo, você precisa transformar o Form em exe, e coloca-lo no comando shell
explicado anteriormente.

217 - Verifica se o programa já está aberto


Enviado por: Fernando Bettine

No load do formulário adicionar a linha de comando abaixo:


Private Sub Form_Unload(Cancel As Integer)
If App.PrevInstance Then

MsgBox "O sistema já está aberto."

Unload Me

End If

218 - Limpando strings de funções API


Enviado por: Gregório V. Dettmann

Private Sub Form_Unload(Cancel As Integer)


'Envie a string retornada de uma função API como por exemplo GetWindowsDirectoryA para essa função e ela
retornará uma string limpa.

Function SpaceCut(ByVal strString As String) As String

Dim intZeroPos As Integer

intZeroPos = InStr(strString, Chr$(0))

If intZeroPos > 0 Then

StripTerminator = Left$(strString, intZeroPos - 1)

Else

StripTerminator = strString

End If

End Function

219 - Criptografar e Descriptografar Senhas de seu Programa


Enviado por: Klayton Marcio Fratoni

Criptografar e Descriptografar é usado geralmente para segurança nos programas, se você guarda no seu
bando de dados as senhas do sistema, qualquer pessoa pode acessa-ló ( por exemplo utilizando o Access )
.
No módulo ( .bas ), crie uma variável "SENHA" tipo String.
Private Sub Form_Unload(Cancel As Integer)
Global Senha As String

Sugiro que as rotinas aqui mencionadas sejam editadas dentro do módulo para poderem ser utilizadas a
qualquer momento dentro de seu programa.
Private Sub Form_Unload(Cancel As Integer)
'****

Public Function Criptografar(Texto)

Senha = ""

Dim I As Integer
williamdsilva@aol.com.br 105

Dim P As Integer

Dim LN1 As Currency

I=0

Do While Not I = Len(Texto)

I=I+1

LN1 = Asc(Mid(Texto, I, 1)) + 16

Senha = Senha & Chr(LN1)

Loop

End Function

'****

Essa função vai transformar a senha em uma outra palavra ou conjunto de caracteres, na sintaxe :
Private Sub Form_Unload(Cancel As Integer)
Criptografar suasenha

senha = caracteres

'ex:

Criptografar klayton

senha = {|lq%@#

'****

Para Descriptografar e só inverter a função.


Private Sub Form_Unload(Cancel As Integer)
Public Function Descriptografar(Texto)

Senha = ""

Dim I As Integer

Dim P As Integer

Dim LN1 As Currency

I=0

Do While Not I = Len(Texto)

I=I+1

LN1 = Asc(Mid(Texto, I, 1)) - 16

Senha = Senha & Chr(LN1)

Loop

End Function

'****

'ex :

Descriptografar {|lq%@#

senha = klayton

'****

Reparem que o número 16 foi utilizado nas funções.


Se alterar o número 16, a senha a ser transformada muda de valor.
Podendo assim utilizar qualquer número no lugar de 16 a senha terá valor diferente.
williamdsilva@aol.com.br 106

220 - Acessando uma Tabela do Access 97 com VBA


Enviado por: MARCELO C SANTOS

No evento "Form_Load" do Formulário desejado devemos incluir os seguintes códigos:


Private Sub Form_Unload(Cancel As Integer)
Dim Banco as Database 'variável do tipo Banco de Dados

Dim Tabela as RecordSet 'variável do tipo conjunto de registros

Set Banco = CurrentDB 'Carrega a variável Banco com o Banco de Dados Ativo

Set Tabela = Banco.OpenRecordSet("Nome_da_Tabela") 'Carrega a variável Tabela com a tabela


"Nome_da_Tabela"

Me.Campo_Do_formulário = Tabela!Nome_do_Campo_da_Tabela 'Carrega o Campo do formulário atual com o


campo da tabela.

Qualquer dúvida ou sugestão enviar E-Mail.

221 - Icone animado de maneira mais simples


Enviado por: Paulo Bezerra

Inicialmente adicione um timer e um imagelist ao seu form logo apos é só seguir os passos.

Primeiro: Você coloca no imagelist os icones que serviram para a animação.

Segundo: Você declara no general uma variável denominada "icone", tipo integer.

Terceiro: Declare um valor para a variavel no form_load, um valor = 0.

Quarto: Você coloca as seguintes linhas de codigo no componente timer.


Private Sub Form_Unload(Cancel As Integer)
icone = icone + 1: If icone = (total de figuras + 1) Then icone = 1

MousePointer = 99

MouseIcon = ImageList1.ListImages(icone).Picture

Enfim o programa devera ficar assim:


Private Sub Form_Unload(Cancel As Integer)
'Declaração no general

Dim icone As Integer

'Declaração no form_load

Private Sub Form_Load()

icone = 0

End Sub

'Declaração no timer1_timer

Private Sub Timer1_Timer()

icone = icone + 1: If icone = (total de figuras + 1) Then icone = 1

MousePointer = 99

MouseIcon = ImageList1.ListImages(icone).Picture

End Sub

Bem é so isso assim as linhas de código ficam reduzidas a bem menos.


Qualquer dúvida ou sugestão enviar E-Mail.

222 - Como não deixar que o form feche


Enviado por: Pedro Henrique

Para não deixar que a form feche, é só digitar na linha de código:


williamdsilva@aol.com.br 107

Private Sub Form_Unload(Cancel As Integer)


Private Sub Form_Unload(Cancel As Integer)

Cancel = 1

End Sub

223 - Selecionar todo o texto em um textbox (em 2 linhas de codigo)


Enviado por: Rogério Barreto

Para selecionar um text em um text box é só usar este comando:


Private Sub Form_Unload(Cancel As Integer)
textbox1.selstart = 0
textbox1.sellenght = (len(textbox1.text))

224 - Digitação fácil nas caixas de texto


Enviado por: Thiago Rosso Adams

Quando precisar entrar com vários dados através de caixas de texto pode-se usar
estas rotinas abaixo para facilitar a entrada de dados.
Através delas após digitar um valor em uma caixa de texto com "Index" e for pressionado
"Enter" ou seta para baixo a próxima caixa de texto será selecionada se for pressionada
seta para cima a caixa anterior será selecionada.
Private Sub Form_Unload(Cancel As Integer)
' Esta sub faz com que o texto fique selecionado

Private Sub Dado_GotFocus(Index As Integer)

Dado(Index).SelStart = 0

Dado(Index).SelLength = Len(Dado(Index))

End Sub

Private Sub Dado_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)

Select Case KeyCode

Case vbKeyDown, 13

If Index < Dado.uBound Then Index = Index + 1 Else Index = Dado.lBound

Dado(Index).SetFocus

Case vbKeyUp

If Index > Dado.lBound Then Index = Index - 1 Else Index = Dado.uBound

Dado(Index).SetFocus

End Select

End Sub

225 - Defina uma lista de valores para uma propriedade no seu UserControl.
Enviado por: Clark

Para definir uma lista de valores para uma determinada propriedade do seu UserControl, siga o exemplo
abaixo:
1) Crie um ENUMERAÇÃO contendo os valores:
Private Sub Form_Unload(Cancel As Integer)
Public Enum MeusValores

mvLeft = 0
williamdsilva@aol.com.br 108

mvCenter = 1

mvRight = 2

End Enum

2) Crie a propriedade declarando seu parâmetro como sendo a enumeração criada acima:
Private Sub Form_Unload(Cancel As Integer)
Public Property Let Alinhamento( byVal vValor as MeusValores )

End Property

vValor as MeusValores - Define que vValor é a enumeração MeusValores, ou seja, quando a propriedade for
publicada na janela Properties do VB, a mesma apresentará uma lista (Combo) contendo os valores
definidos na emumeração.
Legal, não ?

Clark

226 - Consulta no Data Link(vb6)


Enviado por: Cristiano Azevedo Costa

Basta inserir o seguinte código:


Private Sub Form_Unload(Cancel As Integer)
sql = "Select * from MinhaTabela"

MeuDataLink.rsMeuComando.Close

MeuDataLink.rsMeuComando.Source = sql

MeuDataLink.rsMeuComando.Open

MeuDataLink.rsMeuComando.Properties.Refresh

Sql é um comado sql

MeuDataLink é um data link

rsMeuComando é um command(recorset)

227 - Piscar um texto na tela


Enviado por: Fernando D.

Para fazer um texto piscar basta adicionar uma Label contendo o texto que deseja fazer piscar e digitar a
seguinte linha no evento Timer.
Private Sub Form_Unload(Cancel As Integer)
label1.visible = not(label1.visible)

228 - Busca Rápida


Enviado por: Régis Augusto Quinelato
Private Sub Form_Unload(Cancel As Integer)

'Vou precisar de um text1, List, quando _


williamdsilva@aol.com.br 109

'vc digitar a primeira letra automaticamente, _

'a palavra que vc procura será marcada.

'---Declaro as Variáveis---

Dim Search As String

Dim Searchlen As String

'--------------------------

Search = UCase(TxtProcura.Text)

Searchlen = Len(Search)

If Searchlen Then

For Contador = 0 To Lista.ListCount - 1

If UCase(Left(Lista.List(Contador), Searchlen)) = Search Then

Lista.ListIndex = Contador

Exit For

End If

Next Contador

End If

229 - Utilização de um Combo Magico


Enviado por: WIlliam Rogerio Correa

Rotina para posicionar o texto e o item data de um combo de acordo com que for digitado.

O combo devera esta com o style = 0 - dropDown Combo.

Colocar esta rotina no modulo bas


Private Sub Form_Unload(Cancel As Integer)
Public Const CB_ERR = -1

Public Const CB_FINDSTRING = &H14C

Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As
Long, ByVal wParam As Long, lParam As Any) As Long

Sub ComboMagico(cbo As ComboBox, KeyAscii As Integer)

Dim sBuffer As String

Dim lRetVal As Long

sBuffer = Left(cbo.Text, cbo.SelStart) & Chr(KeyAscii)

lRetVal = SendMessage((cbo.hWnd), CB_FINDSTRING, -1, ByVal sBuffer)

If lRetVal <> CB_ERR Then

cbo.ListIndex = lRetVal

cbo.Text = cbo.List(lRetVal)

cbo.SelStart = Len(sBuffer)

cbo.SelLength = Len(cbo.Text)

KeyAscii = 0

End If
williamdsilva@aol.com.br 110

End Sub

e no combo no change colocar o seguinte :


Private Sub Form_Unload(Cancel As Integer)
call ComboMagico(,keyascii)

e pronto...

230 - Menu com texto animado


Enviado por: André Barros

Na propriedade do menu você coloca...


Private Sub menu_Load()

Menu.Caption = "M"

Timer1.Enabled = True

End Sub

´Você coloca 4 timers no form

´o primeiro timer com 1000

´o segundo timer com 2000

´o terceiro timer com 3000

´o quarto timer com 4000

Private Sub Timer1_Timer()

Menu.Caption = " e"

Timer1.Enabled = False

Timer2.Enabled = True

End Sub

Private Sub Timer2_Timer()

Menu.Caption = " n"

Timer2.Enabled = False

Timer3.Enabled = True

End Sub

Private Sub Timer3_Timer()

Menu.Caption = " u"

Timer3.Enabled = False

Timer4.Enabled = True

End Sub

Private Sub Timer4_Timer()

Menu.Caption = "Menu"

Timer4.Enabled = False

End Sub

231 - Pesquisando por nome, sobrenome sem Data


Enviado por: angelo da silva
williamdsilva@aol.com.br 111

dim texto as boolean

dim pat as string

pat="Silva"

texto = InStr(1, UCase(Trim(rsequi("uti_equi"))), UCase(Trim(pat)))

Instr=true se estiver contindo, ou false se não.

232 - Minimizando Todas as Janelas


Enviado por: Antonio Ferreira Marques Junior

Para minimizar todas as janelas de uma maneira bem simples, basta simularmos, via API, o
pressionamento das teclas Alt+M, que seria vc clicando com o botão direito do mouse na barra de tarefas e
escolhendo a opção Minimizar todas as janelas. É simples:

Num módulo:
Declare Sub Keybd_event lib "user32" (ByVal bvk as byte, byval bscan as byte, byval dwflags as long, byval
dwextrainfo as long

const vk_lwin = &H5B

const keyeventf_keyup = &H2


const vk_apps = &H5D

Num evento click de um botão


keybd_event vk_lwin,0,0,0

keybd_event &H4D, 0,0,0

keybd_event vk_lwin,0,keyeventf_keyup,0

Boa Sorte

233 - Aplicações Client/Server


Enviado por: Daniel(Shadow)

Para fazer um cliente de qualquer aplicação em Visual Basic, para qualquer tipo de aplicativo server. Você
tem apenas que colocar um controle Microsoft Winsock 6.0 no form, e em qualquer botão ou na
propriedade load do form, você coloca o seguinte comando:

winsock1.connect (endereço ip),(porta)

Por exemplo:
winsock1.connect 127.0.0.1, 5555

234 - Nomes das letras maiúsculas e sem espacós a mais


Enviado por: Eduardo Mazzarino Costa

Public Function Maiusc(Palavra As String) As String

'converte as primeiras letra dos nomes em maiúsculas(menos: de, da, do, das,

'dos, a, e e)

'retira os espaços em branco excedentes entre as palavras, exemplo:

'string inicial = "nome sobrenome1 dos sobrenome2 "

'string de retorno = "Nome Sobrenome1 dos Sobrenome2"


williamdsilva@aol.com.br 112

' EDUARDO MAZZARINO COSTA, 21 / 3 / 99

Dim Resto As String, Parte As String, Posic As Byte

Resto = Trim(LCase(Palavra)) & " "

Do Until Resto = " "

Posic = InStr(1, Resto, " ")

Parte = Mid(Resto, 1, Posic)

If Trim(Parte) <> "e" And Trim(Parte) <> "a" And Trim(Parte) _

<> "do" And Trim(Parte) <> "dos" And Trim(Parte) <> "da" _

And Trim(Parte) <> "das" And Trim(Parte) <> "de" Then

Parte = UCase(Left(Parte, 1)) & Mid(Parte, 2)

End If

Maiusc = Maiusc & Parte

Resto = Trim(Mid(Resto, Posic)) & " "


Loop

Maiusc = Trim(Maiusc)

End Function

235 - Proibindo campos nulos


Enviado por: FÁBIO FUR

Na Proc LostFocus de uma caixa de texto você digita:


if trim(text1.text) = "" then

msgbox "Preenchimento do campo é obrigatório!"

text1.text = ""

text1.setfocus

Exit sub

End If

236 - Organizando números numa Combo Box


Enviado por: Gregório V. Dettmann

'Sub que orderna os números de uma ComboBox em ordem crescente ou decrescente.

'ByRef:

'Combo-> Objeto(ComboBox) onde seus números serão organizados na ordem de SortType

'ByVal:

'SortType-> Tipo de ordem (constantes abaixo)

'Obs: Este sub gerará um erro se em alguma entrada houver caracteres não-numéricos, por isso,

'certifique-se de que só existam números em todas os Itens do ComboBox.

Const COMBOSORTASCENDING% = 0

Const COMBOSORTDESCENDING% = 1
williamdsilva@aol.com.br 113

Sub SortComboBox(ByRef Combo As ComboBox, ByVal SortType As Long)

Const ASCEND% = 1

Const DESCEND% = -1

'Variáveis de organização

Dim Sort As Boolean

Dim I As Long

Dim I2 As Long

Dim Itens() As Long

Dim TmpValue As Long

If Combo.ListCount = Empty Then Exit Sub

ReDim Preserve Itens(Combo.ListCount - 1) As Long

For I = 0 To UBound(Itens) Step 1

Itens(I) = Combo.List(I)

Next I

Combo.Clear

Sort = (SortType = COMBOSORTASCENDING)

For I = 0 To UBound(Itens) Step 1

For I2 = IIf(Sort, I + 1, UBound(Itens)) To IIf(Sort, UBound(Itens), UBound(Itens) _

- (UBound(Itens) - I)) Step IIf(Sort, ASCEND, DESCEND)

If Sort Xor (CLng(Itens(I2)) > CLng(Itens(I))) Then

Swap Itens(I), Itens(I2)

End If

Next I2

Combo.AddItem Itens(I)

Next I

End Sub

237 - Limpando Combos Read-Only 2


Enviado por: Jeferson Luiz Ravate

Complementando dica enviada por Henrique Angelo


Como diz o autor da dica, não pode-se usar a
propriedade Text para limpar um Combo Read-Only.
Mas pode posicionar o List da Combo numa posição
com conteúdo vazio.

Ao invés de Combo.Text = "", faz-se Combo.List = -1

O texto da combo ficará em branco sem alterar seu conteúdo.


williamdsilva@aol.com.br 114

238 - Mensagem randonica


Enviado por: José Roberto de Paula

Passe para esta funçao sua mensagem e o tamanho do objeto que a contem
ex: Randon_Msg(Label1.Caption,Label1.Width)
Function Randon_Msg(MENSAGEM, TAMANHO As Integer)

Dim ESPAÇO As String

Dim Z As Integer

On Error Resume Next

If TAMANHO > Len(MENSAGEM) Then TAMANHO = Len(MENSAGEM)

For Z = 0 To TAMANHO

ESPAÇO = ESPAÇO & " "

Next

If X < Len(ESPAÇO) Then

X=X+1

NEWS = Mid(ESPAÇO, X, Len(ESPAÇO)) & Mid(MENSAGEM, 1, X)

End If

If X = Len(ESPAÇO) Or X = Len(ESPAÇO) + 1 Then

Y=Y+1

NEWS = Mid(MENSAGEM, Y, Len(MENSAGEM))

If Y = Len(MENSAGEM) Then

Y=0

X=0

End If

End If

End Function

239 - Propriedades da Barra de Tarefas


Enviado por: Junior

Digamos que vc quer realizar as operações daquelas que vc clica com o Direito do mouse, tipo minimizar
todas janelas, lado a lado, etc, Pois bem, o código é este:
Const WM_COMMAND As Long = &H111

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal

lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As

Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Enum AçõesWindows

Cascata = 403

LadoLadoV = 405
williamdsilva@aol.com.br 115

LadoLadoH = 404

Propriedades = 413

MinimizarTudo = 416

DesfazMinimizeCascata = 419

End Enum

Sub ExecutaTarefas(Ação as AçõesWindows)

Dim lRetVal As Long

Dim hwnd As Long

hwnd = FindWindow("Shell_TrayWnd", vbNullString)

lRetVal = PostMessage(hwnd, WM_COMMAND, Ação, 0&)

End Sub

Agora no evento click de um botão:


ExecutaTarefas Açao

Obs.: Se vc tiver usando VB5 ou superior, o argumento ação vc escolherá automaticamente depois de vc
digitar o ExecutaTarefas.
Se vc tiver usando VB4, despreze o bloco Enum/End Enum e coloque no Click do botão: ExecutaTarefas 416
(Por Ex.: para minimizar todas as janelas).

240 - Abrindo qualquer tipo de objeto do Access


Enviado por: Luiz

Dim objAccess As Access.Application

Set objAccess = New Access.Application

'Abre o MDB

'GetSetting e usado na inicializacao junto com

'SaveSetting salvando o local do arquivo

objAccess.OpenCurrentDatabase _ filepath:=GetSetting (NOME_SISTEMA, "MDB", "0")

'se for relatorio

objAccess.DoCmd.OpenReport reportname:=rptname _(1), View:=Access.acPreview, _

wherecondition:=Condicoes

objAccess.Visible = True

objAccess.Docmd.Maximize

'se for macro

objAccess.DoCmd.RunMacro ("NomedaMacro")

'e assim por diante

Set objAccess = Nothing

241 - fundo degrade


Enviado por: Marcio fritsch

'no Resize() de um formulário qualquer coloque:

'simples e rápido.
williamdsilva@aol.com.br 116

Dim i as Integer

Dim y as Integer

Me.AutoRedraw = True

Me.DrawStyle = 6

Me.DrawMode = 13

Me.DrawWidth = 2

Me.ScaleMode = 3

Me.ScaleHeight = (256 * 2)

For i = 255 To 0 Step -1

Me.Line (0, y)-(Me.Width, y + 2), RGB(0, 0, i), BF

y=y+2

Next i

242 - Verificar se programa esta ativo


Enviado por: Nilson M. Uehara

Private Declare Function FindWindow Lib "User32" _

Alias "FindWindowA" _

(ByVal lpClassName As String, _

ByVal lpWindowName As String) As Long

Sub()

Dim hWindow As Long

Dim lngResult As Long

Dim lngReturnValue As Long

'Verifica se a calculadora esta ativa

hWindow = FindWindow(vbNullString, "Calculadora")

If IsWindow(hWindow) < 0 Then

'esta Ativa

Else

'esta Inativa

End If

243 - Mover o Botão de lugar ao passar o Mouse por cima


Enviado por: O Sensacional®

Use a propriedade Mouse Move, e 2 command button. O 2º, com o false do "Visible" ativado.
Dentro do command1, digite :
Command1.visible = false

Command2.visible = true

Dentro do command2, digite:


Command2.visible = false
williamdsilva@aol.com.br 117

Command1.visible = true

244 - Marcar o Texto de um Campo...


Enviado por: Pablo R. Till

Crie um módulo (.Bas) e dentro do mesmo digite...


Public Function MarcaTexto(Campo)

With Campo

.SelStart = 0

.SelLenght = Len(.Text)

End With

End Function

A função é bem simples mas pode ajudar...

245 - Mudar a cor do Label quando o mouse passar sobre o label, dando a aparencia de um link
Enviado por: Thadeu R. Ferraz

Para vc mudar a cor da label conforme o mouse passa sobre ele, basta colocar o seguinte comando abaixo.
Private Sub Form_MouseMove(Button As Integer,

Label1.ForeColor = &H80000012

End Sub

Private Sub Label1_MouseMove(Button As Integer,

Label1.ForeColor = &HFF&

End Sub

246 - Como Listar os registros de um campo de uma tabela num Textbox (sem SQL)
Enviado por: Thiago

Para listar todos os registros de um Campo de uma Tabela separando os mesmo por uma vígula, sem
utilizar SQL, utilize o seguinte código:
RS.MoveFirst

TXT.Text = RS("Campo")

RS.MoveNext

While Not RS.EOF

texto = RS("Campo")

TXT.Text = TXT.Text & ", " & texto

RS.MoveNext

Wend

Obs: O textbox (no caso TXT), deve ter a propriedade Multiline = True e ScroolsBar = 2 (vertical).

RS: Nome da variavel declarada como Recordset

DB: Nome da variavel declarada como DataBase

247 - Comando Printer


Enviado por: Anderson A Lopes
williamdsilva@aol.com.br 118

Com o comando printer podemos imprimir várias coisas rapidamente, por exemplo:
Printer.Print "String a ser Impressa"

Você pode definir margem de quantos centímetros você quiser usando:


Printer.ScaleLeft = - Valor da margem...

Bom é isso aí pessoal....

248 - Testando um Laço For...


Enviado por: AndreRP

Escreva em um botão de Comando a seguinte codificação :


var1 = "TESTANDO"
For i = 1 To 8
MsgBox Mid(var1, i, 1)
Next i

249 - Buscar data/hora em outro computador da rede


Enviado por: Antonio Aristides Mochi Junior

Option Explicit
Private Declare Function NetRemoteTOD Lib "NETAPI32.DLL" (ByVal server As String, buffer As Any) As Long
Private Declare Function NetApiBufferFree Lib "NETAPI32.DLL" (ByVal buffer As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As
Any, ByVal cbCopy 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

'
' Função para retornar a Data/Hora de um computador na rede
' RETORNO:
' string no formato dd/mm/yyyy-hh:mm:ss
' PARAMETROS:
' sComputador: Nome de um computador da rede. Ex: \\SERVIDOR1
'
Private Function BuscarDataHora(sComputador As String) As String
Dim sRetorno As String
Dim todTime As TIME_OF_DAY
Dim ptrTime As Long
Dim lRetorno As Long
Dim sServidor As String
Dim dRemoto As Date
On Error GoTo ERRO
sRetorno = ""
Screen.MousePointer = vbHourglass
sServidor = StrConv(sComputador, vbUnicode)
lRetorno = NetRemoteTOD(sServidor, ptrTime)
If lRetorno = 0 Then
CopyMemory todTime, ByVal ptrTime, Len(todTime) 'COPIA O PONTEIRO RETORNADO PARA A ESTRUTURA
TIME_OF_DAY
dRemoto = DateSerial(70, 1, 1) + (todTime.t_elapsedt / 60 / 60 / 24) 'CONVERTE O TEMPO DECORRIDO
DESDE 1/Jan/70 PARA UMA DATA
dRemoto = dRemoto - (todTime.t_timezone / 60 / 24) 'AJUSTAR PARA DIFERENÇAS DO TimeZone
sRetorno = Format(dRemoto, "dd/mm/yyyy") & "-" & Format(dRemoto, "hh:mm:ss")
NetApiBufferFree (ptrTime) 'LIBERA O PONTEIRO DA MEMÓRIA
williamdsilva@aol.com.br 119

Else
'Erro 53: cannot find server
MsgBox "Não pode encontrar o servidor." & vbCrLf & vbCrLf & sServidor, vbExclamation, "Atenção"
End If
GoTo FIM
ERRO:
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Erro"
FIM:
Screen.MousePointer = vbDefault
BuscarDataHora = sRetorno
Exit Function
End Function

250 - Iniciando programa de E-Mail e Browser pelo VB


Enviado por: Daniel Sitnik

'Este tutorial não serve só para abrir o programa de E-Mail ou o Browser, pode ser usado para qualquer outro
programa. E o melhor, o comando é de apenas 1 linha!!
'Para abrir o programa de E-Mail, coloque um Command Button no form e digite o seguinte no seu evento
Click:

Private Sub Command1_Click()


Shell "start mailto:seu@email.com.br"
End Sub
'Para iniciar o Browser digite o código abaixo, também no evento Click de um botão:
Private Sub Command2_Click()
Shell "start http://www.homepage.com.br"
End Sub
'Muito simples não? Também pode ser usado para abrir um arquivo de texto no notepad:
Private Sub Command3_Click()
Shell "start arquivo.txt"
'E assim por diante, você pode abrir qualquer programa que quiser!!

251 - Desligando o computador pelo VB


Enviado por: Daniel Sitnik

'Primeiro adicione um Módulo .BAS no seu programa e coloque a declaração abaixo nele:
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal
dwReserved As Long) As Long
'Pronto, agora volta para o formulário e coloque o código abaixo num botão de comando ou no evento
Form_Click():
Private Sub Form_Click()
If MsgBox("Sair do Windows?", 36, "Sair") = 6 Then
Call ExitWindowsEx(1, 1)
Else
Exit Sub
End If
End Sub
'Ao clicar o botão ou o formulário uma MsgBox aparecerá perguntando se você quer desligar o Windows, se
você clicar 'Sim' aquela famosa tela 'Seu Computador Já Pode Ser Desligado....' vai aparecer e o computador
será desligado. Ao clicar 'Não' nada acontecerá.

252 - Imprimindo
Enviado por: Elder Paes

Para vc imprimir um documento, utilize o comando Printer ao invés do comando PrintForm. Vamos fazer
com um TextBox e um PictureBox:
Private Sub command1_click()
Printer.Print Text1.Text
Printer.Print Picture1.Picture
williamdsilva@aol.com.br 120

253 - Função para transformar sifras em extenso


Enviado por: Evandro Massini

'Função para transformar sifras em extenso


Option Explicit
Dim unidade(1 To 9) As String
Dim dezena(17) As String
Dim centena(1 To 9) As String
Dim inteiro As String
Dim tamanho As Integer
Public Function unidades(numero As String) As String
unidades = unidade(numero)
End Function
Public Function dezenas(numero As String) As String
If numero > 9 And numero < 21 Then
dezenas = dezena(numero - 10)
ElseIf numero >= 21 And numero <= 99 Then
If Right(numero, 1) = "0" Then
dezenas = dezena(Int(Left(numero, 1) + 8))
Else
dezenas = dezena(Int(1 & Int(Left(numero, 1) - 2))) & " e " & unidade(Int(Right(numero, 1)))
End If
End If
End Function
Public Function centenas(numero As String) As String
If Mid(numero, 2, 2) = 0 Then
If numero = 100 Then
centenas = "cem"
Else
centenas = centena(Left(numero, 1))
End If
ElseIf Mid(numero, 3, 1) = 0 Then
centenas = centena(Left(numero, 1)) & " e " & dezenas(Mid(numero, 2, 2))
ElseIf Mid(numero, 2, 1) = 0 Then
centenas = centena(Int(Left(numero, 1))) & " e " & unidade(Int(Right(numero, 1)))
Else
centenas = centena(Int(Left(numero, 1))) & " e " & dezenas(Int(Right(numero, 2)))
End If
End Function
Public Function ext(numero As Currency) As String
If numero > 999999.99 Then ext = "Número fora dos padrões válidos !": Exit Function
unidade(1) = "um"
unidade(2) = "dois"
unidade(3) = "três"
unidade(4) = "quatro"
unidade(5) = "cinco"
unidade(6) = "seis"
unidade(7) = "sete"
unidade(8) = "oito"
unidade(9) = "nove"
dezena(0) = "dez"
dezena(1) = "onze"
dezena(2) = "doze"
dezena(3) = "treze"
dezena(4) = "quatorze"
dezena(5) = "quinze"
dezena(6) = "dezesseis"
dezena(7) = "dezessete"
dezena(8) = "dezoito"
dezena(9) = "dezenove"
dezena(10) = "vinte"
dezena(11) = "trinta"
dezena(12) = "quarenta"
dezena(13) = "cinquenta"
dezena(14) = "sessenta"
dezena(15) = "setenta"
dezena(16) = "oitenta"
dezena(17) = "noventa"
centena(1) = "cento"
centena(2) = "duzentos"
williamdsilva@aol.com.br 121

centena(3) = "trezentos"
centena(4) = "quatrocentos"
centena(5) = "quinhentos"
centena(6) = "seissentos"
centena(7) = "setessentos"
centena(8) = "oitocentos"
centena(9) = "novecentos"
inteiro = Int(numero)
tamanho = Len(inteiro)
Select Case tamanho
Case 1
ext = unidades(inteiro)
Case 2
ext = dezenas(inteiro)
Case 3
ext = centenas(inteiro)
Case 4
If Right(inteiro, 3) = 0 Then
ext = unidades(Left(inteiro, 1)) & " mil"
Else
If Int(Right(inteiro, 3)) > 99 Then
ext = unidades(Left(inteiro, 1)) & " mil e " & centenas(Int(Right(inteiro, 3)))
ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then
ext = unidades(Left(inteiro, 1)) & " mil e " & dezenas(Int(Right(inteiro, 3)))
ElseIf Int(Right(inteiro, 3)) < 10 Then
ext = unidades(Left(inteiro, 1)) & " mil e " & unidades(Int(Right(inteiro, 3)))
End If
End If
Case 5
If Right(inteiro, 3) = 0 Then
ext = dezenas(Left(inteiro, 2)) & " mil "
Else
If Int(Right(inteiro, 3)) > 99 Then
ext = dezenas(Left(inteiro, 2)) & " mil e " & centenas(Right(inteiro, 3))
ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then
ext = dezenas(Left(inteiro, 2)) & " mil e " & dezenas(Int(Right(inteiro, 3)))
ElseIf Int(Right(inteiro, 3)) < 10 Then
ext = dezenas(Left(inteiro, 2)) & " mil e " & unidades(Int(Right(inteiro, 3)))
End If
End If
Case 6
If Right(inteiro, 3) = 0 Then
ext = centenas(Left(inteiro, 3)) & " mil "
ElseIf Int(Right(inteiro, 3)) > 99 Then
ext = centenas(Left(inteiro, 3)) & " mil e " & centenas(Int(Right(inteiro, 3)))
ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then
ext = centenas(Left(inteiro, 3)) & " mil e " & dezenas(Int(Right(inteiro, 3)))
ElseIf Int(Right(inteiro, 3)) < 10 Then
ext = centenas(Left(inteiro, 3)) & " mil e " & unidades(Int(Right(inteiro, 3)))
End If
End Select
ext = ext & " reais"
If numero - Int(numero) <> 0 Then
Dim fra As String
fra = Right(numero, 2)
If InStr(1, fra, ",") <> 0 Then fra = Right(fra, 1) * 10
If fra >= 10 Then
ext = ext & " e " & dezenas(fra) & " centavos"
ElseIf fra < 10 Then
ext = ext & " e " & unidades(fra) & " centavos"
End If
End If
End Function

254 - Usando o controle MsFlexGrid


Enviado por: FabioFur

Usando o controle MsFlexGrid Para adicionar Dados:


Declare uma Variável em um botão de comando com o nome messes
Dim messes(12) as string
williamdsilva@aol.com.br 122

'logo abaixo digite:


messes(1) = "Janeiro"
messes(2) = "Fevereiro"
messes(3) = "Março"
messes(4) = "Abril"
messes(5) = "Maio"
messes(6) = "Junho"
messes(7) = "Julho"
messes(8) = "Agosto"
messes(9) = "Setembro"
messes(10) = "Outubro"
messes(11) = "Novembro"
messes(12) = "Dezembro"
Dim contador as integer
for contador = 1 to 12
grid1.TextMatrix(contador,1) = messes(contador)
Next contador

Obs.: A propriedade Rows do controle MsFlexGrid deve ser definida com o Mínimo 13.

255 - Efeito de profundidade


Enviado por: Fernando Augusto dos Santos

É muito simples. Se quiser colocar essa oba-oba no seu projeto :

1 - adicione um label.
2 - deixe o fontsize dele com tamanho 10.
3 - deixe a propriedade alignment = 2
4 - no MouseDown adicione o seguinte código :
label1.fontsize = 8
5 - no MouseUp adicione o seguinte código :
label1.fontsize = 10

OBS : Utilize este recurso para substituir botões,


usando o evento click do label para executar ações.

256 - Flip Horizontal e Vertical


Enviado por: Gustavo (Toni)

'coloque os dados abaixo em um module


#If Win32 Then
Declare Function StretchBlt% Lib "GDI32" (ByVal hDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%,
ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal nSrcWidth%, ByVal nSrcHeight%, ByVal dwRop&)
#ElseIf Win16 Then
Declare Function StretchBlt% Lib "GDI" (ByVal hDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%,
ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal nSrcWidth%, ByVal nSrcHeight%, ByVal dwRop&)
#End If
Const SRCCOPY = &HCC0020
'Flip Horizontal
Public Sub imgFlipH(PicOrigem As PictureBox, PicDestino As PictureBox)
Dim xX As Integer, yY As Integer, ReturnV As Integer
PicOrigem.ScaleMode = 3
PicDestino.ScaleMode = 3
PicDestino.Cls
xX = PicOrigem.ScaleWidth
yY = PicOrigem.ScaleHeight
ReturnV = StretchBlt(PicDestino.hDC, xX, 0, -xX, yY, PicOrigem.hDC, 0, 0, xX, yY, SRCCOPY)
End Sub
'Flip Vertical
Public Sub imgFlipV(PicOrigem As PictureBox, PicDestino As PictureBox)
Dim xX As Integer, yY As Integer, ReturnV As Integer
PicOrigem.ScaleMode = 3
PicDestino.ScaleMode = 3
PicDestino.Cls
xX = PicOrigem.ScaleWidth
yY = PicOrigem.ScaleHeight
ReturnV = StretchBlt(PicDestino.hDC, 0, yY, xX, -yY, PicOrigem.hDC, 0, 0, xX, yY, SRCCOPY)
End Sub
williamdsilva@aol.com.br 123

257 - Cores do Sistema


Enviado por: Ivan

Para nao ocorrer de você colocar um controle


em cor Cinza, por exemplo, e o seu usuario trocar as cores do
sistema para o padrao "Deserto" e seu controle continuar cinza,
use o SystemColorConstants
Ex:
Controle.BackColor = SystemColorConstants.vb3DDKShadow
Controle.BackColor = SystemColorConstants.vb3DFace
Controle.BackColor = SystemColorConstants.vbActiveTitleBar

E assim por diante.

258 - Como sair no msgbox...


Enviado por: José Pereira

Crie um MsgBox com sinal de interrogação e com os botões Vbyes e Vbno.Crie um botão:
Private Sub comman1_Click()
resp = MsgBox("Tem certeza que deseja sair?", 36, "SAÍDA")
If resp = vbYes Then
End
Else
MsgBox ("Continue seu trabalho!")
End If
End Sub

259 - Criando toolbars dockaveis


Enviado por: Leon Serfaty Kacowicz

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg
As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare Function ReleaseCapture Lib "user32" () As Long
Sub Toolbar1_MouseDown(Button as integer, Shift as integer, X as single, Y as single)
ReleaseCapture
Dim a&
a& = SendMessage(ToolBar1.hwnd, 161, 2, 0&)
End Sub

260 - Apagando todos os registros de uma tabela com apenas um click!!


Enviado por: Lucas Belkys

Insira um controle timer no formulário e defina a propiedade interval = 10;


Defina a propiedade enabled = false do timer;
em um botão de comando digite:
timer1.enabled = true

No timer:
on error resume next
data1.recordset.delete
data1.recordset.movenext

Espero ter ajudado!!

261 - Enviando registros para Excel


Enviado por: luiz
williamdsilva@aol.com.br 124

Private Sub Command1_Click()


'aconselhavel para poucos registros
Dim rs As Recordset
Dim cn As Connection
Set cn = New Connection
Set rs = New Recordset
'estabelece coneccao
cn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=D:\Program
Files\Microsoft Visual Studio\VB98\Biblio.mdb"
'abre recordset
rs.Open "Select * From Authors", cn, adOpenStatic, adLockReadOnly
Exporta rs
rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing
End Sub
Sub Exporta(ByVal RSConeccao As Recordset)
Dim MCampos() As String
Dim mExcelApp As Excel.Application
Dim c As Range
Const ALFABETICO As String = "ABCDEFGHIJKLMNOPQRSTUVXYWZ"
Set mExcelApp = New Excel.Application
ReDim MCampos(RSConeccao.Fields.Count)
'armazena nomes dos campos
Dim temp As Long
For temp = 0 To RSConeccao.Fields.Count - 1
MCampos(temp) = RSConeccao.Fields(temp).Name
Next
If Not RSConeccao.EOF Then
'popula recordset
RSConeccao.MoveLast
RSConeccao.MoveFirst
Else
RSConeccao.Close
Exit Sub
End If
'instancia excel
Set mExcelApp = New Excel.Application
mExcelApp.Visible = True
mExcelApp.Workbooks.Add
'imprime nome dos campos
Dim ABCD
For temp = 1 To RSConeccao.Fields.Count
ABCD = Mid(ALFABETICO, temp, 1) & "1"
For Each c In mExcelApp.ActiveWorkbook.Worksheets.Application.Range(ABCD)
c.Value = MCampos(temp - 1)
Next c
Next
Dim TTemp2
TTemp2 = 1
'para cada registro
Do
TTemp2 = TTemp2 + 1
'para cada campo
'imprime dados do registro
For temp = 1 To RSConeccao.Fields.Count
For Each c In mExcelApp.ActiveWorkbook.Worksheets.Application.Range(Mid(ALFABETICO, temp, 1) &
TTemp2)
c.Value = RSConeccao(MCampos(temp - 1))
Next c
Next
RSConeccao.MoveNext
'ate fim dos registros
Loop While Not RSConeccao.EOF
Set RSConeccao = Nothing
Set mExcelApp = Nothing
End Sub

262 - Max lenght Combo-box


Enviado por: Marcelo
williamdsilva@aol.com.br 125

'Maxlenght no Combo-box

Private Sub Combo1_Change()


If Len(Combo1.Text) >= 10 Then
Combo1.Text = Left$(Trim(Combo1.Text), 10)
End if
End Sub
Private Sub Combo1_KeyPress(KeyAscii As Integer)
'use send keys quando o form tiver mais 1 controle
'que receba o foco
If KeyAscii = 13 Then SendKeys "{Tab}"
If Len(Combo1.Text) = 10 Then
If KeyAscii <> 8 And KeyAscii <> 13 Then
KeyAscii = 0
Combo1.Locked = True
Beep
Combo1.Locked = False
End If
End If
End Sub

263 - Preencher Combo Datas


Enviado por: Marcelo

'Rotina para adicionar datas do mes corrente, desde o dia de hoje até o ultimo dia do mês:
'código para o módulo:
Option Explicit
Sub G_Preenche_Combo_Data(ComboDatas As Control)
Dim I, DiaCorrente, MesCorrente, AnoCorrente, UltimoDia As Integer
DiaCorrente = Day(Now)
MesCorrente = Month(Now)
AnoCorrente = Year(Now)
UltimoDia = Day(DateValue("01/" & _
Str(MesCorrente + 1) & _
"/" & Str(AnoCorrente)) - 1)
If MesCorrente = 12 Then
UltimoDia = Day(DateValue("31/" & "12/" & Str(AnoCorrente)))
End If
For I = DiaCorrente To UltimoDia
ComboDatas.AddItem Format(I, "0#") & "/" & Format(Now, "mm") & "/" & Format(Now, "yyyy")
Next
End Sub
'código para o formulário:
'insira 1 Combo-box no formulário
Private Sub Form_Load()
G_Preenche_Combo_Data Combo1
End Sub

264 - Centralizar Form


Enviado por: Mimo

Para centralizar um Form siga estes passos:


Clique no Form, tecle F4, em Properties altere StartUpPosition para 2.

265 - Como saber se o seu Computador está preparado para o ano 2000.
Enviado por: MPS Informática Ltda.

Private Sub Command1_Click()


Dim Test As Date
Test = Text1
Text2 = Format(Test, "long date")
End Sub
williamdsilva@aol.com.br 126

266 - Tab Automático sem codificação


Enviado por: Nildo Veras

Use o MaskEdBox setando o valor da propriedade autotab com true. todas as vezes que for preenchido
com o valor igual ao de maxlength automáticamente passará para o próximo controle sem codificação...

267 - TROCAR PONTO POR VÍRGULA


Enviado por: PAULO EDUARDO PACHECO

Função para trocar o ponto de um TEXTBOX por vírgula.

Recentemente, estava importando uma base de dados do DATAFLEX, e deparei com o problema com a
casa decimal. Após uma pequena surra, descobri a solução: Importe a base de dados, e onde aparecer este
campo com o ponto decimal, mude a propriedade para TEXTO (estou falando da importação do ACCESS).
Execute a função abaixo. E depois volte ao ACCESS e mude para MOEDA. O problema estará resolvido.

Exemplo: TEXT1.TEXT=TROCAR(TEXT2.TEXT)
Function trocar(NumeroTexto)
Dim Posicao1, Posicao2, Tamanho As Integer
Tamanho = Len(Trim(NumeroTexto))
Posicao1 = InStr(1, NumeroTexto, ".") 'Achar o ponto
Tamanho = Tamanho - Posicao1 'Para saber qtos item serão coletados
If Posicao1 <> 0 Then 'Achou o ponto
Posicao1 = Posicao1 - 1
Posicao2 = Posicao1 + 1 'P/ encontrar o próximo espaço
trocar = Mid(NumeroTexto, 1, Posicao1) + "," + Right(NumeroTexto, Tamanho)
Else
trocar = NumeroTexto
End If
End Function

268 - Como Não Deixar que o form se feche 2


Enviado por: Pedro

No form unload ponha o seguinte comando:


Cancel =-1

Não sei se funciona em outras versões do VB alem da 5.0.

269 - Como re-abrir um projeto do VB6 no VB5


Enviado por: Robson

Tive uma grande supresa quando abri e rodei um projeto no VB6 e depois quis abrir-lo no VB5. Ao tentar
fazer isto o VB5 mostrou a seguinte mensagem:
"'Retained' is an invalid key. The file .... can´t be loaded"
Para quem quiser consertar o problema, abra o arquivo nomedoprojeto.vbp com o notepad (ou outro editor
de texto) e retire a linha com o seguinte comando:
Retained=0.

Boa sorte.

270 - Nome do processador


Enviado por: Rodolfo Nunez Lacé

Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)


Private Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
williamdsilva@aol.com.br 127

dwReserved As Long
End Type
Function GetCPUInfo() As String
Dim Proc As String
Dim INFO As SYSTEM_INFO
INFO.dwOemID = Len(INFO)
Call GetSystemInfo(INFO)
Select Case INFO.dwProcessorType
Case Is = 860
Proc = INFO.dwNumberOrfProcessors & " Intel 8086"
Case Is = 386
Proc = INFO.dwNumberOrfProcessors & " Intel 80386"
Case Is = 486
Proc = INFO.dwNumberOrfProcessors & " Intel 80486"
Case Is = 586
Proc = INFO.dwNumberOrfProcessors & " Intel Pentuim"
Case Is = 2000
Proc = INFO.dwNumberOrfProcessors & " MIPS R2000"
Case Is = 3000
Proc = INFO.dwNumberOrfProcessors & " MIPS R3000"
Case Is = 4000
Proc = INFO.dwNumberOrfProcessors & " MIPS R4000"
Case Is = 21064
Proc = INFO.dwNumberOrfProcessors & " ALPHA 21064"
Case Is = 601
Proc = INFO.dwNumberOrfProcessors & " Power PC 601"
Case Is = 603
Proc = INFO.dwNumberOrfProcessors & " Power PC 603"
Case Is = 604
Proc = INFO.dwNumberOrfProcessors & " Power PC 604"
Case Is = 620
Proc = INFO.dwNumberOrfProcessors & " Power PC 620"
End Select
GetSysInfo = Proc
End Function

271 - Salvando uma Picture


Enviado por: ton

SAVEPICTURE picture1.image, "c:\imagem.bmp"

272 - Validar conteudo do MaskEdit


Enviado por: Vava

Private Sub Command1_Click()


If Mask1.Mask = "(###)###-####" Then
If Mask1.Text = "(___)___-____" Then
MsgBox "Vazio"
Else: Dim d
d=1
Do While Not d = Mask1.MaxLength + 1
texto = Mid(Mask1.Text, d, 1)
If texto = "_" Then
MsgBox "Vazio"
Exit Sub
Else
d=d+1
End If
Loop
MsgBox "cheio"
End If
End If
End Sub
williamdsilva@aol.com.br 128

273 - Limpar todos os TextBox de todos os Formularios


Enviado por: Alexandre Sergio Nakano

Outra dica de como limpar os textbox dos formulários.


Dim formulario As Form
Dim controle As Control
For Each formulario In Forms
For Each controle In formulario.Controls
If TypeOf controle Is TextBox Then
controle.Text = ""
End If
Next controle
Next formulario

274 - Verificaçao de Data


Enviado por: André Luiz Ribeiro de Araújo

Public Function Verifica_Data(Datas As String) As Boolean


Dim DiasMes, Dia, Mes, Ano, Primeiro_Numero_Ano As Integer
Dim Mensagem As String
On Error GoTo Tratamento_Data

Dia = CInt(Mid(Datas, 1, 2))


Mes = CInt(Mid(Datas, 4, 2))
Ano = CInt(Mid(Datas, 7, 4))
Primeiro_Numero_Ano = CInt(Mid(Datas, 7, 1))

If Primeiro_Numero_Ano = 0 Then

Verifica_Data = False
Exit Function

End If

If Mes = 4 Or Mes = 6 Or Mes = 9 Or Mes = 11 Then


DiasMes = 30
Else
If Ano Mod 4 = 0 Then
DiasMes = 29
Else
DiasMes = 28
End If
If Mes = 1 Or Mes = 3 Or Mes = 5 Or Mes = 7 Or Mes = 8 Or Mes = 10 Or Mes = 12 Then
DiasMes = 31
End If

End If

' determina quantos dias tera o mes


If (Ano > 0) And (Mes >= 1) And (Mes <= 12) And (Dia >= 1) And (Dia <= DiasMes) Then

Verifica_Data = True
Else
Verifica_Data = False
End If

Tratamento_Data:

If Err.Number = 13 Then

End If
End Function

Um exemplo de como funciona:


Dim Verificação as boolean
Verificação = Verifica_Data(Text1.Text)
'Irá Retornar Verificação = True se a Data Digitada for Válida, caso contrário, Retorna
williamdsilva@aol.com.br 129

Verificação = False 'se a Data Digitada for Inválida.

Espero que ajude a resolver seu problema

275 - Qual data ou mês/ano é maior


Enviado por: Douglas Henrique Castelluber

Simples declare essa função no .Bas e passe as datas, se for uma string converta com o CDATE e passe, no
caso de mês/ano, não tem problema não passe o dia, o importante é ser um parametro do tipo data. Boa
Sorte.
Function FirstDate(Date1 As Date, Date2 As Date) As Integer
'FirstDate**************************************************************************************
'Programador..: Castelluber, Douglas Henrique
'Data/Hora....: 01/12/98 - 19:00
'Função.......: Retorna a maior data 1 ou 2 para as datas passadas
'Retorno......: 0 (igual),1 (primeira data + antiga) ou 2 (segunda data + antiga)
'Dependência..: Nenhuma
'Observação...:
'***********************************************************************************************
FirstDate = 0
Select Case DateDiff("d", Date1, Date2)
Case Is > 0
FirstDate = 1
Case Is < 0
FirstDate = 2
End Select
End Function

276 - Enviar E-Mail


Enviado por: Erica Pimentel Souza

Dim objSession As Object


Dim objMessage As Object
Set objSession = CreateObject("MAPI.SESSION")
objSession.Logon "Your Profile Name", , False,False
Set objMessage = objSession.Inbox.Messages.Add
objMessage.Subject = "Mensagem do subject"
objMessage.Text = "Texto da Mensagem"
objMessage.Attachments.Add "Anexo", , , "C:\anexo.XLS" 'caminho do arquivo em anexo
objMessage.Recipients.Add "endereço do e-mail"
objMessage.Recipients.Resolve
objMessage.Send
'Este codigo funciona adequadamente, quando o outlook da pessoa que envia o e-mail está aberto, caso não
quera assim, retire este codigo(,,false,false) da quarta linha. E dará certo !
'Espero que tirem proveito
'Tchau !
'Erica P.

277 - Como usar os Common Dialogs


Enviado por: Marcio A. P.

Private Sub Command1_Click()


'para utilizarmos aquelas caixas padrão de abrir 'arquivo use:
.Filter = "arquivos de texto (*.txt)|*.txt|todos_ os arquivos (*.*)|*.*|"
'a propriedade acima aplica um filtro para os 'arquivos que podem ser abertos
.Action = 1
'a propriedade acima abre a caixa abrir
'obs.: a propriedade .filename retorna o nome do 'arquivo, mas
'se o usuário clicar em "cancelar" o valor 'retornado será nulo podendo causar erros
End With
End Sub
Private Sub Command2_Click()
With CommonDialog1
'para usar a caixa padrão "salvar como:" use isto:
williamdsilva@aol.com.br 130

.Filter = "arquivos de texto (*.txt)|*.txt|todos_ os arquivos (*.*)|*.*|"


'a propriedade acima aplica um filtro para os 'arquivos que podem ser gravados
.Action = 2
'a propriedade acima abre a caixa "salvar como:"
End With
End Sub
With CommonDialog1
'para usar a caixa padrão "cores" use:
.Flags = 1
'a propriedade acima muda o estilo da caixa
.Action = 3
'a propriedade acima chama a caixa "cores"
'obs. a propriedade .color retorna o valor da cor 'em hexa. podendo ser usada direto no controle
End With
End Sub
Private Sub Command4_Click()
With CommonDialog1
'para usar a caixa fontes tente:
.Flags = 2
'a propriedade acima muda o tipo da caixa
.Action = 4
'a propriedade acima chama a caixa
'as propiedades fontename, fontitalic, fontsize 'etc
'retornam os valores para voce usar
End With
End Sub
Private Sub Command5_Click()
With CommonDialog1
'para usar a caixa impressoras
.Action = 5
End With
End Sub
'o resto das propriedades voce mesmo descobre senão o texto ficaria muito longo.

278 - Discando com o VB


Enviado por: Olavo Henrique Dias

Para efetuar uma discagem pelo VB, é muito simples, insira o seguinte código:
Crie um MsComm no seu Form;

Depois Digite:
Mscomm1.CommPort = 2 '(Nº da porta em que está seu FAX/MODEM)
Mscomm1.PortOpen = True
Mscomm1.Output = "ATDT 1234567" '(Discagem por Tom)
MScomm1.Output = "ATDP 1234567" '(Discagem por Pulso)

279 - Limpando Combos Read-Only 3


Enviado por: Pablo R. Till

Vale ressaltar que se as opções 1 e 2 não funcionarem faça o seguinte:


Combo.Listindex = -1

Assim também o combo somente leitura vai ficar em branco, ficando também seu conteúdo inalterado.

280 - Correção dos ítens "Validando CPF"


Enviado por: Adgenor L. Neto & Bernardo T. Lemelle

As duas funções descritas nas dicas existentes não funcionam quando o primeiro dígito do CPF é "0".Aqui
está a função com as devidas correções :
Public Function Calc_CPF(VALOR As String)As Boolean

'Inicializa variaveis
Dim dig1 As Integer
Dim dig2 As Integer
Dim Mult1 As Integer
williamdsilva@aol.com.br 131

Dim Mult2 As Integer


Dim x As Integer
Dim y1 As Integer
Dim y2 As Integer
Let y1 = 9
Let y2 = 10
Let z2 = 11
Mult1 = 10
Mult2 = 11

If Len(VALOR) = 10 Then
Let Mult1 = 9
Let Mult2 = 10
Let z2 = 10
Let y1 = 8
Let y2 = 9
End If

For x = 1 To y1
dig1 = dig1 + (Val(Mid(VALOR, x, 1)) * Mult1)
Mult1 = Mult1 - 1
Next

For x = 1 To y2
dig2 = dig2 + (Val(Mid(VALOR, x, 1)) * Mult2)
Mult2 = Mult2 - 1
Next

dig1 = (dig1 * 10) Mod 11


dig2 = (dig2 * 10) Mod 11
If dig1 = 10 Then dig1 = 0
If dig2 = 10 Then dig2 = 0

Calc_CPF = True
If Val(Mid$(VALOR, y2, 1)) <> dig1 Then Calc_CPF = False
If Val(Mid$(VALOR, z2, 1)) <> dig2 Then Calc_CPF = False

End Function

281 - Passando parâmetros via Form para filtrar registros no Crystal Reports
Enviado por: Adriano Faria

Este exemplo utiliza um combobox em um form para filtrar dados em relatorio do Crystal Report (VB6 e
CR6):
Dim Auxrel as string
auxrel = ""
auxrel = auxrel & "ToText({Tabela.Campo}) like '*" & Combo1.Text & "*'"
CrystalReport1.SelectionFormula = auxrel
CrystalReport1.CopiesToPrinter = 1
CrystalReport1.ReportFileName = "c:\caminho\report.rpt"
CrystalReport1.Action = 1

282 - Abrir Banco de Dados com senha


Enviado por: Alvaro Cesar Falido

Private Sub Command1_Click()


Dim Arq As Database
Dim Tabela As Recordset
Dim Senha As String
Senha = ";pwd=teste" 'Atribua a mesma senha que foi definida no Access
Set Arq = OpenDatabase(App.Path + "\dbsenha.Mdb", False, False, Senha)
Set Tabela = Arq.OpenRecordset("Tabela1", dbOpenTable)
Tabela.MoveFirst
While Not Tabela.EOF
List1.AddItem Tabela!nome
Tabela.MoveNext
williamdsilva@aol.com.br 132

Wend
End Sub

283 - Adicionar Hora e Data no Form


Enviado por: Alyson de Lima Holanda

Crie dois Labels. Ex.: Labe1 e Label2.

Crie um objeto timer com a propriedade interval = 1000

E coloque essas linhas de código no timer1:


label1 . caption = time
label2 . caption = date

E aparecerá automaticamente a hora e a data atualizando de 1 em 1 segundo.

284 - Localização Detalhada.


Enviado por: Antonio Mochi

Errar é humano por isto constantemente é colocado uma palavra escrita erroneamente em vários pontos
de um sistema, como exemplo podemos escrever "Eclusão" no título de um botão e ao demostrar o
sistema só nos resta dar um daqueles sorrisos amarelos e falar que será ajustado na próxima versão.
A ferramenta localizar/substituir do editor de código é bem poderosa porém não verifica erros nas
propriedades dos objetos, como o Caption de um botão.
Para procurar isto utilize a seguinte linha de comando no prompt do DOS no local onde encontra os
arquivos FRM:
FOR %i IN (*.FRM) DO FIND /I "palavra" %i

Com isto podemos verificar se há alguma palavra desejada a ser pesquisada tanto no código quanto na
propriedade, se desejar insira
TempFile.TXT

No final da linha de instrução para enviar a saida para um arquivo texto e facilitar a procura.

285 - Definindo quais caracteres digitar num objeto textbox


Enviado por: Caco

Para aceitar só números digite:


Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 13 '{Enter}, passa para o próximo campo.
KeyAscii = 0
SendKeys "{TAB}"
Case 8, 44, 48 To 57 ' {Backspace}, {,}, {0} a {9}, aceita estes caracteres.
' Continua
Case 46 ' {.}, troca ponto por virgula.
KeyAscii = 44 ' {,}
Case Else
KeyAscii = 0 ' Demais teclas, não aceita.
End Select
End Sub

286 - Travando o Computador


Enviado por: Carlos Assunção

Essa dica vai abrir novos programas iguais aos executados, até a memória acabar e travar tudo!
No Form, no evento Load, Coloque a linha:
Dim REPRO as string
repro = shell ("nome do programa.exe" ,1)
'Se colocar essa linha 10 vezes, ira abrir 10 programas, e assim por diante!
williamdsilva@aol.com.br 133

287 - Objeto Printer e sua principais propriedades


Enviado por: Carlos Peixoto

As propriedades principais do Printer são:


ColorMode: Determina ou mostra a capacidade de impressão colorida do dispositivo.
Copies: Especifica a quantidade de cópias de uma página que deve ser impressa.
CurrentX: Determina a coordenada horizontal que a impressora irá imprimir.
CurrentY: Determina a coordenada vertical que a impressora irá imprimir.
DeviceName: Mostra o nome da impressora padrão suportada pelo dispositivo
FontName: Determina qual fonte de letra a impressora usará para impressão.
FontBold: Determina se a fonte será em negrito.
FontItalic: Determina se a fonte será em itálico.
Fonts: Fornece uma lista de todas as fontes disponíveis para impressão.
FontSize: Determina o tamanho que a fonte de letra escolhida usará.
FontUnderline: Determina se a fonte será sublinhada.
Orientation: Determina a orientação do papel: Retrato ou Paisagem.

Usamos as constantes para definir o tipo escolhido:


vbPRORPortrait 1 Retrato
vbPRORLandscape 2 Paisagem
Page : Retorna o número da página que esta sendo impressa.
PaperSize: Determinamos o tamanho do papel. Podemos usamos as seguintes constantes:
vbPRPSLetter 1 Letter, 8 1/2 x 11 in.
VbPRPSLetterSmall 2 Letter Small, 8 1/2 x 11 in.
VbPRPSTabloid 3 Tabloid, 11 x 17 in.
VbPRPSLedger 4 Ledger, 17 x 11 in.
VbPRPSLegal 5 Legal, 8 1/2 x 14 in.
VbPRPSStatement 6 Statement, 5 1/2 x 8 1/2 in.
VbPRPSExecutive 7 Executive, 7 1/2 x 10 1/2 in.
vbPRPSA3 8 A3, 297 x 420 mm
vbPRPSA4 9 A4, 210 x 297 mm
vbPRPSA4Small 10 A4 Small, 210 x 297 mm
vbPRPSA5 11 A5, 148 x 210 mm
vbPRPSB4 12 B4, 250 x 354 mm
vbPRPSB5 13 B5, 182 x 257 mm
vbPRPSFolio 14 Folio, 8 1/2 x 13 in.
VbPRPSQuarto 15 Quarto, 215 x 275 mm
vbPRPS10x14 16 10 x 14 in.
vbPRPS11x17 17 11 x 17 in.
VbPRPSNote 18 Note, 8 1/2 x 11 in.
vbPRPSEnv9 19 Envelope #9, 3 7/8 x 8 7/8 in.
vbPRPSEnv10 20 Envelope #10, 4 1/8 x 9 1/2 in.
vbPRPSEnv11 21 Envelope #11, 4 1/2 x 10 3/8 in.
vbPRPSEnv12 22 Envelope #12, 4 1/2 x 11 in.
vbPRPSEnv14 23 Envelope #14, 5 x 11 1/2 in.
VbPRPSCSheet 24 C size sheet
vbPRPSDSheet 25 D size sheet
vbPRPSESheet 26 E size sheet
vbPRPSEnvDL 27 Envelope DL, 110 x 220 mm
vbPRPSEnvC3 29 Envelope C3, 324 x 458 mm
vbPRPSEnvC4 30 Envelope C4, 229 x 324 mm
vbPRPSEnvC5 28 Envelope C5, 162 x 229 mm
vbPRPSEnvC6 31 Envelope C6, 114 x 162 mm
vbPRPSEnvC65 32 Envelope C65, 114 x 229 mm
vbPRPSEnvB4 33 Envelope B4, 250 x 353 mm
vbPRPSEnvB5 34 Envelope B5, 176 x 250 mm
vbPRPSEnvB6 35 Envelope B6, 176 x 125 mm
vbPRPSEnvItaly 36 Envelope, 110 x 230 mm
vbPRPSEnvMonarch 37 Envelope Monarch, 3 7/8 x 7 1/2 in.
vbPRPSEnvPersonal 38 Envelope, 3 5/8 x 6 1/2 in.
vbPRPSFanfoldUS 39 U.S. Standard Fanfold, 14 7/8 x 11 in.
vbPRPSFanfoldStdGerman 40 German Standard Fanfold, 8 1/2 x 12 in.
vbPRPSFanfoldLglGerman 41 German Legal Fanfold, 8 1/2 x 13 in.
vbPRPSUser 256 User-defined
Port: Retorna o nome da porta de impressão que será usada pela impressora padrão.
PrintQuality: Determina ou seta a resolução que a impressora irá usar.
VbPRPQDraft -1 Resolução Draft
vbPRPQLow -2 Baixa Resolução
vbPRPQMedium -3 Média Resolução
vbPRPQHigh -4 Alta Resolução

Os métodos:
williamdsilva@aol.com.br 134

EndDoc: Finaliza a impressão de um relatório


KillDoc: Termina imediatamente a impressão
NewPage: Força a impressão passar para a próxima página.
Print {expressão} : Imprime uma expressão ou variável especificada.

O Objeto Printer não aparece na caixa de ferramentas, nem possui um ícone como outros
objetos. Ele é interno que não possui formato visual.

288 - Usuário logado (Novel)


Enviado por: Davi Diogo

Uma das variáveis de ambiente da Novel consegue descobrir o nome do usuário que está logado.
Dim Usuario as string
Usuario = Environ("User")

289 - Ao escolher um item de um menu, proteger todos os outros menus do formulário.


Enviado por: Emerson Nascimento

Quando o usuário escolher uma determinada opção de um menu qualquer de


um formulário, tornar todos os outros menus do formulário protegidos, ou seja, o usuário so pode abrir um
menu, e escolher somente uma opção do menu aberto.
Option Explicit
.
.
.
Private Sub opcao1menu1_Click()
gl_chamador = 1 ' gl_chamador = 1 indica que o formulário foi chamado
' pelo menu e não por outro
formulário
setar_true_false (False)
Form1.MousePointer = 11
Load Form2
Form2.Show
Form1.MousePointer = 1
End Sub
.
.
.
Private Sub opcao2menu1_Click()
gl_chamador = 1
setar_true_false (False)
Form1.MousePointer = 11
Load Form3
Form3.Show
Form1.MousePointer = 1
End Sub
.
.
.
Private Sub opcao1menu2_Click()
gl_chamador = 1
setar_true_false (False)
Form1.MousePointer = 11
Load Form4
Form4.Show
Form1.MousePointer = 1
End Sub
.
.
.
Private Sub opcao2menu2_Click()
gl_chamador = 1
setar_true_false (False)
Form1.MousePointer = 11
Load Form5
Form5.Show
Form1.MousePointer = 1
williamdsilva@aol.com.br 135

End Sub
.
.
.
'Modulo1
Option Explicit
.
.
.
Public gl_chamador As Integer
Function setar_true_false(tf As Boolean)
Form1.menu1.Item(1).Enabled = tf
Form1.menu2.Item(2).Enabled = tf
Form1.menu3.Item(3).Enabled = tf
End Function
.
.
.
'Form2
Private Sub sair_Click()
If gl_chamador = 1 Then
setar_true_false (True)
End If
Unload Me
End Sub
'Form3
Private Sub sair_Click()
If gl_chamador = 1 Then
setar_true_false (True)
End If
Unload Me
End Sub
'Form4
Private Sub sair_Click()
If gl_chamador = 1 Then
setar_true_false (True)
End If
Unload Me
End Sub
'Form5
Private Sub sair_Click()
If gl_chamador = 1 Then
setar_true_false (True)
End If
Unload Me
End Sub

290 - Como filtrar registros usando uma instrução SQL


Enviado por: Fabio Feitoza

* Insira um controle DATA no seu formulário

* Vá até as propriedades Databasename e especifique o caminho e o nome do arquivo de banco de dados.

* Depois verifique se a propriedade RecordsetType é do tipo Dynaset ou Snapshot.

* Abaixo da propriedade RecordsetType estará a Recordsource onde você poderá especificar o nome da
Tabela ou um instrução SQL.

OBS. Especificando a instrução SQL na propriedade Recordsource de um Data Control quando seu projeto
for iniciado o DATA é atualizado automaticamente. Mas se você especificar esse comando dentro da área
de codificação, terá que incluir o código para atualizar o controle.

Por exemplo:
DATA1.RECORDSOURCE = "SELECT [Campo] FROM [Tabela] WHERE [Campo] [Condição]'"& "[Expressão]" & "'"

DATA1.REFRESH
[Campo] - Nome do campo do banco de dados
[Tabela] - Nome da tabela do banco de dados
[Condição] - LIKE, = , > ,< ,<> ,<= ,>=.
williamdsilva@aol.com.br 136

[Expressão] - O que você quer filtrar.[texto digitado].

291 - Mudança de caractéres em uma string ( + fácil )


Enviado por: Fabio J. P. Silva

Para usar esta função é preciso um textbox


e um label para visualizar o resultado.
Exemplo:
Private Sub Text1_Change()
Label1.Caption = MudaTexto(Text1.Text)
End Sub
Function MudaTexto(palavra As String) As String
Dim i As Integer
For i = 0 To Len(palavra)
palavra = Replace(palavra, "<", "[")
palavra = Replace(palavra, ">", "]")
palavra = Replace(palavra, "\", "|")
palavra = Replace(palavra, ".", ",")
'Quantas mudanças forem nescessárias
Next
MudaTexto = palavra
End Function

292 - Como travar o mouse dentro de um formulário


Enviado por: gabriel

Esta dica é muito boa. Com o código a seguir, você vai poder prender o cursor do mouse dentro de um
formulário qualquer.
Primeiro você cria um módulo contendo o seguinte código:
#If Win16 Then
Type Retang
esquerda As Integer
topo As Integer
direita As Integer
baixo As Integer
End Type
Declare Sub ClipCursor Lib "User" (lpRetang As Retang)
Declare Sub GetWindowRect Lib "User" (ByVal hWnd _
As Integer, lpRetang As Retang)
Declare Function GetDesktopWindow Lib "User" () As Integer
#Else
Type Retang
esquerda As Long
topo As Long
direita As Long
baixo As Long
End Type
Declare Sub ClipCursor Lib "User32" (lpRetang As Retang)
Declare Sub GetWindowRect Lib "User32" (ByVal hWnd _
As Integer, lpRetang As Retang)
Declare Function GetDesktopWindow Lib "User32" () As Long
#End If
/pre>

Depois você usa os códigos abaixo em um botão ou como quiser para travar e destravar:
'restringe o movimento do mouse
Dim EstaJanela As Retang
GetWindowRect Me.hWnd, EstaJanela
ClipCursor EstaJanela
'Libera no desktop
Dim DesktopWindow As Retang
GetWindowRect GetDesktopWindow(), DesktopWindow
ClipCursor DesktopWindow
/pre>

Pronto! Se você que entrou nesta dica sabe alguma coisa sobre criação de jogos no VB, pelo amor de Deus,
williamdsilva@aol.com.br 137

me manda um e-mail!!!
email: superforrest@zipmail.com.br

293 - Evitando erros na visualização


Enviado por: Glauco Zamarim Variz

Quando indicamos uma TextBox com um determinado registro do banco de dados, cujo valor é nulo, é
gerado um erro.
Para que não aconteça isto, uso o seguinte código:
textbox.text = "" & Tabela!Campo

294 - Mensagens de erro e soluções


Enviado por: Helmar Santos Faria

Para quem está usando o VB 6, depois de criar


sua aplicação dá uma mensagem de "out of memory".
Pra solucionar este problema, retire do seu pro-
jeto a FM20.DLL da barra de ferramentas, é uma DLL
que não é "distribuitable", aliás pra vc ver se
uma DLL pode ou não ser distribuída, verifique
no CD 1 do VB6 o diretório COMMON\REDIST\ o arqui-
vo redist.txt, lá dentro tem as DLL, que vc pode
mandar junto com a sua aplicação!!!

É isto!!!

Abraços

295 - Problema com o setup


Enviado por: Heros Carlos da Silva

Se você usa o controle MSCAL.OCX, no momento da instalação, se ocorrer o seguinte erro :

"c:\windows\system\$(dllselfregisterex) could not be registered because it could not be found

Adicione no arquivo VB5dep.ini as seguintes linhas :


[MSCAL.OCX]
Register=$(DLLSelfRegister)
Dest=$(WinSysPath)
Uses1=

296 - Conversao de bases


Enviado por: Joao Bosco Ribeiro

Crie um formulario com 3 (três) controles textbox com os seguintes nomes: TxtRecebe, TxtConvertido e
TxtRetornado.
Crie uma frame e dentro dela inclua 4 contoles OpptionButton com o nome Option1 tendo como caption:
Binário, Octal, Decimal de Hexa
Informe o nome no TextBox TxtRecebe e selecione a base para qual voce quer converter o número.

Sao duas funcoes: ConvOD e ConvDO.


A ConvOD (Converte Outras bases para Decimal) {Function ConvOD(ByVal VlOri As String, ByVal Base As
Integer) As Long} recebe como parametro um valor decimal inteiro longo (positivo) e a base para qual se
deseja converter este valor.

A ConvDO (Converte Decimal para outras bases) {Function ConvDO(ByVal VlOri As Long, ByVal Base As
Integer) As String} recebe como parametro uma string que contem um valor em uma base qualquer e a
base em que esta este valor

O que torna estas funçoes bem pequenas é a recursividade.


Dim MatInd(3) As Integer
Dim Caracs As String
williamdsilva@aol.com.br 138

Private Sub Form_Load()


MatInd(0) = 2
MatInd(1) = 8
MatInd(2) = 10
MatInd(3) = 16
Caracs = "0123456789ABCDEF"
End Sub
Private Sub Option1_Click(Index As Integer)
TxtConvertido = ConvDO(CLng(TxtRecebe), MatInd(Index))
TxtRetornado = ConvOD(TxtConvertido, MatInd(Index))
End Sub
Function ConvDO(ByVal VlOri As Long, ByVal Base As Integer) As String
Dim DVI As Long
Dim Rst As Integer
DVI = VlOri \ Base
Rst = (VlOri Mod Base) + 1
If DVI < Base Then
ConvDO = Mid(Caracs, DVI + 1, 1) & Mid(Caracs, Rst, 1)
Else
ConvDO = ConvDO(DVI, Base) & Mid(Caracs, Rst, 1)
End If
End Function
Function ConvOD(ByVal VlOri As String, ByVal Base As Integer) As Long
Dim PCar As Integer
Dim Rst As String
PCar = InStr(Caracs, Left(Trim(VlOri), 1)) - 1
VlOri = Mid(VlOri, 2)
If Len(VlOri) >= 1 Then
ConvOD = PCar * Base ^ Len(Trim(VlOri)) + ConvOD(VlOri, Base)
Else
ConvOD = PCar
End If
End Function

297 - Fazendo aplicativos do estilo client /server


Enviado por: João Milliet

É muito simples fazer aplicativos client e server.


Você precisa do controle winsock.
O que você deve fazer primeiro é um aplicativo server:
Inclua o controle winosck no formulário e determine uma porta local (localPort) .
Obs. A porta local não pode ser alterada durante a execução do programa
no caso, você inclui um botão de comando com o seguinte código:
winsock1.Listen

Ou seja, o winsock estará ouvindo para ver se tem algum aplicativo client chamando por conexão.
Então você da um duplo-clique no controle winsock e seleciona a ação (no menu de ações do editor de
código do VB) e seleciona a ação connectionRequest
colocando o seguinte código
winsock1.accept("")
msgBox "pedido de conecção"

O que significa: o winsock vai aceitar a conexão pedida e vai aparecer uma caixa de diálogo com a
mensagem "pedido de conexão"
OK, o server está feito, agora você pode dar uns retoques no visual e outros.
Agora partimos para o aplicativo client
Você deve inserir nele um controle winsock
Coloque um campo de texto chamado txtIPhost e outro chamado txtPorta (coloquei estes nomes apenas
para simbolizar)
insira um botão de comando e coloque o seguinte código:
'confere se o campo de texto txtIPhost está vazio ou idem para o campo txtPorta
'Se algum deles estiver vazio o aplicativo mostrará uma caixa de diálogo com a mensagem
if txtIPhost.Text = "" or txtPorta.Text = "" then
if txtIPhost.text = "" then
msgBox "Você precisa especificar o endereço da máquina host"
end if
if txtPorta.text = "" then
williamdsilva@aol.com.br 139

msgBox "Você precisa especificar a porta da máquina host"


end if
else
'Configura o endereço host do winsock através do campo de text txtIPhost winsock
winsock1.remoteHost = txtIPhost.Text
'Configura o endereço remoto da porta do winsock através do campo de texto txtPorta
winsock1.remotePort = txtPorta.Text
'Executa conecção
Winsock1.Connect

Então você agora pode criar funções, e depois envia-las, como por exemplo uma mensagem caixa de
diálogo:
Function exemplo()
msgBox "Este é um exemplo de função"
End Function

Então coloque o seguinte código num botão de comando (por exemplo)


'dentro do parenteses o nome da função
winsock1.sendData (exemplo)

Pronto, temos um esquema client - server! OBS. sAINDA OCORREM ALGUMAS PEQUENAS FALHAS
DURANTE A EXECUÇÃO DO PROGRAMA

298 - Como deixar seu formulario de ajuda com cara de Internet !!!
Enviado por: Laurindo dos Santos

Escolha um controle no controle label coloque como FontUnderline.


Na propriedade MouseMove() da label digite :
[label].ForeColor = &H00FF0000&

E no evento Form_Mousemove() digite :


[label].ForeColor = &H0000C000&

Se ouver maior quantidade crie Arrays e use o For para mudar a cor dos mesmos.
Obs.: Para ficar ainda melhor coloque a propriedade MousePointer = Custom e na propriedade MouseIcon
procure o arquivo
c:\Windows\Cursor\Hand-m.ico !!!

299 - Enviando erros de um Controle ou DLL para o aplicativo chamador


Enviado por: Lenilson Marcenal

Public Sub RaiseError(Optional ByVal SrcName, _


Optional ByVal code = 0, _
Optional ByVal Message, _
Optional ByVal oConsulta As STIDB.Query)
Dim sMsg As String
Dim nLoop As Integer
On Error Resume Next
If Not IsMissing(SrcName) Then sMsg = sMsg & " Origem: " & SrcName & vbCr & vbLf
If Not IsMissing(code) Then sMsg = sMsg & " Código: " & code & vbCr & vbLf
If Not IsMissing(Message) Then sMsg = sMsg & " " & Message & vbCr & vbLf
If sLogCreate Then
If Not IsMissing(oConsulta) Then
If Not oConsulta Is Nothing Then
sMsg = sMsg & "----| Parâmetros da Consulta |-----------------------" & vbCr & vbLf
sMsg = sMsg & " Numero de Parâmetros = " & oConsulta.Parameters.Count & vbCr & vbLf
If oConsulta.Parameters.Count > 0 Then
For nLoop = 0 To oConsulta.Parameters.Count - 1
sMsg = sMsg & " Parâmetro " & nLoop & ") Tipo : " & oConsulta.Parameters(nLoop).DataType & " -
Valor : " & Left$(oConsulta.Parameters(nLoop).Value, 100) & vbCr & vbLf
Next
End If
End If
End If
End If
Err.Raise vbObjectError + code, , sMsg
End Sub
williamdsilva@aol.com.br 140

300 - Alinhando números pela vírgula


Enviado por: Lenilson Marcenal

Utilize esta função ao imprimir via código um relatório.


Public Function AlinhaNumeroVirgula(ByVal Numero As Variant, _
ByVal TamanhoNumero As Integer, _
Optional ByVal QuantDecimais As Integer = 2) As String
AlinhaNumeroVirgula = Format$(Format$(Numero, "0" & IIf(QuantDecimais > 0, "." & String(QuantDecimais,
"0"), "")), String(TamanhoNumero, "@"))
End Function

301 - Setando MousePointer de maneira segura


Enviado por: Lenilson Marcenal

Quando tentava fazer uma função que tomaria algum


tempo do usuário, sempre eu colocava a ampulheta
do mouse (11) e depois retornava para o ponteiro
padrao (0), sendo que se esta função fosse chamada
de dentro de outra função que já fizesse isto após
a chamada da segunda função o ponteiro do mouse
ficava como padrão, agora sempre que vou mudar o
ponteiro do mouse utilizo esta função.
Public Function gMousePointer(ByVal nTipodoMouse As MousePointerConstants) As Integer
gMousePointer = Screen.MousePointer
If Screen.MousePointer <> nTipodoMouse Then
Screen.MousePointer = nTipodoMouse
End If
End Function

302 - como gravar um arquivo texto no HD


Enviado por: Marcelo Caetano Costa Leite Dominici

Como gravar um arquivo texo(*.txt) no HD do seu PC?


'************************************************
dlg1.filter="arquivo de texo(*.txt) | *.txt"
dlg1.showsave
if dlg1.filename For Output As #1
open dlg1.filename For Output As #1
print #1,txttexto.text 'Salva string para
'arquivo
close #1
end if
'*************************************************

303 - Localizar Pastas do Windows


Enviado por: Marcelo Zeri

'Código que recupera Pastas do Windows, como Strings:


'Ex: C:\Windows\Desktop, C:\Windows\Histórico...
'-------------------
'Código para o Form
'-------------------

Option Explicit
Private Sub Form_Load()
Call AchePastas
End Sub
Private Sub AchePastas()
MsgBox " 0- " & ListaPastas(0) & vbCrLf & _
williamdsilva@aol.com.br 141

" 2- " & ListaPastas(2) & vbCrLf & _


" 5- " & ListaPastas(5) & vbCrLf & _
" 6- " & ListaPastas(6) & vbCrLf & _
" 7- " & ListaPastas(7) & vbCrLf & _
" 8- " & ListaPastas(8) & vbCrLf & _
" 9- " & ListaPastas(9) & vbCrLf & _
"11- " & ListaPastas(11) & vbCrLf & _
"19- " & ListaPastas(19) & vbCrLf & _
"20- " & ListaPastas(20) & vbCrLf & _
"21- " & ListaPastas(21) & vbCrLf & _
"26- " & ListaPastas(26) & vbCrLf & _
"27- " & ListaPastas(27) & vbCrLf & _
"32- " & ListaPastas(32) & vbCrLf & _
"33- " & ListaPastas(33) & vbCrLf & _
"34- " & ListaPastas(34), , " Pastas do Windows"
Unload Me
End Sub

'------------------------
'Código para o módulo BAS
'------------------------
Option Explicit

'APIs
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long,
ByVal pszPath As String) As Long
Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder As
Long, pidl As ItemDaLista) As Long

'Constantes
Public Type LOCMEIO
CB As Long
ABID As Byte
End Type
Public Type ItemDaLista
MKID As LOCMEIO
End Type

'Função Pública
Public Function ListaPastas(ByVal CSIDL As Long) As String
Dim Zz As Long
Dim StrDoPath As String
Dim IDL As ItemDaLista
Const NOERRO = 0
Const TAM_MAX = 260
On Error GoTo PareFuncao:
Zz = SHGetSpecialFolderLocation(Form1.hWnd, CSIDL, IDL)
'troque o nome do Form1 se ele tiver outro nome
If Zz = NOERRO Then
StrDoPath = Space$(TAM_MAX)
Zz = SHGetPathFromIDList(ByVal IDL.MKID.CB, ByVal StrDoPath)
If Zz Then ListaPastas = Left$(StrDoPath, InStr(StrDoPath, Chr$(0)) - 1)
End If
Exit Function
PareFuncao:
End Function

304 - PopMenu Randômico


Enviado por: Marcelo Zeri

PopMenu Randômico:
1-) Coloque 1 Label ( Label1 ) em 1 formulário e construa o seguinte Menu:
CAPTIONS ( NAMES )
&Arquivo ( mnuArquivo )
williamdsilva@aol.com.br 142

... &Novo ( mnuNovo )


... - ( separa1 )
... &Abrir ( mnuAbrir )
... - ( separa2 )
... &Fechar ( mnuFechar )
&Editar ( mnuEditar )
... &Copiar ( mnuCopiar )
... - ( separa3 )
... &Recortar ( mnuRecortar )
... - ( separa4 )
... &Selecionar Tudo ( mnuSeleTudo )
&Informações ( mnuInfo )
... &Ajuda ( mnuAjuda )
... - ( separa5 )
... &Sobre o Programa ( mnuSobre )

2-) Cole o seguinte código no form:


Option Explicit
Private Sub Form_Load()
Label1.Left = 0
Label1.Width = Me.Width
Label1.Alignment = 2
Label1.FontBold = True
Label1.FontSize = 12
Label1 = "Clique o form com o botão direito do mouse por diversas vezes"
Me.WindowState = 2
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Label1 = ""
If Button = 2 Then
Dim MeuValor%
'Randomize
'sorteia um número entre 1 e 3 para exibir l menu
'quando o botão direito do mouse for clicado
'se quiser adicionar + menus substitua
'o número 3 pelo numero de menus desejado

MeuValor% = Int((3 * Rnd) + 1)

Select Case MeuValor%


Case 1
Label1.ForeColor = QBColor(12)
Label1 = "&Arquivo": PopupMenu mnuArquivo, 2, , , mnuNovo
Case 2
Label1.ForeColor = QBColor(9)
Label1 = "&Editar": PopupMenu mnuEditar, 2, , , mnuSeleTudo
Case 3
Label1.ForeColor = QBColor(1)
Label1 = "&Informações": PopupMenu mnuInfo, 2, , , mnuSobre
End Select
End If
End Sub
Private Sub Form_Resize()
Label1.Width = Me.Width
Label1.Top = Height * 0.75
End Sub
Private Sub Fechar_Click()
Unload me
End Sub

305 - Como fazer cálculos com horas facilmente.


Enviado por: Marcio A. P.

Para início, vamos relembrar 1h = 60min. Isto é só para relembrar você de que para transformar h em min
e só multiplicar por 60.

Todos os cálculos serão realizados em minutos, então para entrada de dados você deve ter dois controles
diferentes, um para horas e outro para minutos. Converta as horas em minutos depois some com os
minutos restantes do outro controle.
williamdsilva@aol.com.br 143

Agora você já tem o 1º. Valor (vamos chamar de x) . Agora faça o mesmo para um segundo valor (vamos
chamar de y).

Preste atenção agora que você tem os dois valores “x” e “y”, você pode realizar qualquer operação com
eles. Mas tem um porém, o valor resultante de uma operação entre “x” e “y” é em minutos.

Para resolver este problema crie um while da seguinte forma:

Suponhamos que seja feita a seguinte operação x + y = z

Neste caso o valor retornado será sempre positivo e > 0 então para essa ocasião temos.
X = minutos

Y = minutos

Z = minutos
do while z >= 60
z = z 60
horas = horas + 1
Loop

Obs.: sendo horas uma variável declarada. Para exibir o resultado faça text1.text = horas & “ : “ & z

Atenção se a operação for subtração deverá ser criado um while para números negativos:
Do while z < 0 and z <= -60
z = z + 60
horas = horas +1
Loop

Tome cuidado para não ficar preso em um loop infinito.

306 - Imprimir como no DOS.


Enviado por: Marcos Joaquim Neto

Área: Impressão
Para imprimir utilizando impressoras matriciais, a melhor forma é como no antigo DOS, utilizando os
próprios carateres da impressora, pois a impressão através Gerenciador do Windows é muito lenta.
Para isso, deve-se abrir a porta da impressora como se fosse um arquivo texto.
Exemplo:
Open "LPT1:" for output as #1
for x= 1 to 10
print #1, "Isto é um teste."
next
print #1, Chr(12);
Close #1

Este exemplo imprime a frase "Isto é um teste." em 10 linhas e faz com que o ponto de impressão passe
para a próxima página.
Observação: Alguns caracteres acentuados das impressoras matriciais tem códigos diferentes daqueles
utilizados pelo Windows.

307 - Função que converte uma cor em VB para cor HTML


Enviado por: RodrigoAlves Peres

Public Function ColorTag(ByVal Cor As Long) As String


Dim Texto As String, corHexa As String
Dim Num As Integer
corHexa = Hex(Cor)
'Converte a cor númerica do
'parametro em Hexadeximal
'Obs.: A função Hex Retorna O Num em Texto
Texto = ""
For Num = (6 - Len(corHexa)) To 1 Step -1
Texto = Texto & "0"
Next
williamdsilva@aol.com.br 144

ColorTag = "#" & Texto & corHexa


'Retorna #BBGGRR
End Function

Agora Pode ser Implementado Assim:


Label1.Caption=ColorTag(vbblue)
'Retorna #FF0000

Ou usar o CommonDialog:

'Chama a caixa de diálogo de cor


CommonDialog1.ShowColor
Label1.Caption = ColorTag(CommonDialog1.Color)

308 - Trocar caracteres em uma string


Enviado por: Sergio Godoy

É possível criar uma função simples que troca um caracter por outro em uma string (Semelhante à dica já
enviada, só que aperfeiçoada). Declare uma função:
Function TrocaString(ByVal sString as String, sOldChar as String, sNewChar as String) as String
While InStr(sString, sOldChar) > 0
Mid(sString,InStr(sString,sOldStr),1)=sNewStr
Wend
TrocaString = sString
End Function

Depois, a chamada é simples. Exemplo:

MsgBox TrocaString("Ganhe muito ????? !","?","$")

Isso exibirá a mensagem 'Ganhe muito $$$$$ !'.

309 - Iluminar Campo


Enviado por: Thadeu R. Ferraz

Estes dois comandos permitem mudar a cor do textbox quando recebe ou deixa o foco.
Private Sub text1_GotFocus()
text1.BackColor = &HC0FFFF
End Sub
Private Sub text1_LostFocus()
text1.BackColor = &H80000005
End Sub

310 - Número de série do HD, sem API


Enviado por: Vanclei Matheus

Para pegar o número de série de um HD utilize o seguinte código:


Dim lSerial as Long
Dim fso As New FileSystemObject, drvDrive As Drive

'Pega as informações do drive c:


Set drvDrive = fso.GetDrive(left(fso.GetDriveName("c:\"), 2))

'Pega o número de série do HD


lSerial = drvDrive.SerialNumber

E não esqueça de adicionar aos references do seu projeto a seguinte biblioteca


"Microsoft Scripting Runtime", senão não funciona

311 - Inserindo textos no crystal a partir do VB


Enviado por: Washington Souzedo
williamdsilva@aol.com.br 145

As vezes você sente necessidade de inserir um periodo ou um texto na hora de execução do seu relatório.
No VB. 1 . objetoCristal.formulas(0) = "NomeFormula = 'Relatorio ....'"
NO Cristal. 1. Crie uma formula (Dê um nome qualquer). Clique em accept e insira o campo de formula no
local desejado.

Quando o relatorio for impresso o Vb enviara a msg para o cristal eo sustituirá on de o nome da formula foi
inserido..

312 - Para o seu texto ficar piscando


Enviado por: Web'o

Coloque um timer, e este código no timer com


interval para 500. E depois crie uma label.
Código do timer:
Private Sub Timer1_Click()
If Label1.visible = true then
Label1.visible=false
else
Label1.visible=true
End if
End sub

313 - como criar Credits Scroll


Enviado por: Wellington E. Souza

Credits Scroll

' Adicione um timer ao seu form com o valor do intervalo =1


' Tenha 1 label ou mais em seu form (esse código pode rolar figuras, textboxes ...)

Private Sub Timer1_Timer()


Label1.Top = Label1.Top - 32 'The bigger the number, the faster the scroll
' add any other labels you want to scroll....
' also try this:
' Label1.Left = Label1.Left - 32
' to scroll sideways

End Sub

314 - Visualizador de imagem simples


Enviado por: William

Para montar um visualizador de imagem simples, basta abrir um noveo projeto,


inserir os seguintes controles FileListBox, DirListbox e Image, em seguida escreva
as seguites linhas:
Private Sub Dir1_Change()
File1 = Dir1 'Amarra os arquivos às pasta
End Sub
Private Sub File1_Click()
Chdir(Dir1) 'Quando mudar de dirtório atualiza o File1
Image1.Picture = LoadPicture(File1)
End Sub
Private Sub Form_Load()
File1.Pattern = *."bmp;*.jpg;*.gif;*.cur;*.wmf;*.ico"
'Filtra o File1, para exibição somente deste arquivos
End Sub

Obviamente que esta última lina poderá ser substituida, simplesmente inserindo as informações entre
parentese na
propriedade Pattern do componente File1.

Outra dica e verificar a propriedade Strech da Image, para limeitar ou não o tamanho da imagem a ser
exibida.

Quem tiver interesse em um visualizador Freeware da Lizaro Software, basta enviar um e-mail para o
williamdsilva@aol.com.br 146

endereço acima.

Um grande abraços a todos e até breve.

315 - Como pegar o diretório do windows com uma só linha de comando


Enviado por: ]Anjo[

Dim Windows
'Nem conta como linha, pois sem ela funciona
'também
Windows = Environ("Windir")
'Essa variável de abiente é setada no
'c:\msdos.sys, é onde é armazenado o nome do
'diretório do windows
MsgBox Windows
'Também não conta como linha
'Retorna: "C:\Windows"
'Tks ao midnait pelo help

316 - Redimensionamento dos controles no Form


Enviado por: Alexandre Gomiero

Se vc precisa deixar habilitado o redimensionamento da janela p/ o usuário e os controles dispõem-se


automaticamente no form, conforme o tamanho, coloque no Form_Resize() o seguinte:
If Me.WindowsState <> 1 Then
'Se quiser que o controle mude de tamanho
controle.height = form.height - (diferença entre e o form.height e controle.height, inicialmente)
controle.width = form.width - (diferença entre o form.width e controle.width, inicialmente)
'Se quiser que o controle mexa-se no form
controle.top = (em alguns casos é fixo (0 por exemplo), se não for, faça as contas onde o controle deverá
aparecer se o form for redimensionado, por exemplo, (form.height/2) - controle.height, se for p/ o controle
aparecer no meio do form
controle.left = (idem acima, mas em vez de .height é .width)
End If

317 - Símbolo da moeda


Enviado por: Anderson J. C. Garcia

O simbolo da moeda definido nas configurações regionais do sistema pode ser obtido através da API
GetLocaleInfo. Segue código:
'Como obter o simbolo da moeda
Option Explicit
Public gstrCurrencySymbol As String
Private Declare Function GetLocaleInfo Lib "kernel32" _
Alias "GetLocaleInfoA" (ByVal Locale As Long, _
ByVal LCType As Long, ByVal lpLCData As String, _
ByVal cchData As Long) As Long
Private Declare Function GetUserDefaultLCID% Lib "kernel32" ()
Private Const LOCALE_SCURRENCY = &H14
Sub Main()
Dim iRet1 As Long
Dim iRet2 As Long
Dim lpLCDataVar As String
Dim Pos As Integer
Dim Locale As Long
Locale = GetUserDefaultLCID()
iRet1 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, lpLCDataVar, 0)
gstrCurrencySymbol = String$(iRet1, 0)
iRet2 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, gstrCurrencySymbol, iRet1)
Pos = InStr(gstrCurrencySymbol, Chr$(0))
If Pos > 0 Then
gstrCurrencySymbol = Left$(gstrCurrencySymbol, Pos - 1)
End If
williamdsilva@aol.com.br 147

MsgBox "O simbolo da moeda é " & gstrCurrencySymbol, vbInformation


End Sub

318 - Pontos de Inserção (Caret) Personalizáveis


Enviado por: Antonio Aristides Mochi Jr.

'Esta programa demostra como personalizar os


'pontos de inserção de um text-box modificando o
'seu formato e o tempo de piscada
'Crie um novo formulário com dois TextBox e copie
'o código abaixo para fazer o teste.
'
'-----------------------------------------
Option Explicit
Private Declare Function CreateCaret Lib "user32" (ByVal hWnd As Long, ByVal hBitmap As Long, ByVal nWidth
As Long, ByVal nHeight As Long) As Long
Private Declare Function SetCaretBlinkTime Lib "user32" (ByVal wMSeconds As Long) As Long
Private Declare Function ShowCaret Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetCaretBlinkTime Lib "user32" () As Long
'VARIAVEIS PRIVADAS
Private lDuracaoBlink_Text2 As Long
'CONSTANTES
Private Const CARET_EM_PRETO As Long = 0
Private Const CARET_EM_CINZA As Long = 1
Private Sub Text2_GotFocus()
'SALVAR A DURAÇÃO DE PISCADA (BLINK) DO PONTO DE INSERÇÃO (CARET)
lDuracaoBlink_Text2 = GetCaretBlinkTime()
'CRIAR E MOSTRAR O NOVO FORMATO PARA O PONTO DE INSERÇÃO
CreateCaret Text2.hWnd, CARET_EM_CINZA, 5, 15
ShowCaret Text2.hWnd
'DEFINIR NOVA DURAÇÃO DE PISCADA
SetCaretBlinkTime 200
End Sub
Private Sub Text2_LostFocus()
'RETORNAR O VALOR DA DURAÇÃO DE PISCADA (BLINK)
SetCaretBlinkTime lDuracaoBlink_Text2
End Sub
'--------------------------------------------

319 - Descobrindo se o SO é Windows 95 ou Windows NT


Enviado por: Antonio Aristides Mochi Jr.

'DEMONSTRAÇÃO DE IDENTIFICAÇÃO DO SISTEMA


'OPERACIONAL CORRENTE.
'
'
'FUNÇÕES
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As
OSVERSIONINFO) As Long
'CONSTANTES
Public Const VER_PLATFORM_WIN32_NT As Long = 2
Public Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
Public Const VER_PLATFORM_WIN32s As Long = 0
'TIPOS
Public Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
'
Public Function VerificarSistemaOperacional() As String
Dim osvSistema As OSVERSIONINFO
Dim sRetorno As String
On Error GoTo ERRO
williamdsilva@aol.com.br 148

osvSistema.dwOSVersionInfoSize = Len(osvSistema)
If GetVersionEx(osvSistema) = 0 Then
sRetorno = "SISTEMA OPERACIONAL NÃO IDENTIFICADO"
Else
If osvSistema.dwPlatformId = VER_PLATFORM_WIN32_NT Then
sRetorno = "WINDOWS NT"
ElseIf osvSistema.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
sRetorno = "WINDOWS 95"
ElseIf osvSistema.dwPlatformId = VER_PLATFORM_WIN32s Then
sRetorno = "WINDOWS 32s"
End If
End If
VerificarSistemaOperacional = sRetorno
Exit Function
ERRO:
VerificarSistemaOperacional = "ERRO AO IDENTIFICAR O SISTEMA OPERACIONAL"
End Function

320 - Espiral
Enviado por: Armando Miani Neto

Private Sub Form_Load()


Timer1.Interval = 25
End Sub
Private Sub Timer1_Timer()
Dim CX, CY, Radius, Limit
ScaleMode = 3
CX = ScaleWidth / 2
CY = ScaleHeight / 2
If CX > CY Then Limit = CY Else Limit = CX
For Radius = 0 To Limit
Circle (CX, CY), Radius, RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Next Radius
End Sub

321 - mapear unidade de rede


Enviado por: bruno

Mapear uma unidade de rede;


Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal _
lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName _
As String) As Long
Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" _
(ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName _
As Long) As Long
Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _
(ByVal lpszName As String, ByVal bForce As Long) As Long
Dim Caminho As String, Unidade as String
Caminho = "\\Computador\Caminho"
Unidade = "I:"
'Realiza conexão
WNetAddConnection Caminho , "Se tiver senha, digite á aqui", unidade
'Consulta caminho de uma determinada conexão, _
'neste caso, na variável caminho será armazenado o local do caminho _
'atual ref. a unidade
WNetGetConnection Unidade, Caminho, 255)
'Desconecta
WNetCancelConnection Unidade, True

322 - Enviando registro para o Excel


Enviado por: Carlos Gentini e Carlos Gama

Uma Maniera facil de Gera Registro de uma tabela em excel.


Dim RS As Recordset
Dim DBanco As DataBase
williamdsilva@aol.com.br 149

Dim XL As Object
Dim Num As Long
Dim Alfabeto As Variant
Dim Campos() As String
Dim Letras As String
sub CommandButton_Click()
Set XL = CreateObject("excel.Application")
XL.Workbooks.Add
Set XL = XL.Application.Worksheets
Call GeraRecordset
If RS.RecordCount <> 0 Then
RS.Close
DBanco.Close
Set XL = nothing
End Sub
Private Sub GeraRecordset()
Alfabeto = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z", _
"AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS",
"AT", "AU", "AV", "AW", "AX", "AY", "AZ", _
"BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS",
"BT", "BU", "BV", "BW", "BX", "BY", "BZ", _
"CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS",
"CT", "CU", "CV", "CW", "CX", "CY", "CZ", _
"DA", "DB", "DC", "DD", "DE", "DF", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DO", "DP", "DQ", "DR",
"DS", "DT", "DU", "DV", "DW", "DX", "DY", "DZ")
Set DBanco = OpenDatabase(caminho)
Set RS = DBanco.OpenRecordset(Tabela, dbOpenDynaset)
ReDim Campos(RS.Fields.Count)
For Num = 0 To RS.Fields.Count - 1
Campos(Num) = RS.Fields(Num).Name
Next
For Num = 0 To RS.Fields.Count - 1
Letras = Alfabeto(Num) & "1"
XL("Plan1").Range(Letras).Value = Campos(Num)
Next
'Copia o todos o recordeset aberto para o Excel
XL("Plan1").Range("A2").CopyFromRecordset RS
End Sub

323 - Imprimir um Relatório em Crystal em rede


Enviado por: CArlos Gentini e Carlos Gama

Se vc tem um aplicativo em VB, e seu relatórios são em crystal, vai um dica de como roda-los em rede
Crystal.DataFiles(0) = "\\Teste\Relatorio\Banco de dados"
Crystal.ReportFileName = "\\Teste\Relatorio\ report.rpt"
Imprimir.Destination = crptToPrinter
Imprimir.Action = 0

324 - Letreiro com LABEL


Enviado por: Carlos Peixoto

Private Sub Form1_Load()


Timer1.Interval = 150
Timer1.Enabled = True
Label1.Caption = "Letreiro com LABEL"
End Sub
Private Sub Timer1_Timer()
Label1.Left = Label1.Left - 100
If Label1.Left < -Label1.Width + 10 Then Label1.Left = Me.Width + 100
End Sub

325 - Qual o último dia do mês X e ano Y??


Enviado por: Carlos Peixoto
williamdsilva@aol.com.br 150

Option Explicit
Dim data As Date
Function Ultimo_Dia(mes As String) As Integer
For Ultimo_Dia = 31 To 28 Step -1
If IsDate(Ultimo_Dia & "/" & mes & "/" & Year(Date)) Then
Exit For
End If
Next
Me.Caption = Ultimo_Dia & "/" & Format$(data, "mm/yyyy")
End Function
Private Sub Form_Click()
data = Text1.Text
Ultimo_Dia (Format$(data, "mm"))
End Sub

326 - Pegar WinDir em uma linha!!


Enviado por: Carlos Peixoto

Bem, é muito simples:


Msgbox Environ("windir")

Pronto!!!

327 - Atualizar Tabelas do DBase para o Access via VB


Enviado por: Cesar Villela - Curitiba/PR

Dim dbAccess As New ADODB.Connection


Dim dbDbase As New ADODB.Connection
Dim TabelaAccess As New ADODB.Recordset
Dim TabelaDBase As New ADODB.Recordset
dbAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;Persist Security Info=false"
dbDBase.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Arquivos do dBASE;Initial
Catalog="
dbAccess.CursorLocation = adUseServer
dbDBase.CursorLocation = adUseClient
Screen.MousePointer = vbHourglass
TabelaAccess.Open "", dbAccess, adOpenKeyset, adLockOptimistic
TabelaDBase.Open "", dbBase, adOpenKeyset, adLockOptimistic
While Not TabelaAccess.EOF
TabelaAccess.AddNew
'Repetir para cada campo a atualizar...
TabelaAccess.Fields("").Value = TabelaDBase.Fields("").Value
TabelaDBase.MoveNext
Wend
Screen.MousePointer = vbDefault
MsgBox "Atualização da tabela FATURA1.DBF, foi concluída com êxito!", vbInformation, "Conclusão"

Observação: As tabelas tem q ter a mesma estrutura de dados.

328 - Correção em "Correção dos ítens "Validando CPF" "


Enviado por: Charles Dayan

Quando o número 11111111111 é colocado para ser testado na função de validação de CPF esta diz que
este é um número válido.
Coloque um teste antes de envia-lo:
Sub Command1_Click()
If Not (Text1.Text = "11111111111") Then
resp = Calc_CPF(Text1.Text)
Else
Label1.Caption = "Valor não aceito!"
GoTo 200
End If
If resp Then
Label1.Caption = "Válido"
Else
Label1.Caption = "Inválido"
End If
End Sub
williamdsilva@aol.com.br 151

329 - Inconsistencia no caminho da AJUDA


Enviado por: Christian Chagas

Se sua ajuda for colocada na configuração do progeto, "Menu project", ela não será achada depois da
instalação, para evitar isso use o seguinte:
App.HelpFile = App.Path & "Ajuda\Ajuda.hlp"
Onde Ajuda é um diretório dentro do diretório do seu projeto, e Ajuda.hlp é o nome da sua ajuda.

330 - Substituindo o IF
Enviado por: Claudio

Ao invés de voce usar:


Private Sub Command1_Click()
Dim humano As String
humano = Text1.Text
If humano = "masculino" Then
MsgBox ("Sexo Masculino")
Else
If humano = "feminino" Then
MsgBox ("Sexo Feminino")
Else
If humano = "menino" Or humano = "menina" Then
MsgBox ("Crianças")
Else
MsgBox ("Humano Invalido")
End If
End If
End If
End Sub
Use:
Private Sub Command1_Click()
Dim humano As String
humano = Text1.Text
Select Case humano
Case "masculino"
MsgBox ("Sexo Masculino")
Case "Feminino"
MsgBox ("Sexo Feminino")
Case "menino"
MsgBox ("Criancas")
Case "menina"
MsgBox ("Criancas")
Case Else
MsgBox ("Humano Inválido")
End Select
End Sub

331 - Acesso ao Oracle


Enviado por: Edi Carlos L. Ortega

Em um módulo declare as seguintes variáveis globais:


Global strCn As String
Global strUser As String
Global strPass As String
Global strDSN As String
Global strCrystal As String
strCn = "ODBC;DSN=ORACLE;UID=" & txtUser.Text & ";PWD=" & txtPassword.Text & ";ConnectString=" &
txtDatabase.Text
strUser = txtUser.Text
strDSN = txtDatabase.Text
strPass = txtPassword.Text
strCrystal = "DSN=" & strDSN & ";UID=" & strPass & ";PWD=" & strPass & ";DSQ="
Crie um formulário com os campos:
txtUser: para Nome de Usuário
txtDatabase para Nome do Banco
txtPassword para Senha do Usuário

Pronto o VB irá conectar-se ao banco digitado pelo usuário.

332 - Identificação das mensagens do Oracle


williamdsilva@aol.com.br 152

Enviado por: Edi Carlos L. Ortega

Coloque em um módulo a seguinte função:


Dim cX As String, nX As Integer
For nX = Errors.Count - 1 To 0 Step -1
cX = cX & CStr(Errors(nX).Number) & " " & Errors(nX).Description & vbNewLine
Next nX
MsgBox cX, vbCritical + vbOKOnly, "Sistema CB"

Em seus formulários adicione rotinas de depuração de errors que chamem esta função e pronto o VB
utilizará esta mensagem para identificar as mensagens do Oracle e também as mensagens do próprio VB.
Qualquer dúvida mande-me um email.

333 - SEEK
Enviado por: FCCD

Para construir um consulta rápida por campos númericos faça o seguinte: Carrege sua base dados com
Table e depois no load do formulário carrege
seu index e faça os comandos abaixos...
Private sub Form_Load()
Data1.Recordest.Index = "PrimaryKey"
end Sub
Private Sub Command1_Click()
Dim Cod as Long
Cod = InputBox("Digite o Código")
data1.Recordset.Seek "=", Cod
if data1.recordest.NoMatch then
msgbox "Código não encontrado"
end if
end Sub

334 - Formulario de Senha


Enviado por: Felipe Durante

'Vou precisar de 2 textbox e um commandButon


no text2 altere a opção de PassowordChar para *
command1_Click()
'Indica a condição para a senha ser aceita
if text1.text="Visual" and text2.text="Basic" then
MsgBox "Senha Aceita"
form2.show
else
'se a senha não for aceita
msgBox"Senha Incorreta"
end if
end sub

335 - Variável Null ou Vazio


Enviado por: Gydian

No VB uma variável pode ser null ou "" (vazia). Para simplificar podesmos usar:
if variavel & "" = "" then...
em vez de
if variavel = "" or variavel = null then...
isto não altera o valor da variável, apenas na comparação, "transforma" uma variavel null em "" (vazia)
para fazer a comparação.

336 - Validação de datas ultra simples.


Enviado por: Gydian

Variavel = IsDate(minha_data)
Devolve True se é uma data possivel.

Devolve False se é uma data impossivel.

337 - Trocar Botoes do Mouse


williamdsilva@aol.com.br 153

Enviado por: Heliomar Pereira Marques dos Santos

'Declare esta API no Módulo


Declare Function SwapMouseButton& Lib _
"user32" (ByVal bSwap As Boolean)
'Dentro do Form você apenas seta o valor FALSE ou TRUE para bSwap
'Exemplo
Private Sub Command1_Click()
SwapMouseButton& (True)
End Sub
Private Sub Command2_Click()
SwapMouseButton& (False)
End Sub

338 - Limpar todos os MaskEditBox do formulário corrente


Enviado por: Hugo Stobienia Wannmacher

'Limpa todos os MskEdBox do formulário


Public Sub pClearMaskEdBox()
On Error Resume Next
Dim intX As Integer
For intX = 0 To Screen.ActiveForm.Count
If TypeOf Screen.ActiveForm.Controls(intX) Is MaskEdBox Then
Screen.ActiveForm.Controls(intX).Text = fStrConv(UCase(Screen.ActiveForm.Controls(intX).Mask), intX)
End If
Next
End Sub
Public Function fStrConv(MyNewMask As String, MyIndex As Integer) As String
On Error Resume Next
Dim intY As Integer
Dim strChar As String
For intY = 1 To Len(MyNewMask)
If UCase(Mid(MyNewMask, intY, 1)) = "A" Or Mid(MyNewMask, intY, 1) = "9" Or Mid(MyNewMask, intY, 1) = "?"
Or Mid(MyNewMask, intY, 1) = "#" Or UCase(Mid(MyNewMask, intY, 1)) = "C" Or Mid(MyNewMask, intY, 1) =
"&" Then
strChar = Screen.ActiveForm.Controls(MyIndex).PromptChar
Else
strChar = Mid(MyNewMask, intY, 1)
End If
fStrConv = fStrConv & strChar
Next
End Function

339 - Criar ícone no Desktop da máquina, em tempo de SETUP...


Enviado por: Joerbeth

Visando uma maneira adequada, para criar esse ícone, descobrí uma muito
fácil, em tempo de Setup do aplicativo... segue os passos:
1. Abrir o Setup.Vbp do \VB\SetupKit\Setup1, depois de aberto, selecionar o
Form (frmBegin), nesse Form, na seção General, colocar a seguinte linha:
Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal
lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal
lpstrLinkPath As String, ByVal lpstrLinkArgs As String) As Long
2. No mesmo Form, tem um botão de comando chamado (cmdInstall), as seguintes
linhas de código já se encontram:
Private Sub cmdInstall_Click()
If IsValidDestDir(gstrDestDir) = True Then
Unload Me
DoEvents
End If
Você terá que acrescentar, logo após o End If, más está pequena linha de
código:
fCreateShellLink "..\..\desktop", "NomeDoAtalho",
"c:\Diretório\ArquivoExecutável.Exe", ""
OBS.: Após incluir as linhas no Setup1.Vbp, compilar o mesmo....
NOTA: em NomeDoAtalho, vc terá que colocar o nome que deseja que o atalho
criado tenha. Em \Diretório\ArquivoExecutável.Exe, significa o caminho e o
williamdsilva@aol.com.br 154

nome do arquivo .EXE.... exemplo:


\Windows\Calc.Exe
API:
Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName As String, ByVal
lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String) As Long
Depois para criar um atalho no desktop use:
fCreateShellLink "..\..\desktop", "texto do atalho", "c:\dir\programa.exe", ""
OBS.: Esse só terá efeito, com o arquivo: STKIT432.dll
Valeu ?!.
Joerbeth S. Costa
Copyright (c) 1996-2001 Visual Basic Brasi

340 - Conecção com o SQL Server 7.0


Enviado por: JOSE ROBERTO ARAUJO TEIXEIRA

Para abrir uma conecção com o SQL Server x.


1) Adicionar no Projeto a referência MICROSOFT REMOTE DATA OBJECT 2.0 OU POSTEIOR
2) Crie uma variavel global para a conecção
3) Adicione esta linha no seu FORM
Set conLog = rdoEnvironments(0).OpenConnection(dsName:="", _
Prompt:=rdDriverNoPrompt, _
Connect:="uid=USUARIO;pwd=SENHA;driver={SQL Server};" _
& "server=Nome do seu Servidor ;database=Nome do banco;")
Veja que a variavel criada global é a conLog.
Depois é so criar as demais variveis para abertura de tabelas, insert´s,update´s,etc...

ROBERTO TEIXEIRA. SAO LUIS-MA

341 - Como simular um texto sendo digitado em tempo de execução em um label


Enviado por: Leandro Gonçalves (MoKe)

Crie um Form..e nele ponha um label, um botão, e um timer...(valor default do Interval do Timer é 100)
Mude o nome do Botão para "MostrarMsg"
Option Explicit
Public Contar As Integer
Public Mensagem As String
Public TamanhoMsg As Integer
Private Sub Form_Load()
Timer1.Enabled = False
End Sub
Public Sub MostrarMsg_Click()
Contar = 0
Timer1.Enabled = True
Mensagem = "Mensagem que você quiser"
TamanhoMsg = Len(Mensagem)
Call Timer1_Timer
End Sub
Private Sub Timer1_Timer()
If Contar < TamanhoMsg Then
Contar = Contar + 1
Label1.Caption = Mid(Mensagem, 1, Contar)
End If
End Sub

342 - Maneira facil de Criptografar senhas em seu Programa


Enviado por: Leandro Navega de Faria

Marcando a caixinha TxtBox1, ou seja, onde devera ser digitado a senha e mudar a propriedade
PasswordChar para * ou outra letra/sinal que devera aparecer no lugar da senha.

343 - Arquivos somente leitura ...


Enviado por: Marcelo

Antes de acessar um arquivo para alterações ou para removê-lo, utilize o comando:


SetAttr App.Path & "\BANCO.MDB", vbNormal
' retorna o atributo de arquivo
williamdsilva@aol.com.br 155

Pois se acidentalmente o usuário leigo alterar a propriedade do arquivo, por exemplo para ARQUIVO
SOMENTE LEITURA, ocasionará um erro de execução no programa.

344 - Gravar um BMP em um campo Image do SQL usando RDO


Enviado por: Marcelo Nagy

Aqui vai a rotina:


Dim cn As New rdoConnection
Dim qy As rdoResultset
Private Sub Command1_Click()
ChunkSize = 16384
login = "usuario"
pass = "senha"
Timeout = 15
cn.CursorDriver = rdUseOdbc
banco = "BANCO"
Conexao = "uid=" & login & ";pwd=" & pass & ";DSN=" & banco & ";driver={SQL Server}"
cn.Connect = Conexao
cn.QueryTimeout = Timeout
cn.LoginTimeout = Timeout
' On Error GoTo erro
cn.Close
cn.EstablishConnection rdDriverNoPrompt, False
Sus = True
sconectou = True
Set qy = cn.OpenResultset("Select tabela_cod,tabela_img from BANCO..tabela ", rdOpenKeyset, 4,
rdExecDirect)
qy.AddNew
qy(0) = 2
' rotina de gravação de imagem no campo tabela_img
DataFile = 2
Dim Chunk() As Byte
Open "c:\imagem\teste.BMP" For Binary Access Read As DataFile
Fl = LOF(DataFile)
If Fl = 0 Then
Close DataFile
Screen.MousePointer = vbDefault
Exit Sub
End If
Chunks = Fl \ ChunkSize
Fragment = Fl Mod ChunkSize
qy(1).AppendChunk Null
ReDim Chunk(Fragment)
Get DataFile, , Chunk()
qy(1).AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
Get DataFile, , Chunk()
qy(1).AppendChunk Chunk()
Next i
Close DataFile
qy.Update
End Sub
BACANA !!!

345 - Filtrando Datas no Crystal


Enviado por: Marcelo Nagy

Para imprimir registros que satisfaçam uma determinada condição, usamos a seguinte codificação:
relatorio.SelectionFormula = "{tabela.nome} = Marcelo Nagy'"
relatorio.Action = 1
O problema, é que este esquema só funciona para dados do tipo string e na hora de tentar fazer isto com
uma data, é erro de fórmula com certeza. Então use da seguinte maneira, por exemplo para mostrar
registros a partir de 13/12/1975:
relatorio.SelectionFormula = "{tabela.data} >= Date(1975,12,13)"
relatorio.Action = 1
É isso aí !!!!!

346 - Enviando um email pelo Outlook.


Enviado por: Marcelo Nagy

Primeiro, selecione o componente MICROSOFT MAPI CONTROLS. Depois acrecente no seu form o objeto
williamdsilva@aol.com.br 156

MAPISESSION e MAPIMESSAGES que apareceram na sua toolbox. Então use a seguinte codificação para
enviar uma mensagem:
mapisession.Action = 1
mapimessages1.SessionID = mapisession.SessionID
mapimessages1.Compose
mapimessages1.RecipAddress = "fulano@provedor.com.br"
mapimessages1.AddressResolveUI = True
mapimessages1.ResolveName
mapimessages1.MsgSubject = "Titulo da minha mensagem"
mapimessages1.MsgNoteText = "conteúdo da minha mensagem, blablablablabla... "
mapimessages1.Send False
BACANA !!!!

347 - API para LOGOFF, REBOOT, DESLIGAR o Computador


Enviado por: Marcelo Zeri

'API para LOGOFF, REBOOT, DESLIGAR o Computador


'Abra 1 novo projeto, adicione 1 label1, 1 text1, 1 command1 e 1 módulo .bas
'Código para o módulo .bas
Option Explicit
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As
Long
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_LOGOFF = 0
'Código para o form
Option Explicit
Private Sub Command1_Click()
Dim Variav
Select Case Text1
Case "0"
If MsgBox("Deseja fazer Logoff agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes Then
Variav = ExitWindowsEx(EWX_LOGOFF, 0)
End If
Case "1"
If MsgBox("Deseja desligar o Computador agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes
Then
Variav = ExitWindowsEx(EWX_SHUTDOWN, 1)
End If
Case "2"
If MsgBox("Deseja reiniciar o Windows agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes Then
Variav = ExitWindowsEx(EWX_REBOOT, 2)
End If
Case Else
MsgBox Label1
Exit Sub
End Select
End Sub
Private Sub Form_Load()
Text1 = ""
Label1.Left = Me.Width * 0.1
Label1.Width = Me.Width * 0.8
Label1.Height = 400
Label1 = "Digite na caixa texto: 0 para logoff, 1 para desligar o Computador, 2 para reiniciar o Windows"
End Sub

348 - Delimitar o tamanho mímino e máximo de um form


Enviado por: Marcelo Zeri

'CÓDIGO PARA DELIMITAR O TAMANHO MÁXIMO E MÍNIMO DE UM FORMULÁRIO


'código para o módulo .bas
Option Explicit
Public OldWindowProc As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex
As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As
Long, ByVal dwNewLong As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal
ByteLen As Long)
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal
williamdsilva@aol.com.br 157

hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_GETMINMAXINFO = &H24
Type POINTAPI
x As Long
y As Long
End Type
Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp
As Long) As Long
If Msg = WM_GETMINMAXINFO Then
Dim MinMax As MINMAXINFO
CopyMemory MinMax, ByVal lp, Len(MinMax)
' Altere estes valores para aumentar ou diminuir o tamanho mínimo
MinMax.ptMinTrackSize.x = 4800 \ Screen.TwipsPerPixelX
MinMax.ptMinTrackSize.y = 3000 \ Screen.TwipsPerPixelY
'se quiser delimitar um tamanho máximo remova os
'apostrofes destas duas linhas abaixo: e altere a propriedade
'do formulário: MaxButton = False
' MinMax.ptMaxTrackSize.x = Screen.Width \ Screen.TwipsPerPixelX \ 2
' MinMax.ptMaxTrackSize.y = 3480 \ Screen.TwipsPerPixelY
CopyMemory ByVal lp, MinMax, Len(MinMax)
SubClass1_WndMessage = 1
Exit Function
End If
SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function
'código para o form
'O formulário deve ter a propriedade
'BorderStyle = 2- Sizable
Option Explicit
Private Const GWL_WNDPROC = (-4)
Private Sub Form_Load()
OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
Me.Width = 7000
Me.Height = 4000
Me.Caption = "Posicione o mouse num canto e resize o form!"
'para aumentar o limite do tamanho do form
'altere os valores do módulo bas
End Sub
Private Sub Form_Unload(Cancel As Integer)
'importante: comando para remover o código da memória
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
End Sub

349 - Abrir automaticamente um Combo-box quando ele receber o foco:


Enviado por: Marcelo Zeri

Abra um novo projeto, insira um combo-box e cole o código abaixo no form:


Option Explicit
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Long) As Long
Private Const CB_SHOWDROPDOWN = &H14F
Private Sub Combo1_GotFocus()
Dim lRet As Long
lRet = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&)
End Sub
Private Sub Form_Load()
Combo1.Clear
Combo1.AddItem "111111"
Combo1.AddItem "222222"
Combo1.AddItem "333333"
Combo1.AddItem "444444"
Combo1.AddItem "555555"
williamdsilva@aol.com.br 158

Combo1.AddItem "666666"
End Sub

350 - Alterando as Configurações Regionais VIA VB


Enviado por: Marcelo Zeri

'Abra um novo Projeto, adicione 1 módulo bas, 2 botões de Comando, 1 text-box e 1 Label:
'Nomes padrão: (Command1 e Command2, Text1, Label1)
'==============================
'Declarações para o módulo .bas
Option Explicit
Declare Function GetLocaleInfo Lib "kernel32" Alias _
"GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, _
ByVal lpLCData As String, ByVal cchData As Long) As Long
Declare Function SetLocaleInfo Lib "kernel32" Alias _
"SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, _
ByVal lpLCData As String) As Boolean
Declare Function GetUserDefaultLCID% Lib "kernel32" ()
'Constantes das Configurações Regionais
Public Const LOCALE_ICENTURY = &H24
Public Const LOCALE_ICOUNTRY = &H5
Public Const LOCALE_ICURRDIGITS = &H19
Public Const LOCALE_ICURRENCY = &H1B
Public Const LOCALE_IDATE = &H21
Public Const LOCALE_IDAYLZERO = &H26
Public Const LOCALE_IDEFAULTCODEPAGE = &HB
Public Const LOCALE_IDEFAULTCOUNTRY = &HA
Public Const LOCALE_IDEFAULTLANGUAGE = &H9
Public Const LOCALE_IDIGITS = &H11
Public Const LOCALE_IINTLCURRDIGITS = &H1A
Public Const LOCALE_ILANGUAGE = &H1
Public Const LOCALE_ILDATE = &H22
Public Const LOCALE_ILZERO = &H12
Public Const LOCALE_IMEASURE = &HD
Public Const LOCALE_IMONLZERO = &H27
Public Const LOCALE_INEGCURR = &H1C
Public Const LOCALE_INEGSEPBYSPACE = &H57
Public Const LOCALE_INEGSIGNPOSN = &H53
Public Const LOCALE_INEGSYMPRECEDES = &H56
Public Const LOCALE_IPOSSEPBYSPACE = &H55
Public Const LOCALE_IPOSSIGNPOSN = &H52
Public Const LOCALE_IPOSSYMPRECEDES = &H54
Public Const LOCALE_ITIME = &H23
Public Const LOCALE_ITLZERO = &H25
Public Const LOCALE_NOUSEROVERRIDE = &H80000000
Public Const LOCALE_S1159 = &H28
Public Const LOCALE_S2359 = &H29
Public Const LOCALE_SABBREVCTRYNAME = &H7
Public Const LOCALE_SABBREVDAYNAME1 = &H31
Public Const LOCALE_SABBREVDAYNAME2 = &H32
Public Const LOCALE_SABBREVDAYNAME3 = &H33
Public Const LOCALE_SABBREVDAYNAME4 = &H34
Public Const LOCALE_SABBREVDAYNAME5 = &H35
Public Const LOCALE_SABBREVDAYNAME6 = &H36
Public Const LOCALE_SABBREVDAYNAME7 = &H37
Public Const LOCALE_SABBREVLANGNAME = &H3
Public Const LOCALE_SABBREVMONTHNAME1 = &H44
Public Const LOCALE_SCOUNTRY = &H6
Public Const LOCALE_SCURRENCY = &H14
Public Const LOCALE_SDATE = &H1D
Public Const LOCALE_SDAYNAME1 = &H2A
Public Const LOCALE_SDAYNAME2 = &H2B
Public Const LOCALE_SDAYNAME3 = &H2C
Public Const LOCALE_SDAYNAME4 = &H2D
Public Const LOCALE_SDAYNAME5 = &H2E
Public Const LOCALE_SDAYNAME6 = &H2F
Public Const LOCALE_SDAYNAME7 = &H30
Public Const LOCALE_SDECIMAL = &HE
Public Const LOCALE_SENGCOUNTRY = &H1002
Public Const LOCALE_SENGLANGUAGE = &H1001
Public Const LOCALE_SGROUPING = &H10
williamdsilva@aol.com.br 159

Public Const LOCALE_SINTLSYMBOL = &H15


Public Const LOCALE_SLANGUAGE = &H2
Public Const LOCALE_SLIST = &HC
Public Const LOCALE_SLONGDATE = &H20
Public Const LOCALE_SMONDECIMALSEP = &H16
Public Const LOCALE_SMONGROUPING = &H18
Public Const LOCALE_SMONTHNAME1 = &H38
Public Const LOCALE_SMONTHNAME10 = &H41
Public Const LOCALE_SMONTHNAME11 = &H42
Public Const LOCALE_SMONTHNAME12 = &H43
Public Const LOCALE_SMONTHNAME2 = &H39
Public Const LOCALE_SMONTHNAME3 = &H3A
Public Const LOCALE_SMONTHNAME4 = &H3B
Public Const LOCALE_SMONTHNAME5 = &H3C
Public Const LOCALE_SMONTHNAME6 = &H3D
Public Const LOCALE_SMONTHNAME7 = &H3E
Public Const LOCALE_SMONTHNAME8 = &H3F
Public Const LOCALE_SMONTHNAME9 = &H40
Public Const LOCALE_SMONTHOUSANDSEP = &H17
Public Const LOCALE_SNATIVECTRYNAME = &H8
Public Const LOCALE_SNATIVEDIGITS = &H13
Public Const LOCALE_SNATIVELANGNAME = &H4
Public Const LOCALE_SNEGATIVESIGN = &H51
Public Const LOCALE_SPOSITIVESIGN = &H50
Public Const LOCALE_SSHORTDATE = &H1F
Public Const LOCALE_STHOUSAND = &HF
Public Const LOCALE_STIME = &H1E
Public Const LOCALE_STIMEFORMAT = &H1003
'====================
'Código para o form
Option Explicit
' Este é um exemplo para o separador de Data
' MAS VOCÊ PODERÁ ALTERAR todas as outras Configurações Regionais
' contantes no módulo BAS, como Formato da Data, Hora etc
Public Sub Get_locale() ' Buscando a configuração regional
Dim Symbol As String
Dim iRet1 As Long
Dim iRet2 As Long
Dim lpLCDataVar As String
Dim Pos As Integer
Dim Locale As Long
Locale = GetUserDefaultLCID()
'LOCALE_SDATE é a constante para separador de data
'para outro locale setting apenas troque a constante
'Função para alterar o separador atual de data
iRet1 = GetLocaleInfo(Locale, LOCALE_SDATE, _
lpLCDataVar, 0)
Symbol = String$(iRet1, 0)
iRet2 = GetLocaleInfo(Locale, LOCALE_SDATE, Symbol, iRet1)
Pos = InStr(Symbol, Chr$(0))
If Pos > 0 Then
Symbol = Left$(Symbol, Pos - 1)
MsgBox "Separador atual = " + Symbol
End If
End Sub
Public Sub Set_locale() 'Altera configurações Regionais
Dim Symbol As String
Dim iRet As Long
Dim Locale As Long
On Error GoTo ErroTexto
If Trim(Text1) = "" Then GoTo ErroTexto
'LOCALE_SDATE é a constante para separador de data
'para outro locale setting apenas troque a constante
'Função para alterar o separador de data
Locale = GetUserDefaultLCID() 'Get user Locale ID
Symbol = Text1 'Novo caracter para a configuração Regional
'digite um novo separador na caixa-texto
iRet = SetLocaleInfo(Locale, LOCALE_SDATE, Symbol)
Exit Sub
ErroTexto:
MsgBox "Digite um separador válido"
End Sub
Private Sub Command1_Click() 'exibe a configuração Regional Atual
Call Get_locale
williamdsilva@aol.com.br 160

End Sub
Private Sub Command2_Click() 'altera configurações Regionais
Call Set_locale
End Sub
Private Sub Form_Load()
' Este é um exemplo para o separador de Data
' MAS VOCÊ PODERÁ ALTERAR todas as outras Configurações Regionais
' contantes no módulo BAS, como Formato da Data, Hora etc
Me.Caption = "Alterando as Configurações Regionais ..."
Command1.Caption = "Separador Atual"
Command2.Caption = "Alterar Separador"
Text1 = ""
Label1 = "Digite o novo padrão na Caixa Texto"
End Sub

351 - Desabilitar X do form


Enviado por: Marcelo Zeri

Código para desabilitar X no form


'Abra um novo Projeto e adicione um botão Command1. Altere a propriedade do form: Clip Controls para False
'Código para o form:
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_Load()
Call DisableClose(form1)
End Sub
'Código para o módulo .bas
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd _
As Long, ByVal bRevert As Boolean) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal _
hMenu As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal _
hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) _
As Long
Private Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_REMOVE = &H1000&
Public Sub DisableClose(frm As Form, Optional _
Disable As Boolean = True)
'Setting Disable to False disables the 'X',
'otherwise, it's reset
Dim hMenu As Long
Dim nCount As Long
If Disable Then
hMenu = GetSystemMenu(frm.hwnd, False)
nCount = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, nCount - 1, MF_REMOVE Or _
MF_BYPOSITION)
Call RemoveMenu(hMenu, nCount - 2, MF_REMOVE Or _
MF_BYPOSITION)
DrawMenuBar frm.hwnd
Else
GetSystemMenu frm.hwnd, True
DrawMenuBar frm.hwnd
End If
End Sub

352 - Fazer uma caixa de texto ler somente números


Enviado por: Osmilto X. Rebouças

Private Sub Text2_KeyPress(KeyAscii As Integer)


Select Case KeyAscii
Case 48 To 57
Case 8
Case 13
Case Else
KeyAscii = 0
williamdsilva@aol.com.br 161

Beep
End Select
If KeyAscii = 46 Then
KeyAscii = 8
KeyAscii = 44
End If
End Sub

353 - Função para retornar o Número de dias do Mes de uma data (Simples e precisa)
Enviado por: Paulo Cesar Ferreira

Function nDiaMes(dData) As Integer


nDiaMes = 32 - Day(CDate("01/" & Month(dData) _ & "/" & Year(dData)) + 31)
End Function

354 - Gerar relatórios por intervalo de datas no Crystal usando VB


Enviado por: Roberto Luís Ghisleni

Para gerar um relatório por intervalo de datas coloque o seguinte código:


Private Sub cmdImprimir_Click()
Dim lFormula As String
'Captura data inicial
lFormula = "({tabela.campo_data_Inicial} >= DATE(" & Mid$(mkeDT_Inicial, 7, 4) & _
"," & Mid$(mkeDT_Inicial, 4, 2) & _
"," & Mid$(mkeDT_Inicial, 1, 2) & "))"
'Captura data final
lFormula = lFormula & " AND ({tabela.campo_data_Final} <= DATE(" & Mid$(mkeDT_Final, 7, 4) & _
"," & Mid$(mkeDT_Final, 4, 2) & _
"," & Mid$(mkeDT_Final, 1, 2) & "))"
'para visualizar a formula
msgbox lformula
CrystalReport1.ReportFileName = App.Path & "\Nome.rpt"
CrystalReport1.SelectionFormula = lformula
CrystalReport1.DiscardSavedData = True
CrystalReport1.Action = 1
End Sub
'Ex.:
'tabela.campo_data_inicia = Clientes.DataCadastro
'tabela.campo_data_final = Clientes.DataExclusao

Para que o relatório funcione basta cria-lo no crystal e inserir este código,
e o crystal vai listar só o que estiver entre este intervalo de datas.
Espero que Ajude!!!!

355 - Como mover um valor numérico de uma TextBox para um relátorio Crystal Reports, formatando
casas decimais
Enviado por: Roberto Luís Ghisleni

Para mover um valor digitado em uma textbox com a formatação correta de casas decimais(ex.: 1.103,45)
para um relatorio do crystal, insira o seguinte código:
Private Sub cmdImprimir_Click()
Dim lpos As Integer
'Formula de Valor
lpos = InStr(txtValor.Text, ",")
If lpos > 0 Then
CrystalReports1.Formulas(0) = "Valor = " & Left$(txtvalor.Text, lpos - 1) & "." & Mid$(txtValor.Text, lpos + 1)
Else
CrystalReports1.Formulas(0) = "Valor = " & txtValor.Text
End If
End Sub

obs.: Para que este código funcione vc deverá inserir em seu relatório Cristal uma formula com o mesmo
nome que estiver definida no VB(ex.: Formula "Valor"), para ai sim mover valores para ela.
Espero ter ajudado!!

356 - Como concatenar informações pelo VB em um relatório no Crystal


Enviado por: Roberto Luís Ghisleni
williamdsilva@aol.com.br 162

Para concatenar campos de tabelas(Arquivo) ou valores de uma TextBox pelo VB em um relatorio do


crystal insira o seguinte código:
'Usando campos de uma determinada Tabela
Private Sub cmdImprimir_Click()
'Formula para Descricao concatenada
CrystalReports1.Formulas(0) = "Descricao = {Tabela.Campo} + {Tabela2.Campo2}"
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub
'Tabela.Campo = Clientes.Codigo
'Tabela2.Campo2 = Fornecedor.Codigo
'Usando valores de TextBox
Private Sub cmdImprimir_Click()
'Formula para Descricao concatenada
CrystalReports1.Formulas(0) = "Descricao = " & textbox1.text & "+" & textbox2.text
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub
'Nome
'textbox1.text = Roberto
'Sobrenome
'textbox2.text = Luís Ghisleni

obs.: Para que este codigo funcione vc deverá inserir em seu relatório Cristal uma formula com o mesmo
nome que estiver definida no VB(ex.: Formula "Descricao"), para ai sim mover algo para ela.

357 - Como mover uma data informada em um MaskEdit para um relatório no Crystal usando código VB
Enviado por: Roberto Luís Ghisleni

Para mover uma data digitada em um MaskEdit para um relatorio do crystal insira o seguinte código:
Private Sub cmdImprimir_Click()
'Formula Data Inicial
CrystalReports1.Formulas(0) = "Data = Date ( " & Mid$(MaskEdit1, 7, 4) & _
"," & Mid$(MaskEdit1, 4, 2) & "," & Mid$(MaskEdit1, 1, 2) & ")"
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub

obs.: Para que este codigo funcione vc deverá inserir em seu relatório Cristal uma formula com o mesmo
nome que estiver definida no VB(ex.: Formula "Data"), para ai sim mover algo para ela.

358 - Formulários
Enviado por: Rogério Adriano de Morais - Clark

Quando se trabalha com formulários no Visual Basic, em projetos MDI principalmente, deve-se tomar
cuidado para não deixá-lo na memória após usá-lo. O sintoma deste erro de programação é o programa
não finalizar após ter clicado no botão FECHAR, e ser necessário clicar no botão END para concluir sua
finalização. Para avitar isso, use sempre o método UNLOAD após usar qualquer utilização de um formulário,
mesmo que ele não seja exibido no video. Veja:
Private Sub Command1_Click()
Dim vTexto as String
vTexto = Form1.Text1.Text
End Sub
No código acima, mesmo que não foi usado o método LOAD, o formulário FORM1 foi carregado para que o
objeto TEXT1 possa ser usado. Repare que não foi usado o método UNLOAD, de forma que, o formulário
continuará na memória mesmo que o procedimento (SUB) seja finalizado (END SUB). Veja o código correto
abaixo:
Private Sub Command1_Click()
Dim vTexto as String
vTexto = Form1.Text1.Text
Unload Form1
End Sub
É lógico que isso é somente um exemplo, a momentos em que é vantajoso o formulário continuar na
memória porque poderá ser usado posteriormente.
Abraços,
Clark

359 - Convertendo nº para binário


Enviado por: Ronie Rodrigues Dias

Para converter um nº inteiro para Binário coloque o seguinte código em um command Button:
williamdsilva@aol.com.br 163

Dim resp, bin, n, dec As Double 'Declara variáveis


dec = Text1
resp = Int(Text1)
Text1 = ""
While resp <> 0
resp = Int(dec / 2)
If resp * 2 = dec Then
bin = 0
Else
bin = 1
End If
Text1 = Text1 & bin
dec = resp
Wend
For n = Len(Text1) To 1 Step -1
Text1.Text = Text1 & Mid(Text1, n, 1)
Next n

360 - ACESSO SQL-SERVER ATRAVES DO OLEDB


Enviado por: SAMUEL BADY HELOU FILHO

1º-FAZ REFERENCIA AO MICROSSOFT ADO 2.0 LIBRARY E AO DATA BINDING COLLECTION

2º-DECLARE DB AS NEW ADODB.CONECTION E

RS AS NEW ADODB.RECONDSET

3º-DB.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=SA;Initial Catalog="


& NOME DO BANCO & ";Data Source=" & SERVIDOR

DB.ConnectionTimeout = 10

DB.Open

ABRE O BANCO

361 - Senha
Enviado por: Thiago MuNhÓz

Crie um Text e um commandbutton, no commandbutton digite:


if text1.text = "Senha desejada" then
form2.show
else
msg box "Senha Incorreta digite novamente"
end if
qualquer duvida envie e-mail para T_Munhoz@zipmail.com.br

362 - Formulário OnTop com apenas 1 linha de código


Enviado por: Thomas Gonzalez Miranda

Você muitas vezes já viu exemplos de formulários OnTop, mas... Eles puxam módulas e mais módulos. Para
isso fiz esta função. Sigam os passos:
Crie duas formulários. Ex: Form 1 e Form2, agora insira um botão no formulário. clique duas vezes no botão
e insira este código
Form2.Show , Me

Pronto. O form2 sempre ficará sobre o form1.


ATENÇÃO: Esta função não cria um formulário Ontop para todas as janelas e sim só para o programa
aberto.
Qualquer dúvida me enviem um e-mail. ;-D

363 - Impossibilitando o clique no formulário de trás


Enviado por: Thomas Gonzalez Miranda

Você, muitas vezes já deve ter tentado fazer com que o formulário que se abre sem ficasse sobre o
formulário abaixo. Pronto! Conseguiu, mas e agora eu clico no Form1, e o Form2, some. :-(
Descobri a solução para isso.
Crie dois formulários. Ex: Form1 e Form2, depois insira um botão no form1. Clique duas vezes no botão e
williamdsilva@aol.com.br 164

insira este código.


form1.enabled = false
pronto!

364 - Abrir URL no Navegador padrão apenas com 3 linhas de código


Enviado por: Thomas Gonzalez Miranda

Muitas pessoas querem um jeito simples de fazer abrir o código de uma


caixa de texto ou url em um browser padrão do usuário. Quer saber
como? Simples. Siga os passoas abaixo:
Na guia General declare estas funções:
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal
lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal
nShowCmd As Long) As Long
Private Const SW_SHOW = 5
Depois disso insira 2 caixas de texto em seu formulário.
Na 1ª: Coloque na propriedade TEXT. O caminho onde está o arquivo à
abrir. Ex: C:\Pagina.html
Na 2ª: Deixei em branco para o usuário digitar códigos HTML ou
simplesmente um endereço à abrir
Agora que fez isso.
Insira um botão e clique nele duas vezes e insira este código
ShellExecute hwnd, "open", Nome_da_1ªCaixa.Text, vbNullString, vbNullString, SW_SHOW
PRONTO, é só isso qualquer dúvida me envie um e-mail. Okz? ;-D
365 - Como dar uma pausa no programa sem utilizar Timer
Enviado por: Wagner Lasdowsky

'codigo para dar pausa no programa utilizando API GettickCount


'declarando API
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Sub Pausa(ByVal Segundos As Integer)
'igual a inkey() do clipper - wagner
Dim xtempo As Long
Dim xInicio As Long
Dim xfinal As Long
xtempo = 1000 * Segundos
xfinal = 0
xInicio = GetTickCount() 'retorna valor em milesimos
While (xfinal - xInicio < xtempo)
xfinal = GetTickCount()
Wend
End Sub

366 - Soma horas mais facilmente


Enviado por: Washington Coutinho Corrêa Junior

'Guarda os dados do Primeiro Horário


hora1 = 14
minuto1 = 34
segundo1 = 25
'Guarda os dados do Segundo Horário
hora2 = 2
minuto2 = 23
segundo2 = 34
'Coloca os dados do Primeiro horário em horario_1
horario_1 = TimeSerial(hora1, minuto1, segundo1)
'Coloca os dados do Primeiro horário em horario_2
horario_2 = TimeSerial(hora2, minuto2, segundo2)
'Mostra a soma deles
MsgBox horario_1 + horario_2
williamdsilva@aol.com.br 165

367 - Máscara de data no TextBox


Enviado por: Beraldo Lopes Figueiredo

Evita todo o problema causado pelo famigerado MASKEDBOX


Private Sub Text1_Change()
If Len(Text1) = 2 Then
Text1 = Text1 + "/"
Text1.SelStart = 4
End If
If Len(Text1) = 5 Then
Text1 = Text1 + "/"
Text1.SelStart = 7
End If
End Sub

Espero que tenha utilidade

368 - Verificando se o Campo é Alfanumérico


Enviado por: Cicero

Public Function IsAlfaNumeric(VALOR)


dim cont as variant
dim verificacao as variant
dim soma as variant
cont = "soma"
For i = 1 To Len(VALOR)
verificacao = Mid$(VALOR, i, 1)
If IsNumeric(verificacao) Then
cont = soma & verificacao
soma = cont
Else
End If
Next i
If IsNumeric(cont) Then
VALOR = True
Else
VALOR = False
End If
IsAlfaNumeric = VALOR
End Function

369 - Utilização de caracteres do Idioma Japonês no Visual Basic 6


Enviado por: Cleuber Ricardo Orsi

São poucos os programadores que passam pela situação de ter que desenvolver aplicativos que
"entendam " em suas caixas de texto os caracteres peculiares da lingua japonesa ou mesmo de outras
linguas, como o Chinês ou o Turco.

Porém quando um desenvolvedor tem um problema como esse é muito mais difícil ainda encontrar
soluções para essa condição.

Por isso estou enviando essa dica de trabalho, pois passei por várias dificuldades e espero conseguir ajudar
os colegas.

- Primeiro ponto importante, é saber como o Windows faz a leitura dos caracteres em japonês.
Isso é possível graças a um dispositivo chamado IME, que converte para caracteres em japonês grupos de
consoantes e vogais digitados, através de um teclado comum, como nosso ocidental. Esse dispositivo é
instalado automaticamente com o Windows em Japonês ou em outro idioma que use caracteres próprios.
Esse tipo de recurso será mais conhecido com a difusão do Windows 2000.

- O Segundo ponto consiste na instalação do Visual Basic, que deve ser feita numa máquina com o
Windows no idioma que se deseja trabalhar. Isso se faz necessário uma vez que o Programa de Instalação
do VB verificará se o Windows instalado na máquina usa o IME ele automaticamente atribuirá uma
propriedade chamada IMEMODE a suas caixas de texto, oque possibilitará a inserção e leitura desses
caracteres pelo controle TEXTBOX. (Essa propriedade somente é disponibilizada neste tipo de situação.)
williamdsilva@aol.com.br 166

Depois desses cuidados o programador deverá observar o valor da propriedade IMEMODE que por padrão
é 0 ( No Operation) e deve ser alterada para 1 (ON) assim o IME poderá agir sobre o controle TEXTBOX.
Outra alteração deve ser feita na fonte da caixa de texto. Alguns tipos de fontes aceitam caracteres em
japonês, outras não. Uma boa fonte é a MS UI Gothic, isso vale também para fontes de relatório, como o
Crystall por exemplo.

Agora se você usa Banco de Dados em seus aplicativos pode ter problemas, mas no caso do ACCESS eu
aconselho criar a Base de Dados através do seu aplicativo, e utilizar a declaração dbLangGeneral na
criação do Banco de Dados, para que esse aceite os caracteres em japonês e os caracteres ocidentais.

Obs. Esse procedimento é valido para a Versão 6 do Visual Basic.

370 - Piscar um objeto


Enviado por: Djair Junior

Para piscar um objeto crie um timer com Interval de 500.


Digite o comando abaixo dentro do timer:
Me!Command1.Visible = True = Not Me!Command1.Visible = True
'Onde o objeto a piscar é um botão com o name Command1.

371 - Como abrir um Banco de dados


Enviado por: Márcio Pulcinelli

Dim DBNewOne as DataBase


Dim rs as RecordSet
Set DBNewOne = DBEngine.Workspaces(0).OpenDataBase(app.path + "\banco_de_dados.mdb")
Set rs = db.openRecordSet("Tabela")

372 - Abrir e Fechar o CD-ROM


Enviado por: Rafael Konrath

'Declarar em um Modulo
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
Private Sub Command1_Click()
dim res as long, returnstring as string*127
res = mcisendstring("set CDAudio door open", returnstring, 127, 0)
End Sub
Private Sub Command2_Click()
dim res as long, returnstring as string*127
res = mcisendstring("set CDAudio door closed", returnstring, 127, 0)
End Sub

373 - Saber se existe placa de Som


Enviado por: Rafael Konrath

Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long


Dim res As Integer
res = waveOutGetNumDevs()
If res > 0 Then
msgbox "Existe tarjeta de sonido"
Else
msgbox "No existe tarjeta de sonido"
End If
williamdsilva@aol.com.br 167

374 - Sabe quanto tempo o Windows esta funcionando


Enviado por: Rafael Konrath

Rafael Konrath

'declare no modulo
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
'Por exemplo :
Private Sub Form_Load()
Dim l As Long, horas As Integer, min As Integer
l = GetTickCount() / 1000
horas = Int(l / 3600)
l = l - (3600 * horas)
min = Int(l / 60)
l = l - (min * 60)
MsgBox "Windows inicio ja faz " & horas & " horas, " & min & " minutos e " & l & " segundos"
End Sub

375 - Crystal Reports: imprimindo em outra impressora que não seja a Padrão.
Enviado por: Adriano Faria Alves
Para mandar o relatório para outra impressora no Crystal Reports:

With CrystalReport1
.ReportFileName = "C:\caminho\relatorio.rpt"
.PrinterDriver = "Epson24"
.PrinterPort = "LPT1"
.PrinterName = "Epson - Matricial"
.Action = 1
End With

376 - Função que limpa todos os campos com propriedade TEXT e LIST BOX do form.
Enviado por: Adriano Faria Alves
Crie essa função em módulo BAS

Public Function LimparCampos(frmForm As Form)

Dim ctlControl As Object

On Error Resume Next

For Each ctlControl In frmForm.Controls


ctlControl.Text = ""
ctlControl.ListIndex = -1
ctlControl.Value = 0
DoEvents
Next ctlControl

End Function

Para chamá-la no seu form:


...
tabela.update
Call LimparCampos(Me)

377 - Verificando se CPF digitado é válido.


Enviado por: Adriano Faria Alves
Crie essa função em Módulo BAS

Public Function CheckCPF(CPF As String) As Boolean

Dim EVAR1 As Integer


Dim evar2 As Integer
Dim F As Integer
If Len(Trim(CPF)) <> 11 Then
CheckCPF = False
Exit Function
End If
EVAR1 = 0
For F = 1 To 9
williamdsilva@aol.com.br 168

EVAR1 = EVAR1 + Val(Mid(CPF, F, 1)) * (11 - F)


Next F
evar2 = 11 - (EVAR1 - (Int(EVAR1 / 11) * 11))
If evar2 = 10 Or evar2 = 11 Then evar2 = 0
If evar2 <> Val(Mid(CPF, 10, 1)) Then
CheckCPF = False
Exit Function
End If
EVAR1 = 0
For F = 1 To 10
EVAR1 = EVAR1 + Val(Mid(CPF, F, 1)) * (12 - F)
Next F
evar2 = 11 - (EVAR1 - (Int(EVAR1 / 11) * 11))
If evar2 = 10 Or evar2 = 11 Then evar2 = 0
If evar2 <> Val(Mid(CPF, 11, 1)) Then
CheckCPF = False
Exit Function
End If

CheckCPF = True

Para chamá-la no form:

Sub CPF_LostFocus()
If CheckCPF(CPF.Text) = False Then
MsgBox "CPF Inválido."
CPF.SetFocus
End IF

378 - Combo Box com data (primeiro ao último dia do mês atual)
Enviado por: Adriano Faria Alves
Crie essa função em um Módulo BAS

Public Function Preenche_ComboData(ComboDatas As Control)

Dim i, DiaCorrente, MesCorrente, AnoCorrente, UltimoDia As Integer


DiaCorrente = "01"
MesCorrente = Month(Now)
AnoCorrente = Year(Now)

UltimoDia = Day(DateValue("01/" & Str(MesCorrente + 1) & "/" & Str(AnoCorrente)) - 1)

If MesCorrente = 12 Then
UltimoDia = Day(DateValue("31/" & "12/" & Str(AnoCorrente)))
End If

For i = DiaCorrente To UltimoDia


ComboDatas.AddItem Format(i, "0#") & "/" & Format(Now, "mm") & "/" & Format(Now, "yyyy")
Next

End Function

Para chamá-la no form (LOAD):

Call Preenche_ComboData(Combo1)

379 - Inicias Maiúsculas, com exceção de DE, DA, DOS, DAS, DI...
Enviado por: Adriano Faria Alves
Crie essa função em um Módulo BAS

Public Function Maiuscula(Texto)

Dim Palavra, Posicaoinicial, Posicaofinal


Dim Resultado As String

Posicaoinicial = 1
Texto = Texto & " "
Do Until InStr(Posicaoinicial, Texto, " ") = 0
Posicaofinal = InStr(Posicaoinicial, Texto, " ")
Palavra = Mid(Texto, Posicaoinicial, Posicaofinal - Posicaoinicial)
Posicaoinicial = Posicaofinal + 1
williamdsilva@aol.com.br 169

If Palavra <> "de" And Palavra <> "di" And Palavra <> "e" And Palavra <> "da" And Palavra <> "das"
And Palavra <> "do" And Palavra <> "dos" Then
Palavra = UCase(Left(Palavra, 1)) & LCase(Mid(Palavra, 2))
End If

Resultado = Resultado & " " & Palavra


Loop
Maiuscula = Trim(Resultado)

End Function

Para chamá-la em um form (LostFocus da Caixa de Texto)

If Trim(Text1 <> "") Then


Text1 = Maiuscula(Text1)
End If

380 - Função para validar datas digitadas.


Enviado por: Adriano Faria Alves
Crie essa função em um Módulo BAS

Public Function ValidaData(DataInformada As String) As Boolean

ValidaData = False

If Not IsDate(DataInformada) Then


Exit Function
End If

If Left(DataInformada, 2) < "01" Or Left(DataInformada, 2) > "31" Then


Exit Function
End If

If Mid(DataInformada, 4, 2) < "01" Or Mid(DataInformada, 4, 2) > "12" Then


Exit Function
End If

ValidaData = True

End Function

Para chamá-la no seu form (lostfocus da caixa DATA1)

If ValidaData(Data1) = False Then


MsgBox "Data inválida.", vbCritical
Data1.SetFocus
End If

381 - Crystal Reports: imprimir período de datas (data inicial e data final)
Enviado por: Adriano Faria Alves
Esse código utiliza 2 MaskEdBox e a função VALIDADATA, também disponível nas dicas desse Site.

Sub Imprimir_Click()

If mskDT1 <> "__/__/____" Then


If Not ValidaData(mskDT1) Then
MsgBox "Primeira data do período inválida", vbCritical, "Erro no Relatório"
Exit Sub
End If
If mskDT2 <> "__/__/____" Then
If Not ValidaData(mskDT2) Then
MsgBox "Segunda data do período inválida", vbCritical, "Erro no Relatório"
Exit Sub
End If
stringsql = stringsql & " and {tabela1.data}in date(" & Right(mskDT1, 4) & "," & Mid(mskDT1, 4, 2)
& "," & Left(mskDT1, 2) & ") to date(" & Right(mskDT2, 4) & "," & Mid(mskDT2, 4, 2) & "," & Left(mskDT2,
2) & ")"
Else
stringsql = stringsql & " and {tabela1.data}=date(" & Right(mskDT1, 4) & "," & Mid(mskDT1, 4, 2)
& "," & Left(mskDT1, 2) & ")"
End If
End If
williamdsilva@aol.com.br 170

stringsql = Mid(stringsql, 5)

CrystalReport1.ReportFileName = App.Path + "\Relatorio.rpt"


CrystalReport1.SelectionFormula = stringsql
CrystalReport1.Destination = crptToWindow
CrystalReport1.Action = 1

382 - Função que verifica a existência de um arquivo


Enviado por: Adriano Faria Alves
Crie essa função em Módulo BAS

Public Function FileExist(FileName As String) As Boolean

Dim TempAttr As Integer


On Error GoTo ErrorFileExist
TempAttr = GetAttr(FileName)
FileExist = True
GoTo ExitFileExist

ErrorFileExist:
FileExist = False
Resume ExitFileExist
ExitFileExist:
On Error GoTo 0

End Function

E no seu form, chame-a da seguinte forma:

If FileExist("C:\Caminho\Arquivo.mdb") = False Then


MsgBox "Banco de Dados não encontrado.", vbCritical, App.Title & " - Erro Geral"
End
End If

383 - Abrir a listagem da Combo ao receber foco.


Enviado por: Adriano Faria Alves
Insira esse código em um módulo BAS

Private Declare Function SendMessage Lib "user32" _


Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Long) As Long

Private Sub Combo1_GotFocus()


Const CB_SHOWDROPDOWN As Long = &H14F
Dim Tmp As Long
Tmp = SendMessage(Combo1.hwnd,CB_SHOWDROPDOWN,1,ByVal 0&)
End Sub

384 - Função que abre um arquivo texto e retorna seu conteúdo


Enviado por: Adriano Faria Alves
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, sLinha

*Quebra a linha e concatena (soma) o resultado


sResult = sResult + Chr(13) & Chr(10) + sLinha
Loop

AbreArquivo = sResult

Fecha o arquivo
Close iARQ
williamdsilva@aol.com.br 171

End Function

Para usar:
Text1.Text = AbreArquivo("C:\Texto.TXT")

385 - Verificando a Data/Hora da Última Alteração de um Arquivo


Enviado por: Adriano Faria Alves
Crie essa função em um Módulo Bas

Public Function DataArq(ByVal sArq As _


String) As String
If Dir$(sArq) <> "" Then
DataArq = FileDateTime(sArq)
Else
DataArq = "ERRO"
End If
End Function

Para chamar no Form:

Dim sVar As String


sVar = DataArq("C:\SQL.log")
If sVar <> "ERRO" Then
Text1.Text = sVar
End If

386 - Dias úteis entre 2 datas.


Enviado por: Adriano Faria Alves
Function DiasUteis(dtInicio As Variant, 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",dtInicio,dtFinal)
varDataCont = DateAdd("ww",intSemanas,dtInicio)
intFimDias = 0

Do While varDataCont < dtFinal


If Format(varDataCont,"ddd") <> "Sun" And _
Format(varDataCont,"ddd") <> "Sat" Then
intFimDias = intFimDias + 1
End If
varDataCont = DateAdd("d", 1, varDataCont)
Loop

DiasUteis = intSemanas * 5 + intFimDias

End Function

387 - Abrir e fechar a gaveta do CDROM


Enviado por: Adriano Faria Alves
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&)

388 - Removendo os Botões MIN-MAX de Forms MDI


Enviado por: Adriano Faria Alves
Coloque o seguinte código num módulo:
williamdsilva@aol.com.br 172

Private Declare Function SetWindowLong Lib "user32" _


Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As _
Long) As Long
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hwnd As Long, _
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.hWnd, GWL_STYLE)

*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.hWnd, GWL_STYLE, lWnd)


End Sub

389 - Animação com Ícones


Enviado por: Adriano Faria Alves
Crie um novo projeto, coloque no Form uma ImageList, um PictureBox (ou ImageBox, pois esta não recebe
foco), um Timer (com Interval = 100, pelo menos) e coloque as figuras da animação na ImageList.

Então, coloque o seguinte código no Form:

Dim iAnim As Integer


Private Sub Form_Load()
iAnim = 1
Call Timer1_Timer
End Sub
Private Sub Timer1_Timer()
*Img1 é a ImageBox e ImgLst1 é a ImageList.
Set Img1.Picture = ImgLst1.ListImages(iAnim).Picture
iAnim = iAnim + 1
If iAnim > ImageList1.ListImages.Count Then
iAnim = 1
End If
End Sub

390 - Copiando Textos de Documentos do Word


Enviado por: Adriano Faria Alves
No evento desejado:
Dim Word As Object
Set Word = CreateObject("Word.Application")

Abre o documento
Word.Documents.Open "C:\Meus Documentos\" & "NomeDoDocumento.DOC"

Seleciona o documento inteiro


Word.Documents("NomeDoDocumento.DOC").Select

Joga o conteúdo da seleção numa caixa de Texto.


Text1.Text = Word.Selection.Text

Pesquise o VBA, pois utilizando-o é possível selecionar palavras, parágrafos, tabelas, etc. Ou seja, qualquer
parte do documento.

391 - Impedir que o programa apareça nos processos do windows


Enviado por: Adriano Faria Alves
1 - Coloque para false a propriedade ShowInTaskbar do Form

2 - Em um módulo declare:
williamdsilva@aol.com.br 173

Public Declare Function ShowWindow Lib "user32" _


Alias "ShowWindow" (ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Public Const SW_HIDE As Long = 0

3 - No Form_Load adicione:

Dim RetValue as Long


RetValue = ShowWindow(Me.hWnd, SW_HIDE)

392 - Impedir que o programa seja encerrado com Ctrl Alt Del
Enviado por: Adriano Faria Alves
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, _
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,RSP_SIMPLE_SERVICE)
End Sub

Depois coloque o seguinte no FORM_LOAD:

Private Form_Load()
MakeMeService
End Sub

393 - Rolando texto em uma Picture Box


Enviado por: Adriano Faria Alves
*Global do Form
Public Function ShowMessage()

Static MsgPtr As Integer


Static MyText As String

If Len(MyText) = 0 Then
MsgPtr = 1
MyText = "Rolando texto numa Picture Box! "
End If

Picture1.Cls
Picture1.Print Mid$(MyText, MsgPtr); MyText;
MsgPtr = MsgPtr + 1

If MsgPtr > Len(MyText) Then


MsgPtr = 1
End If

End Function

*Coloque um objeto Picture Box


*Coloque um objeto Timer (Interval=100)

Private Sub Timer1_Timer()

ShowMessage

End Sub
williamdsilva@aol.com.br 174

394 - Chamando telas específicas do Painel de Controle


Enviado por: Adriano Faria Alves
Para chamar qualquer tela do Painel de Controle não se usa necessariamente uma API, mas sim se executa
o programa rundll32.exe. De acordo com os parâmetros cada tela é chamada. Veja as chamadas das
principais telas:

Para chamar a tela principal do Painel de Controle

Call Shell("rundll32.exe shell32.dll,Control_RunDLL", vbNormalFocus)

Adicionar / Remover Programas


Instalar/Desinstalar
Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1", vbNormalFocus)

Instalação do Windows
Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2", vbNormalFocus)

Disco de Inicialização
Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3", vbNormalFocus)

Vídeo
Segundo Plano
Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0", vbNormalFocus)

Proteção de Tela
Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1", vbNormalFocus)

Aparência
Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2", vbNormalFocus)

Configuração
Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3", vbNormalFocus)

Configurações Regionais
Configurações Regionais
Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0", vbNormalFocus)

Número
Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1", vbNormalFocus)

Moeda
Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2", vbNormalFocus)

Hora
Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3", vbNormalFocus)

Data
Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4", vbNormalFocus)

Joystick
Call Shell("rundll32.exe shell32.dll,Control_RunDLL joy.cpl", vbNormalFocus)

Mouse
Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @0", vbNormalFocus)

Teclado
Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @1", vbNormalFocus)

Impressoras
Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @2", vbNormalFocus)

Fontes
Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @3", vbNormalFocus)

Mail e Fax
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl", vbNormalFocus)

Multimídia
Audio
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0", vbNormalFocus)

Vídeo
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1", vbNormalFocus)
williamdsilva@aol.com.br 175

MIDI
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2", vbNormalFocus)

CD
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3", vbNormalFocus)

Avançado
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4", vbNormalFocus)

Som
Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1", vbNormalFocus)

Modem
Call Shell("rundll32.exe shell32.dll,Control_RunDLL modem.cpl", vbNormalFocus)

Rede
Call Shell("rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl", vbNormalFocus)

Senha
Call Shell("rundll32.exe shell32.dll,Control_RunDLL password.cpl", vbNormalFocus)

Sistema
Geral
Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0", vbNormalFocus)

Gerenciador de Dispositivos
Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1", vbNormalFocus)

Perfis de Hardware
Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2", vbNormalFocus)

Performance
Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3", vbNormalFocus)

Opções de Acessibilidade
Teclado
Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1", vbNormalFocus)

Som
Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2", vbNormalFocus)

Exibir
Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3", vbNormalFocus)

Mouse
Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4", vbNormalFocus)

Geral
Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5", vbNormalFocus)

Assistente (Adicionar novo Hardware)


Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1", vbNormalFocus)

Data e Hora
Call Shell("rundll32.exe shell32.dll,Control_RunDLL timedate.cpl", vbNormalFocus)

DiskCopy
Call Shell("rundll32 diskcopy.dll,DiskCopyRunDll", vbNormalFocus)

395 - Crystal Reports: imprimindo em outra impressora que não seja a Padrão - Correção
Enviado por: Adriano Faria Alves
Na dica para mandar relatório para a Impressora que não seja a Padrão, faça a seguinte alteração:

...
CrystalReport1.PrinterDriver = "Epson24.drv"
...

396 - Informar sobre a alteração de dados


Enviado por: Esdras Pavan

Alvo:
Verificar se os Text Box´s de um formulário tiveram o seu conteúdo alterado
williamdsilva@aol.com.br 176

Aplicação:
Quando um usário altera os dados de alguns campos e sai sem salvar as alteraçõs foram perdidas, está
função verifica a alteração.

Função :
Function Changed(pJanela As Form) As Boolean

Dim vIndice As Integer


For vIndice = 0 To pJanela.Controls.Count - 1
If TypeOf pJanela.Controls(vIndice) Is TextBox Or _
TypeOf pJanela.Controls(vIndice) Is ComboBox Then
If pJanela.Controls(vIndice).DataChanged Then
Changed = True
Exit Function
End If
End If
Next vIndice

End Function

Modo de usar:
Private Sub Form_Unload(Cancel As Integer)

If Changed(Me) Then
If MsgBox("Foram feitas aterações. Deseja sair sem salvar???", 32 + vbYesNo, "Pergunta") = vbNo
Then
Cancel = -1
End If
End If

End Sub

397 - Informar sobre a alteração de dados


Enviado por: Esdras Pavan

Alvo:
Verificar se os Text Box´s de um formulário tiveram o seu conteúdo alterado

Aplicação:
Quando um usário altera os dados de alguns campos e sai sem salvar as alteraçõs foram perdidas, está
função verifica a alteração.

Função :
Function Changed(pJanela As Form) As Boolean

Dim vIndice As Integer


For vIndice = 0 To pJanela.Controls.Count - 1
If TypeOf pJanela.Controls(vIndice) Is TextBox Or _
TypeOf pJanela.Controls(vIndice) Is ComboBox Then
If pJanela.Controls(vIndice).DataChanged Then
Changed = True
Exit Function
End If
End If
Next vIndice

End Function

Modo de usar:
Private Sub Form_Unload(Cancel As Integer)

If Changed(Me) Then
If MsgBox("Foram feitas aterações. Deseja sair sem salvar???", 32 + vbYesNo, "Pergunta") = vbNo
Then
Cancel = -1
End If
End If

End Sub

PS.: Temos que tomar algumas atenções


Criarmos no form uma variável boleana Publica chamada Changed e a setarmos true ou false no momento
correto.
williamdsilva@aol.com.br 177

Ex:Toda vez que o botão salvar for acionado setar a variavel changed = true.

398 - Tabela de Meses


Enviado por: Esdras Pavan
Alvo:
Retorna o nome do mês de acordo com o número passado na função

Função:
Public Function TabMeses(pMes As Integer) As String
Dim vetMeses
vetMeses = Array("Janeiro", "Fevereiro","Março", _
"Abril", "Maio","Junho", "Julho", _
"Agosto", "Setembro", "Outubro", _
"Novembro", "Dezembro")

TabMeses = vetMeses(pMes - 1)
End Function

Modo de Usar:
a linha - > TabMeses(Month(CDate("10/02/2000")))
retorna - > "Fevereiro"

399 - Outra forma de abrir um ComboBox ao receber o foco(mais simples)


Enviado por: João Paulo Rezende
No evento GotFocus do ComboBox coloque o seguinte código:

Private Sub Combo1_GotFocus()


SendKeys "%{DOWN}"
End Sub

No evento load do Form coloque este código:

Private Sub Form_Load()


Combo1.AddItem "Teste1"
Combo1.AddItem "Teste2"
Combo1.AddItem "Teste3"
Combo1.AddItem "Teste4"
End Sub

400 - Testar se a UF digitada está correta


Enviado por: Luis Roberto Garcia Leandro
Public Function TestaUF(UF As String) As Boolean
If UF = "" Then Exit Function
Dim UFpes As String
UFpes = "ACALAMAPBACEDFESFNGOMAMGMSMTPAPBPEPIPRRNRJRSRORRSESCTOSP"
Dim I, Q As Integer
TestaUF = False: Q = 1
For I = 0 To 27
If UCase(UF) = Mid(UFpes, Q, 2) Then TestaUF = True: Exit For
Q=Q+2
Next I
End Function

Modo de usar

Private Sub TBUF_LostFocus()


If TBUF = "" Then Exit Sub
If TestaUF(TBUF) = False Then
MsgBox "Unidade de federação incorreta !", 48, "Atenção !"
TBUF = ""
TBUF.SetFocus
End If
End Sub

401 - Testar se a UF digitada está correta 2


Enviado por: Carlos Peixoto
Private Sub txtUF_LostFocus()
Dim lEstados As String
If txtUF > "" Then
txtUF = UCase$(txtUF)
lEstados = "AC-AL-AM-AP-BA-CE-DF-ES-GO-MA-MG-MS-MT-PA-PB-PE-"
williamdsilva@aol.com.br 178

lEstados = lEstados & "PI-PR-RJ-RN-RO-RR-RS-SC-SE-SP-TO"


If InStr(1, lEstados, txtUF) = 0 Then
MsgBox "Estado inválido", vbExclamation, UCase(txtUF)
txtUF.SetFocus
End If
End If
End Sub

402 - Tornar maiúsculas as letras de TODOS os controles de um form


Enviado por: Roberto Alexandre Levy
Essa serve para aqueles que só querem adicionar em uma base de dados, informações com apenas letras
maiúsculas. Veja com é fácil converter todos os controles com poucas linhas

403 - Tornar maiúsculas as letras de TODOS os controles de um form


Enviado por: Roberto Alexandre Levy
Essa serve para aqueles que só querem adicionar em uma base de dados, informações com apenas letras
maiúsculas. Veja com é fácil converter todos os controles com poucas linhas.

Coloque o seguinte código em um módulo:

Sub Caixa_Alta(oForm As Form)

Screen.MousePointer = vbHourglass

Dim A As Integer

For A = 1 To oForm.Controls.Count - 1

If TypeOf oForm.Controls(A) Is TextBox Then


oForm.Controls(A).Text = UCase(oForm.Controls(A).Text)
ElseIf TypeOf oForm.Controls(A) Is ComboBox Then
oForm.Controls(A).Text = UCase(oForm.Controls(A).Text)
End If

Next A
Screen.MousePointer = vbArrow

End Sub

Para chamá-lo, digite:

Caixa_Alta frmInsert

Onde frmInsert é o nome do form onde você quer converter para maiúsculas.
Um abraço!

404 - Função genérica para alimentar uma Combo Box com dados de uma tabela
Enviado por: Roberto Alexandre Levy
Fato comum entre os sistemas corporativos é a famosa combo box com dados de uma determinada tabela.
Criei essá função genérica para facilitar esse tramite. Veja como é simples...
Coloque o seguinte código em um módulo:

Sub Gera_Combo(oCombo As Control, nTable As String)

Screen.MousePointer = vbHourglass

Dim SN As Recordset

SQL = "SELECT * FROM " & nTable

Set SN = DB.OpenRecordset(SQL, dbOpenSnapshot)

SN.MoveFirst

Do While Not SN.EOF


oCombo.AddItem SN!Descr
SN.MoveNext
Loop

Screen.MousePointer = vbArrow

End Sub

Perceba que a rotina recebe dois parâmetros. O primeiro (oCombo) é o nome do objeto (comboBox) e o
williamdsilva@aol.com.br 179

segundo é o nome da tabela de origem na base de dados.


Um abraço!

405 - Parâmetros Múltiplos para consultas em SQL


Enviado por: Roberto Alexandre Levy
AAA

406 - Verifique se sua aplicação já em uso na hora que inicia sua aplicação
Enviado por: Alexandre Liondas Neto
Para verificar se sua aplicação já está aberta na hora de iniciar seu programa faça o seguinte :

No evento LOAD ou de seu formulário principal digite :

If App.PrevInstance Then
MsgBox "A aplicação iniciada já está em uso.", vbCritical, "Negado"
End
End If

407 - Icones
Enviado por: Henrique Rios Witzel
Gostaria de saber sobre icones para uso nos programas de Visual Basic,Preciso icones de Advogado para
eu colocar no programa.

408 - Verificando a impressora padrão e o seu Drive


Enviado por: William Costa Rodrigues
Private Sub Form_Load()
lbImpress.Caption = "Impressora Padrão: " & Printer.DeviceName
lbDrvImpress.Caption = "Nome do Drive: " & Printer.DriverName
End Sub

409 - Cálculo entre duas datas (resultado em anos, meses e dias)


Enviado por: Adriano Faria Alves
Use um botão de comando e 3 caixas de texto (Entrada, Hoje e Resultado)

*** Crie a Função no Form:

Function CalculaTempo(Entrada As Date)

If IsNull(Entrada) Or Entrada > Date Then


MsgBox "Data de Entrada inválida.", vbCritical
Exit Function
End If

Dim Anos, Meses, Dias


Dim iAnos, iMeses, Intervalo As Double

Intervalo = Date - Entrada

***Um ano tem exatamente 365,25 dias


iAnos = Intervalo / 365.25
Anos = Int(iAnos)
iMeses = (iAnos - Anos) * 12
Meses = Int(iMeses)
Dias = DateDiff("d", DateSerial(DatePart("yyyy", Entrada) + Anos, DatePart("m", Entrada) + Meses,
Day(Entrada)), Date)

If Dias = 30 Then
Dias = 0
Meses = Meses + 1
End If

If Meses = 12 Then
Meses = 0
Anos = Anos + 1
End If

If Anos > 1 Then


Anos = Anos & " anos "
Else
williamdsilva@aol.com.br 180

Anos = Anos & " ano "


End If

If Meses > 1 Then


Meses = Meses & " meses "
Else
Meses = Meses & " mês "
End If

If Dias > 1 Then


Dias = Dias & " dias."
Else
Dias = Dias & " dia."
End If

CalculaTempo = Anos & Meses & Dias

End Function

*** Form Load


Hoje.Text = Format(Now, "dd/mm/yyyy")

*** Botão de Comando:


Resultado.Text = CalculaTempo(Entrada)

410 - Parâmetros Múltiplos para consultas em SQL - CORRIGIDO


Enviado por: Roberto Alexandre Levy
Essa função gera um parametro para usar com a instrução LIKE do SQL,
permitindo que o usuário possa escrever palavras compostas como critério de busca.

Function Cria_Parametro_Multiplo(cParam)

Screen.MousePointer = vbHourglass

Dim cNew As String


cParam = Chr(42) & cParam & Chr(42)
For A = 1 To Len(cParam)
If Mid$(cParam, A, 1) = " " Then
cNew = cNew & Chr(42)
Else
cNew = cNew & Mid(cParam, A, 1)
End If
Next A

Cria_Parametro_Multiplo = cNew

Screen.MousePointer = vbDefault

End Function

OBS: O Caracter 42 e um asterisco. No caso de outras bases, como


ORACLE ou SQO Server, use o caracter 37, percentual!
Dica: Use uma InputBox para buscar o valor criterio desejado pelo usuario.
Qq dúvidas, made um email!

Um abraço

411 - Como dar uma pausa no programa sem usar um Timer


Enviado por: André Quites O. Santos
Me parece que o meio mais simples é utilizando a função Sleep da API do Windows. Além de simples, a
função Sleep libera o Windows para atender a outras aplicações enquanto em espera:

Basta colocar no form a seguinte declaração:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Se a declaração for feita em um módulo, poderá ser pública.

Feito a declaração é só utilizar a função, passando como argumento o tempo da pausa em milisegundos.
Por exemplo, para uma pausa de 1,5 segundos, teríamos:

Sleep(1500)

412 - Como impossibilitar que o form seja fechado, MAS COM APENAS UM COMANDO!!!
williamdsilva@aol.com.br 181

Enviado por: Roberto Alexandre Levy


Nosso amigo Ricardo colocou uma forma de impedir o fechamento de um form. Mas temos uma forma bem
mais simples, e com o mesmo efeito!

Simplesmente coloque no evento QueryUnload o seguinte código:

Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Cancel = 1

End Sub

Tente fechá-lo de alguma forma....

Um abraço

413 - Enviar E-mail


Enviado por: carlos angelo fedrigo junior
Dim TxtEmail as String

TxtEmail = "caflib@bol.com.br"
Shell "start.exe mailto:" & TxtEmail, vbHide

Este exemplo executa o seu gerenciador de e-mail padrão para enviar e-mail.

414 - Abrir URL padrão com código de 1 linha


Enviado por: Danilo Faustinoni Cabello
shell "start http://www.vbbrasil.com", vbhide

415 - Correção mais descritiva de "Abrir URL padrão com código de 1 linha"
Enviado por: Danilo Faustinoni Cabello
Coloque num commandbutton:

Public Sub Command1_Click()


shell "start http://www.vbbrasil.com" , vbHide
End Sub

Você também pode inserir uma textbox e um commandbutton assim

Public Sub Command1_Click()


shell "start " + text1.Text , vbHide
End Sub

Não se esqueça do espaço entre (start e o endereço)

416 - Detectar o conteúdo do CD


Enviado por: Adriano Faria Alves
*** Módulo BAS

Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal


lpRootPathName As String,
ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long,
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long,
lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String,
ByVal nFileSystemNameSize As Long) As Long

Declare Function GetDriveType Lib "kernel32"


Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Public Const DRIVE_CDROM = 5

*** Private Sub Command1_Click()

Dim VolName As String, FSys As String, erg As Long


Dim VolNumber As Long, MCM As Long, FSF As Long
Dim Drive As String, DriveType As Long

VolName = Space(127)
FSys = Space(127)

Drive = "E:\" *** O drive correspondente ao seu cd-rom.


williamdsilva@aol.com.br 182

DriveType& = GetDriveType(Drive$)

erg& = GetVolumeInformation(Drive$, VolName$, 127&,


VolNumber&, MCM&, FSF&, FSys$, 127&)

Print "VolumeName:" & vbTab & VolName$


Print "VolumeNumber:" & vbTab & VolNumber&
Print "MCM:" & vbTab & vbTab & MCM&
Print "FSF:" & vbTab & vbTab & FSF&
Print "FileSystem:" & vbTab & FSys$
Print "DriveType:" & vbTab & DriveType&;

*** Se o drive for CDROM, checa o CD

If DriveType& = DRIVE_CDROM Then


Print " (CDROM, ";

If erg& = 0 Then
Print "não há CD no drive.)"
Else
Print "há CD no drive)"
End If
Else
Print " (Não há CDROM)"
End If

End Sub

417 - Aumentar número de linhas na Combo (por padrão, o VB só mostra 8 e acrescenta uma scroll).
Enviado por: Adriano Faria Alves
*** Módulo BAS

Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long,
ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

*** Função no Módulo BAS

Public Sub SetComboHeight(oComboBox As ComboBox, lNewHeight As Long)

Dim oldscalemode As Integer

If TypeOf oComboBox.Parent Is Frame Then Exit Sub

oldscalemode = oComboBox.Parent.ScaleMode
oComboBox.Parent.ScaleMode = vbPixels

MoveWindow oComboBox.hwnd, oComboBox.Left, _


oComboBox.Top, oComboBox.Width, lNewHeight, 1

oComboBox.Parent.ScaleMode = oldscalemode

End Sub

*** Form_Load ()

Dim i As Integer

For i = 1 To 15
Combo1.AddItem "Item " & i
Next

Call SetComboHeight(Combo1, 400)

*** Onde 400 é o número que você aumenta ou diminui conforme o tanto de registro que quer mostrar
quando abrir a combo.

418 - Descubra o código ASCII pelo VB


Enviado por: Adriano Faria Alves
Abra a IMMEDIATE WINDOWS, digite e dê enter:

?Asc("p")
Ele retornará 112 (o número ASCII do p minúsculo)
williamdsilva@aol.com.br 183

?Asc("P")
Ele retornará 80 (o número ASCII do p maiúsculo)

E assim por diante, digite a letra ou número entre as aspas.

419 - Descobrir senha de proteção de Banco de Dados Access 97


Enviado por: Adriano Faria Alves
*Essa dica serve para mostrar a senha esquecida de proteção do banco de dados Access 97.

*Módulo BAS
Option Compare Binary
Option Explicit

*Função no Módulo BAS


Public Function StPasswordOfStDatabase(stDatabase As String) As String
Dim hFile As Integer
Dim ich As Integer
Dim stBuffer As String
Dim rgbytRaw() As Byte
Dim rgbytPassword() As Byte
Dim rgbytNoPassword() As Byte

rgbytNoPassword = ChrB(134) & ChrB(251) & ChrB(236) & ChrB(55) & ChrB(93) & ChrB(68) & ChrB(156)
& ChrB(250) & ChrB(198) & ChrB(94) & ChrB(40) & ChrB(230) & ChrB(19) & ChrB(182) & ChrB(138) &
ChrB(96) & ChrB(84) & ChrB(148) & ChrB(123) & ChrB(54)

hFile = FreeFile
Open stDatabase For Binary As #hFile
Seek #hFile, 66 + 1
rgbytRaw = InputB(20, #hFile)
Close #hFile

ReDim rgbytPassword(0 To 19)


For ich = 0 To 19
rgbytPassword(ich) = rgbytRaw(ich) Xor rgbytNoPassword(ich)
Next ich

stBuffer = StrConv(rgbytPassword, vbUnicode) & vbNullChar


StPasswordOfStDatabase = Left$(stBuffer, InStr(1, stBuffer, vbNullChar, vbBinaryCompare) - 1)
End Function

*Para chamar a função


Text1.Text = StPasswordOfStDatabase("c:\bd1.mdb")

420 - Saber quantas vezes seu programa foi executado


Enviado por: Robson Soares
O exemplo mostra quantas vezes o programa foi executado:
strRun = GetSetting(App.Title, 0, "Run")
strRun = Val(strRun) + 1
SaveSetting App.Title, 0, "Run", strRun
MsgBox strRun

421 - Limpar ComboBox com Estilo 2 (Dropdown list)


Enviado por: Eduardo de Souza
Para deixar o combobox com a propriedade style n.º 2 (dropdown list -
combo não editável) em branco, basta colocar o código no evento click
de um command button qualquer:

Private Sub CommandButton_Click


combobox.listindex = -1
End Sub

Desta forma, declaramos que nenhum ítem foi selecionado no combo

422 - Procurando por um dado específico no banco


Enviado por: Alex Ricardo Parolin
Vamos procurar por um nome no banco de dados e jogar numa TextBox. O procedimento é o seguinte:

private sub procurar


dim achou as boolean
- tabela.MoveFirst
williamdsilva@aol.com.br 184

Do
if(tabela("Nome")="Nome Desejado")then
TextBox.text= tabela("Nome")
Exit sub
else
achou=false
tabela.Movenext
end if
loop until (tabela.EOF=true)
if(achou=false)then
aviso=msgbox("Não existe o nome procurado!",Vbexclamation+Vbokonly,"Erro")
end if
end sub

Agora se você pretende joaga essa informação numa ListBox, ou Num ComboBox (para o caso de nomes
iguais, mas outros dados diferentes):

private sub procurar2


dim achou as boolean
dim erro as boolean

tabela.MoveFirst
do
if(tabela("Nome")="Nome Desejado")then
ListBox.AddItem(tabela("Nome"))
listBox.Refresh
achou=true
tabela.movenext
else
achou=false
erro=true
tabela.MoveNext
end if
loop until (tabela.EOF=true)
if((achou=false)and(erro=true))then
aviso=msgbox("Não existe o registro procurado!",vbexclamation+vbokonly,"erro")
else
aviso=msgbox("Verifique na lista os nomes encontrados!",vbinformation+vbokonly,"Nomes")
end if
end sub

Qq notificação: a_parolin@zipmail.com.br

423 - Out of stack space (Package & Depoyment Wizard)


Enviado por: Graziele de Bortoli
Este erro acontece devido a um problema no arquivo de
dependência do Crystal Report: Crystl32.dep.

Para solucionar esse erro edit o Crystl32.dep pelo Notepad


ou um editor de texto semelhante e inclua o ; nas seguintes
linhas:

;[CRPE32.DLL]
;Dest=$(WinSysPath)
;Uses1=CRPE32.DLL
;Uses2=

424 - Como procurar por uma pasta usando (API) SHBrowseForFolder


Enviado por: Daniel Marques Pereira

'Coloque estas declarações em um módulo


'Se colocar em um formulário lembre-se de não usar como 'Public'

'Existem outras flags para parametrizar a pesquisa


Public Const BIF_RETURNONLYFSDIRS = 1
Public Const BIF_DONTGOBELOWDOMAIN = 2
Public Const MAX_PATH = 260

Public Declare Function SHBrowseForFolder Lib "shell32" ( _


lpbi As BrowseInfo _
) As Long
williamdsilva@aol.com.br 185

Public Declare Function SHGetPathFromIDList Lib "shell32" ( _


ByVal pidList As Long, _
ByVal lpBuffer As String _
) As Long

Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _


ByVal lpString1 As String, _
ByVal lpString2 As String _
) As Long
'Tipo para def
Public Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

'No evento clic de um botão no formulário


Private Sub Command1_Click()

Dim lpIDList As Long


Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo

'Personaliza a procura
szTitle = "Titulo da procura"
With tBrowseInfo
.hWndOwner = Me.hWnd
.lpszTitle = lstrcat(szTitle, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_EDITBOX
End With

'Abre a janela de procura


'E retorna o caminho da pasta selecionada
lpIDList = SHBrowseForFolder(tBrowseInfo)

'Se existir alguma pasta selecionada extrair


If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
MsgBox "Caminha da Pasta selecionada" + vbCrLf + vbCrLf + sBuffer
End If

End Sub

425 - Conexão de multiplos clientes em um único servidor (Winsock)


Enviado por: Daniel Lopes de Carvalho
Para conectar diversos clientes em um único servidor é necessário:

SERVIDOR
No aplicativo de servidor cria a seguinte rotina:
...
WskSvr(0).LocalPort = 1050 - > Utilize a porta que desejar.
WskSvr(0).Listen
...

Private Sub WskSvr_ConnectionRequest(Index As Integer, ByVal requestID As Long)


On Error Resume Next
If Index = 0 Then
CnnSvr = CnnSvr + 1
Load WskSvr(CnnSvr)
WskSvr(CnnSvr).Accept requestID
End If
End Sub

Esta rotina fará com que toda vez que for solicitada uma nova conexão ele incrementa o contador
williamdsilva@aol.com.br 186

CNNSVR e pede para carregar um novo controle WINSOCK para receber esta solicitação.

CLIENTE
No Aplicativo de cliente as funções serão as mesmas.

WskCli(0).RemoteHost = "127.0.0.1" -> Utilize o endereço de IP ou o hostname do servidor.


WskCli(0).RemotePort = 1050 -> Utilize a mesma porta que foi utilizada no servidor.

426 - Formatar Hora com valor superior à 23:00


Enviado por: Luiz Carlos Moreira Brazão Lima
Quando você usa variável no formato Date, as horas só podem aparecer entre os valores 00:00:00 -
23:59:59
Aqui está uma rotina para mostrar valores superiores como 48:00.

Public Function hFormat(dHora As Double) As String


Dim Horas As String, Minutos As String
Horas = Str(Fix(FullTime / 3600))
Minutos = Str((Fix(FullTime / 60) Mod 60))
hFormat = Format(Horas & ":" & Minutos, "hh:nn")
End Function

Não testei com Single nem Integer como parâmetro.


[]'s

427 - Função que retorna a semana em extenso


Enviado por: fabio aparecido da silva
Function ExtensoSemana(DATA)
SEMANA = Array("Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", _
"Quinta-Feira", "Sexta-Feira", "Sabado")
ExtensoSemana = SEMANA(WeekDay(DATA) - 1)
End Function

Exemplo:

text1.text = ExtensoSemana("16/03/2001")
ou
text1.text = ExtensoSemana(Date)

428 - Inicio do Mês


Enviado por: fabio aparecido da silva
Function InicioMes(DATA)
Total = "01" & "/" & CStr(Month((CDate(DATA)))) & "/" & CStr(Year(Date))
InicioMes = Format(CDate(Total), "DD/MM/YYYY")
End Function

mais dicas:
www.fasinfo.cjb.net

429 - Função Segunda-Feira


Enviado por: fabio aparecido da silva
Function Segunda(DATA)
If WeekDay(DATA) = 1 Then
Segunda = CDate(DATA) - 6
Else
Segunda = CDate(DATA) - (WeekDay(DATA) - 2)
End If
End Function

Mais dicas:
www.fainfo.cjb.net

430 - Centraliza textos em textsbox


Enviado por: fabio aparecido da silva
Function Central(Texto, Tamanho, MeuCaracter)
If Len(Texto) = Tamanho Then
Central = Texto
Else
williamdsilva@aol.com.br 187

Ajusta = (Tamanho - Len(Texto)) / 2


Central = String(Ajusta, MeuCaracter) + Texto + String(Ajusta, MeuCaracter)
End If
End Function

431 - Informações sobre sitema sem o uso de API,s


Enviado por: Fabio Silva
O uso da função "ENVIRON" para retornar variaveis do sistema.

432 - Achando uma letra na String


Enviado por: Carlos Eduardo Rocco Froes
Esta função apenas recebe uma string e procura por uma letra ou numero dentro dela
RETORNO:( True se achar e False se não achar )

Private Function Busca_String(obj_str, in_letra) As Boolean

Dim a
For a = 1 To Len(obj_str)
If Mid(obj_str, a, 1) = in_letra Then
Busca_String = True
Exit Function
End If
Next
Busca_String = False

End Function

433 - Removendo acentos para impressão de relatórios em impressoras matriciais


Enviado por: Luiz Fernando C. Capacio
No módulo (.BAS) insira esta variavel como global
Global vtexconv As Variant

Insira esta parte do fonte onde deseja obter o resultado da conversão


Open "LPT1" for output as #1
vtexto="Teste de acentuação no VB"
vtexconv = "": removeacentos (vtexto)
print #1, vtexconv 'Variavel tera o valor convertido.
close #1

No módulo (.BAS) insira esta função para efetuar a conversão


Function removeacentos(texto As String)
variavel = Text1

vpar = "ÀÁÂÃÄÅÇÈÉÊËÃÍÎÏ“ÓÔÕÖÙÚÛÜàáâãäåçèéêÎìíîïòóôõöùúûü"
vcod = "AAAAAACEEEEIIIIOOOOOUUUUaaaaaaceeeeiiiiooooouuuu"
For c = 1 To Len(variavel)
vpos = InStr(1, vpar, Mid(variavel, c, 1))
If vpos <> 0 Then
vtexconv = vtexconv + Mid(vcod, Val(vpos), 1)
Else
vtexconv = vtexconv + Mid(variavel, c, 1)
End If
Next
End Function

434 - Alternando NumLock e CapsLock por código


Enviado por: Fábio Perkowitsch Mulero
Você pode inserir esse fragmento de código em seu programa e fazer com que seja acionado ou
desacionado as teclas NUM e CAPS Lock
por botões ou eventos de seu programa, para isso é só chamar a sub rotina AlternaCAPS() para o Caps
Lock e
AlternaNUM() para o NUM Lock.

Public Const VK_CAPITAL = &H14


Public Const VK_NUMLOCK = &H90

Public Type KeyboardBytes


kbByte(0 To 255) As Byte
End Type
Public kbArray As KeyboardBytes
Public Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Long
Public Declare Function GetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long
williamdsilva@aol.com.br 188

Public Declare Function SetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long

Public Sub AlternaCAPS()


GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
SetKeyboardState kbArray
End Sub

Public Sub AlternaNUM()


GetKeyboardState kbArray
kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1)
SetKeyboardState kbArray
End Sub

434 - Alternando NumLock e CapsLock por código


Enviado por: Fábio Perkowitsch Mulero
Você pode inserir esse fragmento de código em seu programa e fazer com que seja acionado ou
desacionado as teclas NUM e CAPS Lock
por botões ou eventos de seu programa, para isso é só chamar a sub rotina AlternaCAPS() para o Caps
Lock e
AlternaNUM() para o NUM Lock.

Public Const VK_CAPITAL = &H14


Public Const VK_NUMLOCK = &H90

Public Type KeyboardBytes


kbByte(0 To 255) As Byte
End Type
Public kbArray As KeyboardBytes
Public Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Long
Public Declare Function GetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long
Public Declare Function SetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long

Public Sub AlternaCAPS()


GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
SetKeyboardState kbArray
End Sub

Public Sub AlternaNUM()


GetKeyboardState kbArray
kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1)
SetKeyboardState kbArray
End Sub

435 - Digitação em maiusculo mesmo com o Caps Look desligado


Enviado por: Júlio Cesar Moraes
Com esses comandos é posível fazer a digitação sair sempre
com caracteres em maiúsculo, independente de o Caps Look
estar ligado ou desligado

Private Sub Campotxt_Change()


Campotxt.Text = UCase(Campotxt.Text)
Campotxt.SelStart = Len(Campotxt.Text)
End Sub

436 - Usando o AutoCompletar do Internet Explorer 5


Enviado por: Fábio Perkowitsch Mulero
Inserindo esse fragmento de código vc pode usar a ferramenta
autocompletar do IE5, bastando para isso chamar a sub rotina
MakeAutoComplete() no evento form_load e passando qual textbox
ira usar essa ferramenta.

Public Declare Function SHAutoComplete Lib "Shlwapi.dll" (ByVal hwndEdit As Long, ByVal dwFlags As
Long) As Long
Public Const SHACF_DEFAULT As Long = &H0

Public Sub MakeAutoComplete(ByRef TextB As TextBox)


Call SHAutoComplete(TextB.hWnd, SHACF_DEFAULT)
End Sub

437 - Email - Ler o conteúdo com CDO


Enviado por: Ricardo Garrido Schwach
williamdsilva@aol.com.br 189

Antes de Começar: Ir no Menu Project, opção Referências e Ativar


a referência Microsoft Active Messaging.

Obs.: É Necessário ter a seguinte DLL registrada: OLEMSG32.DLL

Private Sub Command1_Click()


Dim objSession As Object
Set objSession = CreateObject("MAPI.Session")
objSession.Logon "Configurações do MS Exchange", , False, False

For Each objMessage In objSession.Inbox.Messages


If objMessage.Unread = True Then
If InStr(objMessage.Subject, "Assunto do Email") Then
Var = objMessage.Text
End If
End If
Next objMessage
End Sub

438 - Imagem como fundo de Formulário MDI


Enviado por: Moacir Ribeiro do Carmo
Crie um formulário MDI e defina a sua propriedade
Enable como False e BorderStyle como 0 - None.
Inclua nele uma imagem chamada imgBackgroud e insira o
seguinte código de evento:

Private Sub Form_Load()


With imgBackgroud
.Stretch = False

.Top = 0
.Left = 0

Me.Height = .Height
Me.Width = .Width
End With

Me.Top = (FormMDI.ScaleHeight - Me.Height) * 0.45


Me.Left = (FormMDI.ScaleWidth - Me.Width) \ 2
End Sub

'Obs: FormMDI é o nome do formulário MDI. Este formulário deve


'ser carregado no evento MDIForm_Load:

Private Sub MDIForm_Load()

With Screen 'Ocupa toda a tela


Me.Move 0, 0, .Width, .Height - 27 * 15
End With

frmBackground.Show

End Sub

439 - Criando animação no Caption do Form sem API.


Enviado por: Arthur Lopes
Você deve criar 5 timer : ( Timer, Timer1, Timer2, Timer3 e Timer4 )

==> General Declarations <==


Dim vform As String

==> No LOAD do FORM <==


'Private Sub Form_Load()
vform = "T"
Form1.Caption = vform
Timer1.Enabled = True
Timer2.Enabled = False
Timer3.Enabled = False
Timer4.Enabled = False
'End Sub

==> No Timer do Timer1 <==


'Private Sub Timer1_Timer()
williamdsilva@aol.com.br 190

If vform = "T" Then


vform = vform + "e"
Form1.Caption = vform
Timer2.Enabled = True
End If
'End Sub

==> No Timer do Timer2 <==


'Private Sub Timer2_Timer()
If vform = "Te" Then
vform = vform + "s"
Form1.Caption = vform
Timer3.Enabled = True
End If
'End Sub

==> No Timer do Timer1 <==


'Private Sub Timer3_Timer()
If vform = "Tes" Then
vform = vform + "t"
Form1.Caption = vform
Timer4.Enabled = True
End If

End Sub

440 - Centralizando o Form em Runtime


Enviado por: William Rodrigues
'Para colcocar um Form no centro da tela em tempo de execução escreva os seguintes códigos:
Private Sub Form_Resize()
On Error Resume Next 'Evita erro caso o usuário minimize o Form
With Me
.Left = (Screen.Width - .Width) / 2 'Alinha o form no horizontalmente no centro
.Top = (Screen.Height - .Height) / 2 'Alinha o form no verticalmente no centro
End With
End Sub

441 - Preenchendo um ComboBox ou ListBox com dados de um Arquivo


Enviado por: William Rodrigues
'Para esta dica inicie um novo projeto e insira um ComboBox e um ListBox e crie uma arquivo de texto
qualquer (Ex.: C:\Lista de Alunos.txt"). Renomei-e o ComboBox para CboFile e o ListBox para LstFile. Em
seguida no evento Load do Form1, insira as seguintes linhas de comando:
Private Sub Form_Load ()
'Declaração das variáveis
Dim fnum As Integer
Dim lines As Integer
Dim a_line As String
If Dir("C:\Lista de Alunos.txt", vbArchive) = Empty Then 'Verifica se o arquivo se o arquivo existe
MsgBox "O arquivo não foi encontrado!", vbCritical, App.Title 'Caso o arquivo não seja encontrado exibe
a caixa de mensagem
Exit Sub 'Envia o comando para o fim da rotina
End If
fnum = FreeFile 'Devolve a variável fnum a crarterística de FreeFile

Open "C:\Lista de Alunos.txt" For Input As fnum 'Abre o arquivo


Do While Not EOF(fnum) 'Vai para fim de arquivo
Input #fnum, a_line 'Ler a linha de dados do arquivo
lines = lines + 1'Pula para a linha seguinte do arquivo cada vez que o laço e repitido, até chegar a
última linha
CboFile.AddItem a_line 'Preenche o ComboBox com os dados do adicionando cada linha até a última
linha do arquivo
LstFile.Additem a_line 'Preenche o ListBox com os dados do adicionando cada linha até a última linha do
arquivo
Loop 'Finaliza o Laço
Close fnum 'Fechar o arquivo
End Sub

442 - Carregando seu programa ao iniciar o windows automaticamente


Enviado por: Gilson Cezar Rodrigues Bernal
'EXE Location
Public Const MAX_PATH = 206
Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName
As String) As Long
williamdsilva@aol.com.br 191

Public Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As
Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

Sub CreateIniLoad()
a = Environ("windir")
'Get Current Location
Dim lngFileHandle As Long
Dim lngReturn As Long
Dim strFilePath As String
strFilePath = Space$(MAX_PATH)
lngFileHandle = GetModuleHandle(App.EXEName)
lngReturn = GetModuleFileName(lngFileHandle, strFilePath, MAX_PATH)
Text1.Text = strFilePath
'Copy Server File to Windows System Directory
If Text1.Text = a & "\SYSTEM\yourfile" Then GoTo jumpcopy
FileCopy strFilePath, a & "\SYSTEM\yourfile"
'Modify WIN.INI
jumpcopy:
Open a & "\WIN.INI" For Input As #1
Open a & "\WIN.ANA" For Output As #2
While Not EOF(1)
Input #1, b
Print #2, Spc(0); b
If b = "load=" & a & "\SYSTEM\yourfile" Then
Close #1
Close #2
Kill a & "\WIN.ANA"
GoTo end
ElseIf b = "[windows]" Then
Print #2, Spc(0); "load=" & a & "\SYSTEM\yourfile"
Input #1, b
End If
Wend
Close #1
Close #2
Kill a & "\WIN.INI"
Name a & "\WIN.ANA" As a & "\WIN.INI"
End Sub

443 - Abra a janela Mapear Unidade de Rede


Enviado por: Gilson Cezar Rodrigues Bernal
Private Declare Function WNetConnectionDialog Lib "mpr.dll" _
(ByVal hwnd As Long, ByVal dwType As Long) As Long

x% = WNetConnectionDialog(Me.hwnd, 1)

444 - Listar as músicas de um CD Audio


Enviado por: Gilson Cezar Rodrigues Bernal
Option Explicit
Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal
lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" _


(ByVal AppName As String, ByVal KeyName As String, ByVal keydefault As String, ByVal Filename As String)
As Long

Global CDMin As Integer


Global CDSec As Integer
Global TMin As Integer
Global TSec As Integer
Global RMin As Integer
Global RSec As Integer
Global TimeTrack As String
Global TimeElapsed As String
Global TimeRemaining As String

Global Artist1 As String


Global Title1 As String

Global Artist2 As String


Global Title2 As String
williamdsilva@aol.com.br 192

Sub CDAudioProperties()
Dim T As Double
On Error Resume Next
T = Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3", 5)

End Sub

Function GetRawRemainingTime(MMCOntrol1 As Object) As String


Dim Z As String, Min As String, Sec As String, _
Temp As String

Z = GetRunningTime(MMCOntrol1)
Z = GetTrackTime(MMCOntrol1)

Min = LTrim$(Str$(CDMin - TMin))


Sec = LTrim$(Str$(CDSec - TSec))

RMin = Val(Min)
RSec = Val(Sec)

If RSec < 0 Then


RSec = 60 + Val(Sec)
RMin = RMin - 1
End If
Min = LTrim$(Str$(RMin))
Temp = Trim$(Str$(RSec))
If Len(Temp) = 1 Then
Sec = "0" + Temp
Else
Sec = Temp
End If
GetRawRemainingTime = Min + Sec
End Function
Function GetRemainingTime(MMCOntrol1 As Object) As String
Dim Z As String, Min As String, Sec As String, _
Temp As String

Z = GetRunningTime(MMCOntrol1)
Z = GetTrackTime(MMCOntrol1)

Min = LTrim$(Str$(CDMin - TMin))


Sec = LTrim$(Str$(CDSec - TSec))

RMin = Val(Min)
RSec = Val(Sec)

If RSec < 0 Then


RSec = 60 + Val(Sec)
RMin = RMin - 1
End If
Min = LTrim$(Str$(RMin))
Temp = Trim$(Str$(RSec))
If Len(Temp) = 1 Then
Sec = "0" + Temp
Else
Sec = Temp
End If
GetRemainingTime = Min + ":" + Sec
End Function

Sub GetTime(MMCOntrol1 As Object)


Dim Z$
Z$ = GetRemainingTime(MMCOntrol1)

End Sub

Function GetTrackTime(MMCOntrol1 As Object) As String


Dim Length&, Entry2$, Min$, Sec$, D$, Entry$
MMCOntrol1.TimeFormat = 2
Length& = MMCOntrol1.TrackLength
Min$ = Str$(Length& And &HFF)
Sec$ = LTrim$(Str$((Length& And 65280) / 256))
williamdsilva@aol.com.br 193

Entry2$ = Min$ & ":" & Sec$


If Len(Sec$) = 1 Then Entry2$ = Min$ + ":0" + Sec$
Entry$ = Min$ + ":" + Sec$
If Len(Entry2$) = 4 Then
D$ = "0" + Entry2$
Else
D$ = Entry2$
End If
If Len(Entry2$) = 3 Then
D$ = "00" + Entry2$
Else
D$ = Entry2$
End If
D$ = Entry2$
GetTrackTime = Trim$(D$)
MMCOntrol1.TimeFormat = 10
CDMin = Val(Min$)
CDSec = Val(Sec$)

End Function

Function GetRunningTime(MMCOntrol1 As Object) As String


Dim E As Long, M As String, S As String, Length&, Min$, Sec$, D As Long, Entry2$
MMCOntrol1.TimeFormat = 2
Length& = MMCOntrol1.Position - MMCOntrol1.TrackPosition
Min$ = Str$(Length& And &HFF)
Sec$ = LTrim$(Str$((Length& And 65280) / 256))
If Len(Sec$) = 3 Then
D = Val(Min$) - 1
Min$ = LTrim$(Str$(D))
E = Val(Right$(Sec$, 2)) + 4

Sec$ = LTrim$(Str$(E))
End If

M = Min$
'If Len(Min$) = 1 Then M = "0" + Min$ Else M = Min$
'If Val(M) = 0 Then M = "00"
'If Val(M) = 1 Then M = "01"
'If Val(M) = 2 Then M = "02"
'If Val(M) = 3 Then M = "03"
'If Val(M) = 4 Then M = "04"
'If Val(M) = 5 Then M = "05"
'If Val(M) = 6 Then M = "06"
'If Val(M) = 7 Then M = "07"
'If Val(M) = 8 Then M = "08"
'If Val(M) = 9 Then M = "09"
If Len(Sec$) = 1 Then
S = "0" + Sec$
Else
If Len(Sec$) = 3 Then
S = Mid$(Sec$, 2)
Else
S = Sec$
End If
End If
TMin = Val(M)
TSec = Val(S)
Entry2$ = LTrim$(M) + ":" + LTrim$(S)
MMCOntrol1.TimeFormat = 10
GetRunningTime = Entry2$
End Function

Function GetRawRunningTime(MMCOntrol1 As Object) As String


Dim E As Long, M As String, S As String, Length&, Min$, Sec$, D As Long, Entry2$
MMCOntrol1.TimeFormat = 2
Length& = MMCOntrol1.Position - MMCOntrol1.TrackPosition
Min$ = Str$(Length& And &HFF)
Sec$ = LTrim$(Str$((Length& And 65280) / 256))
If Len(Sec$) = 3 Then
D = Val(Min$) - 1
williamdsilva@aol.com.br 194

Min$ = LTrim$(Str$(D))
E = Val(Right$(Sec$, 2)) + 4

Sec$ = LTrim$(Str$(E))
End If

M = Min$
'If Len(Min$) = 1 Then M = "0" + Min$ Else M = Min$
'If Val(M) = 0 Then M = "0"
'If Val(M) = 1 Then M = "1"
'If Val(M) = 2 Then M = "2"
'If Val(M) = 3 Then M = "3"
'If Val(M) = 4 Then M = "4"
'If Val(M) = 5 Then M = "5"
'If Val(M) = 6 Then M = "6"
'If Val(M) = 7 Then M = "7"
'If Val(M) = 8 Then M = "8"
'If Val(M) = 9 Then M = "9"
If Len(Sec$) = 1 Then
S = "0" + Sec$
Else
If Len(Sec$) = 3 Then
S = Mid$(Sec$, 2)
Else
S = Sec$
End If
End If
Entry2$ = M + S
MMCOntrol1.TimeFormat = 10
GetRawRunningTime = Entry2$
End Function

Function GetRawTrackTime(MMCOntrol1 As Object) As String


Dim Length&, Entry2$, Min$, Sec$, D$
MMCOntrol1.TimeFormat = 2
Length& = MMCOntrol1.TrackLength
Min$ = Str$(Length& And &HFF)
Sec$ = LTrim$(Str$((Length& And 65280) / 256))
Entry2$ = Min$ + Sec$
If Len(Sec$) = 1 Then Entry2$ = Min$ + "0" + Sec$
GetRawTrackTime = Entry2$
MMCOntrol1.TimeFormat = 10

End Function

Public Function myReadINI(inifile, inisection, inikey, iniDefault)


'Fail fracefully if no file / wrong file is specified.
'If no section (appname), default is first appname
'if no key, default is first key

Dim lpApplicationName As String


Dim lpKeyName As String
Dim lpDefault As String
Dim lpReturnedString As String
Dim nSize As Long
Dim lpFileName As String
Dim retval As Long
Dim Filename As String
lpDefault = Space$(254)
lpDefault = iniDefault

lpReturnedString = Space$(254)

nSize = 254
lpFileName = inifile
lpApplicationName = inisection
lpKeyName = inikey
Filename = lpFileName
retval = GetPrivateProfileString _
(lpApplicationName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName)
myReadINI = lpReturnedString
End Function
williamdsilva@aol.com.br 195

Public Function myWriteINI(inifile As String, inisection As String, inikey As String, Info As String) As String
Dim retval As Long
retval = WritePrivateProfileString(inisection, inikey, Info, inifile)
myWriteINI = LTrim$(Str$(retval))
End Function

Public Function GenCDSerial(MMCOntrol1 As Object) As Long


Const MCI_FORMAT_MILLISECONDS = 0
Const MCI_FORMAT_MSF = 2
Const MCI_FORMAT_TMSF = 10
'MCI_Format :0,2,10 are the only supported formats for CD
Dim Compat As Integer
Dim i As Integer
Dim dwtotal&, dwtemp&
Dim byte0%, byte1%, byte2%, byte3%
'compat = 0 for EXISTING code
'Compat = 1 for use with CDPLAYER.EXE
Compat = 1
MMCOntrol1.Notify = False
MMCOntrol1.Wait = True
MMCOntrol1.Shareable = True
If MMCOntrol1.Error <> 0 Then
MsgBox MMCOntrol1.ErrorMessage
Exit Function
End If
MMCOntrol1.TimeFormat = MCI_FORMAT_MSF
dwtotal& = 0
For i = 1 To MMCOntrol1.Tracks
DoEvents
MMCOntrol1.Track = i
dwtemp& = MMCOntrol1.TrackPosition
byte0% = dwtemp& And &HFF&
byte1% = (dwtemp& And &HFF00&) \ &H100
byte2% = (dwtemp& And &HFF0000) \ &H10000
byte3% = (dwtemp& And &H7F000000) \ &H1000000
If (dwtemp& And &H80000000) <> 0 Then
' put sign bit back into byte4
byte3 = byte3 + &H80
End If
dwtemp& = byte0% * &H10000 + byte1% * &H100 + byte2%
dwtotal& = dwtotal& + dwtemp&
Next i
If MMCOntrol1.Tracks < 3 Then
dwtotal& = dwtotal& + msf2frames(MMCOntrol1.Length) + Compat
End If
GenCDSerial = dwtotal&

End Function
Function msf2frames(msf As Long) As Long
Rem From the KnowledgeBase
Rem byte1 = MMControl1.Position And &HFF&
Rem byte2 = (MMControl1.Position And &HFF00&) \ &H100
Rem byte3 = (MMControl1.Position And &HFF0000) \ &H10000
Rem byte4 = (MMControl1.Position And &H7F000000) \ &H1000000
Rem If (MMControl1.Position And &H80000000) <> 0 Then
Rem ' put sign bit back into byte4
Rem byte4 = byte4 + &H80
Rem End If
Dim byte0, byte1, byte2, byte3 As Integer
Dim Min, Sec, fra As Integer
byte0 = msf And &HFF&
byte1 = (msf And &HFF00&) \ &H100
byte2 = (msf And &HFF0000) \ &H10000
byte3 = (msf And &H7F000000) \ &H1000000
If (msf And &H80000000) <> 0 Then
' put sign bit back into byte4
byte3 = byte3 + &H80
End If
Min = byte0
Sec = byte1
fra = byte2
msf2frames = (Min * 60 + Sec) * 75 + fra
williamdsilva@aol.com.br 196

End Function

Function Z_Trim(String1 As String) As String


Dim A As Integer
For A = 1 To Len(String1)
If Mid$(String1, A, 1) = Chr$(0) Then Exit For
Next A
Z_Trim = RTrim$(Left$(String1, A - 1))

End Function

445 - Exibindo/Ocultando o ponteiro do mouse


Enviado por: Gilson Cezar Rodrigues Bernal
Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)

Private Sub Command1_Click()


ShowCursor (bShow = True)
End Sub

Private Sub Command2_Click()


ShowCursor (bShow = False)
End Sub

446 - Criando novos efeitos de bordas em controles


Enviado por: Gilson Cezar Rodrigues Bernal
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal CX As Long, ByVal CY As Long, ByVal wFlags As Long) As Long

Private Const GWL_EXSTYLE = (-20)


Private Const WS_EX_CLIENTEDGE = &H200
Private Const WS_EX_STATICEDGE = &H20000

Private Const SWP_FRAMECHANGED = &H20 ' Frame Changed


Private Const SWP_NOMOVE = &H2
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOZORDER = &H4
Public Function ThinBorder(ByVal lhWnd As Long, ByVal bState As Boolean)

Dim rtnVal As Long

' Get current border style


rtnVal = GetWindowLong(lhWnd, GWL_EXSTYLE)

' Set new border style according to bState


If Not (bState) Then
' Remove Office 2000 look
rtnVal = rtnVal Or WS_EX_CLIENTEDGE And Not WS_EX_STATICEDGE
Else
' Create Office 2000 like border on the control
rtnVal = rtnVal Or WS_EX_STATICEDGE And Not WS_EX_CLIENTEDGE
End If

' Apply the change


SetWindowLong lhWnd, GWL_EXSTYLE, rtnVal
SetWindowPos lhWnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or _
SWP_NOOWNERZORDER Or SWP_NOZORDER Or SWP_FRAMECHANGED

End Function

447 - Animação no titulo, demais !!!!


Enviado por: Danilo Faustinoni Cabello
Olá vi e revi muitos códigos para animação no titulo,
mas sem querer desprestigiar os que enviaram o código ele
era ruim ou chato de fazer como:
crie 5 timer cada um com intervela de ...
williamdsilva@aol.com.br 197

ou faça um comando if para cada letra que vc for...

eu estava "brincando" com o código MID e crie uma animação


com apenas um timer. Vamos fazer !?

'Crio as variaveis
Dim title, x

Private Sub Form_Load()


'mensagem do form
title = "digite aqui a mensagem"
Me.Caption = ""
x=1
End Sub

Private Sub Timer1_Timer()


'se o valor de x for igual ao numero de caracteres da
'mensagem mais 1
If x = Len(title) + 1 Then
x=1
Me.Caption = ""
Exit Sub
End If

'caption do form igual ao caption mais letras da mensagem


Me.Caption = Me.Caption + Mid(title, x, 1)
x=x+1
End Sub

só isso, escolha quanto de intervalo vc quer e nunca mais faça


milhões de ifs para fazer uma mensagenzinha

448 - Como Executar Um Som De Fundo No Código


Enviado por: mario gardenias neto
Basta Declarar a Função Playsound

Após Executar:

Call (Variavel) = playsounda("path + Som")

449 - Aspas (tratando aspas)


Enviado por: Flávio Luiz Teixeira Dominges
Function TrocaAspas(cValor As String) As String

Dim i As Integer, cValorAux As String

cValorAux = cValor

i = InStr(cValorAux, Chr(34))
Do Until i = 0

cValorAux = Left(cValorAux, i - 1) & Chr(96) & Mid(cValorAux, i + 1)

i = InStr(i, cValorAux, Chr(34))

Loop

i = InStr(cValorAux, Chr(39))
Do Until i = 0

cValorAux = Left(cValorAux, i - 1) & Chr(96) & Mid(cValorAux, i + 1)

i = InStr(i, cValorAux, Chr(39))

Loop

TrocaAspas = cValorAux

End Function

450 - TROCANDO PONTO POR VIRGULA(2)


Enviado por: Lucas Mesquita Vieira
Uma boa dica para fazer a troca:
williamdsilva@aol.com.br 198

Replace(Campo,".",",")
ou Virgula por Ponto
Replace(Campo,",",".")

452 - conectar Vb com MySql


Enviado por: georgenes s oliveira
Voce precisa fazer referencia do ADO 2.1 e depois fazer os seguinte comandos par aconectar

Dim Ssql As String


Dim cnn As ADODB.Connection
Dim Rs As Recordset

'**** crianto conexao


Set cnn = CreateObject("ADODB.Connection")
'**** abrindo conexao
cnn.Open "driver=MySQL};server=localhost;uid=usuario;pwd=senha;database=NomeDoDatabase"
'**** criando recordset
Set Rs = CreateObject("ADODB.RecordSet")
'**** efetuando conexao do recordset
Set Rs.ActiveConnection = cnn
Rs.Open "select * from clientes"

'*** efetuando isert na tabela clientes no NomeDoDatabase


Ssql = "insert into clientes (Nome,endereco) values ('Georgenes','Rua Do Endereco, 99')"
cnn.Execute Ssql

no CRYSTAL basta escolher opcao de criar com SQL/ODBC, Escolher o MySql e criar os RPT

453 - NumeroBox
Enviado por: Frank de Alcantara Nogueira Soares
Para fazer usar uma caixa de texto que só aceita valores
numéricos crie a seguinte função:

Em um módulo bas

Public Function NumeroBox(Numero As String, Campo As TextBox)


If Campo.Text = "" Then Exit Function
If Not IsNumeric(Numero) Then
MsgBox "Digite apenas Números"
Campo.Text = "" 'Limpa a caixa de Texto
End If
End Function

Para chamar a função coloque as seguintes linhas no evento change da Caixa de Texto

NumeroBox Text1, Text1

By Fox Sistemas

454 - Reiniciar seu computador com apenas uma linha


Enviado por: Bruno Sandivilli Antunes Portis
Coloque este comando em um botão

shell "rundll.dll",vbnormal

455 - TAB automático para o próximo campo(bem mais fácil)


Enviado por: Pablo Till
No evento Form_KeyDown, basta adicionar as linhas:
If KeyCode = vbKeyReturn Then SendKeys "{Tab}"

Ex:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then SendKeys "{Tab}"
End Sub

Falow Galera !!!!

Pablo

456 - Correção do item " Reiniciar seu computador com apenas uma linha "
Enviado por: Bruno Sandivilli Antunes Portis
williamdsilva@aol.com.br 199

Coloque este comando em um botão desejado ( Neste exemplo o botão escolhido foi o command1 )

Private Sub Command1_Click()


Shell "c:\windows\rundll.exe user.exe,exitwindows", vbNormalFocus
End Sub