Você está na página 1de 51

NDCE

NTRODUO----------------------------------------------------------------------------------------------- 2
90 Dicas de Visual Basic------------------------------------------------------------------------------- 2
1 - VB4 - Atalhos para VB no Windows 95---------------------------------------------------------2
2 - VB3/VB4 - Criando um procedimento de pausa---------------------------------------------2
3 - VB3/VB4 - No v embora sem avisar---------------------------------------------------------2
4 - VB3/VB4 - Programando de forma diferente em tempo de desenho e execuo- - -2
5 - VB4 - Novas funes de Registry----------------------------------------------------------------2
6 - VB3 - Carregando forms do VB4 no VB3------------------------------------------------------2
7 - VB3/VB4 - Como calcular as coordenadas (x,y) de qualquer posio de um crculo
2
8 - VB3/VB4 - Procurando por nulos retornados por chamadas DLL-----------------------2
9 - VB4 - Erros de Licena----------------------------------------------------------------------------- 2
10 - VB3/VB4 - Valores de retorno no requeridos---------------------------------------------2
11 - VB4 - Atualizando Bound Controls por uma List Box-------------------------------------2
12 - VB4 - Destacando uma linha em um DBGrid----------------------------------------------2
13 - VB3/VB4 - Objetos vazios?--------------------------------------------------------------------- 2
14 - VB3/VB4 - Livre-se dos zeros inteis--------------------------------------------------------2
15 - VB3/VB4 - Campos na peneira----------------------------------------------------------------2
16 - VB3/VB4 - Convertendo dentificadores em Rtulos e Cabealhos------------------2
17 - VB3/VB4 - Alteraes com Mid---------------------------------------------------------------- 2
18 - VB3/VB4 - Quando usar SendKeys----------------------------------------------------------2
19 - VB3/VB4 - Resoluo do Monitor-------------------------------------------------------------2
20 - VB3/VB4 - Fechando todos os forms--------------------------------------------------------2
21 - VB4 - Subclasse para ChDir-------------------------------------------------------------------- 2
22 - VB3/VB4 - Graduando Cores------------------------------------------------------------------ 2
23 - VB3/VB4 - Arquivo Existe?---------------------------------------------------------------------- 2
24 - VB3/VB4 - Tenha uma linha 3D entre um menu pulldown e uma barra de
ferramentas--------------------------------------------------------------------------------------------------- 2
25 - VB4/VB3 - Providenciando menus especficos de contexto para seus objetos de
interface------------------------------------------------------------------------------------------------------- 2
26 - VB4 - Use seus prprios menus popup------------------------------------------------------2
27 - VB3/VB4 - Criando mltiplos nveis de diretrios-----------------------------------------2
28 - VB3/VB4 - Mova e redimensione controles com preciso------------------------------2
29 - VB4 - GetModuleUsage em 32 bits-----------------------------------------------------------2
30 - VB3/VB4 - Melhorando as declaraes AP ()--------------------------------------------2
31 - VB3/VB4 - Melhorando as declaraes AP ( - a volta do SendMessage)--------2
32 - VB3/VB4 - Simplificando chamadas AP atravs de funes prprias---------------2
33 - VB4 - Criando senhas para banco de dados-----------------------------------------------2
34 - VB4 - Abrindo bases de dados com senha-------------------------------------------------2
35 - VB4 - Posicionando uma Common Dialog--------------------------------------------------2
36 - VB3/VB4 - Economize memria com uma picture box----------------------------------2
37 - VB3/VB4 - Lembra-se do SWAP?-------------------------------------------------------------2
38 - VB3/VB4 - Uma histria de trs beeps------------------------------------------------------2
39 - VB3/VB4 - Converso de Nulos---------------------------------------------------------------2
40 - VB4 - Determinando a classe de qualquer objeto-----------------------------------------2
41 - VB4 - dentificando um controle genrico---------------------------------------------------2
1
42 - VB3/VB4 - Removendo o move---------------------------------------------------------------2
43 VB4 - Otimizando consultas no Jet 3----------------------------------------------------------2
44 - VB3/VB4 - Piscar ou no piscar---------------------------------------------------------------2
45 - VB3/VB4 - Travou tudo?------------------------------------------------------------------------- 2
46 - VB3/VB4 - Painel de Percentual---------------------------------------------------------------2
47 - VB3/VB4 - Painel de Percentual com SQL Count-----------------------------------------2
48 - VB3 - Mantendo constantes--------------------------------------------------------------------2
49 - VB3/VB4 - nconsistncia no caminho da aplicao (app.path)-----------------------2
50 - VB3/VB4 - Bloqueando funes Copiar e Colar em caixas de texto-----------------2
51 - VB3/VB4 - Digitao em Grid------------------------------------------------------------------ 2
52 - VB3/VB4 - O Caracter ENTER-----------------------------------------------------------------2
53 - VB3/VB4 - Limpando Combos Read-Only--------------------------------------------------2
54 - VB3/VB4 - Brancos no controle Masked Edit Box----------------------------------------2
55 - VB3/VB4 - Forando caracteres maisculos-----------------------------------------------2
56 - VB3/VB4 - Pinte meu mundo ... nas cores padro!---------------------------------------2
57 - VB3 - Desmarcar todos os itens de uma lista----------------------------------------------2
58 - VB4 - Ordenando Colunas da ListView------------------------------------------------------2
59 - VB4 - Problemas com o Print------------------------------------------------------------------ 2
60 - VB4 - Use o Code Profiler para depurao (debug)--------------------------------------2
61 - VB3/VB4 - Onde est o Beep?----------------------------------------------------------------2
62 - VB3/VB4 - TAB automtico para o prximo campo---------------------------------------2
63 - VB3/VB4 - Simplificando a condio de um F---------------------------------------------2
64 - VB3/VB4 - Eliminando o F quando possvel-----------------------------------------------2
65 - VB4 - Forms redimensionveis sem barra de ttulo--------------------------------------2
66 - VB3/VB4 - Adicionando segurana a uma base de dados Jet-------------------------2
67 - VB3/VB4 - Passe nothing aos forms com cautela----------------------------------------2
68 - VB3/VB4 - Prevenindo interao do usurio, via MousePointer e Enabled--------2
69 - VB4 - Depure simultaneamente o servidor OLE e a aplicao-----------------------2
70 - VB4 - dentificando uma unidade de CD em Rede---------------------------------------2
71 - VB4 - Soluo para bug no DBGrid----------------------------------------------------------2
72 - VB4 - Propriedade Count, de Control Array, no documentada-----------------------2
73 - VB4 - Determinando se um objeto foi definido (Set)-------------------------------------2
74 - VB3/VB4 - Criando nner Joins (SQL) numa base Access (Jet)-----------------------2
75 - VB4 - O desafio de criar Add-ins--------------------------------------------------------------2
76 - VB4 - Evitando Erros de Atualizao em Bases Access--------------------------------2
77 - VB4 - Descarregando DLLs fora de controle-----------------------------------------------2
78 - VB3/VB4 - Movendo itens em uma list box-------------------------------------------------2
79 - VB3/VB4 - Sub Main, iniciando um projeto sem interface------------------------------2
80 - VB3/VB4 - Capturando parmetros-----------------------------------------------------------2
81 - VB3/VB4 - Onde est o fim?-------------------------------------------------------------------2
82 - VB3/VB4 - F1 e o Help de Contexto----------------------------------------------------------2
83 - VB3/VB4 - Validando CGC e CPF------------------------------------------------------------2
84 - VB3/VB4 - Performance com a SQL Passthrough----------------------------------------2
85 - VB4 - Listas erradas de AP--------------------------------------------------------------------2
86 - VB3/VB4 - Centralizando Forms ()-----------------------------------------------------------2
87 - VB4 - Centralizando Forms ( - A verso)--------------------------------------------------2
88 - VB3 - Menu Colar Alternativo------------------------------------------------------------------2
89 - VB3/VB4 - J estou no ar?---------------------------------------------------------------------2
90 - VB3/VB4 - Seja Feliz----------------------------------------------------------------------------- 2
2
INTRODUO
90 Dicas de Visual Basic
SupIemento EspeciaI - As figurinhas que faItavam
"Bafo! Gritou o garotinho de oito anos, ao trocar uma figurinha com o colega. "No meu
lbum falta a nmero trinta, voc tem?. Anos depois, continuamos a trocar figurinhas.
Por exemplo: "Voc sabe como criar um servidor OLE?, "Como acesso um banco
ODBC no VB?, e outras figurinhas. Nesta edio, trazemos algumas delas.
Conveno: VB3/VB4 = verso aplicvel dica. Por = autor. Aperf. = adaptado e
aperfeioado por.
3
1 - VB4 - AtaIhos para VB no Windows 95
Com a verso quatro do Visual Basic e o novo ambiente de sistema operacional de 32
bits, eu usava trs verses do VB. Alguns de meus clientes no aceitavam aplicaes
construdas em VB4. E alguns no migraram para 32 bits. Aps instalar ambas as
verses 16 e 32 bits em minha mquina com Windows 95, descobri que qualquer
projeto com extenso .VBP pode ser aberto no VB 32 bits. Este o melhor caminho
para executar a correta verso do VB:
1) Salve todos os arquivos de um projeto na mesma pasta.
2) Crie um atalho para o VB, na edio que voc usa.
3) Arraste o projeto (VBP) para o topo do atalho e (tcham); o projeto ser aberto por
esta verso.
Por Joe Sytniak*
2 - VB3/VB4 - Criando um procedimento de pausa
Falta um comando do VB para provocar uma pausa (wait, dalay, pause etc.) no
processamento? Basta implementar uma pequena rotina, em um mdulo (.BAS):
Function FU_DeIay (Quanto As DoubIe, PermiteDoEvents As Integer) As DoubIe
'executa uma pausa na aplicao
'quanto = tempo da pausa (em segundos)
' pode ter fraes de segundos
'PermiteDoEvents true ou false
' DoEvents permite realizar outras tasks do Windows
'Timer uma funo do VB que retorna
' o nr. de segundos desde meia noite
' RETORNO: o tempo de looping
' que devido a impreciso e multitask, pode ser
' diferente do valor pedido
Dim nicio As Double
Dim Check As Double
Dim Contador As Double
Contador = Timer
nicio = Timer
Do Until Check >= (nicio + Quanto)
Check = Timer
f PermiteDoEvents Then DoEvents
Loop
'o VB d uma boa preciso em 1/10 de segundo
'a 1/100 a preciso j parcialmente comprometida
'a 1/100 a preciso se perde
FU_Delay = (Timer - Contador)
End Function
Note que no foi necessrio inserir um controle Timer no form para executar esta
pausa.
Para acessar a rotina basta citar o nome e passar o nmero de segundos. O segundo
parmetro informa se deve ser usado o!"ents.
vPausa = FU_DeIay (4.5, FaIse) 'pausa de 4 segundos e meio
O valor de "Pausa poder no ser 4.5 (uma subtrao poder servir de teste). O
Windows executa vrias tarefas ao mesmo tempo. Assim, uma tarefa poder no ser
executada duas vezes com o mesmo tempo. A chamada ao o!"ents provoca uma
melhoria na distribuio de tarefas, para que a pausa no atrapalhe os demais
programas.
Se desejar criar um procedimento de pausa mais simples, sem tanta preocupao com
a preciso, a funo poder ser chamada por outra rotina, do tipo su#. Abaixo, esta
rotina toma o o!"ents como ativado e simplifica a sintaxe.
SU_DeIay 4.5 'chamada a uma pausa, como se fosse um comando
Sub SU_DeIay (quanto as double)
dim ret as double
ret = FU_Delay(quanto - .01, true)
End Sub
Por $harles A% &'ller.
3 - VB3/VB4 - No v embora sem avisar
Usurios podem, por descuido, sair da sua aplicao atravs da Lista de Tarefas ou
Barra de Tarefas, ou ainda, saindo do Windows. Adicione um procedimento ao evento
(uery)nload do form principal para prevenir o problema.
Este evento possui um parmetro, o )nload&ode, que permite detectar como o
fechamento do form foi invocado. Se o valor for 1, representa que o fechamento ocorreu
via cdigo (comando )nload). Se o valor do parmetro cancel for alterado para true, o
fechamento do form cancelado. Veja (uery)nload e )sin* &+ ,eatures no Help do
VB para maiores detalhes.
Private Sub Form_QueryUnIoad (Cancel As nteger, UnloadMode As nteger)
f UnLoadMode <> 1 then
f 7 = MsgBox("Deseja realmente sair do sistema?", 32 + 4) Then
'respondeu no
Cancel = True
End f
End f
End Sub
O cdigo acima (VB4) tambm se aplica ao VB3.
Por Jiyan* -e"en .uo*, aperf% por $harles A% &'ller
2
4 - VB3/VB4 - Programando de forma diferente em tempo de
desenho e execuo
Este cdigo habilita ou desabilita funes durante o desenho e teste. O cdigo poder
permanecer durante o desenvolvimento, sem afetar o usurio final. Verifique se o
caminho procurado o caminho do seu projeto e no o diretrio final de sua aplicao.
f nsStr(App.Path, "VB") Then
'execute os processos prprios
'de debug e no de sistema executvel
End F
Uma variao :
f nsStr(App.Path, "VB") Then Stop
Voc pode inserir este cdigo para depurao (debug); se voc esquecer, isto no
causar - repetimos - problemas ao usurio.
Por John Bailey *
5 - VB4 - Novas funes de Registry
H uma lista de novas funes do VB4 para trabalhar com entradas do Registry (ou N,
em plataformas Windows de 16 bits): /etSettin*, /etAllSettin*s, Sa"eSettin* e
eleteSettin*. Estas novas funes eliminam a necessidade de chamadas AP. Veja no
VB Help maiores detalhes procurando "Additional +nformation on VBA 0e*istry
,unctions".
Por enis Basaric e 1or#ert Steinhoefel2$ar3ue"ille*
6 - VB3 - Carregando forms do VB4 no VB3
Voc no poder ler um form do VB4 diretamente no VB3. A definio do form deve ser
alterada em um editor de texto (ASC).
VERSON 4.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 5940
'demais propriedades
'...
End
Attribute VB_Name = "Form1"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit
Private Sub Form_Load()
'...
End Sub
3
Mude a verso 4.00 para VERSON 2.00, remova todos os sufixos VB% no comando
Be*in ,orm, remova todas as declaraes Attri#ute. Remova tambm a clusula Pri"ate
de algumas rotinas (eventos). Salve o arquivo e abra-o no VB3.
Por Sa4i Var*hese*, aperf% por $harles A% &'ller
7 - VB3/VB4 - Como caIcuIar as coordenadas (x,y) de quaIquer
posio de um crcuIo
A rotina abaixo (parte da biblioteca $odeBank) calcula as coordenadas de qualquer
ponto, medida em graus, numa circunferncia, num crculo ou numa elipse. Como voc
pode notar, uma rotina simples, mas extremamente til no desenho de grficos ou
movimentao de objetos.
Public Sub DegreesToXY(CenterX as Long, CenterY as Long, _
Degree as Double, RadiusX as Long, RadiusY as Long, _
X as Long, Y as Long)
Dim Convert as Double
Convert = 3.141593 /180 ' P/180
X = CenterX - (Sin(-Degree * Convert) * RadiusX)
Y = CenterY - (Sin((90 + Degree) * Convert) * RadiusX)
End Sub
Por 5ard 6itt, autor do Visual $omponents +nc%7s $odeBank*
8 - VB3/VB4 - Procurando por nuIos retornados por chamadas DLL
Aps uma chamada a DLL (AP), o valor retornado pode conter um nulo. Um dos meios
de eliminar este nulo procurar o caracter Chr$(0), como neste exemplo.
'yourstring a string retornada pela AP, e pode conter um nulo
Dim CheckForNull as nteger
CheckForNull = nstr(YourString, Chr$(0))
f CheckForNull > 0 then Left$(YourString, CheckForNull - 1)
Por &arc &ercuri*
9 - VB4 - Erros de Licena
Enfrentei um interessante problema tentando instalar a edio !nterprise do VB4 no
Windows 3.1. A nova verso do VB usa o 0e*istry, que no Windows 3.1 limitada a
64Kb. Como consultor de uma grande empresa, tenho muitos softwares instalados no
meu laptop para trabalhar em vrios ambientes de cliente. J havia instalado MS Office,
MS Project e Lotus Suite Standart. O arquivo REG.DAT j estava cheio.
Quando instalei o VB4, no foram indicados erros de instalao. Mas, ao tentar us-lo,
juntamente com alguns controles, surgiram erros de "licena".
Liguei para a Microsoft e recebi a seguinte orientao:
4
1. Remover manualmente o VB4.
2. Remover manualmente todos os OCXs e OCAs do diretrio Windows/System.
3. Remover manualmente a OC25.DLL do Windows/System.
4. Renomear REG.DAT para REG.OLD.
5. Remover todos os itens do grupo Start )p (niciar).
6. Remover as entradas .oad e 0un em WN.N.
7. Remover todos os TSRs de AUTOEXEC.BAT.
8. Se voc utiliza um drive compactado, libere 6MB de espao em um volume no
compactado.
9. "Resete" o micro.
10. Reinicie o Windows e reinstale o VB4.
11. Redefina as opes de sistema.
1ota do VBPJ*8 Se estes erros de licena ocorrerem no Windows 95, remova e reinstale
o VB4 para corrigir o problema.
Por Jim /illi*an*
10 - VB3/VB4 - VaIores de retorno no requeridos
Voc no precisa retornar valores em todas as funes. Mas, uma implementao um
pouco perigosa.
Private Sub Form_Load( )
dice
End Sub
Function dice ( ) As Integer
dice = nt(Rnd * 6) + 1
MsgBox "Esta uma rotina que no retorna valor"
End Function
1ota da 0eda9:o8 Esta implementao apenas til em empresas que padronizam
todo o cdigo para funes. Recomendamos o uso de sub e no de function, para um
procedimento que no retorna valor ;$harles A% &'ller<%
ica de Andy 0osa*
11 - VB4 - AtuaIizando Bound ControIs por uma List Box
Quando voc desejar que os Bound $ontrols (controles associados a dados) sejam
atualizados em eventos de listas ou combos, adicione este cdigo no evento click (ou
double-click) da lista ou combo:
Data1.RecordSet.Bookmark = DBCombo1.Selectedtem
Como resultado, seu registro corrente passar a ser o registro com a chave indicada na
lista ou combo. Todos os Bound $ontrols so atualizados automaticamente.
necessrio definir apenas as propriedades 0owSource e .ist,ield. Assim, economiza-se
tempo que seria gasto em converses de dados e atualizao de campos.
Por Peter -lein*
5
12 - VB4 - Destacando uma Iinha em um DBGrid
Para destacar uma linha no controle DBGrid, adicione o registro corrente
SellBookmarks $ollection:
Private Sub DBGrid_RowColChange _
(LatRow As Variant, ByVal LasRow As nteger)
f Data1.RecordSet.RecordCount Then
DBGrid.SelBookmarks.Add _
Data1.RecordSet.Bookmark
End f
End Sub
Por Peter $hyan*
13 - VB3/VB4 - Objetos vazios?
No se pode usar a funo +s!mpty para determinar se uma varivel-objeto (como Form
ou qualquer controle) possui valor. possvel, entretanto, usar a implementao abaixo
para determinar se uma varivel de form (ou outro objeto) est vazia.
f Not frmChild s Nothing Then
Unload frmChild
End f
Por Arn $ota*
14 - VB3/VB4 - Livre-se dos zeros inteis
Vamos retirar os zeros inteis da varivel mystring (que contm "00030"). Abaixo, um
interessante caminho para isto.
Mystring = CStr(Cnt(mystring))
Outro caminho :
Mystring = Str(Val(mystring))
Por Brad 6er#ert* aperf% por $harles A% &'ller
15 - VB3/VB4 - Campos na peneira
Muitas vezes, utiliza-se um campo formatado para exibio, e se grava um valor
"peneirado", ou seja, de um formato especfico. As funes abaixo "limpam" strings de
nmeros ou alfabticos. Esta uma alternativa ao controle &asked !dit.
Function FU_LimpaNumero (campo As String) As String
'recebe string numrica
'retorna string numrica sem pontos, vrgulas etc.
6
'exemplo FU_LimpaNumero("1.245,90") = "1234590"
Dim VA_Posicao As nteger
Dim VA_Caracter As String * 1
Dim VA_Resultado As String
VA_Resultado = ""
VA_Posicao = 1
Do While VA_Posicao <= Len(campo)
VA_Caracter = Mid$(campo, VA_Posicao, 1)
f sNumeric(VA_Caracter) Then
VA_Resultado = VA_Resultado & VA_Caracter
End f
VA_Posicao = VA_Posicao + 1
Loop
FU_LimpaNumero = VA_Resultado
End Function
Function FU_LimpaAIfa (campo As String) As String
'recebe string alfanumrica
'retorna string de letras maisculas sem pontos, vrgulas, nmeros etc.
'exemplo FU_LimpaNumero("Adq-7465") = "ADQ"
Dim VA_Posicao As nteger
Dim VA_Caracter As String * 1
Dim VA_Resultado As String
VA_Resultado = ""
VA_Posicao = 1
campo = UCase(campo)
Do While VA_Posicao <= Len(campo)
VA_Caracter = Mid$(campo, VA_Posicao, 1)
f Asc(VA_Caracter) > 64 And Asc(VA_Caracter) < 91 Then
VA_Resultado = VA_Resultado & VA_Caracter
End f
VA_Posicao = VA_Posicao + 1
Loop
FU_LimpaAlfa = VA_Resultado
End Function
Por $harles A% &'ller
16 - VB3/VB4 - Convertendo Identificadores em RtuIos e
CabeaIhos
Programadores possuem o hbito de criar identificadores (nomes de variveis, por
exemplo) por fuso de palavras como So#re1ome ou $ar*oAnterior. possvel usar
alguns destes nomes para se criar la#els (rtulos) e descries diversas. A funo
abaixo insere espaos, "quebrando" os identificadores a cada inicial maiscula. Assim,
$ar*oAnterior ser convertido para $ar*o Anterior.
Function SpaceName (src As String) As String
Dim i as nteger, tgt As String
tgt = Left$(src,1)
For i = 2 to Len(src)
7
Select Case Mid$(src, i-1, 1
Case "a" to "z"
Select Case Mid$ (src, i, 1)
Case "A" to "Z"
tgt = tgt & " "
End Select
End Select
tgt = tgt & Mid$(src, i, 1)
Next i
SpaceName = tgt
End Function
Por Pat ooley*
17 - VB3/VB4 - AIteraes com Mid
Voc provavelmente j conhece a funo e o comando Mid, que retorna uma substring
com um nmero especfico de caracteres, ou seja, uma parte da string usada como
parmetro. 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
prprios argumentos. Mas, isto economiza uma srie de instrues de
concatenao, observe:
Dim mystring as String
mystring = "SOME STRNG"
f Mid(mystring, 2, 1) = "O" Then
Mid(mystring, 2, 1) = "A" ' substituindo caracter
End f
Por 5illiam Stora*e*
18 - VB3/VB4 - Quando usar SendKeys
A funo Send-eys (que simula o aperto de teclas) adiciona timos recursos de
"interveno" do programador na operao 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)
f cCnt.Enabled Then cCnt.SetFocus
SendKeys KeyValue
End Sub
Por Sa4i Var*hese, aperf% por $harles A% &'ller
8
19 - VB3/VB4 - ResoIuo do Monitor
H uma forma simples de se obter a resoluo de um monitor de vdeo usando uma
AP.
'declarations
Declare Function GetSystemMetrics Lib "User" (ByVal nndex As nteger) as nteger
'...
Sub Form_Resize( )
dim xRes As nteger
dim yRes As nteger
xRes = GetSystemMetrics(0)
yRes = GetSystemMetrics(1)
f xRes < 1024 and yRes < 768 Then
'adicione seu cdigo de controle de dimenses
End f
End Sub
Por San4ay &awalkar*
20 - VB3/VB4 - Fechando todos os forms
Sub UnloadAll ( )
Dim f As nteger
f = Forms.Count
Do While f > 0
Unload Forms(f-1)
f f = Forms.Count Then Exit Do
f = f - 1
Loop
End Sub
Por enis Basaric*
21 - VB4 - SubcIasse para ChDir
Se o seu diretrio de aplicao D:\OldDir, a chamada ChDir(C:\NewDir) ir alterar o
drive corrente para o diretrio NewDir. Mas o diretrio da aplicao continuar sendo
D:\OldDir. Causa: o ChDir altera o diretrio na unidade diferente citada e no muda o
da aplicao. Esta rotina, de classe subdefinida (su#classed), melhora a alterao de
drives:
Sub ChDir(Path As String)
Dim TargetDrive As String
f Mid(Path, 2, 2) = ":\" Then
TargetDrive = Left(Path, 3)
9
f TargetDrive <> Left(CurDir, 3) Then
ChDrive TargetDrive
End f
End f
'chama a funo ChDir do VB
VBA.ChDir Path
End Sub
Por Bruce 6amilton, $entric e"elopment*
22 - VB3/VB4 - Graduando Cores
Este um meio fcil para pintar o fundo de um form, com efeito de uma "cortina
degrad", isto , da cor mais clara no topo, para a cor mais escura na base. Para
especificar a cor usada passe valores true ou false para os parmetros Vermelho, Verde
ou Azul. Combinaes de cores (true) formam outras cores como roxo, amarelo, cinza
etc.
O cdigo abaixo cria o efeito com a cor azul.
FadeForm Me, False, False, True
'qualform, vermelho?,verde?, azul?
J este cria o efeito com a cor ciano (mistura do azul com verde)
FadeForm Me, False, True, True
'qualform, vermelho?,verde?, azul?
O cdigo da rotina segue abaixo
Sub FadeForm (frm As Form, pRed As nteger, pGreen As nteger, pBlue As nteger)
Dim SaveScale As nteger, SaveStyle As nteger, SaveDraw As nteger
Dim y As Long, x As Long, i As Long, J As Long, pixels As Long
'salvar as configuraes atuais do form
SaveScale = frm.ScaleMode
SaveStyle = frm.DrawStyle
SaveDraw = frm.AutoRedraw
'pintar a tela
frm.ScaleMode = 3
pixels = Screen.Height / Screen.TwipsPerPixelY
x = pixels / 64 + .5
frm.DrawStyle = 5
frm.AutoRedraw = True
For J = 0 To pixels Step x
y = 240 - 245 * J / pixels
f y < 0 Then y = 0
frm.Line (-2, J - 2)-(Screen.Width + 2, J + x + 3), RGB(-pRed * y, -pGreen * y,
-pBlue * y), BF
Next J
'restaura configuraes do form
frm.ScaleMode = SaveScale
frm.DrawStyle = SaveStyle
frm.AutoRedraw = SaveDraw
End Sub
Por Timothy .% Birch*
10
23 - VB3/VB4 - Arquivo Existe?
Uma das formas de testar se um arquivo especfico existe utilizando a funo ir=,
com a identificao completa do caminho do arquivo. Dir$ ir retornar o exato nome do
arquivo (se existir) ou um nulo, se no existir. Por exemplo:
f Dir$("C:\MYDR\MYFLE.TXT") <> "" Then
'o arquivo existe
Else
'arquivo no encontrado
End f
Por $huon* Van 6uynh*
24 - VB3/VB4 - Tenha uma Iinha 3D entre um menu puIIdown e uma
barra de ferramentas
Desenhe um 3DPanel com um tamanho (hei*ht) de 30. Este tamanho no fcil de ser
desenhado manualmente. Apague a $aption, mude o Be"el>uter para 1 (inset), #order
para 1 e Ali*n para Top. Desenhe a barra de ferramentas e o menu.
Por &?rio &anuel &our:o $oelho*
25 - VB4/VB3 - Providenciando menus especficos de contexto para
seus objetos de interface
Muito da facilidade do Windows 95 inicia com o fato de que a interface de seus objetos
possui seus prprios menus de contexto, acessados por um simples click no boto
direito do mouse. Voc, desenvolvedor, poder criar seus prprios menus de contexto
tambm . O exemplo abaixo mostra como isto funciona numa list box chamada
lstSample:
1. Defina o menu de contexto, assim como se define qualquer outro menu, como o
menu de help, com seus submenus. Diferente do menu de help, entretanto, este
menu de contexto dever ter a propriedade "isi#le @ false, para que nunca seja visto
pelo usurio na barra de menus pull-down. A caption nunca ser vista pelo usurio,
mas, dever ser algo compreensvel para o programador como $onteAt &enu de
lstSample. O nome, neste exemplo, ser mnuBlstSample. Agora, basta definir os
submenus, que iro aparecer sobre o objeto com o click do boto direito do mouse.
Por exemplo, crie menus como &Remover tem, Remover &Todos, &Adicionar tem
etc.
2. No evento MouseMove do objeto desejado (neste caso, lstSample), invoque o
mtodo PopupMenu.
Private Sub lstSample_MouseDown (button As nteger, Shift As nteger, _
X As Single, Y As Single)
Const vbRightButton = 2 'constante VB4
11
f button And vbRightButton Then
PopupMenu mnu_lstSample
End f
End Sub
3. Deve, obviamente, ser adicionado o cdigo de cada evento menu_click. Veja no help
do VB mais detalhes sobre o mtodo PopupMenu.
Por 6assan a"is*, &icro6elp +nc
1ota da reda9:o8 segundo o autor*, esta uma dica de VB4, mas, j existe menu de
contexto (mtodo popup) no VB3, que funciona no Windows 3.1x (e parcialmente no
Windows 3.0). A diferena que, o mtodo possui menos recursos que no VB4. H um
exemplo no VB3 (SAMPLES/CALLDLLS) que mostra como desenvolver Popup menus
atravs da AP TrackPopup&enu (biblioteca )ser); um exemplo do VB2 que no
deveria estar na verso 3. No VB3, a constante "#0i*htButton chama-se
RGHT_BUTTON. ($harles A% &'ller)
26 - VB4 - Use seus prprios menus popup
Em VB4, se voc quiser mostrar um menu popup para um texto, um menu de sistema
(default) ser mostrado primeiro e o seu menu s aparecer quando o menu default for
fechado. Para contornar este problema:
Private Sub Text1_MouseDown(Button As Integer, _
Shift As nteger, X As Single, Y as Single)
f Button = 2 Then
Text1.EnabIed = False
PopupMenu myMenu
Text1.Enabled = False
End f
End Sub
Por &?rio $oelho*
27 - VB3/VB4 - Criando mItipIos nveis de diretrios
Programas de instalao ou outras aplicaes podem solicitar ao usurio para que
informe onde deseja instalar arquivos ou efetuar alguma operao. Se o diretrio no
existir, ser criado. Mas, o usurio poder informar vrios subnveis de diretrios
inexistentes que devem ser criados. A rotina abaixo cria qualquer diretrio, em todos os
nveis. Basta informar o drive (como C:) e o caminho (como \MYAPP\MYDR\SUBDR) a
ser criado (se no existir). Podem ser criados diretrios de nomes longos em VB4 32
bits, mas, em 16 bits (inclusive VB3), os nomes sero truncados para a conveno C%3.
Voc poder adicionar seu prprio cdigo de manipulao de erros, conforme sua
necessidade.
Abaixo temos um exemplo simples da criao de vrios nveis de diretrios:
Sub CreateLongDir(sDrive as String, sDir as String)
Dim sBuild As String
While nstr(2, sDir, "\") > 1
12
sBuild = sBuild & Left(sDir, nstr(2, sDir, "\") - 1)
sDir = Mid$(sDir, nStr (2, sDir, "\")
f Dir$(sDrive & Sbuild, 16) = "" Then MkDir sDrive & sBuild
Wend
End Sub
Sub Test( )
Call CreateLongDir ("C:", "Test\MyApp\MyDir\Long Directory Name\")
End Sub
Por Jeffrey 0enton*
28 - VB3/VB4 - Mova e redimensione controIes com preciso
Ao desenhar um form, voc pode utilizar mouse e teclado para obter melhor preciso.
Esta dica serve tambm para Access 2 e 7 (95).
A - Quando voc desejar alterar o tamanho de um controle:
1. Selecione-o
2. Pressione SHFT e use as teclas de navegao para alterar o tamanho.
B - Quando voc desejar mover um controle:
1. Selecione-o
2. Pressione CTRL e use as teclas de navegao para alterar a posio.
Por $hris -unicki, repassada por John $hmela ;VB e"eloper7s 1etwork<*
1ota da 0eda9:o8 >s autores informam 3ue a dica ;A e B< se aplica ao VB3, mas, n:o
funciona% Acrescentamos, ainda, al*uns dados a#aiAo%
C - Evitando acidentes
1. O VB4 possui o recurso de trava (lock) de tamanho e posio em tempo de desenho.
Selecione o(s) controle(s) e clique no boto "cadeado", na barra de ferramentas.
2. O VB3 no possui o recurso de "cadeado", mas, possvel mover ou selecionar os
controles com maior cuidado (para alterar vrias propriedades ao mesmo tempo, por
exemplo). Basta selecionar, passando o mouse no form, uma rea em voIta dos
controles. sto no se aplica a controles contidos em outros objetos (como painis,
frames e picture #oAes).
D - Maior preciso
Use os valores numricos de tamanho e posio: left, top, hei*ht 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 Cdigo. Esta tarefa um
pouco rdua, ento, desenhe o controle com medidas aproximadas para depois, ajustar,
via digitao de valores.
Aperf% por $harles A% &'ller
29 - VB4 - GetModuIeUsage em 32 bits
Encontrei uma soluo para o problema, da AP /et&odule)sa*e no trabalhar em
VB4 a 32 bits. A Task+ retornada pela funo Shell pode ser usada por AppActi"ate.
Assim:
TaskD = Shell("DOSAPP.exe", vbNormalFocus)
13
On Error GoTo finished
While True
DoEvents
AppActivate TaskD
Wend
Finished:
On Error GoTo 0
Por John &uiri, repassada por John $hmela ;VB e"eloper7s 1etwork<*
30 - VB3/VB4 - MeIhorando as decIaraes API (I)
Muitas rotinas AP so declaradas como funo, mas, o valor de retorno no sempre
utilizado. A funo Send&essa*e, por exemplo, depende da mensagem enviada, no
importando o valor de retorno. Outro exemplo a funo Shell (se o objetivo for chamar
e no monitorar um programa externo, o retorno no ser utilizado).
Ocorrem chamadas assim:
Dim dummy As nteger
dummy = SendMessage(Text1.hWnd, WM_PASTE, 0, 0&)
A varivel s foi necessria por causa da declarao. Uma alternativa, declarar a
funo como Su# e usar um alias (apelido).
Declare Sub SUB_SendMessage Lib "User" AIias "SendMessage" (byVal hWnd as _
nteger , byVal msg as nteger, byVal wParam as Any, byVal lParam As Any)
Agora, chame pelo nome declarado e no pelo original:
SUB_SendMessage Text1.hWnd, WM_PASTE, 0, 0&
Observe que, seu cdigo ficou mais produtivo de ser mantido.
Por ,rancesco Baleno* ;teAto re"isado por $harles A% &'ller<
31 - VB3/VB4 - MeIhorando as decIaraes API (II - a voIta do
SendMessage)
Quando falava de Send&essa*e ;"e4a dica anterior<, lembrei de um outro truque que
pode ser interessante para ser includo em seus hbitos de programao. Quando uso
algumas mensagens em particular, o argumento lParam , na verdade, considerado
uma combinao de dois valores (words) . A mensagem EM_LNESCROLL pode rolar
uma text box multilinha; a primeira word (low word) contm o nmero de linhas para
rolar verticalmente e a segunda (hight word), contm o nmero de linhas para rolar
horizontalmente.
'rola uma caixa de texto em "HO" linhas
'horizontalmente e "VE" linhas verticalmente
'obs.: isto no funciona corretamente
longValue& = HO * 65536 + VE
...
SUB_SendMessage Text1.hWnd, EM_LNESCROLL, 0, longValue
O cdigo acima no trabalha corretamente se HO for positivo e VE for negativo.
A soluo dividir o nmero long de lParam em dois, na declarao
14
Declare Sub SUB_SendMessage2 Lib "User" AIias "SendMessage" (byVal hWnd as _
nteger , byVal msg as nteger, byVal wParam as Any, byVal lParam1%,_
lParam2)
A chamada passa a ser:
SUB_SendMessage2 Text1.hWnd, EM_LNESCROLL, 0, HO, VE
Este truque funciona, pois um valor long integer na "pilha" corresponde a combinao
de dois valores word combinados.
Por ,rancesco Balena*
32 - VB3/VB4 - SimpIificando chamadas API atravs de funes
prprias
Algumas chamadas funo AP (DLL) so bastante complexas. Uma dica criar uma
funo de cdigo VB que chama a AP. Assim, a complexidade da AP s ir aparecer
uma vez.
Por exemplo, a funo /etPri"ateProfileStrin* que, captura uma configurao de
arquivo N.
Declare Function GetPrivateProfileString Lib "Kernel" (ByVal _
lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault _
As String, ByVal lpReturnedString As String, ByVal nSize As nteger, _
ByVal lpFileName As String) As nteger
A chamada da funo ficaria assim:
Global Const ni_File = App.path & "\Myapp.N)
'...
Dim VA_LastUser
'chamada a AP para capturar o contedo de "lastuser" na seo "options"
On Error GoTo Erro_N
Dim VL_Sec As String, VL_Key As String, VL_Size As nteger
Dim VL_Return As String, VL_FileName As String
Dim VL_SizeHandle As nteger, VL_Valid As nteger
Dim Va_Msg As String
Const CL_Default = "" 'retorno no caso de no encontrar
VL_Sec = "options"
VL_Key = "lastuser"
VL_Size = 30
VL_Return = Space$(VL_Size) 'string a retornar
VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno
VL_FileName = ni_File 'arquivo no formato N
VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _
VL_Return, VL_SizeHandle, VL_FileName)
VA_LastUser = Left$(VL_Return, VL_Valid)
Exit Function 'ou Exit Sub
Erro_LeMeuN:
VA_LastUser = CL_Default
Nota-se uma complexa e grande quantidade de cdigo. A AP no retorna a string
procurada e sim um #uffer. O contedo retornado por um argumento (!) e precisa ser
formatado com o tamanho do buffer (funo left). Para eliminar todo este cdigo a cada
necessidade (cada campo N) foi implementada uma chamada assim:
15
Global Const ni_File = App.path & "\Myapp.N)
'...
Dim VA_LastUser
'chamada a AP para capturar o contedo de "lastuser" na seo "options"
Global Const ni_File = "MYAPP.N"
...
VA_LastUser = FU_Le_MeuN ("options", "lastuser", 30)
Abaixo, um exemplo de funo "tradutora" de AP:
Function FU_Le_MeuIni (VL_Sec As String, VL_Key As String, VL_Size As nteger) As
String
'recebe nome da seo e do pargrafo e tamanho da string de retorno
'retorna valor encontrado (string) ou ""
'usa a constante ni_File e
'a AP (Windows 3.1 Kernel) GetPrivateProfileString
On Error GoTo Erro_LeMeuN
Dim VL_Return As String, VL_FileName As String
Dim VL_SizeHandle As nteger, VL_Valid As nteger
Dim Va_Msg As String
Const CL_Default = "" 'retorno no caso de no encontrar
VL_Return = Space$(VL_Size) 'string a retornar
VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno
VL_FileName = ni_File 'arquivo no formato N
VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _
VL_Return , VL_SizeHandle, VL_FileName)
FU_Le_MeuIni = Left$(VL_Return, VL_Valid)
Exit Function
Erro_LeMeuN:
FU_Le_Meuni = CL_Default
Resume Next
End Function
A funo usada como exempIo do VB3, podendo ser usada em VB4 se sua aplicao
for em 16 bits. Mas, o conceito de criar funes "traduzidas" ou "facilitadas" de AP
aplicvel a qualquer verso do Visual Basic.
Por $harles A% &'ller
33 - VB4 - Criando senhas para banco de dados
O Jet Engine 3 (exclusivo32 bits) inclui um novo sistema de segurana 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 usurios
possuem a mesma senha. Entretanto, voc poder usar tanto o recurso de B
Password (senha de BD) como o de work*roup (grupos), ao mesmo tempo (isto , que
dar mais segurana).
Manipule uma DB Password no VB, usando o novo mtodo 1ewPassword (data#ase
o#4ect), com cdigos como este:
Dim wrk As Workspace
Dim db As Database
16
Set wrk = DBEngine. Workspace(0)
Set db = wrk.OpenDatabase("MYDB.MDB",true)
'note que a base deve ser aberta como exclusiva
'alterando a senha atual (em branco) para "NewPass"
db.NewPassword "","NewPass
Por Paul .itwin*
34 - VB4 - Abrindo bases de dados com senha
Na dica anterior mostrei a definio de senhas para bancos Jet 3 (32 bits). Para abrir o
banco necessrio passar a senha no parmetro $onnect. No exemplo abaixo, a senha
"bobo".
Dim wrk As Workspace
Dim db As Database
Set wrk = DBEngine. Workspace(0)
Set db = wrk.OpenDatabase("MYDB.MDB", false, false, ";PWD=bobo")
O parmetro $onnect (4
o
parmetro) case sensiti"e (diferencia A de a) e - ao
contrrio do que diz a documentao do VB - os parmetros eAclusi"e e read-only (2
o
e
3
o
parmetros) devem ser faIsos.
Por Paul .itwin*
35 - VB4 - Posicionando uma Common DiaIog
Ficou triste ao ler a documentao do VB, que dizia "Note: you cannot specify where a
common dialog is displayed" (voc no poder especificar onde mostrada uma
common dialog)? Ento tente isto:
nicie um novo form (que ser usado apenas para isto) em vez de chamar a abertura do
dilogo diretamente do form principal.
(FrmDummy_OpenSaveAs.Hide)
Defina as propriedades .eft e Top conforme desejar e inicie a common dialo* deste
form. No Windows 95 (VB 4-32 bits) , a common dialog ir aparecer na posio do form
que a chamou. Como o form hide (oculto), isto imperceptvel para o usurio.
Por 0einhard Salchner*
36 - VB3/VB4 - Economize memria com uma picture box
Mudar a propriedade AutoRedraw para true consiste em redesenhar forms
rapidamente e desperdiar alguma memria. Se seu form redimensionvel, o
desperdcio pode ser bem maior, pois, o bitmap persistente criado pelo Auto0edraw
to grande quanto as dimenses mximas do form para revelar a sada oculta, quando
o usurio maximiza ou minimiza a janela. Se o grfico a ser redimensionado (mantido)
17
for pequeno em relao ao form, voc economizar memria se utilizar uma picture
box com Auto0edraw = true e BorderStyle = 0, enquanto o Auto0edraw do form ser
desativado (false).
Por ,rancesco Balena*
37 - VB3/VB4 - Lembra-se do SWAP?
Fiquei surpreso quando notei que no Visual Basic, o comando SWAP do Qbasic no
havia sido implementado. Na rotina abaixo, que usei para ordenar um arquivo, o SWAP
simulado com strings, mas funciona com outros tipos de dado.
Private Sub Form_Load( )
Dim a,b As String * 4
Dim c As String * 4 ' varivel para alternao (Swap)
a = "Joo"
b = "Francisco"
Debug.Print "Antes do swap: " & a & " " & b
c = a
a = b
b = c
Debug.Print "Aps o swap: " & a & " " & b
End Sub
Por a"id ,er#er*
38 - VB3/VB4 - Uma histria de trs beeps
Seus programas no esto executando instrues em VB4 como executavam em VB3?
Tente isto , em Qbasic, VB3 e VB4.
BEEP: BEEP: BEEP
Ao depurar com passo (F8), este mui complexo cdigo, voc ir ouvir trs Beeps,
exceto no VB4. No VB4, paIavras reservadas seguidas de dois pontos (:) so
consideradas labels (rtuIos de desvio).
Assim funciona:
Beep
Beep
Beep
E voc ouvir os to esperados trs beeps.
Por a"id ,er#er*
39 - VB3/VB4 - Converso de NuIos
Em consultas a bancos de dados, o retorno de uma varivel, quando nula, poder no
ser 0 (numrico) ou "" (string). Geralmente se resolve assim:
18
f Not sNull(myrecordset.myfield) Then
myvar = myrecordset.myfield
Else
myvar = ""
'myvar = 0, no caso de numricos
End f
Uma forma mais simples -
myvar = "" & myrecordset.myfield
Ou
myvar = val(0 & myrecordset.myfield) ' para numricos
Por /arold &inkin* aperf% por $harles A% &'ller
40 - VB4 - Determinando a cIasse de quaIquer objeto
No VB4, o comando Type>f trabalha com qualquer objeto vlido. Exemplo:
'Esta rotina imprime informaes especficas de objetos
Public Sub PrintObjectnfo (YourObject As Object)
f TypeOf YourObject s CDesk then
Print "Object Type: Mesa"
Print "Nmero de pernas: " & YourObject.NumberOfLegs
Elsef TypeOf YourObject s CHouse Then
Print "Object Type: Casa"
Print "Nmero de portas: " & YourObject.NumberOfDoors
End f
'impresso das propriedades de mesmo nome
Print "Data de Venda: " & YourObject.Date
Print "Preo de Venda: " & YourObject.Price
'...
End Sub
Por 6assan a"is*, &icro6elp +nc
41 - VB4 - Identificando um controIe genrico
Quando uma rotina pode trabalhar com muitos tipos de controles diferentes, a funo
Type>, pode detectar o tipo de controle em tempo de execuo:
Function MyFunc (ctI as ControI)
f TypeOf ctl s TextBox Then
'...
Elsef TypeOf ctl s CommandButton Then
'...
'...
End f
End Function
19
Este cdigo funciona em VB3 e VB4. A diferena que no VB4, alm de controles e
forms, qualquer objeto vlido pode ser identificado. O VB4 adiciona ainda, a funo
Type1ame que indica (numa strin*) o nome da classe do objeto:
Function MyFunc (ctI as ControI)
Dim sClassType As String
'typeName novidade do VB4
sClassType = TypeName(ctl)
Select Case sClassType
Case "TextBox"
'...
Case "CommandButton"
'...
'case ...
End Select
End Function
Os nomes das classes de controle, no ambiente do VB, aparecem na Properties
5indow (janela de propriedades, ao lado do nome do controle).
Por Senthil Shanmu*ham*
42 - VB3/VB4 - Removendo o move
Em alguns casos, interessante impedir o usurio de mover um form. No VB isto pode
ser implementado com APs:
Declare Function GetMenu% Lib "User" (ByVal hWnd%)
Declare Function RemoveMenu% Lib "User" (ByVal hWnd%, ByVal nPosition%, ByVal
wFlags%)
'...
Dim Res%
Res = RemoveMenu(GetMenu(Form.hWnd), SC_MOVE, MF_BYPOSTON)
Por Phil Parsons*
43 VB4 - Otimizando consuItas no Jet 3
Se voc precisa analisar a performance de uma 3uery (consulta) no Jet !n*ine 3%D
(banco .MDB), atravs de um plano de execuo de consultas, voc deve adicionar esta
chave de 0e*istry e execut-la no RegEdit.
\\HKEY_LOCAL_MACHNE\SOFTWARE\Microsoft\Jet\3.0\Engines\Debug
Para a nova chave Debug, adicione o nome JETSHOWPLAN (tudo maisculo) e valor
ON. O Jet ir gerar um arquivo chamado SHOWPLAN.OUT, que ir mostrar planos de
execuo de 3ueries associados com sua aplicao. Como estes arquivos podem se
tornar muito grandes rapidamente, no se esquea de alterar o valor para OFF ao
terminar.
Queries e bases de dados bem definidas iro gerar planos que, indicaro o uso de
ndices e/ou a tecnologia 0ushmore. Bases e consultas mal definidas exibem apenas
uma leitura de tabela.
20
Por 0o# -aratEas*
44 - VB3/VB4 - Piscar ou no piscar
Geralmente, ao criar uma ajuda de barra de situao (status #ar help), voc ir
adicionar cdigo no evento &ouse&o"e 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 vrias 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 funo que
controla a barra de status.
Global Const CG_EXPLCAPADRAO = "Pressione F1 para obter ajuda."
'...
Sub SU_Explica (oque As String)
'rotina em VB3, usa um painel 3D
oque = Trim(oque)
f oque = "" Then oque = CG_EXPLCAPADRAO
f Len(oque) > 1 And Right$(oque, 1) <> "." Then
oque = oque & "." 'acrescenta ponto final
End f
'muda a inicial para maiscula
f Len(oque) > 1 Then
oque = UCase(Left(oque, 1)) & Right(oque, Len(oque) - 1)
Else
oque = UCase(oque)
End f
'altera a barra se o novo contedo for diferente
f MainForm.PA_Status.Caption <> oque Then
MainForm.PA_Status.FloodShowPct = False
MainForm.PA_Status.FloodType = 0
MainForm.PA_Status.Caption = oque
End f
End Sub
A funo usa uma constante (CG_EXPLCAPADRAO) que, contm uma frase genrica,
para quando no houver o que explicar sobre um form ou objeto.
Para chamar a funo:
Sub CmdOK_MouseMove(Button As nteger, Shift As nteger, X As Single, _
Y As Single)
SU_Explica "Grava as alteraes no banco de dados."
End Sub
Pode ser utilizado tambm o evento /ot,ocus (para resposta ao teclado). Neste caso, o
.ost,ocus dever limpar a barra de status (como a frase genrica).
Sub txtNome_LostFocus ( )
SU_Emplica ""
End Sub
Por a"e 0o#ins*, aperf% por $harles A% &'ller
21
As trFs prGAimas dicas se referem ao 3ue mostrar para os usu?rios em processos
demorados8
45 - VB3/VB4 - Travou tudo?
Em alguns processos demorados, como consultas a bancos de dados, o usurio tem a
impresso de que o sistema "travou". No Windows 3.1x, esta sensao maior (pois o
controle de tarefas mais rudimentar). Para minimizar o problema, estes loops (laos
de repetio de cdigo) demorados devem conter uma instruo DoEvents. Para no
assustar o usurio, alterada a propriedade MousePointer do Form para ampulheta
(hour*lass) ou aparece uma mensagem (ou percentuais) na barra de status.
Para mudar o ponteiro do mouse:
'antes
Me.MousePointer = 11 'hourglass (ampulheta)
ExecutarProcessoDemorado
'depois
Me.MousePointer = 0 'padro
Neste caso, se o sistema operacional for o Windows 95 (ou outro Win32), o usurio
poder definir um cone animado nas suas configuraes.
Outra forma utilizar um 3 Panel como barra de progresso percentuaI, usando as
propriedades ,loodPercent, ,loodShowPct e ,loodType (detalhes no help do VB).
Estes so os recursos mais comuns. Mas, se a barra de status j estiver sendo utilizada
como contador percentual, onde exibirei uma mensagem de "aguarde processando..."?
E se eu desejar algo com maior destaque que um simples ponteiro de mouse?
No possvel utilizar um form para isto ou uma caixa de mensagem, pois, eles
esperariam uma ao do usurio - o que interromperia o processamento.
A soluo incluir, no MD Form (form principal), uma "faixa de aguarde". Assim:
1) No MD Form de sua aplicao (aqui chamado de F00), insira uma picture #oA, que
ser chamada P+_A*uarde. Esta picture box ser como uma barra de ferramentas. A
propriedade Ali*n dever ser 1 (Ali*n Top). Esta a "faixa de aguarde". Atribua false
para a propriedade Visi#le.
2) Na P_Aguarde, insira um rtulo (la#el), chamado .B_&s*A*uarde. Use um tamanho
e formato de fonte que d bastante destaque ao texto.
3) Voc poder inserir ainda, ao lado do label, uma outra picture (pequena e para
enfeite), contendo um desenho que remeta idia de espera. Este desenho, poder
ser um cone de um semforo.
4) Em um mdulo (.BAS), insira a rotina S)_A*uarde, para manipular a faixa.
Eis o cdigo da rotina:
Sub SU_Aguarde (VA_Liga As nteger, VA_Msg As String)
'recebe VA_Liga (true/false)
'mostra a picture de aguarde com VA_Msg ou padro
f VA_Liga Then
F00.P_Aguarde.Visible = True
screen.MousePointer = 11 'hourglass
VA_Msg = Trim$(VA_Msg)
f Len(VA_Msg) = 0 Then
'mensagem padro
VA_Msg = "Por favor, aguarde: processando..."
22
End f
F00.LB_MsgAguarde.Caption = VA_Msg
Else 'desliga
F00.LB_MsgAguarde.Caption = ""
F00.P_Aguarde.Visible = False
screen.MousePointer = 0 'default
End f
End Sub
Esta rotina pblica passa mensagens para a faixa, que ficar ativa durante o processo
demorado. O primeiro parmetro (true/false) liga ou desliga a barra. O segundo passa
uma frase. No caso de frase vazia (""), usada uma frase padro.
Para chamar a rotina:
'antes
SU_Aguarde True, "Por favor, aguarde: consultando tabela de Clientes..."
ExecutarConsultaGrid_Cliente
'depois
SU_Aguarde False, ""
Por $harles A% &'ller
46 - VB3/VB4 - PaineI de PercentuaI
Na dica anterior, citei a barra de progresso percentuaI como uma forma de mostrar ao
usurio como est um processo demorado (assim ele no pensar que o programa
"travou"). Para mostrar um percentual, preciso conhecer o tempo (ou tamanho) total
da operao e a que ponto se est em dado momento de um loop (lao de repetio).
Num programa de instalao, 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 usurio v X% da instalao completa.
Para usar um 3 Panel como barra de percentual, siga estes passos:
1) nsira um 3D Panel, com nome PABStatus, no MDForm (aqui chamado de F00).
Atribua Ali*n @ Ali* Botton.
2) nsira em um mdulo (.BAS) a rotina S)BBarraPerc.
Sub SU_BarraPerc (Perc As Integer, Acum As Integer)
'recebe perc, um nmero de 0 a 100
'100 = "desliga" a barra
'Acum = boolean, acumula o anterior ou no (true/false)
Static VA_Vez
Static VA_SaveCor As Long
f Acum Then
Perc = Perc + F00.PA_Status.FloodPercent
End f
f Perc > 100 Or Perc < -1 Then
MsgBox "Perc deve estar entre -1 e 100", 16, "Erro de parmetro _
em SU_BarraPerc"
Exit Sub
End f
23
f sEmpty(VA_Vez) Or VA_Vez = 1 Then
'liga barra - altera o painel
F00.PA_Status.Caption = ""
F00.PA_Status.FloodShowPct = True
VA_SaveCor = F00.PA_Status.ForeColor
F00.PA_Status.ForeColor = RGB(0, 0, 0)'preto
F00.PA_Status.BevelOuter = 2 'raised
F00.PA_Status.BevelWidth = 3
F00.PA_Status.BorderWidth = 1
F00.PA_Status.FloodType = 1 'left to right
F00.PA_Status.FontSize = 9.75
End f
f Perc < 100 Then
f Perc > 48 Then
F00.PA_Status.ForeColor = RGB(255, 255, 255)'branco
End f
'mostra perc
F00.PA_Status.FloodPercent = Perc
VA_Vez = 2 'ou mais
Else
'desliga barra - reestrutura painel
F00.PA_Status.BevelOuter = 1 'inset
F00.PA_Status.BevelWidth = 1
F00.PA_Status.BorderWidth = 3
F00.PA_Status.FloodType = 0 'none
F00.PA_Status.FontSize = 8.25
F00.PA_Status.ForeColor = VA_SaveCor
F00.PA_Status.FloodShowPct = False
VA_Vez = 1
End f
End Sub
Para chamar a rotina, basta passar o valor atual do percentual. O segundo parmetro,
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 nteger
For i = 1 To 10
SU_BarraPerc (i * 10), False
MsgBox "Clique em OK para continuar"
Next i
SU_BarraPerc (100), False 'desliga a barra
Por $harles A% &'ller
47 - VB3/VB4 - PaineI de PercentuaI com SQL Count
Complementando a dica anterior: Em uma operao de consulta a um banco de dados
(tpica de desenvolvimento comercial), deveremos conhecer o tamanho do retorno da
consulta. O nmero de linhas que ir retornar calculado por um Select $ount
24
(instruo SQL para contador) igual ao Select que, posteriormente, ser usado para a
consulta. O Count uma operao rpida, principalmente em bancos Client Server
(onde o clculo executado no servidor). O retorno do Select Count um nmero,
contendo o total de linhas que seria trazido pela consulta. Com o Count, podero 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 /rid simples com dados de uma tabela. Utilizamos as
rotinas SU_Aguarde e SU_BarraPerc (explicadas nas dicas anteriores).
Sub SU_CarregarGrid ()
Dim VA_Cmd As String
Dim dynatemp As dynaset
Dim dynacont As dynaset
Dim VA_Cont, VA_Curr
Dim VA_SevErro

