90 Dicas de Visual Basic



Baixar 426,91 Kb.
Página6/14
Encontro03.05.2017
Tamanho426,91 Kb.
1   2   3   4   5   6   7   8   9   ...   14

29 - VB4 - GetModuleUsage em 32 bits


Encontrei uma solução para o problema, da API GetModuleUsage não trabalhar em VB4 a 32 bits. A TaskID retornada pela função Shell pode ser usada por AppActivate. Assim:

TaskID = Shell("DOSAPP.exe", vbNormalFocus)

On Error GoTo finished

While True

DoEvents

AppActivate TaskID

Wend

Finished:



On Error GoTo 0

Por John Muiri, repassada por John Chmela (VB Developer's Network)*

30 - VB3/VB4 - Melhorando as declarações API (I)


Muitas rotinas API são declaradas como função, mas, o valor de retorno não é sempre utilizado. A função SendMessage, por exemplo, depende da mensagem enviada, não importando o valor de retorno. Outro exemplo é a função Shell (se o objetivo for chamar e não monitorar um programa externo, o retorno não será utilizado).

Ocorrem chamadas assim:

Dim dummy As Integer

dummy = SendMessage(Text1.hWnd, WM_PASTE, 0, 0&)

A variável só foi necessária por causa da declaração. Uma alternativa, é declarar a função como Sub e usar um alias (apelido).

Declare Sub SUB_SendMessage Lib "User" Alias "SendMessage" (byVal hWnd as _ Integer , byVal msg as Integer, byVal wParam as Any, byVal lParam As Any)

Agora, chame pelo nome declarado e não pelo original:

SUB_SendMessage Text1.hWnd, WM_PASTE, 0, 0&

Observe que, seu código ficou mais produtivo de ser mantido.

Por Francesco Baleno* (texto revisado por Charles A. Müller)

31 - VB3/VB4 - Melhorando as declarações API (II - a volta do SendMessage)


Quando falava de SendMessage (veja dica anterior), lembrei de um outro truque que pode ser interessante para ser incluído em seus hábitos de programação. Quando uso algumas mensagens em particular, o argumento lParam é, na verdade, considerado uma combinação de dois valores (words) . A mensagem EM_LINESCROLL pode rolar uma text box multilinha; a primeira word (low word) contém o número de linhas para rolar verticalmente e a segunda (hight word), contém o número de linhas para rolar horizontalmente.

'rola uma caixa de texto em "HO" linhas

'horizontalmente e "VE" linhas verticalmente

'obs.: isto não funciona corretamente

longValue& = HO * 65536 + VE

...


SUB_SendMessage Text1.hWnd, EM_LINESCROLL, 0, longValue

O código acima não trabalha corretamente se HO for positivo e VE for negativo.

A solução é dividir o número long de lParam em dois, na declaração

Declare Sub SUB_SendMessage2 Lib "User" Alias "SendMessage" (byVal hWnd as _ Integer , byVal msg as Integer, byVal wParam as Any, byVal lParam1%,_ lParam2)

A chamada passa a ser:

SUB_SendMessage2 Text1.hWnd, EM_LINESCROLL, 0, HO, VE

Este truque funciona, pois um valor long integer na "pilha" corresponde a combinação de dois valores word combinados.

Por Francesco Balena*

32 - VB3/VB4 - Simplificando chamadas API através de funções próprias


Algumas chamadas à função API (DLL) são bastante complexas. Uma dica é criar uma função de código VB que chama a API. Assim, a complexidade da API só irá aparecer uma vez.

Por exemplo, a função GetPrivateProfileString que, captura uma configuração de arquivo INI.

Declare Function GetPrivateProfileString Lib "Kernel" (ByVal _

lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault _

As String, ByVal lpReturnedString As String, ByVal nSize As Integer, _

ByVal lpFileName As String) As Integer

A chamada da função ficaria assim:

Global Const Ini_File = App.path & "\Myapp.INI)

'...

Dim VA_LastUser



'chamada a API para capturar o conteúdo de "lastuser" na seção "options"

On Error GoTo Erro_INI

Dim VL_Sec As String, VL_Key As String, VL_Size As Integer

Dim VL_Return As String, VL_FileName As String

Dim VL_SizeHandle As Integer, VL_Valid As Integer

Dim Va_Msg As String

Const CL_Default = "" 'retorno no caso de não 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 = Ini_File 'arquivo no formato INI

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_LeMeuINI:

VA_LastUser = CL_Default

Nota-se uma complexa e grande quantidade de código. A API não retorna a string procurada e sim um buffer. O conteúdo é retornado por um argumento (!) e precisa ser formatado com o tamanho do buffer (função left). Para eliminar todo este código a cada necessidade (cada campo INI) foi implementada uma chamada assim:

Global Const Ini_File = App.path & "\Myapp.INI)

'...


Dim VA_LastUser

'chamada a API para capturar o conteúdo de "lastuser" na seção "options"

Global Const Ini_File = "MYAPP.INI"

...


VA_LastUser = FU_Le_MeuINI ("options", "lastuser", 30)

Abaixo, um exemplo de função "tradutora" de API:



Function FU_Le_MeuIni (VL_Sec As String, VL_Key As String, VL_Size As Integer) As String

'recebe nome da seção e do parágrafo e tamanho da string de retorno

'retorna valor encontrado (string) ou ""

'usa a constante Ini_File e

'a API (Windows 3.1 Kernel) GetPrivateProfileString

On Error GoTo Erro_LeMeuINI

Dim VL_Return As String, VL_FileName As String

Dim VL_SizeHandle As Integer, VL_Valid As Integer

Dim Va_Msg As String

Const CL_Default = "" 'retorno no caso de não encontrar

VL_Return = Space$(VL_Size) 'string a retornar

VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno

VL_FileName = Ini_File 'arquivo no formato INI

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_LeMeuINI:

FU_Le_MeuIni = CL_Default

Resume Next

End Function

A função usada como exemplo é do VB3, podendo ser usada em VB4 se sua aplicação for em 16 bits. Mas, o conceito de criar funções "traduzidas" ou "facilitadas" de API é aplicável a qualquer versão do Visual Basic.



Por Charles A. Müller


1   2   3   4   5   6   7   8   9   ...   14


©livred.info 2017
enviar mensagem

    Página principal