|
CAPÍTULO
9
DICAS & TRUQUES
Otimização
- Use das cláusulas
"With .. End" sempre que se referir a
mais de uma propriedade ou método de objetos;
- Desligue todos os
controles OCX que o projeto não venha a utilizar
através do menu Tools|Custom Controls;
- Evite uso do tipo de
dados Variant. Utilize a seguinte ordem de
preferência: Integer, Long, Single, Double,
Currency e Variant;
- Use tipos de objetos
específicos ao invés de genéricos. Exemplo:
use TextBox e não Control, use frmMain e não
Form, etc.;
- Use constantes sempre
que possível;
- Prefira Image Control
ao invés de Picture Box, a menos que haja
necessidade de características especiais que o
último provê. O uso do primeiro aumenta a
velocidade e diminui o tamanho do código;
- Use o AutoRedraw
apropriadamente;
- Use Show prematuro
(já na primeira linha) no evento Load de um
formulário. O VB 4 não mostra o formulário
até que todo o código do evento Load tenha sido
executado. Fazendo assim, você estará
fornecendo alguma coisa para ser visto enquanto
outras operações ainda estão em andamento;
- Sempre que possível,
prefira o emprego de arrays de controle
carregados em tempo de execução ao invés de
controles individuais colocados em tempo de
desenvolvimento;
- Quando não for
necessário que o usuário edite o texto, use
Labels ao invés de TextBox;
- Agrupe os
procedimentos que tenham relacionamento entre si
em módulos separados;
- Procure usar arryas
dinâmicos do que fixos. Quando não mais
necessário um dado array, use ERASE ou ReDim
Preserve para descartar dados não necessários;
- Elimine Debug.Print
.... Apesar de ignorados em tempo de execução,
eles estarão presentes no arquivo .EXE,
aumentando o tamanho deste;
- Prefira carregar
imagens em tempo de execução a partir de um
arquivo usando a função LoadResPicture. Imagens
carregadas em tempo de desenvolvimento adicionam
a imagem ao formulário e aumentam o consumo de
recursos do formulário em questão;
- Quando não estiver
mais usando uma imagem em controles do tipo Form,
Picture box ou Image, defina a propriedade
Picture para Nothing. Exemplo: Set
Picture1.Picture = Nothing ;
- Se você usa a
propriedade Image de uma Picture Box ou de um
formulário, o VB cria um bitmap AutoRedraw
(mesmo que a propriedade esteja False). Quando
você não mais precisar desta imagem, ganhe
memória usando o método Cls antes de fazer o
AutoRedraw = false. Exemplo:
picMyPic.AutoRedraw
= True
picMyPic.Cls
picMyPic.AutoRedraw = False
Como remover um formulário Completamente
da Memória
No Visual Basic um
formulário não pode ser completamente removido da
memória através do conhecido comando Unload. Para
removê-lo, você deve incializar o Form para Nothing
(Set Form1= Nothing).
Como Disparar um ShutDown a partir de uma
Aplicação VB
Um shutdown do
microcomputador pode ser dado através de uma função do
API. Inicialmente, Escreva o seguinte trecho de código
em um módulo do VB:
Declare Function
ExitWindows Lib "user32" Alias
"ExitWindowsEx" (ByVal uFlags As Long,
_ ByVal dwReserved As Long) As Long
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1
Em seguida, você pode
colocar o seguinte código em um controle do VB (e.g., um
botão de comando):
Dim RetVal as Long
RetVal = ExitWindows(0, 0)
Como Obter o Nome do Computador onde a
Aplicação VB está Rodando
Às vezes necessitamos
conhecer qual o nome da máquina local onde nossa
aplicação está rodando. Podemos pensar em dar uma
espiada no registro local do Windows95. Esta seria uma
solução possível (abordada em outra dica mais
adiante). Outra solução envolve uma simples chamada a
uma função do API do WIndows95, ou seja:
Declare Function
GetComputerName Lib "kernel32" Alias
"GetComputerNameA" _
(ByVal
lpBuffer As String, nSize As Long) As Long
Function sGetComputerName() As String
Dim sBuffer As String
Dim lBufSize As Long
Dim lStatus As Long
lBufSize = 255
sBuffer = String$(lBufSize, " ")
lStatus = GetComputerName(sBuffer, lBufSize)
sGetComputerName = ""
If lStatus <> 0 Then
sGetComputerName = left(sBuffer,
lBufSize)
End If
End Function
Aqui segue outra maneira,
através de uma class que defina uma WINAPI
do advapi32:
Private Declare
Function RegQueryValueEx Lib
"advapi32.dll" Alias
"RegQueryValueExA" _
(ByVal hkey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Any, _
lpcbData As Long) As Long
Public Function GetLocalComputerName()
Dim RegistryAgent As New
clsRegistryAgentRegistryAgent.RegistryKey =
"\System\CurrentControlSet\Control\ComputerName\
ComputerName"
RegistryAgent.SubKey = "ComputerName"
RegistryAgent.GetValue
GetLocalComputerName = RegistryAgent.KeyValue
End Function
Como enviar um e-mail através de uma
Aplicação VB
Uma das possibilidades de
mandarmos um e-mail através do Visual Basic pode
ser conferida pela seguinte dica:
Option Explicit
Private Declare Function ShellExecute Lib
"shell32.dll" Alias _
"ShellExecuteA"
(ByVal hwnd As Long, ByVal lpOperation As _
String, ByVal
lpFile As String, ByVal lpParameters As String, _
ByVal
lpDirectory As String, ByVal nShowCmd As Long) As
Long
Private Sub Command1_Click()
Dim ret&
ret = ShellExecute(Me.hwnd, "Open",
"mailto:aluiziog@mail.copel.br?SUBJECT=Teste
de e-mail via VB com ShellExecute", _
"", App.Path, 1)
End Sub
Como Alterar Datas de Arquivos via VB
(p.ex. para Refletir a Versão Corrente de um AplicatiVO)
A seguinte dica cria a
possibilidade, através do Visual Basic, de alterarmos
datas de arquivos para que refletitam uma certa versão
que estamos distribuindo:
Private Type
SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type OFSTRUCT
cBytes As Integer
fFixedDisk As Integer
nErrCode As Long
Reserved1 As Long
Reserved2 As Long
szPathName As String * 128
End Type
Const OF_READ = &H0
Const OF_READWRITE = &H2
Private Declare Function OpenFile Lib
"kernel32" _
(ByVal lpFileName As String, lpReOpenBuff As
OFSTRUCT, ByVal wStyle As
Long) As Long
Private Declare
Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Declare Function SetFileTime Lib
"kernel32" _
(ByVal hFile As Long, lpCreationTime As FILETIME,
_
lpLastAccessTime As FILETIME, lpLastWriteTime As
FILETIME) As Long
Private Declare Function GetFileTime Lib
"kernel32" _
(ByVal hFile As Long, lpCreationTime As FILETIME,
_
lpLastAccessTime As FILETIME, lpLastWriteTime As
FILETIME) As Long
Private Declare Function SystemTimeToFileTime Lib
"kernel32" _
(lpSystemTime As SYSTEMTIME, lpFileTime As
FILETIME) As Long
Private Declare Function LocalFileTimeToFileTime
Lib "kernel32" _
(lpLocalFileTime As FILETIME, lpFileTime As
FILETIME) As Long
Function ahtSetFileDateTime(strFileName As
String, dtmDate As Date) As Boolean
Dim hFile As Long
Dim of As OFSTRUCT
Dim st As SYSTEMTIME
Dim ftCreation As FILETIME
Dim ftLastAccess As FILETIME
Dim ftLastWrite As FILETIME
Dim ftLocal As FILETIME
Dim fOK As Boolean
st.wYear = Year(dtmDate)
st.wMonth = Month(dtmDate)
st.wDay = Day(dtmDate)
st.wHour = Hour(dtmDate)
st.wMinute = Minute(dtmDate)
st.wSecond = Second(dtmDate)
hFile = OpenFile(strFileName, of, OF_READWRITE)
If hFile > 0 Then
fOK = GetFileTime(hFile, ftCreation,
ftLastAccess, ftLastWrite)
If fOK Then fOK =
SystemTimeToFileTime(st, ftLastWrite)
If fOK Then fOK =
LocalFileTimeToFileTime(ftLastWrite, ftLocal)
If fOK Then fOK = SetFileTime(hFile,
ftCreation, ftLocal, ftLocal)
CloseHandle hFile
End If
ahtSetFileDateTime
= fOK
End Function
Determinando se a Aplicação VB está
Rodando no Ambiente de Desenvolvimento (IDE)
Às vezes necessitamos dar
um tratamento diferenciado ao comportamento do nosso
código, dependendo se ele está sendo executado no
ambiente de desenvolvimento (IDE) ou via
"executável". Um modo de tratar isto poderia
ser:
Function
InEditEnvironment() as boolean
' Isto aqui funciona com o VB5 - pequenas
alterações deverão ser feitas para os outros
VB's
Dim Mdl$, hInst
Mdl$ = String$(128, Chr$(0))
hInst = GetWindowWord(hwnd, GWL_HINSTANCE)
ModuleName = Left$(ModuleName,
GetModuleFileName(hInst, Mdl$, Len(Mdl$)))
If (Len(Mdl$)) > 0 Then
inEditEnvironment = (
right(UCase(Mdl$), 7) = "VB5.EXE" )
End If
End Function
Copyright © 1998/1999 - Desenvolvido por
Alvaro Augusto de Almeida (isso significa que você pode
manter cópias para uso
particular, mas não para divulgação). Dúvidas e
sugestões serão bem vindas.
|