Escolar Documentos
Profissional Documentos
Cultura Documentos
br 1
VISUAL
BA S I C
Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de
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).
O Visual Basic sempre carrega os mesmos arquivos e custom controls automaticamente quando você inicia um novo
projeto. Na verdade, ele carrega um projeto já existente no seu diretório. Mas você pode criar seu projeto para ser
carrejado quando iniciar um novo. Basta salvar o projeto como auto32ld.vbp para o VB 32 bits, auto16ld.vbp
para o VB 4.0 16 Bits ou autoload.mak para o VB 3.0. Estes arquivos estão no diretório principal (raiz) do VB. É sempre
bom que você faça
uma cópia de segurança desses arquivos antes, para qualquer eventualidade...
Para centralizar um formulário MDI Child ou colocá-lo em qualquer lugar da tela utiliza-se o seguinte comando no
evento Load do MDI child:
rem Centralizar
me.left = (form1.left - me.left) /2
me.top = (form1.width - me.width) /2
me.left = (valor)
me.top = (valor)
MMCase = Trim(resultado)
End Function
williamdsilva@aol.com.br 4
executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)
executa = Space(256)
executa = "Shell_TrayWnd"
janela = FindWindow(executa, vbNullString)
Para abrir um link através do VB, no navegador padrão, coloque o seguinte código na seçao de declarações:
#If Win32 Then
#Else
#End If
iret = ShellExecute(Me.hwnd, _
vbNullString, _
"http://www.vbbrasil.com", _
vbNullString, _
"c:\", _
SW_SHOWNORMAL)
End Sub
End Sub
Esta Dica é para quem quer que a tecla enter funcione como um tab para mudar de campo.
1º - Mude a propriedade KeyPreview do formulário para true.
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:
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.
É 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.
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?", _
williamdsilva@aol.com.br 8
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
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"
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:
------- 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
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
williamdsilva@aol.com.br 13
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.
Data1.RecordSource = "Select * from [Clientes] where month([Nasc]) = _
'" & Val(Text1.Text) & "'Order by [Nome]"
Data1.Refresh
Obs: A função "Month" retorna um valor de 1 a 12, por isso faça com que o usuário só possa digitar na caixa texto um
numero de 1 a 12.
Se voce quiser pesquisar por nome ou sobrenome, ou em qualquer parte da string use o seguinte comando:
williamdsilva@aol.com.br 14
Você pode controlar um objeto MCIwndX ou MCC Control (Microsoft Multimedia Control, que já vem com o VB) sem
precisar tocar na lista de propriedades. Vamos chamar o objeto de mciMedia.
'Especifica as propriedades principais
mciMedia.filename =
mciMedia.visible = True/False
mciMedia.enabled = True/False
Obs.: a propriedade 'visible' refere-se somente ao controle. Animações/filmes/etc serão exibidos normalmente se o
controle estiver oculto.
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:
Public Const MB_OK = &H0&
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
williamdsilva@aol.com.br 18
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
williamdsilva@aol.com.br 19
Else
End If
Para modificar algum caracter de uma string com o comando Mid faça o seguinte:
Dim MinhaString as String
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
williamdsilva@aol.com.br 20
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
williamdsilva@aol.com.br 21
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
X = GetWindowsDirectory(Space$(255), 255)
*** ATENÇÃO esta rotina é recomendada para programas simples(Impresão de cheques, etc.), por conter grande
número de comandos ***
Decidi criar uma rotina de extenso mas uma bem simples apenas com comandos básicos(If,Mid,For e outros) para
quem é iniciante em VB conseguir entender.
Para ficar mais fácil entender ao invés de transformar o número em extenso em uma função só criei várias funções.
Lembrando que esta função é BETA mais funciona perfeitamente com valores até 9999.
End If
End Function
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Public Function Unitarios(Nmr1 As Integer)
'Determinando os valores das centenas em extenso.
Unidades(0) = "": Unidades(1) = "Um": Unidades(2) = "Dois": Unidades(3) = "Três": Unidades(4) _
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.
Você pode ter várias colunas do TrueDbGrid ligados a um Data ou a um RDC e querer que uma delas não esteja, e
receba um valor qualquer, como a soma de todas as colunas. P/ isso, a propriedade DataMode do TrueDbgrid tem que
estar como 0 - Unbound. Nesta coluna do Total, vc tem que definir um caption, e deixar a propriedade DataField vazia,
assim ele reconhecerá esta coluna como Unbound. Então funciona assim, os dados do Data ou do RDC são puxadas p/
cada coluna. O valor desta coluna do Total, será definido pelo evento UnboundColumnFetch. P/ cada linha(ou registro),
ele passará por este evento p/ pegar o valor desta coluna. Vc poderia:
Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal _
TDBGrid1.Columns(1).CellValue(Bookmark)
End Sub
williamdsilva@aol.com.br 25
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
williamdsilva@aol.com.br 27
-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.
MousePointer = 99 - Custom
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 29
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.
williamdsilva@aol.com.br 31
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"
williamdsilva@aol.com.br 32
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"
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
williamdsilva@aol.com.br 33
End If
End Function
Já estou no ar?
Algumas aplicações para Windows podem ter várias instâncias, ou seja, podem ser executadas repetidas vezes ao
mesmo tempo no mesmo computador. É o caso do Bloco de Notas, do Paint, da Calculadora e de outros. Existem
programas cuja múltipla execução não é interessante, por questões de produtividade ao usuário (como o Word, o File
Manager e o Excel) ou segurança (como aplicações que usam banco de dados). Os sistemas comerciais (de banco de
dados), em geral, só podem ser executados em uma sessão ao mesmo tempo. O controle disto no VB é feito através do
objeto App.
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.
williamdsilva@aol.com.br 34
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}"
williamdsilva@aol.com.br 35
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)
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
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
williamdsilva@aol.com.br 36
dim i as integer
i = waveOutGetNumDevs()
if i > 0 then
else
end if
end function
77 - Arquivos INI
Enviado por: Felipe Maion Garcia
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
Returns$ = Space$(128)
x% = GetPrivateProfileString(ByVal seção$, ByVal chave$, "Nenhum valor lido", Returns$, Len(Returns$), ByVal
arquiv$)
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
williamdsilva@aol.com.br 37
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
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?
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
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
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 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):
williamdsilva@aol.com.br 39
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
Tabela.movenext
Wend
Tabela.close
Dim db as Database
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
MoveArquivo = True
Exit Function
ErroMovendoArquivo:
MoveArquivo = False
williamdsilva@aol.com.br 41
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 42
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"
williamdsilva@aol.com.br 43
campo1.Name = "NOME"
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 44
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.
williamdsilva@aol.com.br 45
91 - Banco de dados
Enviado por: Felipe Maion Garcia
Podemos entender por banco de dados qualquer sistema que reúna e mantenha organizada uma série de informações
relacionadas a um determinado assunto em uma determinada ordem.
A lista telefônica é um exemplo, nela percebemos que todos os dados referentes a uma pessoa estão na mesma linha,
a isso chamamos registros.
O tipo ou categoria da informação (nome,telefone,etc.) sobre uma pessoa está separada em colunas, as quais
chamamos campos.
Um Sistema Gerenciador de banco de dados relacionais(SGBDR) é usado para armazenar as informações de uma forma
que permita às pessoas examiná-las de diversas maneiras.
O Gerenciador relacional de banco de dados do Visual Basic e do Access é o Microsoft Jet, ele pertence a uma categoria
diferente dos Gerenciadores tradicionais, como o Dbase e o Paradox, pois possuem características em comum com os
banco de dados cliente-servidor. Tais características comuns são:
Todas as tabelas, indíces, consultas, relatórios e código são armazenados num único arquivo .MDB
Os campos de data suportam informação de hora.
Admite o armazenamento permanente de comandos SQL.
É possível forçar a integridade referencial entre as tabelas.
Os campos suportam valores nulos (Null).
No Dbase/Clipper banco de dados significa um arquivo que contém a estrutura de dados(campos) e os dados (Arquivo
padrão DBF). Para o padrão MDB este conjunto de dados e sua estrutura denomina-se Tabela.
Portanto aquilo que o Dbase/Clipper considera um banco de dados o Access e o Visual Basic considera como uma
Tabela.
Para o Access e o Visual Basic todos os componentes do sistema estão em um único arquivo com extensão MDB, a este
"pacote" consideramos o banco de dados.
Logo quando abrimos um arquivo MDB temos acesso a todos os componentes do sistema: tabelas, consultas, macros,
relatórios, etc. A esses componentes chamamos objetos do sistema.
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"
williamdsilva@aol.com.br 46
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.
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)).
williamdsilva@aol.com.br 47
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 caminho para isto.
Mystring = CStr(CInt(mystring))
Outro caminho é:
Mystring = Str(Val(mystring))
97 - Objetos vazios?
Enviado por: Henrique Angelo
Não se pode usar a função IsEmpty para determinar se uma variável-objeto (como Form ou qualquer controle) possui
valor. É possível, entretanto, usar a implementação abaixo para determinar se uma variável de form (ou outro objeto)
está vazia.
If Not frmChild Is Nothing Then
Unload frmChild
End If
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
williamdsilva@aol.com.br 48
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
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.
A rotina abaixo (parte da biblioteca CodeBank) calcula as coordenadas de qualquer ponto, medida em graus, numa
circunferência, num círculo ou numa elipse. Como você pode notar, é uma rotina simples, mas extremamente útil no
desenho de gráficos ou movimentação de objetos.
Public Sub DegreesToXY(CenterX as Long, CenterY as Long, _
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
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
williamdsilva@aol.com.br 50
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 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
williamdsilva@aol.com.br 51
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
williamdsilva@aol.com.br 52
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
williamdsilva@aol.com.br 53
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
Shape1.Top = Shape1.Top + 30
williamdsilva@aol.com.br 54
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 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.
williamdsilva@aol.com.br 56
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
williamdsilva@aol.com.br 57
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
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
williamdsilva@aol.com.br 61
distintos nos vários produtos (linguagens e bancos) disponíveis no mercado. Assim, cada fornecedor de banco de dados
poderá incluir recursos (como storned procedures) e sintaxes específicas em seus produtos; existem o SQL da Oracle, o
SQL da Informix, o SQL da Sybase etc. Escrevendo seus comandos em SQL ANSI, o ODBC irá "interpretar", em tempo
de execução, os comandos para a sintaxe SQL do banco que seu usuário acessa. Esta operação tem uma vantagem e
uma desvantagem:
1) A vantagem é que um só aplicativo, a priori, poderá ser executado - sem alteração de fontes - em qualquer banco de
dados Client Server, pelo padrão ODBC. Além da portabilidade de código fonte, existe o ganho em interoperabilidade: o
programa poderá acessar, ao mesmo tempo, bases diferentes. A interoperabilidade é necessária em empresas, por
exemplo, que passaram por processos de fusão ou incorporação com outra empresa (que usa outra "marca" de banco
de dados).
2) Desvantagem: a "tradução" impacta consideravelmente na performance do sistema, o aplicativo (que pode estar
rodando em uma grande rede) tornar-se-á muito mais lento.
A solução é pedir ao ODBC que "pule" a tradução que seria realizada pelos seus drivers. Assim, ganha-se tempo de
execução. Veja este exemplo:
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):
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
williamdsilva@aol.com.br 62
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 mesmo tempo, de rede e CD.
A chamada indica o sistema de arquivos: FAT, NTFS, HPFS ou CDFS (CD File System).
Declare Function GetVolumeInformation _
Lib "Kernel32" _
Alias "GetVolumeInformationA" _
As Long
'...
pstrRootPath = "E:\"
pstrVolName = Space$(256)
williamdsilva@aol.com.br 63
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.
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
williamdsilva@aol.com.br 64
.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 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).
Complementando a dica anterior: Em uma operação de consulta a um banco de dados (típica de desenvolvimento
comercial), deveremos conhecer o tamanho do retorno da consulta. O número de linhas que irá retornar é calculado
por um Select Count (instrução SQL para contador) igual ao Select que, posteriormente, será usado para a consulta. O
williamdsilva@aol.com.br 65
Count é uma operação rápida, principalmente em bancos Client Server (onde o cálculo é executado no servidor). O
retorno do Select Count é um número, contendo o total de linhas que seria trazido pela consulta. Com o Count, poderão
ser impedidas consultas longas demais, por exemplo.
Para o percentual, já temos o total. O "registro corrente" é obtido dentro do loop. No exemplo abaixo, carregamos um
Grid simples com dados de uma tabela. Utilizamos as rotinas SU_Aguarde e SU_BarraPerc (explicadas nas dicas
anteriores).
Sub SU_CarregarGrid ()
Dim VA_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)
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.
____________
Para mostrar um percentual, é preciso conhecer o tempo (ou tamanho) total da operação e a que ponto se está em
dado momento de um loop (laço de repetição). Num programa de instalação, por exemplo, se conhece o tamanho total
dos arquivos (ou quantidade de arquivos) a serem instalados e qual o arquivo atual (no loop). Com isto, o usuário vê X
% da instalação completa.
Para usar um 3D Panel como barra de percentual, siga estes passos:
1) Insira um 3D Panel, com nome PA_Status, no MDIForm (aqui chamado de F00). Atribua Align = Alig 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
F00.PA_Status.BevelWidth = 1
F00.PA_Status.BorderWidth = 3
williamdsilva@aol.com.br 68
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
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
williamdsilva@aol.com.br 70
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 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.
Os utilitários APILOD16.EXE e APILOD32.EXE acessam o arquivo WIN32API para passar os parâmetros de tipos de
dados (Type Declarations) necessários para chamar funções Win32 API. Porém existem erros. Por exemplo:
WIN32API.TXT (incorretamente)diz:
Type COMSTAT
cbInQue As Long
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.
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.
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)
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
williamdsilva@aol.com.br 77
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
...
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.
Evite o erro de acesso 3260 ("Couldn't update; currently record is locked by user '' on machine ''"), que ocorre quando
duas ou mais aplicações acessam a mesma tabela de uma base de dados Access (Jet). O acesso é realizado por objetos
recordset (como table ou dynaset), sobre uma tabela que contenha uma chave (primária ou não).
Se uma das aplicações está ociosa (apenas abriu o registro e ainda não o alterou) e outra aplicação tenta alterar ou
adicionar dados, o erro citado ocorre. Para evitar este problema, inclua o método Idle dbFreeLOcks após o recordset ser
aberto. Se for um table recordset, inclua-o após ter definido a propriedade Index. Veja um exemplo:
williamdsilva@aol.com.br 79
Set db = Workspaces(0).Opendatabase("Test.mdb")
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:
1) Referenciando uma propriedade da VBIDE Instance Object, como AcitveProject.FileName no evento ConnectAddin da
Conector Class.
Para quem não sabe, infelizmente, é possível "espiar", ou até mesmo "alterar" o código de um executável (somente as
"mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usuário de nível intermediário.
Para que isso não ocorra, ou pelo menos para dificultar alguma alteração, quando quiser escrever uma mensagem, por
exemplo do tipo:
msgbox "Olá, blz?"
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
williamdsilva@aol.com.br 80
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.
É uma boa idéia passar o valor nothing a variáveis de form para recuperar memória alocada pelo módulo. Executando
este recurso para um form já carregado, entretanto, irá colocar o módulo em um estado confuso. Veja:
Form2.show
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).
williamdsilva@aol.com.br 81
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
Para dar segurança a uma base de dados Jet (.MDB), versão 2.5 (Access 2/VB3/VB4-16 bit) ou versão 3.0 (Access
7/VB4-32 bit), siga estes passos:
1) Use o Access Workgroup Administrator para criar um novo grupo de trabalho, com uma não nula Workgroup ID.
3) Crie um novo usuário, adicione-o no grupo de Administração, com os privilégios de administrador. Remova a conta
Admin do grupo de administradores.
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
End If
End Sub
williamdsilva@aol.com.br 83
Este código elimina o beep quando se tecla ENTER ou TAB em uma text box que atingiu seu número máximo de
caracteres.
Sub Form_KeyPress (keyascii as integer)
KeyAscii = 0
End If
End Sub
Algumas vezes, um erro de execução se manifesta apenas após a criação de um EXE e não em tempo de debug. O add-
in Code Profiler poderá ajudá-lo.
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)
'...
'...
'...
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
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"
williamdsilva@aol.com.br 86
b = "Francisco"
c=a
a=b
b=c
End Sub
Ficou triste ao ler a documentação do VB, que dizia "Note: you cannot specify where a common dialog is displayed"
(você não poderá especificar onde é mostrada uma common dialog)? Então tente isto:
Inicie um novo form (que será usado apenas para isto) em vez de chamar a abertura do diálogo diretamente do form
principal.
(FrmDummy_OpenSaveAs.Hide)
Defina as propriedades Left e Top conforme desejar e inicie a common dialog deste form. No Windows 95 (VB 4-32
bits) , a common dialog irá aparecer na posição do form que a chamou. Como o form hide (oculto), isto é imperceptível
para o usuário.
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.
williamdsilva@aol.com.br 87
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) controle(s) e
clique no botão "cadeado", na barra de ferramentas.
2. O VB3 não possui o recurso de "cadeado", mas, é possível mover ou selecionar os controles com maior cuidado (para
alterar várias propriedades ao mesmo tempo, por exemplo). Basta selecionar, passando o mouse no form, uma área em
volta dos controles. Isto não se aplica a controles contidos em outros objetos (como painéis, frames e picture boxes).
D - Maior precisão
Use os valores numéricos de tamanho e posição: left, top, height e width - correspondentes a x, y' (eixo y do topo para
baixo) , h (altura) e b (base), respectivamente - na Janela de Propriedades ou Janela de Código. Esta tarefa é um
pouco árdua, então, desenhe o controle com medidas aproximadas para depois, ajustar, via digitação de valores.
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 _
williamdsilva@aol.com.br 90
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)
nBuffer = 25
If Ret Then
GetUser$ = lpUserID$
End If
End Function
If Len(InString) Then
Else
ClipNull = InString
End If
End If
End Function
williamdsilva@aol.com.br 91
Enabled = False
No Form_Load()
timer1.enabled = true
No Timer1_Timer()
Label1.left = label1.left + 2
wend
Next Controle
End Sub
Sub CloseChild()
Dim i As Integer
i = Forms.Count - 1
Wend
End Sub
williamdsilva@aol.com.br 92
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
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
williamdsilva@aol.com.br 93
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"
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
Para quem não sabe, infelizmente, é possível "espiar", ou até mesmo "alterar" o código de um executável (somente as
"mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usuário de nível intermediário.
Para que isso não ocorra, ou pelo menos para dificultar alguma alteração, quando quiser escrever uma mensagem, por
exemplo do tipo:
msgbox "Olá, blz?"
williamdsilva@aol.com.br 95
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
A=FreeFile
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.:
williamdsilva@aol.com.br 98
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
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)
williamdsilva@aol.com.br 101
ContaRegistros = RsQ!QuantReg
RsQ.Close
End Function
'
'
'
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)
williamdsilva@aol.com.br 103
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)
williamdsilva@aol.com.br 105
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
'====================================
'Esta função quebra as linhas com divisores
'====================================
Dim separadores As String: separadores = "<>/\ " & Chr(13)
Dim divisores As String: divisores = ",;.:!" & Chr(10)
Dim X As Integer
Dim R As String
S = LTrim(S)
X=1
Do
If InStr(1, separadores, Mid$(S, X + 1, 1)) Or InStr(1, divisores, Mid$(S, X, 1)) Then
Exit Do
End If
X=X+1
Loop Until X >= Len(S)
R = Left(S, X)
S = Right(S, Len(S) - Len(R))
Token = R
End Function
Para fazer com que um programa receba parâmetros externos, use a funcão 'command' no Form_Load. Ex:
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 :
Call ExitWindowsEx(2, 0)
Você pode manipular suas informacões que ficam armazenadas banco de dados do Windows. Ex:
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
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.
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:
williamdsilva@aol.com.br 112
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)
williamdsilva@aol.com.br 113
'****
Senha = ""
Dim I As Integer
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 :
williamdsilva@aol.com.br 114
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
williamdsilva@aol.com.br 116
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
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
williamdsilva@aol.com.br 117
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
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:
williamdsilva@aol.com.br 120
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
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
williamdsilva@aol.com.br 124
LadoLadoV = 405
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.
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
williamdsilva@aol.com.br 126
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
williamdsilva@aol.com.br 127
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
williamdsilva@aol.com.br 128
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
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
If Mid(numero, 2, 2) = 0 Then
If numero = 100 Then
centenas = "cem"
Else
centenas = centena(Left(numero, 1))
End If
ElseIf Mid(numero, 3, 1) = 0 Then
centenas = centena(Left(numero, 1)) & " e " & dezenas(Mid(numero, 2, 2))
ElseIf Mid(numero, 2, 1) = 0 Then
centenas = centena(Int(Left(numero, 1))) & " e " & unidade(Int(Right(numero, 1)))
Else
centenas = centena(Int(Left(numero, 1))) & " e " & dezenas(Int(Right(numero, 2)))
End If
End Function
Public Function ext(numero As Currency) As String
If numero > 999999.99 Then ext = "Número fora dos padrões válidos !": Exit Function
unidade(1) = "um"
unidade(2) = "dois"
unidade(3) = "três"
unidade(4) = "quatro"
unidade(5) = "cinco"
unidade(6) = "seis"
unidade(7) = "sete"
unidade(8) = "oito"
unidade(9) = "nove"
dezena(0) = "dez"
dezena(1) = "onze"
dezena(2) = "doze"
dezena(3) = "treze"
dezena(4) = "quatorze"
dezena(5) = "quinze"
dezena(6) = "dezesseis"
dezena(7) = "dezessete"
dezena(8) = "dezoito"
dezena(9) = "dezenove"
dezena(10) = "vinte"
dezena(11) = "trinta"
dezena(12) = "quarenta"
dezena(13) = "cinquenta"
dezena(14) = "sessenta"
dezena(15) = "setenta"
dezena(16) = "oitenta"
dezena(17) = "noventa"
centena(1) = "cento"
centena(2) = "duzentos"
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
williamdsilva@aol.com.br 131
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.
williamdsilva@aol.com.br 136
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"
williamdsilva@aol.com.br 137
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.
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
End Sub
'o resto das propriedades voce mesmo descobre senão o texto ficaria muito longo.
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
Dim Mult2 As Integer
Dim x As Integer
Dim y1 As Integer
Dim y2 As Integer
Let y1 = 9
Let y2 = 10
Let z2 = 11
Mult1 = 10
Mult2 = 11
If Len(VALOR) = 10 Then
Let Mult1 = 9
Let Mult2 = 10
Let z2 = 10
Let y1 = 8
Let y2 = 9
End If
For x = 1 To y1
dig1 = dig1 + (Val(Mid(VALOR, x, 1)) * Mult1)
Mult1 = Mult1 - 1
Next
williamdsilva@aol.com.br 142
For x = 1 To y2
dig2 = dig2 + (Val(Mid(VALOR, x, 1)) * Mult2)
Mult2 = Mult2 - 1
Next
dig1 = (dig1 * 10) Mod 11
dig2 = (dig2 * 10) Mod 11
If dig1 = 10 Then dig1 = 0
If dig2 = 10 Then dig2 = 0
Calc_CPF = True
If Val(Mid$(VALOR, y2, 1)) <> dig1 Then Calc_CPF = False
If Val(Mid$(VALOR, z2, 1)) <> dig2 Then Calc_CPF = False
End Function
281 - Passando parâmetros via Form para filtrar registros no Crystal Reports
Enviado por: Adriano Faria
Este exemplo utiliza um combobox em um form para filtrar dados em relatorio do Crystal Report (VB6 e CR6):
Dim Auxrel as string
auxrel = ""
auxrel = auxrel & "ToText({Tabela.Campo}) like '*" & Combo1.Text & "*'"
CrystalReport1.SelectionFormula = auxrel
CrystalReport1.CopiesToPrinter = 1
CrystalReport1.ReportFileName = "c:\caminho\report.rpt"
CrystalReport1.Action = 1
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!
Os métodos:
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")
setar_true_false (False)
Form1.MousePointer = 11
Load Form5
Form5.Show
Form1.MousePointer = 1
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.
williamdsilva@aol.com.br 147
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, = , > ,< ,<> ,<= ,>=.
[Expressão] - O que você quer filtrar.[texto digitado].
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)
williamdsilva@aol.com.br 148
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, 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
Uses1=
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
msgBox "Você precisa especificar a porta da máquina host"
end if
else
'Configura o endereço host do winsock através do campo de text txtIPhost winsock
winsock1.remoteHost = txtIPhost.Text
'Configura o endereço remoto da porta do winsock através do campo de texto txtPorta
winsock1.remotePort = txtPorta.Text
'Executa conecção
Winsock1.Connect
Então você agora pode criar funções, e depois envia-las, como por exemplo uma mensagem caixa de diálogo:
Function exemplo()
msgBox "Este é um exemplo de função"
End Function
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
williamdsilva@aol.com.br 151
c:\Windows\Cursor\Hand-m.ico !!!
End If
End Function
Option Explicit
Private Sub Form_Load()
Call AchePastas
End Sub
Private Sub AchePastas()
MsgBox " 0- " & ListaPastas(0) & vbCrLf & _
" 2- " & ListaPastas(2) & vbCrLf & _
" 5- " & ListaPastas(5) & vbCrLf & _
" 6- " & ListaPastas(6) & vbCrLf & _
" 7- " & ListaPastas(7) & vbCrLf & _
" 8- " & ListaPastas(8) & vbCrLf & _
" 9- " & ListaPastas(9) & vbCrLf & _
"11- " & ListaPastas(11) & vbCrLf & _
"19- " & ListaPastas(19) & vbCrLf & _
"20- " & ListaPastas(20) & vbCrLf & _
"21- " & ListaPastas(21) & vbCrLf & _
"26- " & ListaPastas(26) & vbCrLf & _
"27- " & ListaPastas(27) & vbCrLf & _
"32- " & ListaPastas(32) & vbCrLf & _
"33- " & ListaPastas(33) & vbCrLf & _
"34- " & ListaPastas(34), , " Pastas do Windows"
Unload Me
End Sub
'------------------------
'Código para o módulo BAS
'------------------------
Option Explicit
'APIs
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal
williamdsilva@aol.com.br 153
'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 )
... &Novo ( mnuNovo )
... - ( separa1 )
... &Abrir ( mnuAbrir )
... - ( separa2 )
... &Fechar ( mnuFechar )
&Editar ( mnuEditar )
... &Copiar ( mnuCopiar )
... - ( separa3 )
... &Recortar ( mnuRecortar )
... - ( separa4 )
... &Selecionar Tudo ( mnuSeleTudo )
&Informações ( mnuInfo )
... &Ajuda ( mnuAjuda )
... - ( separa5 )
... &Sobre o Programa ( mnuSobre )
Label1.Left = 0
Label1.Width = Me.Width
Label1.Alignment = 2
Label1.FontBold = True
Label1.FontSize = 12
Label1 = "Clique o form com o botão direito do mouse por diversas vezes"
Me.WindowState = 2
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Label1 = ""
If Button = 2 Then
Dim MeuValor%
'Randomize
'sorteia um número entre 1 e 3 para exibir l menu
'quando o botão direito do mouse for clicado
'se quiser adicionar + menus substitua
'o número 3 pelo numero de menus desejado
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.
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.
Label1.Caption=ColorTag(vbblue)
'Retorna #FF0000
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
End Sub
Private Sub Form_Load()
File1.Pattern = *."bmp;*.jpg;*.gif;*.cur;*.wmf;*.ico"
'Filtra o File1, para exibição somente deste arquivos
End Sub
Obviamente que esta última lina poderá ser substituida, simplesmente inserindo as informações entre parentese na
propriedade Pattern do componente File1.
Outra dica e verificar a propriedade Strech da Image, para limeitar ou não o tamanho da imagem a ser exibida.
Quem tiver interesse em um visualizador Freeware da Lizaro Software, basta enviar um e-mail para o 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
williamdsilva@aol.com.br 159
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
MsgBox "O simbolo da moeda é " & gstrCurrencySymbol, vbInformation
End Sub
320 - Espiral
Enviado por: Armando Miani Neto
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
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)
williamdsilva@aol.com.br 166
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:
williamdsilva@aol.com.br 167
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)
williamdsilva@aol.com.br 168
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 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 !!!!
Variav = ExitWindowsEx(EWX_REBOOT, 2)
End If
Case Else
MsgBox Label1
Exit Sub
End Select
End Sub
Private Sub Form_Load()
Text1 = ""
Label1.Left = Me.Width * 0.1
Label1.Width = Me.Width * 0.8
Label1.Height = 400
Label1 = "Digite na caixa texto: 0 para logoff, 1 para desligar o Computador, 2 para reiniciar o Windows"
End Sub
'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
williamdsilva@aol.com.br 172
Unload Me
End Sub
Private Sub Form_Load()
Call DisableClose(form1)
End Sub
'Código para o módulo .bas
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd _
As Long, ByVal bRevert As Boolean) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal _
hMenu As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal _
hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) _
As Long
Private Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_REMOVE = &H1000&
Public Sub DisableClose(frm As Form, Optional _
Disable As Boolean = True)
'Setting Disable to False disables the 'X',
'otherwise, it's reset
Dim hMenu As Long
Dim nCount As Long
If Disable Then
hMenu = GetSystemMenu(frm.hwnd, False)
nCount = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, nCount - 1, MF_REMOVE Or _
MF_BYPOSITION)
Call RemoveMenu(hMenu, nCount - 2, MF_REMOVE Or _
MF_BYPOSITION)
DrawMenuBar frm.hwnd
Else
GetSystemMenu frm.hwnd, True
DrawMenuBar frm.hwnd
End If
End Sub
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!!
Para concatenar campos de tabelas(Arquivo) ou valores de uma TextBox pelo VB em um relatorio do crystal insira o
seguinte código:
'Usando campos de uma determinada Tabela
Private Sub cmdImprimir_Click()
'Formula para Descricao concatenada
CrystalReports1.Formulas(0) = "Descricao = {Tabela.Campo} + {Tabela2.Campo2}"
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub
williamdsilva@aol.com.br 176
'Tabela.Campo = Clientes.Codigo
'Tabela2.Campo2 = Fornecedor.Codigo
'Usando valores de TextBox
Private Sub cmdImprimir_Click()
'Formula para Descricao concatenada
CrystalReports1.Formulas(0) = "Descricao = " & textbox1.text & "+" & textbox2.text
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub
'Nome
'textbox1.text = Roberto
'Sobrenome
'textbox2.text = Luís Ghisleni
obs.: Para que este codigo funcione vc deverá inserir em seu relatório Cristal uma formula com o mesmo nome que
estiver definida no VB(ex.: Formula "Descricao"), para ai sim mover algo para ela.
357 - Como mover uma data informada em um MaskEdit para um relatório no Crystal usando código VB
Enviado por: Roberto Luís Ghisleni
Para mover uma data digitada em um MaskEdit para um relatorio do crystal insira o seguinte código:
Private Sub cmdImprimir_Click()
'Formula Data Inicial
CrystalReports1.Formulas(0) = "Data = Date ( " & Mid$(MaskEdit1, 7, 4) & _
"," & Mid$(MaskEdit1, 4, 2) & "," & Mid$(MaskEdit1, 1, 2) & ")"
CrystalReports1.DiscardSavedData = True
CrystalReports1.Action = 1
End Sub
obs.: Para que este codigo funcione vc deverá inserir em seu relatório Cristal uma formula com o mesmo nome que
estiver definida no VB(ex.: Formula "Data"), para ai sim mover algo para ela.
358 - Formulários
Enviado por: Rogério Adriano de Morais - Clark
Quando se trabalha com formulários no Visual Basic, em projetos MDI principalmente, deve-se tomar cuidado para não
deixá-lo na memória após usá-lo. O sintoma deste erro de programação é o programa não finalizar após ter clicado no
botão FECHAR, e ser necessário clicar no botão END para concluir sua finalização. Para avitar isso, use sempre o
método UNLOAD após usar qualquer utilização de um formulário, mesmo que ele não seja exibido no video. Veja:
Private Sub Command1_Click()
Dim vTexto as String
vTexto = Form1.Text1.Text
End Sub
No código acima, mesmo que não foi usado o método LOAD, o formulário FORM1 foi carregado para que o objeto
TEXT1 possa ser usado. Repare que não foi usado o método UNLOAD, de forma que, o formulário continuará na
memória mesmo que o procedimento (SUB) seja finalizado (END SUB). Veja o código correto abaixo:
Private Sub Command1_Click()
Dim vTexto as String
vTexto = Form1.Text1.Text
Unload Form1
End Sub
É lógico que isso é somente um exemplo, a momentos em que é vantajoso o formulário continuar na memória porque
poderá ser usado posteriormente.
Abraços,
Clark
Para converter um nº inteiro para Binário coloque o seguinte código em um command Button:
Dim resp, bin, n, dec As Double 'Declara variáveis
dec = Text1
resp = Int(Text1)
williamdsilva@aol.com.br 177
Text1 = ""
While resp <> 0
resp = Int(dec / 2)
If resp * 2 = dec Then
bin = 0
Else
bin = 1
End If
Text1 = Text1 & bin
dec = resp
Wend
For n = Len(Text1) To 1 Step -1
Text1.Text = Text1 & Mid(Text1, n, 1)
Next n
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 insira este
código.
form1.enabled = false
pronto!
hora2 = 2
minuto2 = 23
segundo2 = 34
'Coloca os dados do Primeiro horário em horario_1
horario_1 = TimeSerial(hora1, minuto1, segundo1)
'Coloca os dados do Primeiro horário em horario_2
horario_2 = TimeSerial(hora2, minuto2, segundo2)
'Mostra a soma deles
MsgBox horario_1 + horario_2
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.
williamdsilva@aol.com.br 180
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.)
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, _
williamdsilva@aol.com.br 181
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
With CrystalReport1
.ReportFileName = "C:\caminho\relatorio.rpt"
.PrinterDriver = "Epson24"
.PrinterPort = "LPT1"
.PrinterName = "Epson - Matricial"
.Action = 1
End With
williamdsilva@aol.com.br 182
376 - Função que limpa todos os campos com propriedade TEXT e LIST BOX do form.
Enviado por: Adriano Faria Alves
End Function
CheckCPF = True
Sub CPF_LostFocus()
If CheckCPF(CPF.Text) = False Then
MsgBox "CPF Inválido."
CPF.SetFocus
williamdsilva@aol.com.br 183
End IF
378 - Combo Box com data (primeiro ao último dia do mês atual)
Enviado por: Adriano Faria Alves
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
Posicaoinicial = 1
Texto = Texto & " "
Do Until InStr(Posicaoinicial, Texto, " ") = 0
Posicaofinal = InStr(Posicaoinicial, Texto, " ")
Palavra = Mid(Texto, Posicaoinicial, Posicaofinal - Posicaoinicial)
Posicaoinicial = Posicaofinal + 1
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
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)
Crie um novo projeto, coloque no Form uma ImageList, um PictureBox (ou ImageBox, pois esta não recebe foco), um
Timer (com Interval = 100, pelo menos) e coloque as figuras da animação na ImageList.
No evento desejado:
Dim Word As Object
Set Word = CreateObject("Word.Application")
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.
williamdsilva@aol.com.br 188
2 - Em um módulo declare:
3 - No Form_Load adicione:
392 - Impedir que o programa seja encerrado com Ctrl Alt Del
Enviado por: Adriano Faria Alves
Private Form_Load()
MakeMeService
End Sub
*Global do Form
Public Function ShowMessage()
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 If
End Function
ShowMessage
End Sub
Para chamar qualquer tela do Painel de Controle não se usa necessariamente uma API, mas sim se executa o programa
rundll32.exe. De acordo com os parâmetros cada tela é chamada. Veja as chamadas das principais telas:
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)
williamdsilva@aol.com.br 190
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)
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)
williamdsilva@aol.com.br 191
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
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
Alvo:
Retorna o nome do mês de acordo com o número passado na função
Função:
Public Function TabMeses(pMes As Integer) As String
Dim vetMeses
vetMeses = Array("Janeiro", "Fevereiro","Março", _
"Abril", "Maio","Junho", "Julho", _
"Agosto", "Setembro", "Outubro", _
"Novembro", "Dezembro")
TabMeses = vetMeses(pMes - 1)
End Function
Modo de Usar:
a linha - > TabMeses(Month(CDate("10/02/2000")))
retorna - > "Fevereiro"
Modo de usar
Essa serve para aqueles que só querem adicionar em uma base de dados, informações com apenas letras maiúsculas.
Veja com é fácil converter todos os controles com poucas linhas
Essa serve para aqueles que só querem adicionar em uma base de dados, informações com apenas letras maiúsculas.
Veja com é fácil converter todos os controles com poucas linhas.
Screen.MousePointer = vbHourglass
Dim A As Integer
For A = 1 To oForm.Controls.Count - 1
Next A
Screen.MousePointer = vbArrow
williamdsilva@aol.com.br 194
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 segundo é o
nome da tabela de origem na base de dados.
Um abraço!
AAA
406 - Verifique se sua aplicação já em uso na hora que inicia sua aplicação
Enviado por: Alexandre Liondas Neto
Para verificar se sua aplicação já está aberta na hora de iniciar seu programa faça o seguinte :
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
williamdsilva@aol.com.br 195
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
williamdsilva@aol.com.br 196
Essa função gera um parametro para usar com a instrução LIKE do SQL,
permitindo que o usuário possa escrever palavras compostas como critério de busca.
Function Cria_Parametro_Multiplo(cParam)
Screen.MousePointer = vbHourglass
Cria_Parametro_Multiplo = cNew
Screen.MousePointer = vbDefault
End Function
Um abraço
Me parece que o meio mais simples é utilizando a função Sleep da API do Windows. Além de simples, a função Sleep
libera o Windows para atender a outras aplicações enquanto em espera:
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!!!
Enviado por: Roberto Alexandre Levy
Nosso amigo Ricardo colocou uma forma de impedir o fechamento de um form. Mas temos uma forma bem mais
simples, e com o mesmo efeito!
Cancel = 1
End Sub
williamdsilva@aol.com.br 197
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
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
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)
?Asc("P")
Ele retornará 80 (o número ASCII do p maiúsculo)
*Essa dica serve para mostrar a senha esquecida de proteção do banco de dados Access 97.
*Módulo BAS
Option Compare Binary
Option Explicit
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
Vamos procurar por um nome no banco de dados e jogar numa TextBox. O procedimento é o seguinte:
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
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.
Quando você usa variável no formato Date, as horas só podem aparecer entre os valores 00:00:00 - 23:59:59
Aqui está uma rotina para mostrar valores superiores como 48:00.
Function ExtensoSemana(DATA)
SEMANA = Array("Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", _
"Quinta-Feira", "Sexta-Feira", "Sabado")
ExtensoSemana = SEMANA(WeekDay(DATA) - 1)
End Function
Exemplo:
text1.text = ExtensoSemana("16/03/2001")
ou
text1.text = ExtensoSemana(Date)
williamdsilva@aol.com.br 203
Function InicioMes(DATA)
Total = "01" & "/" & CStr(Month((CDate(DATA)))) & "/" & CStr(Year(Date))
InicioMes = Format(CDate(Total), "DD/MM/YYYY")
End Function
mais dicas:
www.fasinfo.cjb.net
Function Segunda(DATA)
If WeekDay(DATA) = 1 Then
Segunda = CDate(DATA) - 6
Else
Segunda = CDate(DATA) - (WeekDay(DATA) - 2)
End If
End Function
Mais dicas:
www.fainfo.cjb.net
Esta função apenas recebe uma string e procura por uma letra ou numero dentro dela
RETORNO:( True se achar e False se não achar )
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
williamdsilva@aol.com.br 204
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
Você pode inserir esse fragmento de código em seu programa e fazer com que seja acionado ou desacionado as teclas
NUM e CAPS Lock
por botões ou eventos de seu programa, para isso é só chamar a sub rotina AlternaCAPS() para o Caps Lock e
AlternaNUM() para o NUM Lock.
Você pode inserir esse fragmento de código em seu programa e fazer com que seja acionado ou desacionado as teclas
NUM e CAPS Lock
por botões ou eventos de seu programa, para isso é só chamar a sub rotina AlternaCAPS() para o Caps Lock e
AlternaNUM() para o NUM Lock.
Public Declare Function SHAutoComplete Lib "Shlwapi.dll" (ByVal hwndEdit As Long, ByVal dwFlags As Long) As Long
Public Const SHACF_DEFAULT As Long = &H0
Next objMessage
End Sub
.Top = 0
.Left = 0
Me.Height = .Height
Me.Width = .Width
End With
frmBackground.Show
End Sub
End Sub
'Para colcocar um Form no centro da tela em tempo de execução escreva os seguintes códigos:
Private Sub Form_Resize()
On Error Resume Next 'Evita erro caso o usuário minimize o Form
With Me
.Left = (Screen.Width - .Width) / 2 'Alinha o form no horizontalmente no centro
.Top = (Screen.Height - .Height) / 2 'Alinha o form no verticalmente no centro
End With
End Sub
'Para esta dica inicie um novo projeto e insira um ComboBox e um ListBox e crie uma arquivo de texto qualquer (Ex.:
C:\Lista de Alunos.txt"). Renomei-e o ComboBox para CboFile e o ListBox para LstFile. Em seguida no evento Load do
Form1, insira as seguintes linhas de comando:
Private Sub Form_Load ()
'Declaração das variáveis
Dim fnum As Integer
Dim lines As Integer
Dim a_line As String
If Dir("C:\Lista de Alunos.txt", vbArchive) = Empty Then 'Verifica se o arquivo se o arquivo existe
MsgBox "O arquivo não foi encontrado!", vbCritical, App.Title 'Caso o arquivo não seja encontrado exibe a caixa de
mensagem
Exit Sub 'Envia o comando para o fim da rotina
End If
fnum = FreeFile 'Devolve a variável fnum a crarterística de FreeFile
'EXE Location
Public Const MAX_PATH = 206
Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As
Long
Public Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal
lpFileName As String, ByVal nSize As Long) As Long
Sub CreateIniLoad()
williamdsilva@aol.com.br 208
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)
Option Explicit
Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As
String, ByVal nSize As Long, ByVal lpFileName As String) As Long
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
Length& = MMCOntrol1.TrackLength
Min$ = Str$(Length& And &HFF)
Sec$ = LTrim$(Str$((Length& And 65280) / 256))
Entry2$ = Min$ & ":" & Sec$
If Len(Sec$) = 1 Then Entry2$ = Min$ + ":0" + Sec$
Entry$ = Min$ + ":" + Sec$
If Len(Entry2$) = 4 Then
D$ = "0" + Entry2$
Else
D$ = Entry2$
End If
If Len(Entry2$) = 3 Then
D$ = "00" + Entry2$
Else
D$ = Entry2$
End If
D$ = Entry2$
GetTrackTime = Trim$(D$)
MMCOntrol1.TimeFormat = 10
CDMin = Val(Min$)
CDSec = Val(Sec$)
End Function
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
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
williamdsilva@aol.com.br 212
lpApplicationName = inisection
lpKeyName = inikey
Filename = lpFileName
retval = GetPrivateProfileString _
(lpApplicationName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName)
myReadINI = lpReturnedString
End Function
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
williamdsilva@aol.com.br 213
End Function
End Function
End If
End Function
'Crio as variaveis
Dim title, x
Após Executar:
cValorAux = cValor
i = InStr(cValorAux, Chr(34))
Do Until i = 0
williamdsilva@aol.com.br 215
Loop
i = InStr(cValorAux, Chr(39))
Do Until i = 0
Loop
TrocaAspas = cValorAux
End Function
Replace(Campo,".",",")
ou Virgula por Ponto
Replace(Campo,",",".")
Voce precisa fazer referencia do ADO 2.1 e depois fazer os seguinte comandos par aconectar
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
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
Coloque este comando em um botão desejado ( Neste exemplo o botão escolhido foi o command1 )