On Error GoTo Erro_Carregar_Grid
SU_Aguarde True, "Carregando tabela de cidades..."
'rotina acima explicada na DCA ANTEROR
'... limpar o Grid
'... formatar TB_Cidade.text
'query
VA_Cmd = "Select * From CDADE"
f Len(TB_Cidade.Text) > 0 Then
VA_Cmd = VA_Cmd + " Where CDADE.Nome >= '" & (TB_Cidade.Text) & "' "
VA_Cmd = VA_Cmd + "And CDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255)
& "' "
End f
Set dynatemp = db.CreateDynaset(VA_Cmd, VGl_SQLop)
'query do contador
VA_Cmd = "Select Count(*) From CDADE"
f Len(TB_Cidade.Text) > 0 Then
VA_Cmd = VA_Cmd + " Where CDADE.Nome >= '" & (TB_Cidade.Text) & "' "
VA_Cmd = VA_Cmd + "And CDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255)
& "' "
End f
Set dynacont = db.CreateDynaset(VA_Cmd, VGl_SQLop)
f Not dynacont.EOF Then
VA_Cont = dynacont(0)
Else
VA_Cont = 0
End f
f VA_Cont = 0 Then
MsgBox "Nenhum registro de cidade encontrado."
SU_Aguarde False, ""
Gr_Grid.Row = 1
'... marcar outra linha do grid
Exit Sub
End f
'carga do grid
25
Gr_Grid.Rows = VA_Cont + 1
VA_Curr = 1
Do While Not dynatemp.EOF
SU_BarraPerc CInt(VA_Curr * 100 / VA_Cont), FaIse
'rotina explicada na DCA ANTEROR
Gr_Grid.Row = VA_Curr
Gr_Grid.Col = 0
Gr_Grid.Text = dynatemp("CodCidade")
Gr_Grid.Col = 1
Gr_Grid.Text = dynatemp("NomeCidade")
Gr_Grid.Col = 2
Gr_Grid.Text = dynatemp("UF")
VA_Curr = VA_Curr + 1
dynatemp.MoveNext
Loop
'desliga a barra de percentual
SU_BarraPerc 100, faIse
'... demais lgicas
'... (tratamento de erro e formataes)
End Sub
Como esta rotina de carga de grid enorme (e no VB4, o B/rid faz isto sozinho), o
cdigo acima apenas mostra a formao do Select Count e a chamada a
SU_BarraPerc.
Por $harles A% &'ller
48 - VB3 - Mantendo constantes
Melhore o uso do arquivo CONSTANT.TXT. Para um novo projeto, copie o arquivo
CONSTANT.TXT para MYCONST.TXT (para o diretrio do seu projeto). nclua
MYCONST.TXT no seu projeto (menu ,ile Add ,ile). Substitua (menu !dit
0eplace ou CTRL + R) todas as expresses Global por ' Global neste arquivo.
Quando for necessria uma nova constante, basta verificar se a mesma j foi definida
pela Microsoft e remover o a ' do comentrio (reverter a substituio).
Por Stan &lynek*
49 - VB3/VB4 - Inconsistncia no caminho da apIicao (app.path)
Esteja atento quando usar a propriedade path (caminho) do objeto Application (App,
aplicao). Se seu executvel est rodando na raiz de um drive, App.Path retornar o
nome (letra:) na unidade e uma barra (algo como C:\). Apareceu quando o executvel
est em um subdiretrio, a barra final no acrescentada (C:\SUBDR). Para testar e
acrescentar a barra, use o cdigo abaixo que, retornar C:\SUBDR\.
MyPath = App.Path
f Not Right(MyPath, 1) = Chr(92) then
'chr 92 = "\"
26
MyPath = MyPath & Chr(92)
End f
Por $lint 5alker*
50 - VB3/VB4 - BIoqueando funes Copiar e CoIar em caixas de
texto
As funes Copiar (CTRL+C) e Colar (CTRL+V) esto sempre disponveis para text
boxes, mas e se voc no desejar que estas funes funcionem? Voc deve supor que
o evento -eyown consegue detectar CTR+C e CTRL+V, mas no detecta. No evento
-eyPress, estas teclas podem ser capturadas:
Sub Text1_KeyPress (KeyAscii As Integer)
f KeyAscii = 3 Or KeyAscii = 22 Then KeyAscii = 0
'CTRL+C = 3 e CTRL+V = 22, valores no constantes na tabela ANS,
'geram estas combinaes. Recurso no documentado
End Sub
Por Pedro VelaE3ueE ?"ila*
51 - VB3/VB4 - Digitao em Grid
O controle /rid uma tabela de exibio de dados, que no permite a digitao direta
de valores em suas clulas (no estou falando do B/rid). possvel "simular" a
aceitao de teclas atravs de cdigo. Basta um clique de mouse na clula e digitar. O
programador deve ter includo as rotinas abaixo nos eventos -eyown e -eyPress.
Sub Grid1_KeyDown (KeyCode As nteger, Shift As nteger)
Select Case KeyCode
Case &H8 'BACKSPACE
f Len(Grid1.Text) > 0 Then
Grid1.Text = Left(Grid1.Text, (Len(Grid1.Text) - 1))
End f
Case &H2E 'DEL
Grid1.Text = ""
End Select
End Sub
Sub Grid1_KeyPress (keyascii As nteger)
Select Case keyascii
Case s <> 8, 9, 10, 13'no imprimveis
Grid1.Text = Grid1.Text & Chr(keyascii)
End Select
End Sub
No evento -eyPress todos os caracteres imprimveis so acrescentados ao texto da
clula ativa do /rid. O evento -eyown apaga o ltimo caracter com BACKSPACE ou o
texto inteiro com a tecla DEL.
Por $harles A% &'ller.
27
52 - VB3/VB4 - O Caracter ENTER
Ele nunca aparece, mas existe. No Word representado por um , nas caixas de texto
do VB aparece um (caracter no imprimvel). Mas como aceitar e gerar este caracter?
1) No evento -eyPress, o caracter digitado (parmetro -eyAscii) vale 10 ou 13 (os dois
valores do ENTER na tabela de caracteres ANS).
2) Em quaisquer consistncias (como TeAtBoAB$han*e ou anlise de variveis strin*) a
funo Asc retornar 10 ou 13.
Texto = Left(Texto, (Len(Texto) - 1))
f Asc(texto) = 10 or Asc(texto) = 13 then msgbox "Foi digitado um ENTER"
3) Numa teAt#oA, preciso gerar (via funo chr) o caracter 10 mais o caracter 13.
text1.Text = "linha 1"
text1.Text = text1.Text & Chr$(13) & Chr$(10) & "linha 2"
text1.Text = text1.Text & Chr$(13) & Chr$(10)
text1.Text = text1.Text & Chr$(13) & Chr$(10) & "linha 4"
4) Numa &s*BoA, basta gerar o caracter 13.
Dim vmsg As String
vmsg = "linha 1"
vmsg = vmsg & Chr$(13) & "linha 2"
vmsg = vmsg & Chr$(13)
vmsg = vmsg & Chr$(13) & "linha 4"
MsgBox vmsg, 0, "texto 2"
Por $harles A% &'ller.
53 - VB3/VB4 - Limpando Combos Read-OnIy
Numa $om#oBoA com a propriedade Style = 2 (dropdown list), a propriedade TeAt
somente-para-leitura. sto impede limpeza e troca de contedo por esta propriedade, em
construes como estas:
Combo1.text = "" 'ou
Combo1.text = "novo contedo"
A soluo limpar a com#o com o mtodo clear e adicionar o valor novo.
Combo1.Clear
Combo1.Addtem "novo contedo "
Por $harles A% &'ller.
54 - VB3/VB4 - Brancos no controIe Masked Edit Box
O controle &S &asked !dit apenas aceita entrada de dados dentro da mscara
formatada (mask). sto impede o programador de limpar a text do controle diretamente
(masked1.text = ""), pois, o caracter espao (ou nulo) pode no se encaixar no formato
da mscara. Por exemplo, algumas possuem o formato # (aceitam somente nmeros).
Logo, o "" no seria aceito. Este problema resolvido por este cdigo:
28
vTemp = masked1.mask
masked1.mask = ""
masked1.text = ""
masked.mask = vTemp
Removendo a mscara possvel limpar o texto. Depois, basta devolver a mscara
original ao controle. Uso isto no evento Data1_Validation!rror quando adiciono um novo
registro.
Por Scott 5allace*
55 - VB3/VB4 - Forando caracteres maiscuIos
Para facilitar a digitao de maisculos, independente do pressionamento de CAPS
LOCK, converta cada caracter no evento -eyPress.
Private Sub Form_KeyPress (KeyAscii as nteger)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub
Para que esta rotina funcione para todos os campos do form, altere a propriedade
-eyPre"iew do mesmo para true.
Balamurali Bala4i*
56 - VB3/VB4 - Pinte meu mundo ... nas cores padro!
Apenas aps executar o ltimo "make !H!", troque seu esquema de cores e veja
quantos fundos de cores voc possui fora do padro (escoIhido peIo usurio finaI, via
PaineI de ControIe). nfelizmente, muitos controles customizados (VBX/OCX) pecam
neste detalhe importante.
Atravs do Painel de Controle, tente o esquema "deserto" no Windows 95, ou "vero"
no Windows 3.1x, ou ainda, crie um outro esquema horroroso. sto o ajudar a testar
suas aplicaes de cores.
O VB4 dispe de 24 cores de sistema como constantes. No VB Help, procure por "$olor
$onstants" ou "VBTranslate$olor". Copie o valor hexadecimal para a propriedade de cor
de seu objeto se ele foi erroneamente redefinido (fora do padro). Tambm possvel
copiar os valores de controles que estejam corretos, mas cuidado, a face do boto por
exemplo, pode no ser cinza.
Por $lint 5alker*
1ota do VBPJ*: Na nova paleta de cores do VB4, h um boto Deault, que altera as
cores do objeto selecionado para o padro do Windows. Verifique se a propriedade
Appearance 3 para obter melhores resultados.
1otas do ,Grum Access ;$harles A% &'ller<8 1) uma regrinha antiga. Nunca mude as
cores que, o usurio, que o cIiente, define externamente (no Windows), a menos que
isto traga utiIidade. Nestes casos, esteja atento para o significado das cores e sua
harmonia (afinal, penteadeiras de camarim na tela no so desejveis). 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 alterao automtica
para as cores padro (alm do boto default).
29
57 - VB3 - Desmarcar todos os itens de uma Iista
Uma forma rpida de retirar qualquer seleo de uma list#oA :
list1.selected (-1) = False
sto no funciona em VB4.
Por John &'ller*
58 - VB4 - Ordenando CoIunas da ListView
D ao seu controle .istView (32 bits) a funcionalidade de ordenao do Windows 95
Explorer. Este cdigo ordena a lista por qualquer coluna. Se a lista j estiver ordenada
por esta coluna, a ordem ser invertida.
Private Sub ListView1_CoIumnCIick _
(ByBal ColumnHeader As ColumnHeader)
Whith ListView1
f (ColumnHeader.ndex -1) = .SortKey Then
.SortOrder = (.SortOrder + 1) Mod 2
Else
.Sorted = False
.SortOrder = 0
.SortKey = ColumnHeader - 1
.Sorted = True
End F
End With
End Sub
Por Joe Tuttle*
59 - VB4 - ProbIemas com o Print
O cdigo abaixo funciona em VB3:
Cls
Print Spc(10); "nforme seu nome:";
currentX = 0
currentY = currentY +1
Print Spc(10); "nforme seu nome:";
Este cdigo falha em VB4. Retirando o ltimo ponto-e-vrgula do primeiro print:
Print Spc(10); "nforme seu nome:"
Acrescente Debug. antes de Print para testar:
Cls
Debug.Print Spc(10); "nforme seu nome:"
currentX = 0
currentY = currentY +1
Debug.Print Spc(10); "nforme seu nome:";
30
Ou mude o comando para:
Print Space(10); "nforme seu nome:";
Por a"id ,er#er*
60 - VB4 - Use o Code ProfiIer para depurao (debug)
Algumas vezes, um erro de execuo se manifesta apenas aps a criao de um EXE e
no em tempo de de#u*. O add-in $ode Profiler poder ajud-lo.
1) Faa uma cpia do seu fonte.
2) Selecione o add-in Code Profiler.
3) Selecione o(s) arquivo(s) de cdigo a serem analisados.
4) Selecione a opo .ine 6it $ount.
5) Selecione o boto Add Profiler $ode.
6) Compile (make !H!) o programa (MYAPP.EXE).
7) Execute o seu cdigo com erro.
8) Volte ao Code Profiler e selecione View 0esults no menu ,ile.
Veja a ltima linha que foi executada ao ocorrer o erro. Voc ter que executar seu
cdigo em modo debug enquanto olha os resultados do Code Profiler.
Por 0ich Spencer*
61 - VB3/VB4 - Onde est o Beep?
Este cdigo elimina o beep quando se tecla ENTER ou TAB em uma text box que
atingiu seu nmero mximo de caracteres.
Sub Form_KeyPress (keyascii as integer)
f KeyAscii = 13 or KeyAscii = 9 Then
KeyAscii = 0
End f
End Sub
Por .onnie BrioadnaA, &ichael >ttomanelli e Preston 5erntE*
62 - VB3/VB4 - TAB automtico para o prximo campo
Esta dica til para desenvolvimento de aplicaes VB com a forma de edio de
terminais 3270 (BM Mainframe). Quando o usurio termina de preencher um campo em
um terminal 3270, o foco imediatamente transmitido para o prximo campo.
Sub Text1.KeyUp (keycode as integer, shift as integer)
f keycode > 47 and keycode < 123 then
f Len(Me.ActiveControl.Text) = (Me.ActiveControl.MaxLenght) then
Sendkeys "{TAB}"
End f
End f
31
End Sub
Por .onnie BrioadnaA, &ichael >ttomanelli e Preston 5erntE*
63 - VB3/VB4 - SimpIificando a condio de um IF
Quando voc escreve um comando F (Se) assim:
f Category = "CM" or Category = "M2" or Category = "P1" or Category = "ZZ" then
ProcesseEmpregado
End f
Poderia simplificar para:
Dim ValidValues as string
ValidValues = "CM M2 P1 ZZ"
f (InStr(1, ValidValues, Category)) > 0 then
ProcesseEmpregado
End f
sto torna o cdigo mais rpido e mais fcil de ser entendido. Note que separei os
valores com " " para no aparecerem strings como "CMM2P1ZZ"; voc poder utilizar
espaos ou outros separadores como vrgulas, ponto-e-vrgulas etc.
Por Jaspreet Sin*h*
1otas de 0eda9:o ;$harles A% &'ller<8
1) Este teste ainda aceitar "C", " P", "2 P" e outras expresses invlidas, por conterem
o separador ou terem tamanho invlido. Para corrigir esta falha, basta usar espao
(apenas) como separador e testar o tamanho da categoria.
Category = trim(Category)
f (nStr(1, ValidValues, Category)) > 0 and Len(Category) = 2 Then
'...
2) Este truque pode ser usado para vrias validaes, como ValidValues =
"abcdefghijlmnopqrstuvxz".
3) Outra forma, ainda mais fcil, criar um pequeno Select $ase, separando os valores
vlidos por vrgulas:
Select Case Category
Case "CM", "M2", "P1", "ZZ"
ProcesseEmpregado
End Select
64 - VB3/VB4 - EIiminando o IF quando possveI
Se voc atribui true ou false para uma varivel (ou propriedade), aps testar certas
condies, poderia faz-lo sem o F. Veja:
f (age > 18 and sex = "M") and (NecessitaSeContigente = true ) Then ServicoMilitar =
true
Pode substituir por:
ServicoMilitar = (age > 18 and sex = "M") and (NecessitaSeContigente)
Outro exemplo:
32
F (age > 25 and Category = "M1") or (age > 35 and Category = "C1") or _
(Age > 45 and Category = "P1") then ExecuteDemissao
Poderia ser:
Dim condicao as nteger 'boolean
condio = (age > 25 and Category = "M1") or (age > 35 and Category = "C1")_ or (Age
> 45 and Category = "P1")
f condicao Then ExecuteDemissao
Por Jaspreet Sin*h*
65 - VB4 - Forms redimensionveis sem barra de ttuIo
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) so mantidas. Utilizando borderstyle = 5 (sizable toolwindows,
no VB4), voc ter um form redimensionvel.
possvel (VB3/VB4) alternar o contedo da Caption, limpando-a quando conveniente.
E no se esquea de acrescentar um boto de Fechar (unload) no seu form!
Por $lint 5alker*
66 - VB3/VB4 - Adicionando segurana a uma base de dados Jet
Para dar segurana a uma base de dados Jet (.MDB), verso 2.5 (Access 2/VB3/VB4-
16 bit) ou verso 3.0 (Access 7/VB4-32 bit), siga estes passos:
1) Use o Access 5ork*roup Administrator para criar um novo grupo de trabalho, com
uma no nula Workgroup D.
2) nicie o Access e altere a senha para o usurio default Admin.
3) Crie um novo usurio, adicione-o no grupo de Administrao, com os privilgios de
administrador. Remova a conta Admin do grupo de administradores.
4) Reinicie o Access, conectando-se como novo usurio, e altere a senha.
5) Execute o Access Security Wizard (para o Access 2, copie de
www.microsoft.com/accdev).
6) Crie o(s) usurios e o(s) grupo(s) de usurio, definindo seus privilgios.
7) No defina nenhuma permisso para o Admin.
Por Paul .itwin*
67 - VB3/VB4 - Passe nothing aos forms com cauteIa
uma boa idia passar o valor nothin* a variveis de form para recuperar memria
alocada pelo mdulo. Executando este recurso para um form j carregado, entretanto,
ir colocar o mdulo em um estado confuso. Veja:
Form2.show
Set Form2 = nothing
33
Form2.show
MsbBox forms.count & " forms carregados"
Unload Form2
Unload Form2
A segunda linha do cdigo tornou form2 nothing, mas o segundo use do form2.show ir
mostrar uma segunda instncia do form2. A Forms Collection ir conhecer as duas
instncias, mas apenas uma ser descarregada (Unload Form2).
Para contornar este problema, em VB4, esteja certo que o form est descarregado. No
possvel executar Set Me = Nothing. Mas, com a estrutura For Each (no existente no
VB3) possvel se conseguir o Nothing, no evento Form_!nload.
Private Sub Form_Unload (Cancel As nteger)
Dim Form As Form
For Each Form n Forms
f Form s Me Then
Set Form = Nothing
Exit For
End f
Next Form
End Sub
Por 5illian Stora*e*
68 - VB3/VB4 - Prevenindo interao do usurio, via MousePointer e
EnabIed
Mudar a propriedade &ousePointer do form no impede a ao do usurio, via mouse
ou teclado, apenas altera o desenho do ponteiro.
Para impedir que o usurio interaja com o sistema em algumas operaes, desenvolvi
esta dica, aplicvel a &+ parent forms (janelas principais de interface mltipla) e seus
&+ children forms (janelas filhas). Em alguns processos demorados (como carga de
banco de dados) mude a propriedade enabled de um MD child para false, assim:
'antes
Me.Enabled = False
Me.MousePointer = 11 'hourglass (ampulheta)
ExecutarProcessoDemorado
'depois
Me.Enabled = True
Me.MousePointer = 0 'padro
No caso de um MD com muitos filhos ativos, crie uma "orms #ollection e desative
(enabled = false) cada form. Depois de desativ-los, use MDForm.Hourglass = false.
Por Al /ehri* Jr*
69 - VB4 - Depure simuItaneamente o servidor OLE e a apIicao
O VB4 no apenas permite a criao de servidores OLE, mas, tambm permite depurar
(de#u*) o servidor e a aplicao cliente ao mesmo tempo. Se voc criar um servidor
34
OLE remoto, altere a propriedade +nstancin* para $reata#le Sin*le)se. sto tornar o
debugging muito mais interessante.
Cada vez que a classe for chamada, a aplicao tentar criar outra instncia do
servidor. O servidor estar rodando em tempo de desenho, e o VB no iniciar outra
cpia de si mesmo para carregar o servidor novamente. A soluo, , temporariamente,
definir $nstancin% & #reatable Multi!se para uso nos testes. No se esquea de voltar
para $reata#le Sin*le)se antes de compilar o servidor OLE.
Por .%J% Johnson*
70 - VB4 - Identificando uma unidade de CD em Rede
A AP de 32 bits bem mais rica que a de 16 bits. Entretanto, a funo /etri"eType
mostra os Drives CDs em Rede, apenas como DRVE_REMOTE (de rede). sto uma
verdade, mas no completa. Combine a chamada a GetDriveType com uma chamada a
/etVolume+nformation 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 GetVolumenformation _
Lib "Kernel32" _
Alias "GetVolumenformationA" _
(ByVal lPRootPathName as String _
ByVal lpVolumeNameBuffer As String _
ByVal nVolumeNameSize As Long _
ByVal lpVolumeSerialNumber As Long _
ByVal lpMaximumComponentLenght As Long _
ByVal lpFileSystemFlags As Long _
ByVal lpFileSystemNameSize As Long) _
As Long
'...
pstrRootPath = "E:\"
pstrVolName = Space$(256)
pstrSystemType = Space$(32)
plngSysTypeSize = Clng(Len(pstr(SystemType))
plnVolNameSize = Clng(Len(pstrVolName))
plngRtn = GetVolumenformation _
(pstrRoothPath, pstrVolName, _
plngVolNameSize, plngVolSerialNum,
plngMaxFileNameLen, plngSysFlags, _
pstrSystemType, plngSysTypeSize)
Por .% J% Johnson*
71 - VB4 - SoIuo para bug no DBGrid
H um srio bug (erro) em VB4, no controle ata#oud /rid usado com forms modais.
Por exemplo, crie trs forms: form1, form2 e form3. Adicione um Command1 (boto) em
cada form. No evento click do boto em form1, chame o form2 como modal. No evento
35
click do boto em form2 chame o form3 como modal. Adicione um DBGrid no form3. No
evento click do boto em form3, use unload form3.
Execute o form1 e aperte nos referidos botes. No clique do terceiro boto, 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.
Soluo: no 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 referncia ao form que chamou.
With FormModal
.propCaller = Me
.Show
End With
Agora altere $aller%!na#led = false no evento .oad do form "modal". Volte para true no
evento )nload.
Por .uis &i*uel da $osta Pereira ,erreira*
72 - VB4 - Propriedade Count, de ControI Array, no documentada
No VB4, cada control array (vetor de controles) uma collection e possui uma
propriedade $ount. sto no ocorre com o VB3. possvel, ento, se criar um loop (lao
de repetio) tendo o Count como valor mximo.
Esta caracterstica no aparece nem nos manuais, nem no help do VB4. Talvez, pelo
fato de que uma control array collection no possui todas as propriedades e mtodos
das demais collections. A propriedade Count e o mtodo tem so suportados, enquanto
os mtodos Add e Remove no o so.
Este pequeno exemplo usa o Count para determinar qual elemento de um vetor de
botes de opo foi selecionado.
Private Sub FindSelectedOption ( )
Dim ij As nteger As nteger
For ij = 0 to Option1.Count - 1
f Option(ij).Value Then
MsgBox str(ij),0, "Opo Selecionada"
End f
Next ij
End Sub
Esta rotina trabalha apenas com nmeros contnuos. Se os elementos forem 0, 1, 3 e 4,
ocorrer um erro (run time error 340), ao se tentar fazer referncia ao item 2.
Por $rai* !"erett*
73 - VB4 - Determinando se um objeto foi definido (Set)
VB4 providencia uma srie de novas capacidades de uso de objetos. Porm, um objeto
deve ser "setado" (definido) antes de ser referenciado. A nica forma de verificar se um
objeto j foi definido atravs do cdigo de erro (91).
Por exemplo:
36
PubIic Function IsSomething (ob As Object) As Long
Dim J as Long
Err.Clear
On Error Resume Next
f TypeOf ob s TextBox Then
J = 1
End f
Select Case Err.Number
Case 91
'error 91 = object not set
sSomethig = false
Case 0
sSomething = true
Case Else
'... outro erro ocorreu
End Select
On Error GoTo 0
End Function
Por !"an ickinson*
74 - VB3/VB4 - Criando Inner Joins (SQL) numa base Access (Jet)
A palavra reservada n, da linguagem SQL (estrutura nner Join) funciona em bases
externas (ODBC), mas causa problemas em bases do Access (MDB). A sintaxe correta
:
SELECT Authors.*
FROM C:\VB\Biblio1.Authors
NNER JON C:\VB\Biblio2.MDB.Titles
NNER JON C:\VB\Biblio3.MDB.Publishers
NNER JON C:\VB\Biblio4.MDB.[Publisher Comments]
ON Publishers.PubD = [Publisher Comments].PubD
ON Titles.PubD = Publishers.PubD
ON Authors.Au_D = Titles.Au_D
Os comandos de uso do SQL (como CreateDynaset) devem estar em uma s linha (ou
_, no VB4). Usamos como exemplo, a base BBLO.MDB dividida em 4 bases, uma com
cada tabela.
Ao usar ODBC, trabalhe com a clusula N. Veja no Help do VB detalhes sobre o SQL.
Por &ark P% Atwood*, teAto re"isado por $harles A% &'ller
75 - VB4 - O desafio de criar Add-ins
Escrever add-ins (recursos adicionais) para o VB4 pode ser desafiador, recompensador
e melindroso. Se voc no tomar cuidado, o VB poder "estranhar" algumas coisas e
abortar. Podem aparecer vrias mensagens, dependendo do sistema operacional. As
mensagens so diversas, mas o resultado o mesmo.
37
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 DE est sendo descarregada (unloaded) e ser
executada numa posterior abertura do VB com o aviso "AAAAA add2in could not #e
loaded, do you want to remo"e it from the list of add2ins?"
Aps 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 VBDE nstance Object, como
Acit"ePro4ect.,ile1ame no evento $onnectAddin da $onector $lass.
2) Conectando mais menus ou submenus que voc desconectou.
Programao , predominantemente, uma cincia exata e muitas "regras no
documentadas" so uma real necessidade ao se criar um add-in.
Por .es Smith*
76 - VB4 - Evitando Erros de AtuaIizao em Bases Access
Evite o erro de acesso 3260 ("$ouldn7t updateI currently record is locked #y user
7Juser1ameK7 on machine 7Juser&achine+K'"), que ocorre quando duas ou mais
aplicaes acessam a mesma tabela de uma base de dados Access (Jet). O acesso
realizado por objetos recordset (como ta#le ou dynaset), sobre uma tabela que
contenha uma chave (primria ou no).
Se uma das aplicaes est ociosa (apenas abriu o registro e ainda no o alterou) e
outra aplicao tenta alterar ou adicionar dados, o erro citado ocorre. Para evitar este
problema, inclua o mtodo +dle d#,ree.>cks aps o recordset ser aberto. Se for um
ta#le recordset, inclua-o aps ter definido a propriedade ndex. Veja um exemplo:
Set db = Workspaces(0).Opendatabase("Test.mdb")
Set TB = Db.OpenRecordSet("Customer_Master", dbOpenTable)
TB.ndex = "PrimaryKey"
DB.Engine.IdIe (dbFreeLocks)
Por 0a4esh Patil*
77 - VB4 - Descarregando DLLs fora de controIe
Quando uso VB em Windows 95, s vezes ocorre que, um programa torne o sistema
operacional instvel. Costumava derrubar o Windows 95 e reiniciar para limpar a
memria de todos os VBXs e DLLs. Mas descobri, recentemente, uma forma mais
prtica:
Criei um arquivo DOS Batch chamado RESTART.BAT, no seu disco rgido, com este
contedo:
EXT
No Windows 95, criei um atalho para este BAT. O modo DOS selecionado, nas
propriedades, como Pro*ram L Ad"anced. Este caminho muito mais rpido que um
re#oot.
Por &ichael J% yer*
38
78 - VB3/VB4 - Movendo itens em uma Iist box
Para, atravs do mouse, mover a localizao de um item numa list box, use o cdigo
abaixo.
'declarations:
Dim Tmp_Text As String
Dim Old_index As nteger
Dim New_index As nteger
'mouse events:
Sub List1_MouseDown (Button As nteger, _
Shift As nteger, X As Single, Y As Single)
Old_index = List1.Listndex
Tmp_text = List1.text
End Sub
Sub List1_MouseUp (Button As nteger, _
Shift As nteger, X As Single, Y As Single)
New_index = List1.Listndex
f Old_index <> New_index Then
List1.Removetem Old_ndex
List1.Addtem TmpText, Newndex
End f
End Sub
Por &?rcio $ristiano de $astro Scotti*
79 - VB3/VB4 - Sub Main, iniciando um projeto sem interface
Nem sempre necessrio 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 inicializao muito longo, com abertura de banco de dados, testes para
verificar se o sistema pode ou no ser inicializado, leitura de 0e*istry ou arquivos N,
etc.
2) Quando o sistema rodar em "background", ou seja, em segundo plano. Este
sistema no ter janelas (forms) para interao com o usurio.
No Visual Basic, o recurso bastante simples. Primeiro, se informa ao VB que o projeto
iniciar com uma Sub Main (esta informao passada nas opes de projeto -
>ptions Pro4ect Start )p ,orm = Su# &ain.) Depois, basta incluir em um dos
mdulos de cdigo (.BAS), uma rotina com este nome.
Sub Main
'rotinas de inicializao e leitura de opes
'logon, abertura de banco de dados e restante da inicializao
'mostra o primeiro form
form1.show
End Sub
Por $harles A% &'ller.
39
80 - VB3/VB4 - Capturando parmetros
Todos se recordam das velhas linhas de comando nos programas DOS: dir Ls, pkunEip
2", del Lp, mysys LM, myeditor myfile%tAt 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 prprio 0e*istry do Windows
passa os devidos parmetros ao executar uma aplicao associada a um tipo de
arquivo. Assim, aplicativos da linha Office podem ser disparados para abertura e
impresso de arquivos ou execuo de macros. Para "capturar" a linha de comando
com os parmetros de um executvel em VB, basta utilizar a funo $ommand:
Select Case UCase(Trim(Command$))
Case "/A"
frmAvanc.Show 'usurios avanados
Case "/M"
frmMedios.Show 'usurios mdios
Case Else
frmBasico.Show 'default, usurios novatos
End Select
A captura de parmetros ocorre normalmente na su# main ou num evento load do form
inicial.
Por $harles A% &'ller.
81 - VB3/VB4 - Onde est o fim?
Uma aplicao do Visual Basic pode ser encerrada de vrias formas: 1) com o
fechamento (unload) do form principal. 2) com o comando Stop (apenas como
interrupo na depurao). 3) com o comando !nd. Este ltimo, fecha todos os arquivos
e limpa todas as variveis. O problema do !nd que esta palavra faz parte de outros
comandos como !nd Su# e !nd +f (fechamento de blocos). magine se voc precisar
depurar um programa para descobrir quais os pontos em que ele encerrado, como
diferenciar o !nd "puro" dos outros? Basta chamar sempre uma funo pblica
(codificada em um .BAS) que "substituir" o !nd. Somente esta funo ter !nd,
facilitando o controle do cdigo.
Public Sub SU_AbortaSis
End 'nico local para o End
End Sub
Private Sub Form_Unload (Cancel As nteger)
...
SU_GravaConfiguracoes
SU_AbortaSis
End Sub
Por $harles A% &'ller.
40
82 - VB3/VB4 - F1 e o HeIp de Contexto
As aplicaes Windows acessam Help (ajuda) diretamente atravs do pressionamento
da tecla F1. Muitas porm, utilizam menus (? Contedo) ou botes (Ajuda). Nestes
casos deve aparecer a pgina de ajuda indicada na propriedade 6elp$onteAt+ do form
ou controle. A soluo ao programador pode ser o uso de AP, com a funo WinHelp,
na biblioteca User (como sugere o exemplo SAMPLES\CONWRKS). Uma forma mais
simples, simular o pressionamento de F1:
Sub AjudaConteudo_Click ()
SendKeys "{F1}"
End Sub
Por $harles A% &'ller.
83 - VB3/VB4 - VaIidando CGC e CPF
Essa brasiIeirssima. Os nmeros de CGC e CPF possuem dgitos verificadores
para... adivinhem ... verificar!
sto obvio. A validao deve ser feita (por qualquer sistema decente) para impedir a
digitao por engano e os CGCs e CPFs falsos ("que coisa feia, tentando passar a
perna na gente"). A funo abaixo no de minha autoria, mas, achei no meu "ba" de
cdigo.
Function Fu_consistir_CgcCpf (VI_CgcCpf As String)
' Esta Rotina Devolver True Se o Cgc/Cpf nformado For valido
' ou False Se o Cgc/Cpf No For Correto
' Para Chamar esta Rotina de Consistncia
' 1 ) Atribuir o valor do CgcCpf a uma Variavel String
' 2 ) Chamar a Rotina com : Fu_consistir_CgcCpf (Variavel)
' Uma Forma Simples de fazer a Consistencia
' Copiando as linhas abaixo (exemplo)
' para dentro do Programa
' Dim Vl_CgcCpf As String
' Vl_CgcCpf = Me.CgcCpf.Text
' f Fu_consistir_CgcCpf(Vl_CgcCpf) = False then
' MsgBox "( Cgc/Cpf nformado No um Cgc/Cpf Correto )"
' Me.CgcCpf.SetFocus
' Exit Sub
' End if

Fu_consistir_CgcCpf = False
Dim VA_CgcCpf As String
Dim VA_Digito As String
Static Numero(15) As nteger
Dim VA_Resto As nteger
Dim VA_Resultado As nteger
Dim VA_SomaDigito10 As nteger
Dim VA_resto1 As nteger
41
VA_CgcCpf = Format(Vl_CgcCpf, "@@@@@@@@@@@@@@")
VA_Digito = Mid(VA_CgcCpf, 13, 2)

Numero(1) = Val(Mid(VA_CgcCpf, 1, 1))
Numero(2) = Val(Mid(VA_CgcCpf, 2, 1))
Numero(3) = Val(Mid(VA_CgcCpf, 3, 1))
Numero(4) = Val(Mid(VA_CgcCpf, 4, 1))
Numero(5) = Val(Mid(VA_CgcCpf, 5, 1))
Numero(6) = Val(Mid(VA_CgcCpf, 6, 1))
Numero(7) = Val(Mid(VA_CgcCpf, 7, 1))
Numero(8) = Val(Mid(VA_CgcCpf, 8, 1))
Numero(9) = Val(Mid(VA_CgcCpf, 9, 1))
Numero(10) = Val(Mid(VA_CgcCpf, 10, 1))
Numero(11) = Val(Mid(VA_CgcCpf, 11, 1))
Numero(12) = Val(Mid(VA_CgcCpf, 12, 1))
Numero(13) = Val(Mid(VA_CgcCpf, 13, 1))
Numero(14) = Val(Mid(VA_CgcCpf, 14, 1))

f Len(Trim(Vl_CgcCpf)) > 11 Then ' Cgc
VA_Resultado = Numero(1) * 2
f VA_Resultado > 9 Then
VA_SomaDigito10 = VA_Resultado + 1
Else
VA_SomaDigito10 = VA_Resultado
End f
VA_Resultado = Numero(3) * 2
f VA_Resultado > 9 Then
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1
Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End f
VA_Resultado = Numero(5) * 2
f VA_Resultado > 9 Then
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1
Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End f
VA_Resultado = Numero(7) * 2
f VA_Resultado > 9 Then
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1
Else
VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado
End f
VA_SomaDigito10 = VA_SomaDigito10 + Numero(2) + Numero(4) + Numero(6)
f Mid(Str(VA_SomaDigito10), Len(Str(VA_SomaDigito10)), 1) = "0" Then
VA_Resto = 0
Else
VA_Resto = 10 - Val(Mid(Str(VA_SomaDigito10), _
Len(Str(VA_SomaDigito10)), 1))
End f
42
f VA_Resto <> Numero(8) Then
Exit Function
End f
VA_Resultado = (Numero(1) * 5) + (Numero(2) * 4) _
+ (Numero(3) * 3) + (Numero(4) * 2) _
+ (Numero(5) * 9) + (Numero(6) * 8) + _
(Numero(7) * 7) + (Numero(8) * 6) + _
(Numero(9) * 5) + (Numero(10) * 4) + _
(Numero(11) * 3) + (Numero(12) * 2)
' Atribui para resto o resto da diviso
' de VA_resultado dividido por 11
VA_Resto = VA_Resultado Mod 11
f VA_Resto < 2 Then
VA_resto1 = 0
Else
VA_resto1 = 11 - VA_Resto
End f
f VA_resto1 <> Numero(13) Then
Exit Function
End f
VA_Resultado = (Numero(1) * 6) + _
(Numero(2) * 5) + (Numero(3) * 4) + _
(Numero(4) * 3) + (Numero(5) * 2) + _
(Numero(6) * 9) + (Numero(7) * 8) + _
(Numero(8) * 7) + (Numero(9) * 6) + _
(Numero(10) * 5) + (Numero(11) * 4) + _
(Numero(12) * 3) + (Numero(13) * 2)
' Atribui para resto o resto da diviso
' de VA_resultado dividido por 11
VA_Resto = VA_Resultado Mod 11
f VA_Resto < 2 Then
VA_resto1 = 0
Else
VA_resto1 = 11 - VA_Resto
End f
f VA_resto1 <> Numero(14) Then
Exit Function
End f
Else ' Cpf
VA_Resultado = (Numero(4) * 1) + _
(Numero(5) * 2) + (Numero(6) * 3) _
+ (Numero(7) * 4) + (Numero(8) * 5) _
+ (Numero(9) * 6) + (Numero(10) * 7)_
+ (Numero(11) * 8) + (Numero(12) * 9)
VA_Resto = VA_Resultado Mod 11
f VA_Resto > 9 Then
VA_resto1 = VA_Resto - 10
Else
VA_resto1 = VA_Resto
End f
f VA_resto1 <> Numero(13) Then
43
Exit Function
End f

VA_Resultado = (Numero(5) * 1) _
+ (Numero(6) * 2) + (Numero(7) * 3) _
+ (Numero(8) * 4) + (Numero(9) * 5) + _
(Numero(10) * 6) + (Numero(11) * 7) + _
(Numero(12) * 8) + (VA_Resto * 9)
VA_Resto = VA_Resultado Mod 11
f VA_Resto > 9 Then
VA_resto1 = VA_Resto - 10
Else
VA_resto1 = VA_Resto
End f
f VA_resto1 <> Numero(14) Then
Exit Function
End f
End f
Fu_consistir_CgcCpf = True
End Function
Por $hales A% &'ller
84 - VB3/VB4 - Performance com a SQL Passthrough
Quando voc acessa uma base dados via ODBC (>pen ata#ase $onnecti"ity), os
drivers ODBC atuaro como tradutores dos seus comandos SQL. A razo disto que,
existe uma linguagem SQL genrica (SQL ANS) e dialetos SQL distintos nos vrios
produtos (linguagens e bancos) disponveis no mercado. Assim, cada fornecedor de
banco de dados poder incluir recursos (como storned procedures) e sintaxes
especficas em seus produtos; existem o SQL da Oracle, o SQL da nformix, o SQL da
Sybase etc. Escrevendo seus comandos em SQL ANS, o ODBC ir "interpretar", em
tempo de execuo, os comandos para a sintaxe SQL do banco que seu usurio
acessa. Esta operao tem uma vantagem e uma desvantagem:
1) A vantagem que um s aplicativo, a priori, poder ser executado - sem alterao de
fontes - em qualquer banco de dados Client Server, pelo padro ODBC. Alm da
portabiIidade de cdigo fonte, existe o ganho em interoperabiIidade: o programa
poder acessar, ao mesmo tempo, bases diferentes. A interoperabilidade
necessria em empresas, por exemplo, que passaram por processos de fuso ou
incorporao com outra empresa (que usa outra "marca" de banco de dados).
2) Desvantagem: a "traduo" impacta consideravelmente na performance do sistema,
o aplicativo (que pode estar rodando em uma grande rede) tornar-se- muito mais
lento.
A soluo pedir ao ODBC que "pule" a traduo que seria realizada pelos seus
drivers. Assim, ganha-se tempo de execuo. Veja este exemplo:
Dim VA_Cmd As String 'comando SQL
Dim snapCidade As Snapshop
Dim VA_Cod As nteger 'cdigo da cidade (campo chave)
44
Const SQLPASSTRHOUGH = 64
'...
VA_Cmd = "Select Cidade, Nome from CDADE where Cidade = " & VA_Cod
Set snapCidade = db.CreateSnapshop(VA_Cmd, SQLPASSTRHOUGH)
A SQL Passthrough o parmetro para "pular" a traduo. No VB4, a constante
chama-se db'()Pass*+rou%+.
O comando SQL passado deve estar na sintaxe especfica do SGBD (ou DBMS)
utilizado. Mesmo assim, o sistema poder continuar como portveI e interoperveI,
seguindo-se os passos abaixo (cdigo parametrizado):
1) Programe todas as consultas em todos os dialetos SQL utilizados pelos seus
usurios, escreva o cdigo de um modo fcil de ser compreendido e alterado.
2) Execute a consulta especfica do banco tal no momento tal. A informao de 3ual
#anco poder estar em entradas de arquivos N ou no Registry.
Por $harles A% &'ller
85 - VB4 - Listas erradas de API
Os utilitrios APLOD16.EXE e APLOD32.EXE acessam o arquivo WN32AP para
passar os parmetros de tipos de dados (Type Declarations) necessrios para chamar
funes Win32 AP. Porm existem erros. Por exemplo:
WN32AP.TXT (incorretamente)diz:
Type COMSTAT
fCtsHold As Long 'errado
fDsrHold As Long 'errado
fRlsHold As Long 'errado
fXoffHold As Long 'errado
fXoffSnet As Long 'errado
fEof As Long 'errado
fTxim As Long 'errado
fReserved As Long 'errado
cbnQue As Long
cbOutQue As Long
End Type
WNT31APTXT, corretamente, diz:
Type COMSTAT
bunch_Of_Bits As Long
cbnQue As Long
cbOutQue As Long
End Type
Por Andy 0osa*
45
86 - VB3/VB4 - CentraIizando Forms (I)
Para mostrar as janelas no meio da tela, podem ser utilizadas estas rotinas. Quando se
deseja centralizar o prprio form, o parmetro ser a palavra &e e a rotina ser
chamada do evento ,ormB.oad.
Sub CenterForm (f As Form)
Screen.MousePointer = 11
f.Top = (Screen.Height) / 2 - f.Height / 2
f.Left = Screen.Width / 2 - f.Width / 2
Screen.MousePointer = 0
End Sub
Para um suave desIocamento do centro, interessante para forms modais, utilize
apenas 85% da medida 6ei*ht da tela:
f.Top = (Screen.Height * .85) / 2 - f.Height / 2
Exemplo de aplicao:
Form1.Load
CenterForm Form1
Form1.Show
Outro exemplo:
Sub Form_Load ( )
CenterForm Me
'...
End Sub
Para centralizar um form no em relao a tela, mas a outro form, utilize a rotina abaixo.
Ela til quando h um form principal do sistema, que geralmente um &+,orm.
Sub SU_CenterChiId (f As Form)
'centraliza um form dentro do MDform (chamado aqui de F00)
Dim VA_X, VA_Y
VA_X = (((F00.ScaleWidth - f.Width) \ 2) + F00.Left)
VA_Y = (((F00.ScaleHeight - f.Height) \ 2) + F00.Top)
f.Move VA_X, VA_Y
End Sub
Por $harles A% &'ller
87 - VB4 - CentraIizando Forms (II - A verso)
A dica anterior mostra como centralizar forms no VB3. A dica tambm aplicvel ao
VB4. Abaixo, h uma outra verso desta rotina. Ela usar um parmetro opcional
(frmParent). O ltimo form lido ser centralizado em relao ao "parent" (pai, o
principal). Na falta do frmParent, a centralizao ocorrer em relao a tela. Lembramos
que esta implementao somente para a verso 4 do VB.
PubIic Sub CenterForm(OptionaI frmParent)
f Forms.Count = 0 then Exit Sub
f IsMissing (frmParent) Or Not TypeOf frmParente s Form then
Forms(Forms.Count -1).Move _
(Screen.Width - Forms(Forms.Count -1).Width / 2, _
46
(Screen.Height - Forms(Forms.Count -1).Height / 2
Else
Forms(Forms.Count -1).Move _
(frmParent.Width - Forms(Forms.Count -1).Width / 2, _
(frmParent..Height - Forms(Forms.Count -1).Height / 2
End f
End Sub
Por enis Basaric*
88 - VB3 - Menu CoIar AIternativo
Se voc usa alguns controles, como o QuickPack Pro (da Crescent), impossvel
atribuir CTRL+V para Editar-Colar. Pois, o texto do Clipboard ser colado duas vezes.
Para manter a tecla de atalho, atribua mnuPaste.caption = "Co&Iar" + Chr$(9) + "CtrI
+ V", na Sub Main ou no form_Load.
Por aniele Al#erti*
89 - VB3/VB4 - J estou no ar?
Algumas aplicaes para Windows podem ter vrias instncias, 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 mltipla
execuo no interessante, por questes de produtividade ao usurio (como o Word,
o File Manager e o Excel) ou segurana (como aplicaes que usam banco de dados).
Os sistemas comerciais (de banco de dados), em geral, s podem ser executados em
uma sesso ao mesmo tempo. O controle disto no VB feito atravs do objeto App.
Dim SaveTitle as string
f App.PrevInstance Then
SaveTitle = App.Title
App.Title = "... segunda chamada ao mesmo programa."
Me.Caption = "... segunda chamada ao mesmo programa, serei fechado"
'se for a Sub Main, a linha acima, obviamente, no existe
'as linhas abaixo fecham a segunda chamada e alternam para
'a primeira
AppActivate SaveTitle
SendKeys "% R", True
End
End f
O cdigo acima deve ser a primeira coisa a ser executada na sua aplicao. Assim, ao
invs de abrir uma segunda sesso do programa, o Windows ir alternar para a sesso
j aberta. sto tambm pode ser feito por APs (,ind5indow, Show5indow e Set,ocus,
da bilblioteca )ser), mas, tem o mesmo efeito e mais trabalhoso.
Por $harles A% &'ller.
47
90 - VB3/VB4 - Seja FeIiz
Voc que j passa horas e horas diante do computador (do VB, do Windows e outros
bichos), tire um tempo para um filme, um livro, a famlia e os amigos.
At a prxima!
Algumas dicas de Visual Basic foram implementadas em uma verso (3 ou 4) e podem
ser utilizadas na outra verso. necessrio, porm, que o leitor observe as pequenas
diferenas de sintaxe existentes entre duas verses. Por exemplo, o VB3 no aceita o
caracter _ para mudana de linha.
As dicas de autor assinalado (*) so uma adaptao do Visual Basic Pro*rammerNs
Journal Technical Tips Supplement ;3
rd
!d%, DCLOP<, da ,awcett Technical Pu#lications
(001-415-833-7100). Acrescentamos traduo e algumas melhorias, alm de dicas
nossas. At a prxima!
Gostaria de participar de um prximo guia de dicas? Ento envie a sua contribuio
para editor@forumaccess.com. As dicas podero ser de VB3, VB4, VB5 (inclusive
CCE), VBScript, VBA, VBA5 e Access.
*CharIes A. MIIer (muller@rla14.pucpr.br), de Curitiba, Editor Adjunto de Visual
Basic da Revista Frum Access, tcnico em Processamento de Dados e Acadmico de
Comunicao (PUC PR). Atua como consultor em nternet, Multimdia e Visual Basic.
48

Você também pode gostar