90 Dicas de Visual Basic



Baixar 426,91 Kb.
Página14/14
Encontro03.05.2017
Tamanho426,91 Kb.
1   ...   6   7   8   9   10   11   12   13   14

77 - VB4 - Descarregando DLLs fora de controle


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

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

EXIT

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



Por Michael J. Dyer*

78 - VB3/VB4 - Movendo itens em uma list box


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

'declarations:

Dim Tmp_Text As String

Dim Old_index As Integer

Dim New_index As Integer

'mouse events:



Sub List1_MouseDown (Button As Integer, _

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

Old_index = List1.ListIndex

Tmp_text = List1.text



End Sub

Sub List1_MouseUp (Button As Integer, _

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

New_index = List1.ListIndex

If Old_index <> New_index Then

List1.RemoveItem Old_Index

List1.AddItem TmpText, NewIndex

End If

End Sub

Por Márcio Cristiano de Castro Scotti*

79 - VB3/VB4 - Sub Main, iniciando um projeto sem interface


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

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

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

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

Sub Main


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

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

'mostra o primeiro form

form1.show

End Sub

Por Charles A. Müller.

80 - VB3/VB4 - Capturando parâmetros


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

Select Case UCase(Trim(Command$))

Case "/A"

frmAvanc.Show 'usuários avançados

Case "/M"

frmMedios.Show 'usuários médios

Case Else

frmBasico.Show 'default, usuários novatos

End Select

A captura de parâmetros ocorre normalmente na sub main ou num evento load do form inicial.



Por Charles A. Müller.

81 - VB3/VB4 - Onde está o fim?


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

Public Sub SU_AbortaSis

End 'único local para o End

End Sub


Private Sub Form_Unload (Cancel As Integer)

...


SU_GravaConfiguracoes

SU_AbortaSis

End Sub

Por Charles A. Müller.

82 - VB3/VB4 - F1 e o Help de Contexto


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

Sub AjudaConteudo_Click ()

SendKeys "{F1}"

End Sub


Por Charles A. Müller.

83 - VB3/VB4 - Validando CGC e CPF


Essa é brasileiríssima. Os números de CGC e CPF possuem dígitos verificadores para... adivinhem ... verificar!

Isto é obvio. A validação deve ser feita (por qualquer sistema decente) para impedir a digitação por engano e os CGCs e CPFs falsos ("que coisa feia, tentando passar a perna na gente"). A função abaixo não é de minha autoria, mas, achei no meu "baú" de código.



Function Fu_consistir_CgcCpf (Vl_CgcCpf As String)

' Esta Rotina Devolverá True Se o Cgc/Cpf Informado For valido

' ou False Se o Cgc/Cpf Não For Correto

' Para Chamar esta Rotina de Consistência

' 1 ) Atribuir o valor do CgcCpf a uma Variavel String

' 2 ) Chamar a Rotina com : Fu_consistir_CgcCpf (Variavel)

' Uma Forma Simples de fazer a Consistencia

' é Copiando as linhas abaixo (exemplo)

' para dentro do Programa

' Dim Vl_CgcCpf As String

' Vl_CgcCpf = Me.CgcCpf.Text

' If Fu_consistir_CgcCpf(Vl_CgcCpf) = False then

' MsgBox "( Cgc/Cpf Informado Não é um Cgc/Cpf Correto )"

' Me.CgcCpf.SetFocus

' Exit Sub

' End if


Fu_consistir_CgcCpf = False

Dim VA_CgcCpf As String

Dim VA_Digito As String

Static Numero(15) As Integer

Dim VA_Resto As Integer

Dim VA_Resultado As Integer

Dim VA_SomaDigito10 As Integer

Dim VA_resto1 As Integer


VA_CgcCpf = Format(Vl_CgcCpf, "@@@@@@@@@@@@@@")

VA_Digito = Mid(VA_CgcCpf, 13, 2)

Numero(1) = Val(Mid(VA_CgcCpf, 1, 1))

Numero(2) = Val(Mid(VA_CgcCpf, 2, 1))

Numero(3) = Val(Mid(VA_CgcCpf, 3, 1))

Numero(4) = Val(Mid(VA_CgcCpf, 4, 1))

Numero(5) = Val(Mid(VA_CgcCpf, 5, 1))

Numero(6) = Val(Mid(VA_CgcCpf, 6, 1))

Numero(7) = Val(Mid(VA_CgcCpf, 7, 1))

Numero(8) = Val(Mid(VA_CgcCpf, 8, 1))

Numero(9) = Val(Mid(VA_CgcCpf, 9, 1))

Numero(10) = Val(Mid(VA_CgcCpf, 10, 1))

Numero(11) = Val(Mid(VA_CgcCpf, 11, 1))

Numero(12) = Val(Mid(VA_CgcCpf, 12, 1))

Numero(13) = Val(Mid(VA_CgcCpf, 13, 1))

Numero(14) = Val(Mid(VA_CgcCpf, 14, 1))

If Len(Trim(Vl_CgcCpf)) > 11 Then ' Cgc

VA_Resultado = Numero(1) * 2

If VA_Resultado > 9 Then

VA_SomaDigito10 = VA_Resultado + 1

Else

VA_SomaDigito10 = VA_Resultado



End If

VA_Resultado = Numero(3) * 2

If VA_Resultado > 9 Then

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1

Else

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado



End If

VA_Resultado = Numero(5) * 2

If VA_Resultado > 9 Then

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1

Else

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado



End If

VA_Resultado = Numero(7) * 2

If VA_Resultado > 9 Then

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado + 1

Else

VA_SomaDigito10 = VA_SomaDigito10 + VA_Resultado



End If

VA_SomaDigito10 = VA_SomaDigito10 + Numero(2) + Numero(4) + Numero(6)

If Mid(Str(VA_SomaDigito10), Len(Str(VA_SomaDigito10)), 1) = "0" Then

VA_Resto = 0

Else

VA_Resto = 10 - Val(Mid(Str(VA_SomaDigito10), _ Len(Str(VA_SomaDigito10)), 1))



End If

If VA_Resto <> Numero(8) Then

Exit Function

End If


VA_Resultado = (Numero(1) * 5) + (Numero(2) * 4) _

+ (Numero(3) * 3) + (Numero(4) * 2) _

+ (Numero(5) * 9) + (Numero(6) * 8) + _

(Numero(7) * 7) + (Numero(8) * 6) + _

(Numero(9) * 5) + (Numero(10) * 4) + _

(Numero(11) * 3) + (Numero(12) * 2)

' Atribui para resto o resto da divisão

' de VA_resultado dividido por 11

VA_Resto = VA_Resultado Mod 11

If VA_Resto < 2 Then

VA_resto1 = 0

Else


VA_resto1 = 11 - VA_Resto

End If


If VA_resto1 <> Numero(13) Then

Exit Function

End If

VA_Resultado = (Numero(1) * 6) + _



(Numero(2) * 5) + (Numero(3) * 4) + _

(Numero(4) * 3) + (Numero(5) * 2) + _

(Numero(6) * 9) + (Numero(7) * 8) + _

(Numero(8) * 7) + (Numero(9) * 6) + _

(Numero(10) * 5) + (Numero(11) * 4) + _

(Numero(12) * 3) + (Numero(13) * 2)

' Atribui para resto o resto da divisão

' de VA_resultado dividido por 11

VA_Resto = VA_Resultado Mod 11

If VA_Resto < 2 Then

VA_resto1 = 0

Else


VA_resto1 = 11 - VA_Resto

End If


If VA_resto1 <> Numero(14) Then

Exit Function

End If

Else ' Cpf



VA_Resultado = (Numero(4) * 1) + _

(Numero(5) * 2) + (Numero(6) * 3) _

+ (Numero(7) * 4) + (Numero(8) * 5) _

+ (Numero(9) * 6) + (Numero(10) * 7)_

+ (Numero(11) * 8) + (Numero(12) * 9)

VA_Resto = VA_Resultado Mod 11

If VA_Resto > 9 Then

VA_resto1 = VA_Resto - 10

Else

VA_resto1 = VA_Resto



End If

If VA_resto1 <> Numero(13) Then

Exit Function

End If


VA_Resultado = (Numero(5) * 1) _

+ (Numero(6) * 2) + (Numero(7) * 3) _

+ (Numero(8) * 4) + (Numero(9) * 5) + _

(Numero(10) * 6) + (Numero(11) * 7) + _

(Numero(12) * 8) + (VA_Resto * 9)

VA_Resto = VA_Resultado Mod 11

If VA_Resto > 9 Then

VA_resto1 = VA_Resto - 10

Else

VA_resto1 = VA_Resto



End If

If VA_resto1 <> Numero(14) Then

Exit Function

End If
End If

Fu_consistir_CgcCpf = True

End Function



Por Chales A. Müller

84 - VB3/VB4 - Performance com a SQL Passthrough


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

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

  2. Desvantagem: a "tradução" impacta consideravelmente na performance do sistema, o aplicativo (que pode estar rodando em uma grande rede) tornar-se-á muito mais lento.

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

Dim VA_Cmd As String 'comando SQL

Dim snapCidade As Snapshop

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

Const SQLPASSTRHOUGH = 64

'...


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

Set snapCidade = db.CreateSnapshop(VA_Cmd, SQLPASSTRHOUGH)

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

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



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

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

Por Charles A. Müller

85 - VB4 - Listas erradas de API


Os utilitários APILOD16.EXE e APILOD32.EXE acessam o arquivo WIN32API para passar os parâmetros de tipos de dados (Type Declarations) necessários para chamar funções Win32 API. Porém existem erros. Por exemplo:

WIN32API.TXT (incorretamente)diz:

Type COMSTAT

fCtsHold As Long 'errado

fDsrHold As Long 'errado

fRlsHold As Long 'errado

fXoffHold As Long 'errado

fXoffSnet As Long 'errado

fEof As Long 'errado

fTxim As Long 'errado

fReserved As Long 'errado

cbInQue As Long

cbOutQue As Long

End Type


WINT31APITXT, corretamente, diz:

Type COMSTAT

bunch_Of_Bits As Long

cbInQue As Long

cbOutQue As Long

End Type


Por Andy Rosa*

86 - VB3/VB4 - Centralizando Forms (I)


Para mostrar as janelas no meio da tela, podem ser utilizadas estas rotinas. Quando se deseja centralizar o próprio form, o parâmetro será a palavra Me e a rotina será chamada do evento Form_Load.

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 deslocamento do centro, interessante para forms modais, utilize apenas 85% da medida Height da tela:

f.Top = (Screen.Height * .85) / 2 - f.Height / 2

Exemplo de aplicação:

Form1.Load

CenterForm Form1

Form1.Show

Outro exemplo:

Sub Form_Load ( )

CenterForm Me

'...


End Sub

Para centralizar um form não em relação a tela, mas a outro form, utilize a rotina abaixo. Ela é útil quando há um form principal do sistema, que geralmente é um MDIForm.



Sub SU_CenterChild (f As Form)

'centraliza um form dentro do MDIform (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 Charles A. Müller

87 - VB4 - Centralizando Forms (II - A versão)


A dica anterior mostra como centralizar forms no VB3. A dica também é aplicável ao VB4. Abaixo, há uma outra versão desta rotina. Ela usará um parâmetro opcional (frmParent). O último form lido será centralizado em relação ao "parent" (pai, o principal). Na falta do frmParent, a centralização ocorrerá em relação a tela. Lembramos que esta implementação é somente para a versão 4 do VB.

Public Sub CenterForm(Optional frmParent)

If Forms.Count = 0 then Exit Sub

If IsMissing (frmParent) Or Not TypeOf frmParente Is Form then

Forms(Forms.Count -1).Move _

(Screen.Width - Forms(Forms.Count -1).Width / 2, _

(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 If

End Sub

Por Denis Basaric*

88 - VB3 - Menu Colar Alternativo


Se você usa alguns controles, como o QuickPack Pro (da Crescent), é impossível atribuir CTRL+V para Editar-Colar. Pois, o texto do Clipboard será colado duas vezes. Para manter a tecla de atalho, atribua mnuPaste.caption = "Co&lar" + Chr$(9) + "Ctrl + V", na Sub Main ou no form_Load.

Por Daniele Alberti*

89 - VB3/VB4 - Já estou no ar?


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

Dim SaveTitle as string

If App.PrevInstance Then

SaveTitle = App.Title

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

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

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

'as linhas abaixo fecham a segunda chamada e alternam para

'a primeira

AppActivate SaveTitle

SendKeys "% R", True

End


End If

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



Por Charles A. Müller.

90 - VB3/VB4 - Seja Feliz


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 família e os amigos.
Até a próxima!

Algumas dicas de Visual Basic foram implementadas em uma versão (3 ou 4) e podem ser utilizadas na outra versão. É necessário, porém, que o leitor observe as pequenas diferenças de sintaxe existentes entre duas versões. Por exemplo, o VB3 não aceita o caracter _ para mudança de linha.



As dicas de autor assinalado (*) são uma adaptação do Visual Basic Programmer’s Journal Technical Tips Supplement (3rd Ed., 08/96), da Fawcett Technical Publications (001-415-833-7100). Acrescentamos tradução e algumas melhorias, além de dicas nossas. Até a próxima!
Gostaria de participar de um próximo guia de dicas? Então envie a sua contribuição para editor@forumaccess.com. As dicas poderão ser de VB3, VB4, VB5 (inclusive CCE), VBScript, VBA, VBA5 e Access.
*Charles A. Müller (muller@rla14.pucpr.br), de Curitiba, é Editor Adjunto de Visual Basic da Revista Fórum Access, técnico em Processamento de Dados e Acadêmico de Comunicação (PUC PR). Atua como consultor em Internet, Multimídia e Visual Basic.












1   ...   6   7   8   9   10   11   12   13   14


©livred.info 2017
enviar mensagem

    Página principal