Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
br 1
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
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).
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)
MMCase = Trim(resultado)
End Function
executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)
executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)
#Else
#End If
williamdsilva@aol.com.br 5
iret = ShellExecute(Me.hwnd, _
vbNullString, _
"http://www.vbbrasil.com", _
vbNullString, _
"c:\", _
SW_SHOWNORMAL)
End Sub
End Sub
Pronto, agora sempre que for pressionado um enter no formulário sera disparado um tab.
Para Minúsculas:
KeyAscII= Asc(Lcase(Chr(KeyAscII)))
No General do Form:
williamdsilva@aol.com.br 6
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
É 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
Basta colocar no evento GOTFOCUS da caixa de texto, por exemplo, TEXT1, a seguinte rotina:
text1.selstart = 0
text1.sellenght = len(text1.text)
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
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.
Modificando a dica existente, assim não se precisa declarar mais uma variável:
If MsgBox("Tem certeza que deseja sair do programa?", _
End
Else
Cancel = True
End If
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
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
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
20 - Aplicação já iniciada
Enviado por: Hantan
End Function
williamdsilva@aol.com.br 9
Text1.Text = Resultado
22 - Formulário OnTop
Enviado por: Hantan
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
Abraços.
24 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horários.
Enviado por: Márcio Britto®
Agora = Time$
BomDia = "00:00:00"
BoaTarde = "12:00:00"
BoaNoite = "19:00:00"
williamdsilva@aol.com.br 10
Pic_Noite.Visible = True
Pic_Tarde.Visible = False
Pic_Dia.Visible = False
Pic_Noite.Visible = False
Pic_Tarde.Visible = True
Pic_Dia.Visible = False
Pic_Noite.Visible = False
Pic_Tarde.Visible = False
Pic_Dia.Visible = True
End If
Nao citarei como se deve declarar variaveis visto que ja fiz isso em uma dica
anterior...
Explicando a sintaxe:
("select * from (1)agenda where (2)sexo = ' " & (3)TXTprocurasexo & " ' and (4)bairro = ' " &
(5)TXTprocuraBairro & " ' ")
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
------- No form.Load
-------
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...
27 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horários. 2
Enviado por: Rodrigo Meirelles de Mello - DJOP
Pic_Noite.Visible = True
Pic_Tarde.Visible = False
Pic_Dia.Visible = False
Pic_Noite.Visible = False
Pic_Tarde.Visible = True
Pic_Dia.Visible = False
Pic_Noite.Visible = False
Pic_Tarde.Visible = False
Pic_Dia.Visible = True
End If
williamdsilva@aol.com.br 12
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).
[]'s,
Uriel
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).
vbCharacters = 4: 'Caractere (horizontal = 120 twips por unidade; vertical = 240 twips por unidade).
VbInches = 5: 'Polegada.
VbMillimeters = 6: 'Milímetro.
VbCentimeters = 7: 'Centímetro.
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.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.
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 & "*'"
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
mciMedia.Command = "Open"
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).
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
e substitua em MB_OKCANCEL..
Para fazer um message box que não seja modal faça o seguinte:
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
Print "A Resolução é : " & Str$(xPixels) & " por " & Str$(YPixels) & " pixels"
dado = text1.text
text1.text = format(dado,"CURRENCY")
37 - Fundo degradê
Enviado por: Hantan
FillLeft = 0
FillRight = Frm.Width
For Reps = 1 To 63
Vermval = Vermval - 4
Verdval = Verdval - 4
Azulval = Azulval - 4
Next
End Sub
A variável chamada TopToBottom é se vai do preto para a cor escolhida ou da cor escolhida para o preto.
As String) As Long
Declare Function GetProfileString Lib "Kernel32" Alias _
Val = String$(255, 0)
If worked = 0 Then
GetIni = ""
Else
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)
Val = String$(255, 0)
End Sub
Dim X
DoEvents
End Sub
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")
NomedoControleData.Recordset.Delete
NomedoControleData.Recordset.MoveNext
End If
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)
If Dir$(sDrive & Sbuild, 16) = "" Then MkDir sDrive & sBuild
Wend
End Sub
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
Else
End If
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"
End If
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:
VA_Resultado = ""
VA_Posicao = 1
If IsNumeric(VA_Caracter) Then
End If
VA_Posicao = VA_Posicao + 1
Loop
LimpaNumero = VA_Resultado
End Function
VA_Resultado = ""
VA_Posicao = 1
campo = UCase(campo)
End If
VA_Posicao = VA_Posicao + 1
Loop
LimpaAlfa = VA_Resultado
End Function
SemLetra = LimpaAlfa("0H1A2N3T4A5N6")
Dim f As Integer
f = Forms.Count
Do While f > 0
Unload Forms(f-1)
f=f-1
Loop
End Function
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.
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
Dim X$
X = GetWindowsDirectory(Space$(255), 255)
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.
Abraços, Hantan
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
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.
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.
TDBGrid1.OddRowStyle.BackColor = QBColor(14)
TDBGrid1.AlternatingRowStyle = True
Settext adiciona um novo texto p/ a área de transferência, no entanto p/ funcionar á necessário limpá-la
primeiro usando o clear.
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
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.
Selecionando registros:
Set DyRec = DBanco.Createdynaset("select * from func")
Inserindo registros:
Banco.Execute "insert into func values ('Nome_func',Identidade,'Endereco')
'veja que Nome_func e Endereco estão entre aspas simples pois têm atributos do tipo Text
Excluindo registros:
Banco.Execute "delete from func where Nome_func like 'G*')
Atualizando registros:
Banco.Execute "update func set
Nome_func = 'Guilherme',
Declarar as variáveis:
Global Banco As Object
Criar o objeto:
Set Secao = CreateObject("OracleInProcServer.XOraSession")
-Oraclb4d.dll
-Oraclbj.dll
-Oraclbjd.dll
-Oraclm.dll
-Oraclmd.dll
Declare Function GetUserNameA Lib "advapi32.dll" (ByVal lpBuffer As String, nSize As Long) As Long
m$ = Space$(255)
i% = GetUserNameA(m$, Len(m$))
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.
Exit Sub
End If
If Picture1.Picture = ImageList1.ListImages(2).Picture Then
Exit Sub
End If
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.
Exit Sub
End If
If Form1.MouseIcon = ImageList1.ListImages(2).Picture Then
Exit Sub
End If
Ex:
Dim MeuDiretorio
IF Len(App.Path)>3 THEN
ELSE
END IF
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
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) _
from tabela1 _
where campo1>valor1 _
union _
from tabela2 _
where campoS1>valor2
E assim sucessivamente.
Caso você não queira armazenar o valor comece no primeiro SELECT (descartando o INSERT)
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()
WorkSpaces(0).BeginTrans
WorkSpaces(0).CommitTrans
Exit_CmdInserir_Click:
Exit Sub
Err_CmdInserir_Click:
MsgBox Error%
WorkSpaces(0).Rollback
Resume Exit_CmdInserir_Click
End Sub
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()
MySQL$ = "Select Nome from Clientes Where Nome like " Chr(39) & CmbNome.Text & Chr(42) & Chr(39)
'seleciona os nomes
MyNome.MoveLast
MyNome.First
CmbNome.AddItem(MyNome("Nome"))
CmbNome.MoveNext
End If
Next i&
End if
End sub
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"
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
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.
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
SSPanel.BevelWidth=1
End Sub
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.
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.
MMControl1.DeviceType = "avivideo"
MMControl1.hWndDisplay = Picture1.hWnd
MMControl1.filename = "File.avi"
MMControl1.Command = "open"
MMControl1.Command = "prev"
MMControl1.Command = "play"
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"
Ex:
MMControl1.Command = "close"
MMControl1.DeviceType = "Sequencer"
MMControl1.filename = "File.wav"
MMControl1.Command = "open"
MMControl1.Command = "prev"
MMControl1.Command = "play
Function trocavírgulaporponto(NúmeroTexto)
Tamanho = Len(Trim(NúmeroTexto))
Posição1 = Posição1 - 1
Else
trocavírgulaporponto = NúmeroTexto
End If
End Function
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.
If App.PrevInstance Then
williamdsilva@aol.com.br 31
SaveTitle = App.Title
'a primeira
AppActivate SaveTitle
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.
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 _
End Sub
74 - Conexão Dial-Up
Enviado por: Felipe Maion Garcia
Dim X
AppActivate X
SendKeys "{enter}"
DoEvents
End Sub
Ex.:
call AbrirDialUp ("Infolink") 'onde no lugar de Infolink _
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.
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 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
dim i as integer
i = waveOutGetNumDevs()
if i > 0 then
else
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
arquiv$ = nome_do_arquivo.ini
williamdsilva@aol.com.br 34
Returns$ = Space$(128)
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
arquiv$ = nome_de_arquivo.ini
End Function
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
retn% = GetAsyncKeyState(KEY_TAB)
' o último bit menos significativo será 1 quando a tecla TAB for 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.
End Select
End Function
Sub Form_Click () ' Para testar a função MyMacroOperator
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$, _
Dim ret%
, 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
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
4. Atualizar tabela
set db=workspaces(0).Opendatabase("c:\base.mdb")
set tabela=db.Openrecordset("tabela")
Tabela.edit
Tabela.valor=tabela.valor*1.10
Tabela.update
williamdsilva@aol.com.br 37
Tabela.movenext
Wend
Tabela.close
Set db=Workspaces(0).Opendatabase("c:\base.mdb")
Db.close
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.
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*'
Exemplo:
Public Function MoveArquivo(Origem As String, Destino As String) As Boolean
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
x=0
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
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:
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)
CHDIR App.Path
dim db as database
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
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 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.update
next a
tb.close
db.close
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.
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.
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.
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.
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)
End Sub
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
Form1.TxtCampo1.Text=MySet("Campo1")
Form1.TxtCampo2.Text=MySet("Campo2")
Form1.TxtCampo3.Text=MySet("Campo3")
Form1.TxtCampo4.Text=MySet("Campo4")
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)).
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.
Vamos retirar os zeros inúteis da variável mystring (que contém "00030"). Abaixo, um interessante
williamdsilva@aol.com.br 44
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
Para destacar uma linha no controle DBGrid, adicione o registro corrente à SellBookmarks Collection:
Private Sub DBGrid_RowColChange _
If Data1.RecordSet.RecordCount Then
DBGrid.SelBookmarks.Add _
Data1.RecordSet.Bookmark
End If
End Sub
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.
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
End Function
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.
X as Long, Y as Long)
End Sub
Para, através do mouse, mover a localização de um item numa list box, use o código abaixo.
'declarations:
'mouse events:
Old_index = List1.ListIndex
Tmp_text = List1.text
williamdsilva@aol.com.br 46
End Sub
Sub List1_MouseUp (Button As Integer, _
New_index = List1.ListIndex
List1.RemoveItem Old_Index
End If
End Sub
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)
SendKeys KeyValue
End Sub
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)
End Sub
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.
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)
End Sub
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!
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%
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).
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
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:
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:
Picture1.Top = Picture1.Top + 50
Exit Sub
End If
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.
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
Direita = True
End If
Cima = True
End If
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
Direita = False
End If
Cima = False
End If
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
Shape1.Left = Shape1.Left + 30
End If
7Shape1.Top = Shape1.Top - 30
End If
williamdsilva@aol.com.br 50
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.
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:
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".
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:
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:
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".
Para conseguir múltipla seleção numa list box basta mudar uma propriedade MultiSelect para
Ex:
For n=0 to (List.ListCount-1)
end if
Next n
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.
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
With ObjectAccess
.OpenCurrentDatabase filepath:="File.mdb"
.Visible = True
'E
With ObjectAccess
.OpenCurrentDatabase filepath:="File.mdb"
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.
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
Para alterar em tempo de execução a impressora é preciso inserir o Controle Common Dialog.
Em seguida insira o seguinte código:
CommonDialog1.ShowPrinter
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
Form1.Controls(i).Text=""
end if
Next i
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()
Grid1.ColWidth(1) = 3000
...
Grid1.Row=0
Grid1.Text = "Campo1"
Grid1.Text = "Campo2"
...
Grid1.Text = "CampoN"
Grid1.Text=MyTable("Campo1")
Else
Grid1.Text=""
End if
Grid1.Text=MyTable("Campo2")
Else
Grid1.Text=""
End if
Grid1.Text=MyTable("CampoN")
Else
Grid1.Text=""
End if
Linhas=Linhas+1
Loop
williamdsilva@aol.com.br 55
End Sub
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.
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)
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.
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:
MsgBox "O Banco de Dados está corrompido ! Pressione Ok para Reparar", 16, "Opção"
End if
É importante compactar o banco de dados após repará-lo devido ao aumento de tamanho do mdb.
'declare em general:
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
ShowCursor False
End Sub
Wend
End Sub
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).
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:
Const SQLPASSTRHOUGH = 64
'...
VA_Cmd = "Select Cidade, Nome from CIDADE where Cidade = " & VA_Cod
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.
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 ( )
For ij = 0 to Option1.Count - 1
If Option(ij).Value Then
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.
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.
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
Lib "Kernel32" _
Alias "GetVolumeInformationA" _
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)
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
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
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 _
Whith ListView1
Else
.Sorted = False
.SortOrder = 0
.SortKey = ColumnHeader - 1
.Sorted = True
End IF
End With
End Sub
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
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
'chr 92 = "\"
End If
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).
Dim VA_SevErro
'query
VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' "
VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' "
End If
'query do contador
VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' "
VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' "
End If
VA_Cont = dynacont(0)
williamdsilva@aol.com.br 61
Else
VA_Cont = 0
End If
If VA_Cont = 0 Then
Gr_Grid.Row = 1
Exit Sub
End If
'carga do grid
Gr_Grid.Rows = VA_Cont + 1
VA_Curr = 1
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
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.
____________
1) Insira um 3D Panel, com nome PA_Status, no MDIForm (aqui chamado de F00). Atribua Align = Alig
williamdsilva@aol.com.br 62
Botton.
Static VA_Vez
If Acum Then
End If
em SU_BarraPerc"
Exit Sub
End If
F00.PA_Status.Caption = ""
F00.PA_Status.FloodShowPct = True
VA_SaveCor = F00.PA_Status.ForeColor
F00.PA_Status.BevelOuter = 2 'raised
F00.PA_Status.BevelWidth = 3
F00.PA_Status.BorderWidth = 1
F00.PA_Status.FontSize = 9.75
End If
End If
'mostra perc
F00.PA_Status.FloodPercent = Perc
Else
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
Next i
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).
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)
While True
williamdsilva@aol.com.br 64
DoEvents
AppActivate TaskID
Wend
Finished:
On Error GoTo 0
End Type
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) 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
GetKeyboardState kbArray
kbArray.kbByte(VK_NUMLOCK) = 1
SetKeyboardState kbArray
End Sub
GetKeyboardState kbArray
kbArray.kbByte(VK_NUMLOCK) = 0
SetKeyboardState kbArray
End Sub
End Type
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) 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
End Function
End Sub
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
SetKeyboardState kbArray
End Sub
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 1
SetKeyboardState kbArray
End Sub
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 0
SetKeyboardState kbArray
End Sub
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.
If App.PrevInstance Then
SaveTitle = App.Title
'a primeira
AppActivate SaveTitle
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.
Se você usa alguns controles, como o QuickPack Pro (da Crescent), é impossível atribuir CTRL+V para
Editar-Colar.
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
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.
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
currentX = 0
currentY = currentY +1
currentX = 0
currentY = currentY +1
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).
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.
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."
'...
oque = Trim(oque)
End If
Else
oque = UCase(oque)
williamdsilva@aol.com.br 71
End If
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.
Y As Single)
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
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
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 Sub
...
williamdsilva@aol.com.br 72
SU_GravaConfiguracoes
SU_AbortaSis
End Sub
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"
Case "/M"
Case Else
End Select
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
form1.show
End Sub
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.
TB.Index = "PrimaryKey"
DB.Engine.Idle (dbFreeLocks)
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:
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
J=1
End If
Case 91
IsSomethig = false
Case 0
IsSomething = true
Case Else
End Select
On Error GoTo 0
End Function
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.
Form2.show
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)
If Form Is Me Then
Exit For
End If
Next Form
End Sub
1) Use o Access Workgroup Administrator para criar um novo grupo de trabalho, com uma não nula
Workgroup ID.
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 _
condição = (age > 25 and Category = "M1") or (age > 35 and Category = "C1")_ or (Age > 45 and Category
= "P1")
ProcesseEmpregado
End If
Poderia simplificar para:
Dim ValidValues as string
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)
'...
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:
ProcesseEmpregado
End Select
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)
Sendkeys "{TAB}"
End If
williamdsilva@aol.com.br 77
End If
End Sub
KeyAscii = 0
End If
End Sub
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.
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.
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
'...
'...
'...
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)
sClassType = TypeName(ctl)
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).
End If
'...
End Sub
williamdsilva@aol.com.br 79
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 = ""
End If
Uma forma mais simples é-
Ou
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
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( )
a = "João"
b = "Francisco"
c=a
a=b
b=c
End Sub
williamdsilva@aol.com.br 80
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.
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 db As Database
Set db = wrk.OpenDatabase("MYDB.MDB",true)
db.NewPassword "","NewPass
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 _
'...
Dim VA_LastUser
VL_Sec = "options"
VL_Key = "lastuser"
VL_Size = 30
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
...
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.
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
longValue& = HO * 65536 + VE
...
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
1. Selecione-o
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
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.
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
End If
Para destacar uma linha no controle DBGrid, adicione o registro corrente à SellBookmarks Collection:
Private Sub DBGrid_RowColChange _
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
gsUserId = ClipNull(GetUser())
lpUserID = String(25, 0)
williamdsilva@aol.com.br 84
nBuffer = 25
If Ret Then
GetUser$ = lpUserID$
End If
End Function
If Len(InString) Then
Else
ClipNull = InString
End If
End If
End Function
Enabled = False
No Form_Load()
timer1.enabled = true
No Timer1_Timer()
Label1.left = label1.left + 2
wend
Next Controle
williamdsilva@aol.com.br 85
End Sub
Sub CloseChild()
Dim i As Integer
i = Forms.Count - 1
Wend
End Sub
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
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
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
sInfo.cb = Len(sInfo)
ret& = CloseHandle(pInfo.hThread)
ret& = CloseHandle(pInfo.hProcess)
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.
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
Se quiser excluir:
DeleteSetting "MyApp", "User"
- 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.
É 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:
Err.Number & Chr(10) & Err.Description & Chr(10) & Err.Source & _
191 - Como saber se o programa está rodando no Windows95 (ou em suas futuras versões)?
Enviado por: Gerson Keiti Motoyama
IsWindows95 = True
Else
IsWindows95 = False
End If
End Function
williamdsilva@aol.com.br 88
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:
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)]"
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" & ")]"
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:
Type record
dbLocalFile As String * 200 'Variavel onde será guardada o local do Banco de Dados
vRegistroDoUsuario As String * 40
vCorDeFundo As String * 10
End Type
williamdsilva@aol.com.br 89
vPreferencias.dbLocalFile = RTrim(txtLocalDoBanco.Text)
vPreferencias.vRegistroDoUsuario = RTrim(txtNome.Text)
vPrefetencias.vCorDeFundo = RTrim(txtCorDeFundo.Text)
vPrefetencias.vImagemDeFundo = RTrim(txtImagemDeFundo.Text)
Close #A
txtLocalDoBanco.Text = RTrim(vPreferencias.dbLocalFile)
txtNome.Text = RTrim(vPreferencias.vRegistroDoUsuario)
txtCorDeFundo.Text = RTrim(vPrefetencias.vCorDeFundo)
txtImagemDeFundo.Text = RTrim(vPrefetencias.vImagemDeFundo)
Close #A
É 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( )
xResolucao = GetSystemMetrics(0)
yResolucao = GetSystemMetrics(1)
'Rotina que será ativada ao verificar que a resolução do monitor é menor que
1024x768
End If
End Sub
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 :
Declare Function mciSendString lib "MMSystem" (byval lpstrCommand$, byval lpstrReturnStr as Any, Byval
wReturnLen%, byval hCallBack%) as Long
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.
Esta API é muito interessante: ShellAbout. Com ela vc pode abrir a janela padrao de 'sobres' do Windows.
1) Handle da janela
2) Nome do aplicativo
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.
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).
1) Nome do servidor
2) Handle da janela
3) Nome da porta
Ex.:
ConfigurePort "", Form1.hWnd, "COM1"
Para certificar se a funcao funcionou, verifique se ela retornou uma valor igual a 1 ou True.
End Function
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
If KeyNum = 8 Then
Testa_NumAbs = (KeyNum)
Exit Function
End If
End Function
End Function
' Uma função que limpa campos formatados com CIC, CEP e outros
Public Function LimpaCampo(Q_Campo) As String
For X = 1 To Len(Q_Campo)
Next X
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)
Mid(QTexto, y, 1) = "A"
Mid(QTexto, y, 1) = "C"
Mid(QTexto, y, 1) = "E"
Mid(QTexto, y, 1) = "I"
Mid(QTexto, y, 1) = "O"
Mid(QTexto, y, 1) = "U"
End Select
Next
Texto_MainFrame = UCase(QTexto)
End Function
' Os títulos das colunas assim bem como o seu tamanho serão obtidos
'
Q_Grade.Cols = Rs_X.Fields.Count
Q_Grade.Rows = 1
Q_Grade.Row = 0
Q_Grade.Col = Coluna
Q_Grade.Text = DaoRs.Value
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
.Col = Coluna
Next
End With
Rs_X.MoveNext
Loop
End Sub
' O nome da tabela deve ser passado como parâmetro e dever ser uma string
Public Function ContaRegistros(QTab As String)
ContaRegistros = RsQ!QuantReg
RsQ.Close
End Function
'
williamdsilva@aol.com.br 94
'
'
Q_Cic = LimpaCampo(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
ValidaCPF = False
Exit Function
End If
For X = 1 To 9
Next X
Soma = 0
Resto = 0
For X = 0 To 9
Next X
End Function
End Function
' 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
End If
End Function
DadoCalc = LimpaCampo(Q_Dado)
Peso = 2
Peso = IIf(Peso = 1, 2, 1)
Next X
X=1
For X = 1 To Len(Regua)
Next X
End Function
Numero = Trim(QNumero)
Multiplicador = 2
Next
' Exceção
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.
Crie um novo projeto, coloque no Form uma ImageList, coloque os ícones da animação nesta mesma
Imagelist.
Coloque um Timer.
Exit Sub
End If
Exit Sub
End If
No Form_Load coloque:
Form1.caption = "T"
No Timer1_Timer() coloque:
If Form1.caption = "T"
form1.caption = "T"
endif
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
sParametro = Command
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)
Obs: Se você informar apenas o Nome da aplicacão com a Secão todas as Chaves serão excluídas
As String) As Long
As Long) As Long
Caminho = "\\Computador\Caminho"
Unidade = "I:"
'Realiza conexão
'Desconecta
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
Usuario = Space(256)
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String,
nSize As Long) As Long
maquina = Space(30)
GetComputerName maquina, 30
lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, _
'Para abilitar:
Vimos uma função de calculo digito para controle de CPF e CGC muito extensa;
Temos a mesma função mais simples para ler.
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"
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
'****
Text3.SelStart = 0
Text3.SelLength = Len(Text3)
End Sub
'****
If Tecla = 0 Then
Text3 = Val(Text3)
End If
Tecla = 0
Text3.SelStart = Len(Text3)
End If
End Sub
'****
Tecla = 1
End If
End Sub
Ele só é fechado se o micro é renicializado, isso fui eu que descobri, e é bem simples:
End Sub
OBS: Atenção para que de certo, você precisa transformar o Form em exe, e coloca-lo no comando shell
explicado anteriormente.
Unload Me
End If
Else
StripTerminator = strString
End If
End Function
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)
'****
Senha = ""
Dim I As Integer
williamdsilva@aol.com.br 105
Dim P As Integer
I=0
I=I+1
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%@#
'****
Senha = ""
Dim I As Integer
Dim P As Integer
I=0
I=I+1
Loop
End Function
'****
'ex :
Descriptografar {|lq%@#
senha = klayton
'****
Set Banco = CurrentDB 'Carrega a variável Banco com o Banco de Dados Ativo
Inicialmente adicione um timer e um imagelist ao seu form logo apos é só seguir os passos.
Segundo: Você declara no general uma variável denominada "icone", tipo integer.
MousePointer = 99
MouseIcon = ImageList1.ListImages(icone).Picture
'Declaração no form_load
icone = 0
End Sub
'Declaração no timer1_timer
MousePointer = 99
MouseIcon = ImageList1.ListImages(icone).Picture
End Sub
Cancel = 1
End Sub
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
Dado(Index).SelStart = 0
Dado(Index).SelLength = Len(Dado(Index))
End Sub
Case vbKeyDown, 13
Dado(Index).SetFocus
Case vbKeyUp
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
MeuDataLink.rsMeuComando.Close
MeuDataLink.rsMeuComando.Source = sql
MeuDataLink.rsMeuComando.Open
MeuDataLink.rsMeuComando.Properties.Refresh
rsMeuComando é um command(recorset)
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)
'---Declaro as Variáveis---
'--------------------------
Search = UCase(TxtProcura.Text)
Searchlen = Len(Search)
If Searchlen Then
Lista.ListIndex = Contador
Exit For
End If
Next Contador
End If
Rotina para posicionar o texto e o item data de um combo de acordo com que for digitado.
Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As
Long, ByVal wParam As Long, lParam As Any) As Long
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 pronto...
Menu.Caption = "M"
Timer1.Enabled = True
End Sub
Timer1.Enabled = False
Timer2.Enabled = True
End Sub
Timer2.Enabled = False
Timer3.Enabled = True
End Sub
Timer3.Enabled = False
Timer4.Enabled = True
End Sub
Menu.Caption = "Menu"
Timer4.Enabled = False
End Sub
pat="Silva"
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
keybd_event vk_lwin,0,keyeventf_keyup,0
Boa Sorte
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:
Por exemplo:
winsock1.connect 127.0.0.1, 5555
'converte as primeiras letra dos nomes em maiúsculas(menos: de, da, do, das,
'dos, a, e e)
<> "do" And Trim(Parte) <> "dos" And Trim(Parte) <> "da" _
End If
Maiusc = Trim(Maiusc)
End Function
text1.text = ""
text1.setfocus
Exit sub
End If
'ByRef:
'ByVal:
'Obs: Este sub gerará um erro se em alguma entrada houver caracteres não-numéricos, por isso,
Const COMBOSORTASCENDING% = 0
Const COMBOSORTDESCENDING% = 1
williamdsilva@aol.com.br 113
Const ASCEND% = 1
Const DESCEND% = -1
'Variáveis de organização
Dim I As Long
Dim I2 As Long
Itens(I) = Combo.List(I)
Next I
Combo.Clear
End If
Next I2
Combo.AddItem Itens(I)
Next I
End Sub
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 Z As Integer
For Z = 0 To TAMANHO
Next
X=X+1
End If
Y=Y+1
If Y = Len(MENSAGEM) Then
Y=0
X=0
End If
End If
End Function
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 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
End Sub
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).
'Abre o MDB
wherecondition:=Condicoes
objAccess.Visible = True
objAccess.Docmd.Maximize
objAccess.DoCmd.RunMacro ("NomedaMacro")
'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)
y=y+2
Next i
Alias "FindWindowA" _
Sub()
'esta Ativa
Else
'esta Inativa
End If
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
Command1.visible = true
With Campo
.SelStart = 0
.SelLenght = Len(.Text)
End With
End Function
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
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
texto = RS("Campo")
RS.MoveNext
Wend
Obs: O textbox (no caso TXT), deve ter a propriedade Multiline = True e ScroolsBar = 2 (vertical).
Com o comando printer podemos imprimir várias coisas rapidamente, por exemplo:
Printer.Print "String a ser Impressa"
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
'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:
'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
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
Obs.: A propriedade Rows do controle MsFlexGrid deve ser definida com o Mínimo 13.
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
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
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
No timer:
on error resume next
data1.recordset.delete
data1.recordset.movenext
'Maxlenght no Combo-box
'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
265 - Como saber se o seu Computador está preparado para o ano 2000.
Enviado por: MPS Informática Ltda.
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...
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
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.
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
If Primeiro_Numero_Ano = 0 Then
Verifica_Data = False
Exit Function
End If
End If
Verifica_Data = True
Else
Verifica_Data = False
End If
Tratamento_Data:
If Err.Number = 13 Then
End If
End Function
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
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)
Assim também o combo somente leitura vai ficar em branco, ficando também seu conteúdo inalterado.
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
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
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
Wend
End Sub
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.
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
Os métodos:
williamdsilva@aol.com.br 134
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.
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")
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
* 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
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
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
É isto!!!
Abraços
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.
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
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
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
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
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 !!!
Option Explicit
Private Sub Form_Load()
Call AchePastas
End Sub
Private Sub AchePastas()
MsgBox " 0- " & ListaPastas(0) & vbCrLf & _
williamdsilva@aol.com.br 141
'------------------------
'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
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
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.
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
Á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.
Ou usar o CommonDialog:
É 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
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
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..
Credits Scroll
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.
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
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
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
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
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
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
Pronto!!!
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
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
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
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.
Variavel = IsDate(minha_data)
Devolve True se é uma data possivel.
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
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
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.
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.
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í !!!!!
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 !!!!
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
Combo1.AddItem "666666"
End Sub
'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
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
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
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!!
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
Para converter um nº inteiro para Binário coloque o seguinte código em um command Button:
williamdsilva@aol.com.br 163
RS AS NEW ADODB.RECONDSET
DB.ConnectionTimeout = 10
DB.Open
ABRE O BANCO
361 - Senha
Enviado por: Thiago MuNhÓz
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
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
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.
'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
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
End Function
CheckCPF = True
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
If MesCorrente = 12 Then
UltimoDia = Day(DateValue("31/" & "12/" & Str(AnoCorrente)))
End If
End Function
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
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
End Function
ValidaData = False
ValidaData = True
End Function
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()
stringsql = Mid(stringsql, 5)
ErrorFileExist:
FileExist = False
Resume ExitFileExist
ExitFileExist:
On Error GoTo 0
End Function
iARQ = FreeFile
Open sArquivo For Input As iARQ
Do While Not EOF(iARQ)
*Pega o conteúdo da linha
Line Input #iARQ, sLinha
AbreArquivo = sResult
Fecha o arquivo
Close iARQ
williamdsilva@aol.com.br 171
End Function
Para usar:
Text1.Text = AbreArquivo("C:\Texto.TXT")
dtInicio = DateValue(dtInicio)
dtFinal = DateValue(dtFinal)
intSemanas = DateDiff("w",dtInicio,dtFinal)
varDataCont = DateAdd("ww",intSemanas,dtInicio)
intFimDias = 0
End Function
PARA ABRIR
Call mciSendString("Set CDAudio Door Open Wait", 0&, 0&, 0&)
PARA FECHAR
Call mciSendString("Set CDAudio Door Closed Wait", 0&, 0&, 0&)
Sub MDIForm_Load()
Dim lWnd as Long
lWnd = GetWindowLong(Me.hWnd, GWL_STYLE)
Abre o documento
Word.Documents.Open "C:\Meus Documentos\" & "NomeDoDocumento.DOC"
Pesquise o VBA, pois utilizando-o é possível selecionar palavras, parágrafos, tabelas, etc. Ou seja, qualquer
parte do documento.
2 - Em um módulo declare:
williamdsilva@aol.com.br 173
3 - No Form_Load adicione:
392 - Impedir que o programa seja encerrado com Ctrl Alt Del
Enviado por: Adriano Faria Alves
Declara o seguinte em um Módulo:
Private Form_Load()
MakeMeService
End Sub
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
End Function
ShowMessage
End Sub
williamdsilva@aol.com.br 174
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)
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"
...
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
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
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
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
Ex:Toda vez que o botão salvar for acionado setar a variavel changed = true.
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"
Modo de usar
Screen.MousePointer = vbHourglass
Dim A As Integer
For A = 1 To oForm.Controls.Count - 1
Next A
Screen.MousePointer = vbArrow
End Sub
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:
Screen.MousePointer = vbHourglass
Dim SN As Recordset
SN.MoveFirst
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
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 :
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.
If Dias = 30 Then
Dias = 0
Meses = Meses + 1
End If
If Meses = 12 Then
Meses = 0
Anos = Anos + 1
End If
End Function
Function Cria_Parametro_Multiplo(cParam)
Screen.MousePointer = vbHourglass
Cria_Parametro_Multiplo = cNew
Screen.MousePointer = vbDefault
End Function
Um abraço
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
Cancel = 1
End Sub
Um abraço
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.
415 - Correção mais descritiva de "Abrir URL padrão com código de 1 linha"
Enviado por: Danilo Faustinoni Cabello
Coloque num commandbutton:
VolName = Space(127)
FSys = Space(127)
DriveType& = GetDriveType(Drive$)
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
oldscalemode = oComboBox.Parent.ScaleMode
oComboBox.Parent.ScaleMode = vbPixels
oComboBox.Parent.ScaleMode = oldscalemode
End Sub
*** Form_Load ()
Dim i As Integer
For i = 1 To 15
Combo1.AddItem "Item " & i
Next
*** Onde 400 é o número que você aumenta ou diminui conforme o tanto de registro que quer mostrar
quando abrir a combo.
?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)
*Módulo BAS
Option Compare Binary
Option Explicit
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
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):
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
;[CRPE32.DLL]
;Dest=$(WinSysPath)
;Uses1=CRPE32.DLL
;Uses2=
'Personaliza a procura
szTitle = "Titulo da procura"
With tBrowseInfo
.hWndOwner = Me.hWnd
.lpszTitle = lstrcat(szTitle, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_EDITBOX
End With
End Sub
SERVIDOR
No aplicativo de servidor cria a seguinte rotina:
...
WskSvr(0).LocalPort = 1050 - > Utilize a porta que desejar.
WskSvr(0).Listen
...
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.
Exemplo:
text1.text = ExtensoSemana("16/03/2001")
ou
text1.text = ExtensoSemana(Date)
mais dicas:
www.fasinfo.cjb.net
Mais dicas:
www.fainfo.cjb.net
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
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
Public Declare Function SHAutoComplete Lib "Shlwapi.dll" (ByVal hwndEdit As Long, ByVal dwFlags As
Long) As Long
Public Const SHACF_DEFAULT As Long = &H0
.Top = 0
.Left = 0
Me.Height = .Height
Me.Width = .Width
End With
frmBackground.Show
End Sub
End Sub
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
x% = WNetConnectionDialog(Me.hwnd, 1)
Sub CDAudioProperties()
Dim T As Double
On Error Resume Next
T = Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3", 5)
End Sub
Z = GetRunningTime(MMCOntrol1)
Z = GetTrackTime(MMCOntrol1)
RMin = Val(Min)
RSec = Val(Sec)
Z = GetRunningTime(MMCOntrol1)
Z = GetTrackTime(MMCOntrol1)
RMin = Val(Min)
RSec = Val(Sec)
End Sub
End Function
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
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
End Function
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
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
End Function
End Function
'Crio as variaveis
Dim title, x
Após Executar:
cValorAux = cValor
i = InStr(cValorAux, Chr(34))
Do Until i = 0
Loop
i = InStr(cValorAux, Chr(39))
Do Until i = 0
Loop
TrocaAspas = cValorAux
End Function
Replace(Campo,".",",")
ou Virgula por Ponto
Replace(Campo,",",".")
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
Para chamar a função coloque as seguintes linhas no evento change da Caixa de Texto
By Fox Sistemas
shell "rundll.dll",vbnormal
Ex:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then SendKeys "{Tab}"
End Sub
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 )