Anda di halaman 1dari 196

williamdsilva@aol.com.

br

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

VISUAL BA S I C
Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de Dicas de

1 - Reconhecendo o pressionamento de teclas Enviado por: Visual Basic Brasil Declare as constantes que voc desejar utilizar em um mdulo. Exemplo:

williamdsilva@aol.com.br

Global Global Global Global Global Global Global Global Global Global Global Global Global Global Global Global

Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const

KEY_F1 = &H70 KEY_F2 = &H71 KEY_F3 = &H72 KEY_F4 = &H73 KEY_F5 = &H74 KEY_F6 = &H75 KEY_F7 = &H76 KEY_F8 = &H77 KEY_F9 = &H78 KEY_F10 = &H79 KEY_F11 = &H7A KEY_F12 = &H7B KEY_F13 = &H7C KEY_F14 = &H7D KEY_F15 = &H7E KEY_F16 = &H7F

A listagem de todas as constantes esto no arquivo constant.txt (Uma cpia desse arquivo, que acompanha o VB, est na pgina de arquivos do VBB). Em seguida digite o cdigo no evento KeyDown de qualquer objeto. Exemplo: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = KEY_F12 Then Beep 'Quando f12 for pressionado, toque um Beep. End Sub

2 - Alinhando controles no formulrio Enviado por: Visual Basic Brasil


Para alinhar controles no formulrio, basta incluir o seguinte cdigo no procedimento que voc desejar: Para alinhar horizontalmente: controle.Left = (Form.Width / 2) - (controle.Width / 2) Para alinhar verticalmente: controle.Top = (Form.Height / 2) - (controle.Height / 2)

controle o nome do controle que voc deseja alinhar, e form o nome do formulrio onde est o controle. Se o formulrio que contm o controle, for redimensionvel, ento bom que voc coloque o cdigo no procedimento Form_Resize. Assim, sempre que voc modificar o tamanho do formulrio, o controle ser automaticamente centralizado.

3 - Carregando o projeto que voc quiser Enviado por: Visual Basic Brasil O Visual Basic sempre carrega os mesmos arquivos e custom controls automaticamente quando voc inicia um novo projeto. Na verdade, ele carrega um projeto j existente no seu diretrio. Mas voc pode criar seu projeto para ser carrejado quando iniciar um novo. Basta salvar o projeto como auto32ld.vbp para o VB 32 bits, auto16ld.vbp para o VB 4.0 16 Bits ou autoload.mak para o VB 3.0. Estes arquivos esto no diretrio principal (raiz) do VB. sempre bom que voc faa uma cpia de segurana desses arquivos antes, para qualquer eventualidade... 4 - Formulrio MDI Child Enviado por: Andr Lus Milar de Medeiros Para centralizar um formulrio MDI Child ou coloc-lo em qualquer lugar da tela utiliza-se o seguinte comando no evento Load do MDI child:

williamdsilva@aol.com.br

rem Centralizar me.left = (form1.left - me.left) /2 me.top = (form1.width - me.width) /2 rem Aparecer em qualquer lugar: me.left = (valor) me.top = (valor) rem *** fim do form load ***

5 - Converter texto para Maisculo/Minsculo Enviado por: Lionardo Fonseca Paiva A vai uma funo bastante til... Public Function MMCase(Texto As String) As String 'Esta funo converte o texto para Maiusculo/Minusculo, deixando as 'primeiras letras das palavras em maiusculo. 'respeitando as excees da lingua portuguesa como: de, da, do, das, dos, a, e '***** Autor: Lionardo Fonseca Paiva '***** lionardo@base.com.br Dim Palavra, PosioInicial, PosioFinal Dim resultado As String PosioInicial = 1 Texto = LCase(Texto) & " " Do Until InStr(PosioInicial, Texto, " ") = 0 PosioFinal = InStr(PosioInicial, Texto, " ") Palavra = Mid(Texto, PosioInicial, PosioFinal - PosioInicial) PosioInicial = PosioFinal + 1 If Palavra <> "de" And Palavra <> "da" And Palavra <> "do" And _ Palavra <> "das" And Palavra <> "dos" And Palavra <> "a" And _ Palavra <> "e" Then Palavra = UCase(Left(Palavra, 1)) & LCase(Mid(Palavra, 2)) End If resultado = resultado & " " & Palavra Loop MMCase = Trim(resultado) End Function

6 - Ocultar/mostrar barra de tarefas Enviado por: Visual Basic Brasil Coloque na seo de Declaraes do formulrio: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpexecuta As String, ByVal lpWindowName As String) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As _ Long, ByVal nCmdShow As Long) As Long Const SW_HIDE = 0: Const SW_SHOWNORMAL = 1 Para Ocultar a barra de tarefas: Dim aviso As Long Dim janela As Long Dim executa As String executa = Space(256) executa = "Shell_TrayWnd" janela = FindWindow(executa, vbNullString) aviso = ShowWindow(janela, SW_HIDE) 'Esconde a barra Para Mostrar a barra de tarefas: Dim aviso As Long

williamdsilva@aol.com.br

Dim janela As Long Dim executa As String executa = Space(256) executa = "Shell_TrayWnd" janela = FindWindow(executa, vbNullString) aviso = ShowWindow(janela, SW_SHOWNORMAL) 'Mostra a barra

7 - Abrir URL no navegador padro Enviado por: Visual Basic Brasil Para abrir um link atravs do VB, no navegador padro, coloque o seguinte cdigo na seao de declaraes: #If Win32 Then 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 #Else Private Declare Function ShellExecute Lib _ "shell.dll" _ (ByVal hwnd As Integer, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Integer) As Integer #End If Private Const SW_SHOWNORMAL = 1

No procedimento CLICK de algum controle, digite: Private Sub label1_Click() Dim iret As Long iret = ShellExecute(Me.hwnd, _ vbNullString, _ "http://www.vbbrasil.com", _ vbNullString, _ "c:\", _ SW_SHOWNORMAL) End Sub

8 - Confirmar trmino do programa Enviado por: Visual Basic Brasil Para perguntar ao usurio se ele realmente deseja sair do programa: Private Sub Form_Unload(Cancel As Integer) sair = MsgBox("Tem certeza que deseja sair do programa?", _ vbYesNo + vbExclamation, "Ateno") If sair = vbYes Then End Else Cancel = True End If End Sub

williamdsilva@aol.com.br

9 - Usando a tecla Enter no lugar da tecla Tab Enviado por: Almando Menezes Guimares Esta Dica para quem quer que a tecla enter funcione como um tab para mudar de campo. 1 - Mude a propriedade KeyPreview do formulrio para true. 2 - Coloque o seguinte cdigo no evento KeyDown do formulrio. If KeyCode = vbKeyReturn then Sendkeys "{Tab}" Pronto, agora sempre que for pressionado um enter no formulrio sera disparado um tab. 10 - Letras Maisculas e Minsculas Enviado por: Andr Lus Milar de Medeiros No Evento Keypress utilize, Para Maisculas: KeyAscII= Asc(Ucase(Chr(KeyAscII)))

Para Minsculas: KeyAscII= Asc(Lcase(Chr(KeyAscII)))

Pronto! No necessrio a utilizao de API's

11 - Busca de Strings em um TextBox Enviado por: Fausto Fiorese No General do Form: Public Last_Pos As Integer Public First_Pos As Integer Public Find_String As String Private Sub Text1_GotFocus() 'Valor Default p/ as variaveis Last_Pos = 1 First_Pos = 1 End Sub Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) CtrlDown = (Shift And vbCtrlMask) > 0 If KeyCode = vbKeyF And CtrlDown Then 'Identifica a Tecla Ctrl+F Mensagem = "Entre com o Texto a ser procurado!" Titulo = "Procura" Default = "" Find_String = InputBox(Mensagem, Titulo, Default) If Find_String = "" Then Exit Sub KeyCode = 114 'Forca a passagem pela Busca End If 'As rotinas abaixo verificam se a tecla apertada F3 'A primeira coisa a ser feita verificar se realmente ' existe em algum ponto do TextBox a string informada ' no InputBox. 'Existindo a string, entao verificado se a busca ser feita ' "para baixo" (F3) ou "para cima" (Shift+F3) If KeyCode = 114 Then If InStr(Text1.Text, Find_String) = 0 Then MsgBox "Texto no encontrado!", vbInformation Exit Sub End If If Shift = 1 Then If First_Pos = 0 Or InStr(Mid(Text1.Text, 1, First_Pos), Find_String) = 0 Then First_Pos = Len(Text1.Text) End If For i% = (First_Pos - 1) To 1 Step -1 If Mid(Text1.Text, i%, Len(Find_String)) = Find_String Then Pos% = i% Exit For

williamdsilva@aol.com.br

End If DoEvents Next For i% = (First_Pos - 1) To 1 Step -1 If Mid(Text1.Text, i%, Len(Find_String)) = Find_String Then Pos_Fim% = Len(Find_String) + i% Exit For End If DoEvents Next Last_Pos = Pos_Fim% First_Pos = Pos% Text1.SelStart = Pos% - 1 Text1.SelLength = Pos_Fim% - Pos% Else Pos% = InStr(Last_Pos, Text1.Text, Find_String) First_Pos = Pos% If Pos% = 0 Then Last_Pos = 1 Pos% = InStr(Last_Pos, Text1.Text, Find_String) End If Pos_Fim% = Len(Find_String) + Pos% Last_Pos = Pos_Fim% Text1.SelStart = Pos% - 1 Text1.SelLength = Pos_Fim% - Pos% End If End If End Sub

12 - DoEvents Enviado por: Fabio Quando for trabalhar com processamentos longos, procure sempre utilizar uma ProgressBar ou coisa assim p/ interar o usurio. Voc pode tambm, quando estiver utilizando loops como Do...Loop, For...Next, criar um Boto Cancelar com a funao DoEvents, que retorna a ateno p/ o Sistema. simples, declare en General uma varivel do tipo Booleana. Na Rotina onde ir utilizar o Loop, comece atribuindo um valor False p/ a varivel : Para = false.

Logo quando comear o Loop, faa o seguinte:


Do DoEvents if Para = true then exit sub No Boto Cancelar, s atribua um valor true p/ a varivel: Para = True

muito simples, o loop sempre voltar a ateno p/ o sistema, quando o usurio clicar em cancelar ele muda o valor do Booleano. Isso muito til, e vc pode utilizar DoEvents p/ vrias outras coisas no intuito de no travar seu Micro. Copyright (c) 1996-2001 Visual Basic Brasil 13 - Deixar a Caixa de Texto (TextBox) com o texto selecionado ao entrar Enviado por: Mateus Zambonatto Pezzin Basta colocar no evento GOTFOCUS da caixa de texto, por exemplo, TEXT1, a seguinte rotina: text1.selstart = 0 text1.sellenght = len(text1.text) Simples e eficaz, funciona sempre! 14 - Ajustando os controles dentro do Formulrio Enviado por: Fabio Como j dito em uma dica enviada por no sei quem, podemos centralizar os controles no Form usando os

williamdsilva@aol.com.br

procedimentos j citados. Voc pode tambm, fazer com que o tamanho de seus controle fique proporcional ao tamanho do Formulrio. fcil, veja o tamanho e altura(Width e Height) do Form e do controle que vai utilizar. Veja a diferena entre eles, vamos supor que seja 600. No evento Form_Resize(que ocorre qdo o tamanho da form alterado), atualize a proporo: frame1.width = form1.width - 600 frame1.height = form1.height - 600 Qdo vc maximizar a tela o controle se ajustar, e qdo alterar o tamanho tambm. Nesse evento vc tambm pode escrever os procedimentos p/ centralizar os controles como mandou um colega a, e fazer vrias outras coisas. 15 - Confirmando saida do programa II Enviado por: Rodrigo Meirelles de Mello Modificando a dica existente, assim no se precisa declarar mais uma varivel: If MsgBox("Tem certeza que deseja sair do programa?", _ vbYesNo + vbExclamation, "Ateno") = vbYes Then End Else Cancel = True End If

16 - Salvar Bmp da caixa de imagem Enviado por: Marcelo Nagy Voc j conhece o processo de leitura de um bmp para uma caixa de imagem ? assim: Image1.picture=loadpicture("c:\Windows\carros.bmp") Mas voc tambm pode gravar uma imagem que est em uma caixa de imagem e converte-lo para bmp, gif, etc. assim SavePicture image1, "C:\windows\teste.bmp" fcil ?????!!!!!! Espero que sirva pra alguem falou galera ! 17 - Colocar sempre visivel o form como um Tollbox Enviado por: Armando Estruc Tem que fazer um mdi ou uma a tela principal que seria um mdi, e colocar um form nao child e na hora de chamar este form nao child colocar o seguinte comando Nomedoform.Show , NomedoMid

18 - Colocar Titulos do programa VB para o Crystal Enviado por: Armando Estruc Para mandar coisa do VB para o crystal tem que ir ao crystal e colocar uma formula onde deseja cria um titulo ou mandar outra coisa, na formula colocar o nome e depois a formula que seria assim: "*" Depois Acept No Vb colocar o comando: NomedoRPT.Formulas(0)=" NomedaFormula=" & NomedaVariavelTitulo Para cada coisa que deseja mandar para o crystal deve ter um array diferente.

19 - Fechar um Formulrio Enviado por: Cleiton Oliveira da Silva

williamdsilva@aol.com.br

Para se fechar um formulrio no basta usar o comando unload e o nome do mesmo e sim : Unload Set = Nothing Pois assim estaro sendo fechadas tambm as variveis pertencentes ao formulrio.

20 - Aplicao j iniciada Enviado por: Hantan Para voc verificar se sua aplicao j est sendo executada coloque o sequinte cdigo no inicio do form. If App.PrevInstance Then End Espero que seja til.

21 - Arrendondar casas decimais Enviado por: Hantan Para arredondar casa decimais crie a seguinte funo: Function Round(Nmr As Double, Casas As Integer) As Double Round = Int((Nmr * 10 ^ Casas) + 0.5) / 10 ^ Casas End Function Para chamar a funo utiliza-se: Dim Resultado as integer Resultado = Round([VALOR], [NUMERO DE CASAS]) Text1.Text = Resultado Espero ter ajudado.

22 - Formulrio OnTop Enviado por: Hantan Para manter um formulrio OnTop ou seja, sempre visvel faa o seguinte: Declare o seguinte em um mdulo .BAS: Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags_ As Long) As Long Global Const conHwndTopmost = -1 Global Const conHwndNoTopmost = -2 Public Const SWP_NOMOVE = 2 Public Const SWP_NOSIZE = 1 Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE Para colocar um Form OnTop coloque o seguinte cdigo: SetWindowPos [NOMEDOFORM].hwnd, -2, 0, 0, 0, 0, FLAGS Espero ter ajudado.

williamdsilva@aol.com.br

23 - Reconhecendo o pressionamento de teclas - Mais simples sem mdulo Enviado por: Tercio Filho Para reconhecer o pressionamento de teclas mais fcil coloque o seguinte cdigo no evento keyDown ou keyUp do form ou do objeto: If (KeyCode = [TECLA]) then Beep 'TECLA significa o valor para a tecla pressionada. 'Os valores esto no HELP do VB em "Keycode Constants" 'Ex.: If (KeyCode = VbKeyF2) then Beep 'Toca um Beep quando a teclar F2 for apertada. Abraos. 24 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horrios. Enviado por: Mrcio Britto Neste exemplo, eu usei imagens, mas pode se usar apenas textos... Dim Agora, BomDia, BoaTarde, BoaNoite As Variant, Nome As String Agora = Time$ BomDia = "00:00:00" BoaTarde = "12:00:00" BoaNoite = "19:00:00" If Agora > BoaNoite Then Pic_Noite.Visible = True Pic_Tarde.Visible = False Pic_Dia.Visible = False ElseIf Agora > BoaTarde Then Pic_Noite.Visible = False Pic_Tarde.Visible = True Pic_Dia.Visible = False ElseIf Agora > BomDia Then Pic_Noite.Visible = False Pic_Tarde.Visible = False Pic_Dia.Visible = True End If

25 - Metodo de selecao de registros usando SQL Enviado por: Rodrigo Meirelles de Mello Temos como um exemplo um Banco de dados Agenda com os seguintes campos NOME, TELEFONE, ENDERECO, SEXO Nao citarei como se deve declarar variaveis visto que ja fiz isso em uma dica anterior... Tendo tudo declarado...

williamdsilva@aol.com.br

10

Definido anteriormente que o campo sexo recebe "M" ou "H" Desejo selecionar dentre todo o banco de dados os registros das pessoas do sexo feminino "M" e que moram no humaita... --> Set DYNagenda = DBagenda.createdynaset ("select * from agenda where sexo = ' " & TXTprocurasexo & " ' and bairro = ' " & TXTprocuraBairro & " ' ") Explicando a sintaxe: ("select * from (1)agenda where (2)sexo = ' " & (3)TXTprocurasexo & " ' and (4)bairro = ' " & (5)TXTprocuraBairro & " ' ") (1) Tabela agenda do banco de dados agenda.mdb (2) Campo Sexo (3) TXTProcuraSexo - onde eu informo o sexo... (4) Campo bairro (5) TXTprocurabairro - onde eu informo o Humaita Espero ter ajudado, qquer duvida mail-me... 26 - Metodos de procura, Usando o Find... Enviado por: Rodrigo Meirelles de Mello - DJOP Nesta dica, informarei como se encherga o valor de um campo TXT por exemplo na sintaxe dentro do Find... Exemplo: E em um Mdulo declara-se as variaveis... Global DBagenda as Database Global DYNagenda as Dynaset ------- No form.Load Set DBagenda = OpenDatabase("c:\agenda\arquivo.mdb") ' Define o arquivo de banco de dados Set DYNagenda = DBagenda.OpenTable("agenda") ' Abri a tabela agenda do banco de dados Set DYNagenda = DBagenda.CreateDynaset("agenda") ------Para se procurar por exemplo uma pessoa que more em botafogo Posso usar a seguinte sintaxe... DYNagenda.findfirst "bairro = ' " + TXTbairro + " ' " Desta forma estou procurando no campo bairro o valor do campo TXTbairro se eu nao fizesse esta sintade ( ' " + ??? + " ' ) e coloca-se somente "bairro = TXTbairro" o programa iria procurar a frase TXTbairro. OBS.: O findFist procura o primeiro nome da lista... em seguida coloque uma rotinhazinha de verificacao... tipo: if DYNagenda.NoMatch then msgbox "Nao encontrei nenhuma pessoa que more em" & TXTbairro, , "Agenda eletrnica" Pode-se tb usar o FindFirst, FindNext, FindPrevious e FindLast ----Esta Sintaxe pode ser usada em varias outras formulas, em SQL por exemplo Onde em uma proxima dica colocarei uma sintaxe de selecao em SQL, que muito mais rapido do que o Find, Outro mtodo de pesquisa absurdamente mais rapido que o Find, o Seek mas o Find se encaixa perfeitamente para Banco de dados pequenos... Espero ter ajudado... Qualquer duvida escreva-me. 27 - VB que fala: Bom dia, boa tarde e boa noite nos respectivos horrios. 2 Enviado por: Rodrigo Meirelles de Mello - DJOP

williamdsilva@aol.com.br

11

Analisando uma dica previamente mandada, percebi que as pessoas gostam de declarar variaveis sem necessidade... If time$ > "19:00:00" Then Pic_Noite.Visible = True Pic_Tarde.Visible = False Pic_Dia.Visible = False ElseIf time$ > 12:00:00 Then Pic_Noite.Visible = False Pic_Tarde.Visible = True Pic_Dia.Visible = False ElseIf time$ > 00:00:00 Then Pic_Noite.Visible = False Pic_Tarde.Visible = False Pic_Dia.Visible = True End If Deste modo nao se declara variaveis...

28 - Colocar um "Continua..." em relatrios do Crystal Reports Enviado por: Uriel Papa Para quem deseja colocar a expresso "Continua..." no final de cada pgina do relatrio, com excesso da ltima, aqui vai a dica: Escolha um campo da linha de detalhes que nunca receba valores nulos (Campo_A). Insira a seguinte frmula no bottom da pgina: If NextIsNull({Campo_A}) then "" Else "Continua..."

[]'s, Uriel 29 - Usando o objeto printer para imprimir formulrios. Enviado por: Cecil Weiss Coloca o vb no modo de impresso de caracteres Printer.ScaleMode = 4 Printer.CurrentX = 0 'coluna Printer.CurrentY = 0 'linha Printer.Print "Nome=" Printer.CurrentX = 7 'coluna Printer.CurrentY = 0 'linha Printer.Print "Nome=" Experimente estes cdigos, usando "scalemode", voce pode imprimir usando medidas por caracteres, pixels, twips, etc... veja abaixo a tabela. vbUser = 0: Indica que uma ou mais das propriedades ScaleHeight, ScaleWidth, ScaleLeft e ScaleTop esto configuradas

williamdsilva@aol.com.br

12

como valores personalizados. VbTwips = 1: VbPoints = 2: VbPixels = 3: vbCharacters = 4: VbInches = 5: VbMillimeters = VbCentimeters = '(Padro) Twip (1440 twips por polegada lgica; 567 twips por centmetro lgico). 'Ponto (72 pontos por polegada lgica). 'Pixel (menor unidade de resoluo de monitor ou impressora). 'Caractere (horizontal = 120 twips por unidade; vertical = 240 twips por unidade). 'Polegada. 6: 7: 'Milmetro. 'Centmetro.

30 - Mostrar somente seleo em um banco de dados. Enviado por: Cecil Weiss Use os seguintes comandos para selecionar uma parte de uma string, com isso voce filtra o banco de dados mostrando somente o desejado. Data1.RecordSource = "Select * from [Clientes]here [Nome] _ like '*" & Text1.Text & "*'Order by [Nome]" Data1.Refresh Use os seguintes comandos para selecionar um ms especifico em um campo data, com isso voce filtra o banco de dados mostrando somente o desejado. Data1.RecordSource = "Select * from [Clientes] where month([Nasc]) = _ '" & Val(Text1.Text) & "'Order by [Nome]" Data1.Refresh Obs: A funo "Month" retorna um valor de 1 a 12, por isso faa com que o usurio s possa digitar na caixa texto um numero de 1 a 12.

31 - Pesquisa por nome ou sobrenome. Enviado por: Cecil Weiss Se voce quiser pesquisar por nome ou sobrenome, ou em qualquer parte da string use o seguinte comando: Data1.Recordset.FindFirst "NOME Like '*" & Text1.Text & "*'" Espero ter ajudado.

32 - Como controlar o MCIwndX e o MCC (para reproduzir arquivos multimdia) Enviado por: Leonardo Motta Voc pode controlar um objeto MCIwndX ou MCC Control (Microsoft Multimedia Control, que j vem com o VB) sem precisar tocar na lista de propriedades. Vamos chamar o objeto de mciMedia. 'Especifica as propriedades principais mciMedia.filename = mciMedia.visible = True/False mciMedia.enabled = True/False Obs.: a propriedade 'visible' refere-se somente ao controle. Animaes/filmes/etc sero exibidos normalmente se o controle estiver oculto. Os comandos dos objetos MCI: ' Abre o arquivo mciMedia.Command = "Open"

williamdsilva@aol.com.br

13

' Reproduz o arquivo mciMedia.Command = "Play" ' Pausa mciMedia.Command = "Pause" ' Para mciMedia.Command = "Stop" ' Fecha o arquivo (sempre use este comando quando for usar animaes ou filmes...) mciMedia.Command = "Close" Obs.: existem outros comandos para retornar, voltar ao comeo, ir ao final, etc. (Ex.: Prev, Back) Alguns eventos teis: Done e NotifyCode so eventos que acontecem quando o objeto termina de reproduzir o arquivo. A varivel "NotifyCode" especifica se o arquivo foi reproduzido com sucesso, se foi interrompido pelo usurio ou por algum erro do objeto. As constantes referentes ao "NotifyCode" so mciNotify(CRL+ESPACO para listar). 33 - MsgBox no modal 2 Enviado por: Hantan Para fazer a msgbox no modal com apenas o boto de OK declare o seguinte no mdulo .BAS: Public Const MB_OK = &H0& e substitua em MB_OKCANCEL.. Qualquer coisa veja em Constants no Text API Viewer

34 - MsgBox no modal Enviado por: Hantan Para fazer um message box que no seja modal faa o seguinte: Em um mdulo .BAS coloque o seguinte: Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, _ ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Const MB_OKCANCEL = &H1 Para chamar a funo faa: Dim ret% ret = MessageBox(0, "Sou uma MsgBox no modal.", "Modeless MessageBox ", MB_OKCANCEL) At mais.

35 - Resoluo da tela Enviado por: Hantan Este exemplo mostra como saber qual a resoluo da tela sem ter que fazer com API. Dim xTwips%, yTwips%, xPixels#, YPixels# xTwips = Screen.TwipsPerPixelX yTwips = Screen.TwipsPerPixelY YPixels = Screen.Height / yTwips xPixels = Screen.Width / xTwips Print "A Resoluo : " & Str$(xPixels) & " por " & Str$(YPixels) & " pixels"

williamdsilva@aol.com.br
A saida vai ser alguma coisa assim: A Resoluo : 800 por 600 pixels Espero ter sido til. Algum problema com programao em VB me contacte.

14

36 - Transformar qualquer valor na moeda corrente Enviado por: Robson Batista Dim dado as string dado = text1.text text1.text = format(dado,"CURRENCY")

37 - Fundo degrad Enviado por: Hantan Para deixar um fundo degrade faa o seguinte: Crie o seguinte em um mdulo .BAS: Sub Fundo(Frm As Object, Vermval&, Verdval&, Azulval&, TopToBottom As Boolean) On Error Resume Next Dim Step%, Reps%, FillTop%, FillLeft%, FillRight%, FillBottom%, HColor$ Step = (Frm.Height / 63) If TopToBottom = True Then FillTop = 0 Else FillTop = Frm.Height - Step FillLeft = 0 FillRight = Frm.Width FillBottom = FillTop + Step For Reps = 1 To 63 Frm.Line (FillLeft, FillTop)-(FillRight, FillBottom), RGB(Vermval, Verdval, Azulval), BF Vermval = Vermval - 4 Verdval = Verdval - 4 Azulval = Azulval - 4 If Vermval <= 0 Then Vermval = 0 If Verdval <= 0 Then Verdval = 0 If Azulval <= 0 Then Azulval = 0 If TopToBottom = True Then FillTop = FillBottom Else FillTop = FillTop - Step FillBottom = FillTop + Step Next End Sub A varivel chamada TopToBottom se vai do preto para a cor escolhida ou da cor escolhida para o preto. 39 - Ler e escrever arquivos INI Enviado por: Hantan Para ler arquivos INI faa o seguinte: Em um mdulo .BAS coloque:

williamdsilva@aol.com.br

15

Declare Function GetPrivateProfileString Lib "Kernel32" Alias _ "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, ByVal lpDefault As String, ByVal _ lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName _ As String) As Long Declare Function GetProfileString Lib "Kernel32" Alias _ "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName _ As String, ByVal lpDefault As String, ByVal lpReturnedString As _ String, ByVal nSize As Integer) As Integer Declare Function WritePrivateProfileString Lib "Kernel32" Alias _ "WritePrivateProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName _ As String, ByVal lpDefault As String, ByVal lpFileName As String) As Integer Crie a seguinte funo no mesmo mdulo .BAS: Function GetIni(section, key, arq) 'section = o que est entre [] 'key = o nome que se encontra antes do sinal de igual (=) 'arq = o nome do arquivo INI Dim Val As String Dim valor As Integer Val = String$(255, 0) valor = GetPrivateProfileString(section, key, "", Val, Len(Val), arq) If worked = 0 Then GetIni = "" Else GetIni = Left(Val, valor) End If End Function No mesmo mdulo .BAS crie a seguinte funo para escrever no arquivo INI: Sub WriteIni(section, key, dado, arq) 'section = o que est entre [] 'key = o nome que se encontra antes do sinal de igual (=) 'dado = o valor que vai depois do sinal de igual (=) 'arq = o nome do arquivo INI Dim Val As String Dim valor As Integer Val = String$(255, 0) valor = WritePrivateProfileString(section, key, dado, arq) End Sub Para chamar as funes faa o seguinte:

williamdsilva@aol.com.br

16

Text1.Text = GetIni("EntreColchetes", "AntesDoIgual", "ARQUIVO.INI") WrtArqIni "EntreColchetes", "AntesDoIgual", "ValorPosIgual", "ARQUIVO.INI"

40 - Abrir uma conexo da Rede Dial-Up Enviado por: Hantan Para abrir uma conexo da Rede Dial-Up crie a seguinte: Private Sub AbrirDialUp(Conexo As String) Dim X X = Shell("C:\Windows\rundll32.exe rnaui.dll,RnaDial " & Conexo, 1) DoEvents End Sub Na varivel Conexo o nome da conexo que se quer abrir. 41 - Confirmando uma exclusao de registro em banco de dados Enviado por: Sinister Overrider Para voce deletar um registro em um banco de dados basta apenas digitar o codigo abaixo em qualquer controle que execute a instrucao quando voce manda por exemplo um Botao: Dim resp As Variant resp = MsgBox("Voce tem certeza que deseja excluir este registro?", vbYesNo, "Exclusao") If resp = vbYes Then NomedoControleData.Recordset.Delete NomedoControleData.Recordset.MoveNext End If

42 - Criar multiplos nveis de diretrio Enviado por: Hantan As vezes vc tem um programa que precisa criar multiplos nveis de diretrios(C:\Dir1\Dir2\Dir3....) esta rotina faz isso: Sub LongDir(sDrive as String, sDir as String) 'sDrive = Nome do Drive(C:, D:, E:....) 'sDir = Nvel de diretrio(Dir1\....) Dim sBuild As String While Instr(2, sDir, "\") > 1 sBuild = sBuild & Left(sDir, Instr(2, sDir, "\") - 1) sDir = Mid$(sDir, InStr (2, sDir, "\") If Dir$(sDrive & Sbuild, 16) = "" Then MkDir sDrive & sBuild Wend End Sub

Call LongDir ("C:", "Dir1\Dir2\Nome Longo\Etc")

williamdsilva@aol.com.br

17

(Por Jeffrey Renton, aperfeioada por mim.) 43 - O arquivo existe ou no Enviado por: Hantan Se vc quiser saber se existe ou no um arquivo insira o cdigo abaixo em qualquer lugar do seu prg.: If Dir$("X:\XXXX\XXXXX.XXX") <> "" Then 'O arquivo existe Else 'O arquivo no existe End If

44 - Modificar caractere de uma string com o comando Mid Enviado por: Hantan Para modificar algum caracter de uma string com o comando Mid faa o seguinte: Dim MinhaString as String MinhaString = "Hantan" If Mid(MinhaString, 2, 1) = "a" Then Mid(MinhaString, 2, 1) = "A" 'Substituindo o caracter End If Abraos a todos, Hantan

45 - "Peneira" de dados Enviado por: Hantan Se voc quiser retirar todas as letras ou todos os nmero de uma string faa o seguinte: Crie a seguinte funo para retirar os nmeros: Function LimpaNumero (campo As String) As String Dim VA_Posicao As Integer 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) If IsNumeric(VA_Caracter) Then VA_Resultado = VA_Resultado & VA_Caracter End If VA_Posicao = VA_Posicao + 1 Loop LimpaNumero = VA_Resultado

williamdsilva@aol.com.br

18

End Function

Para limpar as letras crie a seguinte funo: Function LimpaAlfa (campo As String) As String Dim VA_Posicao As Integer 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) If Asc(VA_Caracter) > 64 And Asc(VA_Caracter) < 91 Then VA_Resultado = VA_Resultado & VA_Caracter End If VA_Posicao = VA_Posicao + 1 Loop LimpaAlfa = VA_Resultado End Function Para chamar as funes faa isso: SemNumero = LimpaNumero("0H1A2N3T4A5N6") Sair assim: HANTAN SemLetra = LimpaAlfa("0H1A2N3T4A5N6") Sair assim: 0123456 Espero ter sido til, abraos.

47 - Fechar todos os forms Enviado por: Hantan Para fechar todos os forms abertos crie a seguinte funo: Public Function FecharForms() Dim f As Integer f = Forms.Count Do While f > 0 Unload Forms(f-1) If f = Forms.Count Then Exit Do f=f-1 Loop End Function

williamdsilva@aol.com.br

19

48 - Como abrir um site pelo navegador padro (Mais fcil) Enviado por: Fabio Dentro de Windows\Command, existe um programa chamado Start. Basta vc digitar Shell "c:\windows\command\start http://www.vbbrasil.com/" Sem nenhuma declarao de API. OBS: O prpio Shell sozinho no consegue abrir o site, no tenho certeza, mas este pode ser um recurso exclusivo do Internet Explorer 4.0, gostaria que algum testasse isso em outro navegador e entrasse em contato comigo.

49 - Saber qual o diretrio do Windows Enviado por: Hantan Para saber qual o diretrio do Windows declare a seguinte funo em um modulo .BAS: Private Declare Function GetWindowsDirectory Lib "Kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Para saber qual o diretrio do windows chame a funo assim: Dim X$ X = GetWindowsDirectory(Space$(255), 255)

Para saber o diretrio System do Windows faa o seguinte: Dim X$ X = GetWindowsDirectory(Space$(255), 255) & "\System"

50 - Rotina de extenso com vrias funes(Para iniciantes) Enviado por: Hantan *** ATENO esta rotina recomendada para programas simples(Impreso de cheques, etc.), por conter grande nmero de comandos *** Decidi criar uma rotina de extenso mas uma bem simples apenas com comandos bsicos(If,Mid,For e outros) para quem iniciante em VB conseguir entender. Para ficar mais fcil entender ao invs de transformar o nmero em extenso em uma funo s criei vrias funes. Lembrando que esta funo BETA mais funciona perfeitamente com valores at 9999. Abaixo vai as funes todas detalhadamente comentadas: ( s copiar e colar dentro de um mdulo .BAS ou no General do Form) 'Determinado para que o VB avise qualquer varivel no declarada Option Explicit 'Declarando variveis Dim Unidades(19) As String Dim Dezena(9) As String Dim Centena(9) As String Dim Milhares(9) As String Dim Valor(99) As Integer Dim Grupos(99) As String Dim i As Integer Dim Temp As Boolean =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* Public Function Centenas(Nmr3 As Integer) 'Determinando os valores das centenas em extenso. Centena(1) = "Cento": Centena(2) = "Duzentos": Centena(3) = "Trezentos": Centena(4) _ = "Quatrocentos": Centena(5) = "Quinhentos": Centena(6) = "Seicentos": Centena(7) _ = "Setecentos": Centena(8) = "Oitocentos": Centena(9) = "Novecentos" 'Verificando que nmero . For i = 1 To 9 If Nmr3 = i Then Grupos(1) = Centena(i) Next i

williamdsilva@aol.com.br

20

'Determinando valor em extenso da funo. Centenas = Grupos(1) End Function =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* Public Function Dezenas(Nmr2 As Integer) 'Determinando os valores das centenas em extenso. Dezena(2) = "Vinte": Dezena(3) = "Trinta": Dezena(4) = "Quarenta": Dezena(5) = _ "Cinquenta": Dezena(6) = "Sessenta": Dezena(7) = "Setenta": Dezena(8) = "Oitenta": Dezena(9) = "Noventa" 'Verificando que nmero . For i = 2 To 9 If Nmr2 = i Then Grupos(1) = Dezena(i) Next i 'Determinando valor em extenso da funo. Dezenas = Grupos(1) End Function =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* Public Function Extenso(Nmr As Integer) On Error Resume Next 'Verificando se o nmero est entre o suportado If IsNull(Nmr) Or Nmr > 9999 Then Extenso = "Valor no suportado!!!": Exit Function 'Verificando se o nmero est entre 1000 e 19999 If Nmr > 999 And Nmr < 20000 Then Extenso = Mil(Nmr): Exit Function 'Verificando se centena inteira(100,200,300,etc.) For i = 1 To 9 If Nmr = i & "00" Then Extenso = Centena(i): Exit Function Next i 'Verificando se o nmero est entre 1 e 19 If Nmr > 0 And Nmr < 20 Then 'Determinando valor em extenso da funo Extenso = Unitarios(Nmr): Exit Function ElseIf Nmr > 19 And Nmr < 100 Then If Mid(Nmr, 2, 1) > 0 Then 'Determinando valor em extenso da funo Extenso = Dezenas(Mid(Nmr, 1, 1)) & " e " & Unitarios(Mid(Nmr, _ 2, 1)): Exit Function ElseIf Mid(Nmr, 2, 1) = 0 Then 'Determinando valor em extenso da funo Extenso = Dezenas(Mid(Nmr, 1, 1)): Exit Function End If End If 'Verificando se o nmero est entre 100 e 999 If Nmr > 99 And Nmr < 1000 Then If Mid(Nmr, 2, 1) = 0 Or Mid(Nmr, 2, 1) = 1 Then 'Determinando valor em extenso da funo Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Unitarios(Mid(Nmr, _ 2, 2)): Exit Function 'Verificando se a segunda casa maior que 1, ou seja >= 2 ElseIf Mid(Nmr, 2, 1) > 1 Then 'Verificando se a terceira casa igual a 0 If Mid(Nmr, 3, 1) = 0 Then 'Determinando valor em extenso da funo Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Dezena(Mid(Nmr, _ 2, 1)): Exit Function 'Verificando se a terceira casa maior que 0, _ 'ou seja, >= 1 ElseIf Mid(Nmr, 3, 1) > 0 Then 'Determinando valor em extenso da funo Extenso = Centenas(Mid(Nmr, 1, 1)) & " e " & Dezena(Mid(Nmr, 2, _ 1)) & " e " & Unitarios(Mid(Nmr, 3, 1)): Exit Function End If End If End If End Function =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* Public Function Mil(Nmr4 As Integer) 'Verifica se o nmero est entre 1000 e 10000 If Nmr4 > 999 And Nmr4 < 10000 Then 'Determinando os nmeros Valor(1) = Mid(Nmr4, 1, 1): Valor(2) = Mid(Nmr4, 2, 1): Valor(3) = Mid(Nmr4, _ 3, 1): Valor(4) = Mid(Nmr4, 4, 1) 'Verificando se 2 mil, 3 mil, etc. For i = 1 To 9 If Valor(1) = i Then Grupos(1) = Unidades(i) Next i

williamdsilva@aol.com.br

21

'Verifica se a segunda casa 0 If Valor(2) = 0 Then 'Verificando se a terceira casa 0 If Valor(3) = 0 Then 'Verificando se a quarta casa 0 If Valor(4) = 0 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil" 'Verificando se a quarta casa maior que 0, ou seja, >= 1 ElseIf Valor(4) > 0 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil e " & Unidades(Valor(4)): Exit Function End If 'Verificando se a terceira casa est entre 2 e 9 ElseIf Valor(3) > 1 And Valor(3) > 10 Then 'Verificando se valor inteiro ou quebrado, _ 'ou seja, 20 ou 21,22,23,24... For i = 2 To 9 If Valor(3) & Valor(4) = i & 0 Then Temp = True Next i 'Verificando se a varivel de valor inteiro verdadeira If Temp Then Mil = Grupos(1) & " Mil, " & Dezenas(Valor(3)): Exit Function 'Verificando se a varivel de valor inteiro no verdadeira If Not Temp Then Mil = Grupos(1) & " Mil e " & Dezenas(Valor(3)) & " _ e " & Unidades(Valor(4)): Exit Function 'Verificando se a terceira casa 1 ElseIf Valor(3) = 1 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil e " & Unidades(Valor(3) & Valor(4)): Exit Function End If 'Verificando se a segunda casa maior que 0, ou seja, >=1 ElseIf Valor(2) > 0 Then 'Verificando se a terceira casa igual a 0 If Valor(3) = 0 Then 'Verificando se a quarta casa 0 If Valor(4) = 0 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil" ElseIf Valor(4) > 0 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil e " & Centenas(Valor(2)) & Unidades(Valor(4)): _ Exit Function End If 'Verificando se a terceira casa est entre 2 e 9 ElseIf Valor(3) < 1 And Valor(3) < 10 Then 'Verificando se valor inteiro ou quebrado, ou seja, _ '20 ou 21,22,23,24... For i = 2 To 9 If Valor(3) & Valor(4) = i & 0 Then Temp = True Next i 'Verificando se a varivel de valor inteiro verdadeira If Temp Then Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & Dezenas(Valor(3)): _ Exit Function 'Verificando se a varivel de valor inteiro no verdadeira If Not Temp Then Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & " e " & _ Dezenas(Valor(3)) & " e " & Unidades(Valor(4)): Exit Function ElseIf Valor(3) = 1 Then 'Determinando valor da funo em extenso Mil = Grupos(1) & " Mil, " & Centenas(Valor(2)) & " e " & Unidades(Valor(3) _ & Valor(4)): Exit Function End If End If End If End Function =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* Public Function Unitarios(Nmr1 As Integer) 'Determinando os valores das centenas em extenso. Unidades(0) = "": Unidades(1) = "Um": Unidades(2) = "Dois": Unidades(3) = "Trs": Unidades(4) _ = "Quatro": Unidades(5) = "Cinco": Unidades(6) = "Seis": Unidades(7) = "Sete": Unidades(8) = _ "Oito": Unidades(9) = "Nove": Unidades(10) = "Dez": Unidades(11) = "Onze": Unidades(12) = "Doze": _ Unidades(13) = "Treze": Unidades(14) = "Quatorze": Unidades(15) = "Quinze": Unidades(16) = _

williamdsilva@aol.com.br

22

"Dezesseis": Unidades(17) = "Dezessete": Unidades(18) = "Dezoito": Unidades(19) = "Dezenove" 'Verificando que nmero . For i = 1 To 19 If Nmr1 = i Then Grupos(1) = Unidades(i) Next i 'Determinando valor em extenso da funo. Unitarios = Grupos(1) End Function Abraos, Hantan Ps. Se vc no entender esta funo, mande um e-mail. 51 - Como ligar o True DbGrid a um Array Enviado por: Fabio C. O true DbGrid um controle perfeito, as vezes achamos que outros so melhores ou mais fceis de se lidar, mas ele completo. Voc pode por exemplo, querer lig-lo a um array, onde os dados ficaro temporariamente na memria. Siga os passos: 1 - Insira um true DbGrid em seu Formulrio 2 - Altere a propriedade DataMode dele p/ 4 - Storage. 3 - Em Project - References(VB5), adicione a biblioteca "APEX xarray object", prpria dele. 4 - Na Form Load declare: Dim vetor As New XArray vetor.ReDim r1, r2, c1, c2 Set TDBGrid1.Array = vetor Onde vc cria um novo objeto XArray, depois o redimensiona considerando que r1 e r2 o nmero de linha (Rows) e c1 e c2 o nmero de colunas. Depois vc seta a propriedade Array do TrueDbGrid a este objeto. 52 - Como criar uma coluna TOTAL no TrueDbGrid Enviado por: Fabio Voc pode ter vrias colunas do TrueDbGrid ligados a um Data ou a um RDC e querer que uma delas no esteja, e receba um valor qualquer, como a soma de todas as colunas. P/ isso, a propriedade DataMode do TrueDbgrid tem que estar como 0 - Unbound. Nesta coluna do Total, vc tem que definir um caption, e deixar a propriedade DataField vazia, assim ele reconhecer esta coluna como Unbound. Ento funciona assim, os dados do Data ou do RDC so puxadas p/ cada coluna. O valor desta coluna do Total, ser definido pelo evento UnboundColumnFetch. P/ cada linha(ou registro), ele passar por este evento p/ pegar o valor desta coluna. Vc poderia: Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal _ Col As Integer, Value As Variant) Value = TDBGrid1.Columns(0).CellValue(Bookmark) + _ TDBGrid1.Columns(1).CellValue(Bookmark) End Sub Onde esta propriedade CellValue(bookmark) o valor das colunas que esto no mesmo registro que esta coluna de Total, e Value o valor desta Coluna.

53 - Como definir um TrueDbGrid com 2 cores Enviado por: Fabio Defina na Form Load: TDBGrid1.EvenRowStyle.BackColor = QBColor(6) TDBGrid1.OddRowStyle.BackColor = QBColor(14) TDBGrid1.AlternatingRowStyle = True

54 - Acesso rea de Transferncia Enviado por: Fabio

williamdsilva@aol.com.br

23

O Objeto Clipboard uma referncia rea de transferncia, vejam: Clipboard.gettext Retorna o contedo da rea de transferncia: Clipboard.clear Clipboard.settext "Teste"

Settext adiciona um novo texto p/ a rea de transferncia, no entanto p/ funcionar necessrio limp-la primeiro usando o clear.

55 - Parametros -> Funo Command Enviado por: Fabio Quem quer estabelecer parametros ao programa s usar a funo Command. Por exemplo, vc poderia criar um programa chamado PRG, que qdo vc digitasse PRG executasse o programa, e PRG /? executasse a ajuda do programa. simples, vc pode criar um mdulo, e na Sub_Main deste coloque: if command$ = "/?" then frmAjuda.show elseif command$ = "" then meuprograma.show end if No se esqueam de colocar a sub main p/ ser a primeira coisa a ser executada. Menu Project - Properties. 56 - Operaes via SQL Enviado por: Guilherme Joo Frana Soares A princpio deve-se declarar a variveis de database e dynaset: Global DBanco as database Global DyRec as dynaset Abrindo o Banco de Dados: Set DBanco = Opendatabase (app.path & "\banco.mdb") 'onde banco o banco de dados Selecionando registros: Set DyRec = DBanco.Createdynaset("select * from func") 'onde func uma tabela do banco.mdb 'seleciona todos registros de func Inserindo registros: Banco.Execute "insert into func values ('Nome_func',Identidade,'Endereco') 'onde Nome_func,Identidade,Endereco so colunas do banco 'veja que Nome_func e Endereco esto entre aspas simples pois tm atributos do tipo Text 'e Identidade Number Excluindo registros:

williamdsilva@aol.com.br

24

Banco.Execute "delete from func where Nome_func like 'G*') 'exclui todas as linhas onde Nome_func comea com 'G' Atualizando registros: Banco.Execute "update func set Nome_func = 'Guilherme', Endereco = 'Rua 1, Qd. 1, Casa 1' where Identidade = "0000000000"

57 - Acesso ao Oracle via Oracle Objects Enviado por: Guilherme Joo Frana Soares Declarar as variveis: Global Banco As Object Global Secao As Object

Criar o objeto: Set Secao = CreateObject("OracleInProcServer.XOraSession")

Abrir o Banco de Dados: Set Banco = Secao.OpenDatabase(Servidor, Usuario/Senha, 0&) necessrio ter na mquina os arquivos do Oracle Obejects: -Oraclb45.dll -Oraclb4d.dll -Oraclbj.dll -Oraclbjd.dll -Oraclm.dll -Oraclmd.dll -Oraipsrv.reg (rodar o reg) Que se encontram nos discos de instalao do Oracle Objects. 58 - Usando a api GetUserName Enviado por: Guilherme Joo Frana Soares Declare Function GetUserNameA Lib "advapi32.dll" (ByVal lpBuffer As String, nSize As Long) As Long m$ = Space$(255) i% = GetUserNameA(m$, Len(m$)) TxtLogin = Left(m$, InStr(m$, Chr(0)) - 1)

59 - Animaes Enviado por: Henrique Angelo Crie um novo projeto, coloque no Form uma ImageList, coloque as figuras da animao nesta mesma Imagelist. Coloque uma PictureBox e um Timer.

williamdsilva@aol.com.br
Na Propriedade Form_Load() coloque: Set Picture1.Picture = ImageList1.ListImages(1).Picture Na propriedade Timer1_Timer() coloque: If Picture1.Picture = ImageList1.ListImages(1).Picture Then

25

Set Picture1.Picture = ImageList1.ListImages(2).Picture Exit Sub End If If Picture1.Picture = ImageList1.ListImages(2).Picture Then Set Picture1.Picture = ImageList1.ListImages(1).Picture Exit Sub End If No Timer1, coloque um intervalo de 100.

60 - Cursores Animados em VB Enviado por: Henrique Angelo Crie um novo projeto, coloque no Form uma ImageList, coloque os cones e/ou cursores que faro parte da animao nesta mesma Imagelist. Coloque tambm um Timer. Coloque na propriedade do Form: MousePointer = 99 - Custom

Na Propriedade Form_Load() coloque: Set Form1.MouseIcon = ImageList1.ListImages(1).Picture

Na propriedade Timer1_Timer() coloque: If Form1.MouseIcon = ImageList1.ListImages(1).Picture Then Set Form1.MouseIcon = ImageList1.ListImages(2).Picture Exit Sub End If If Form1.MouseIcon = ImageList1.ListImages(2).Picture Then Set Form1.MouseIcon = ImageList1.ListImages(1).Picture Exit Sub End If

No Timer1, coloque um intervalo de 100. 61 - Descobrir Path do Aplicativo Enviado por: Mauro Sakamoto Para descobrir o Path do aplicativo utilize a funo App.Path Ex:

williamdsilva@aol.com.br

26

Dim MeuDiretorio IF Len(App.Path)>3 THEN MeuDiretorio=App.Path & "\" ELSE MeuDiretorio=App.Path 'Se estiver na raiz END IF

62 - Condies (IIF) em consultas Enviado por: Mauro Sakamoto Para testar o contedo de um campo e retornar valores diferentes conforme o contedo do campo, pode-se utilizar o comando IIF(condio,se valor1 se verdade ,valor2 se falso ). Ex: Se a mdia do aluno for maior ou igual a 5, escrever aprovado, seno reprovado. SELECT Nome, Mdia, IIF(Mdia>=5,"Aprovado","Reprovado") AS Status FROM Alunos

63 - Adicionar contedo de uma ou mais tabelas em outra Enviado por: Mauro Sakamoto Se voc tem duas ou mais tabelas com alguns campos em comum e deseja v-los em uma nica tabela, utilize essa consulta. Insert into tabela3(campo1, campo2, campo3) _ select campo1, campo2, campo3 _ from tabela1 _ where campo1>valor1 _ union _ select campo1, campo2, campo3 _ from tabela2 _ where campoS1>valor2

E assim sucessivamente. Caso voc no queira armazenar o valor comece no primeiro SELECT (descartando o INSERT) 64 - Como usar BeginTrans, CommitTrans e Rollback Enviado por: Mauro Sakamoto Um problema bastante comum o micro ser desligado acidentalmente ou a energia acabar, no momento de uma operao com o Banco de Dados (Insero, Atualizao ou Excluso). Para evitar isso voc pode utilizar os Mtodos BeginTrans (inicia a transao) CommitTrans (Confirma a insero) e Rollback (volta ao estado inicial). Ex: Sub CmdInserir_Click() On error goto Err_CmdInserir_Click WorkSpaces(0).BeginTrans

williamdsilva@aol.com.br

27

' executa comandos de (insero,excluso ou atualizao) WorkSpaces(0).CommitTrans Exit_CmdInserir_Click: Exit Sub Err_CmdInserir_Click: MsgBox Error% WorkSpaces(0).Rollback Resume Exit_CmdInserir_Click End Sub

65 - Atualizar contedo de ComboBox conforme string digitada Enviado por: Mauro Sakamoto Caso voc tenha um ComboBox que liste o contedo de um campo da tabela e deseja que ao digitar a letra "a" o combo mostre todos os nomes iniciados por "a" escreva o cdigo no evento DropDown. Sub CmbNome_DropDown() Dim MyDB As Database Dim MyNome As SnapShot MySQL$ = "Select Nome from Clientes Where Nome like " Chr(39) & CmbNome.Text & Chr(42) & Chr(39) 'seleciona os nomes Set MyDB=OpenDataBase("Table.mdb") 'Abre o BD Set MyNome=MyDB.CreateSnapShot(MySQL$) 'Cria um snapshot CmbNome.Text = "" 'limpa o texto no combo CmbNome.Clear 'limpa o contedo do combo If Not MyNome.NoMatch And MyNome.RecordCount>0 then 'verifica se existe nomes MyNome.MoveLast Total&=MyNome.RecordCount 'pega o total de nomes MyNome.First For i&=1 to Total 'atualiza o combo If Not Isnull(MyNome("Nome")) then CmbNome.AddItem(MyNome("Nome")) CmbNome.MoveNext End If Next i& End if End sub

66 - Como chamar um arquivo de HELP para sua aplicao Enviado por: Mauro Sakamoto

williamdsilva@aol.com.br

28

Supondo que voc j tenha um arquivo de help para sua aplicao, voc pode cham-lo utilizando a funo API WinHelp. Para isso v crie um modulo (.bas) e declare as seguintes constantes e funes: Const Help_File = "File.hlp" Const Help_Index = &H3 Const Help_Context = &H1

Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long Em seguida v at o controle em que voc deseja chamar o help e digite: WinHelp hwnd, Help_File, Help_Context, 20

O Primeiro valor hwnd , se refere ao Handle da Janela e deve ser passado como hwnd mesmo. O segundo o nome de seu arquivo hlp. O terceiro parmetro pode ser utilizado ou para abrir o Help_Index (help padro do windows, independente do valor em Help_File) ou Help_Context (que abrir o arquivo especificado em Help_File). J o quarto parmetro s ter efeito quando o terceiro parmetro for Help_Context. Esse parmetro se refere ao valor do tpico definido em seu arquivo de help (funciona como se fosse um link - abre o aquivo no tpico escolhido). Alm do Help_Context e Help_Index existem outros parmetros que podem ser passados. Porm os mais comuns so esses dois. 67 - Fazer de forma simples um boto do tipo do VB5 Enviado por: Mauro Sakamoto Para fazer isso voc deve inserir um SSPanel (que vem com o Sheridan 3D). Em seguida defina a propriedade BevelWidth=0 e retire o caption. Insira uma picture em cima do seu SSPanel mudando a propriedade apparence para 0-flat e BorderStyle para 0-None. No evento MouseMove do seu SSPanel e de seu Picture faa: Sub Picture_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) SSPanel.BevelWidth=1 End Sub Sub SSPanel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) SSPanel.BevelWidth=1 End Sub

Agora no evento MouseMove do Formulrio faa o inverso Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) SSPanel.BevelWidth=0 End Sub Dessa forma quando o mouse for posicionado em cima do "boto", este automaticamente ficar em 3D e quando for movido para fora, ficar chapado. possvel tambm trocar a picture, dando um efeito tipo Internet Explorer 4.

68 - Reproduzir um vdeo com MMControl Enviado por: Mauro Sakamoto Para reproduzir um vdeo em um formulrio, conveniente antes de mais nada declarar um picture box onde ele ser executado. Em seguida insira um MMControl. Para reproduzir o avi faa: MMControl1.Command = "close" MMControl1.DeviceType = "avivideo"

williamdsilva@aol.com.br

29

MMControl1.hWndDisplay = Picture1.hWnd MMControl1.filename = "File.avi" MMControl1.Command = "open" MMControl1.Command = "prev" MMControl1.Command = "play"

69 - Reproduzir um arquivo wav ou mid Enviado por: Mauro Sakamoto Para reporduzir um arquivo de som com do tipo wa ou mid, voc precisa utilizar o MMControl. Ex: MMControl1.Command = "close" MMControl1.DeviceType = "WaveAudio" MMControl1.filename = "File.wav" MMControl1.Command = "open" MMControl1.Command = "prev" MMControl1.Command = "play"

Se for um arquivo do tipo mid mude a propriedade DeviceType para "sequencer" Ex: MMControl1.Command = "close" MMControl1.DeviceType = "Sequencer" MMControl1.filename = "File.wav" MMControl1.Command = "open" MMControl1.Command = "prev" MMControl1.Command = "play

70 - Trocar vrgula por ponto em um valor digitado Enviado por: Mauro Sakamoto Function trocavrgulaporponto(NmeroTexto) Dim Posio, Tamanho Dim MidWord, Msg, TstStr, SpcPos1, SpcPos2 ' Declarao de variveis Tamanho = Len(Trim(NmeroTexto)) Posio1 = InStr(1, NmeroTexto, ",") 'Acha a vrgula If Posio1 <> 0 Then Posio1 = Posio1 - 1 posio2 = Posio1 + 2 ' Encontra prximo espao.

williamdsilva@aol.com.br

30

trocavrgulaporponto = Mid(NmeroTexto, 1, Posio1) + "." + Mid(NmeroTexto, posio2) Else trocavrgulaporponto = NmeroTexto End If End Function

71 - Como evitar entrar duas vezes Enviado por: Felipe Maion Garcia 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 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, no existe 'as linhas abaixo fecham a segunda chamada e alternam para 'a primeira AppActivate SaveTitle SendKeys "% R", True End End If 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. Isto tambm pode ser feito por APIs (FindWindow, ShowWindow e SetFocus, da bilblioteca User), mas, tem o mesmo efeito e mais trabalhoso.

72 - Como evitar o bug do ano 2000 Enviado por: Felipe Maion Garcia

williamdsilva@aol.com.br

31

Dim Pdata As Date Dim Intervalo As String Dim Qdias As Integer Intervalo = "d" ' "d" Especifica o dia Pdata = turini 'data de entrega Qdias = (Val(TextCarga / 4)) ' - 1 'Quantidade de dias para a soma) turini.Tag = Format(turini, "w") ' verifica o dia da semana do incio do curso If Val(turini.Tag) = 5 And Qdias > 9 Then Qdias = Qdias + 2 If Val(turini.Tag) = 5 And Qdias = 4 Or Qdias = 5 Then Qdias = Qdias + 1 If Val(turini.Tag) = 4 And Qdias > 9 Then Qdias = Qdias + 3 If Val(turini.Tag) = 4 And Qdias = 4 Or Qdias = 5 Then Qdias = Qdias + 1 If Val(turini.Tag) = 3 And Qdias > 5 Then Qdias = Qdias + 3 If Val(turini.Tag) = 3 And Qdias < 5 Then Qdias = Qdias - 1 If Val(turini.Tag) = 2 And Qdias > 9 Then Qdias = Qdias + 1 turter = DateAdd(Intervalo, Qdias, Pdata)

73 - Menu PopUp Enviado por: Felipe Maion Garcia Crie um menu normal com o caption de "Popup Menu" e o name "mnufile", desmarque a opo "Visible", agora crie dois submenus do "Popup Menu" o primeiro com o caption que vc quiser e o name "mnusub1" e o segundo tambm com o caption que vc quiser e com o name "mnusub2",ATENO: os dois submenus so visible true. agora crie o cdigo para que quando o usuario clicar no formulario aparecer o popup: Private Sub Form_MouseDown(Button As Integer, Shift As _ Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu mnufile 'Mostra o menu popup _ 'se o boto direito for clicado End Sub

74 - Conexo Dial-Up Enviado por: Felipe Maion Garcia Private Sub AbrirDialUp(Conexo as String) Dim X X = Shell("C:\Windows\rundll32.exe rnaui.dll,RnaDial " & Conexo, 1) AppActivate X SendKeys "{enter}" DoEvents End Sub Ex.: call AbrirDialUp ("Infolink") 'onde no lugar de Infolink _ 'voc vai utilizar o nome de sua conexo

williamdsilva@aol.com.br

32

75 - Como pegar o nome do computador Enviado por: Felipe Maion Garcia No mdulo voc coloca: Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal sBuffer As String, lSize As Long) As Long A funo GetComputerName requer dois argumentos. O primeiro argumento, sBuffer, o buffer que ir armazenar o nome do computador depois que a funo executada. O tamanho do buffer deve ser grande o suficiente para que o nome inteiro caiba nele. O segundo argumento, lSize, deve ser inicializado com o tamanho de sBuffer. Depois de ter executado a funo GetComputerName, a varivel lSize conter o nmero de caracteres (contador) armazenados na string sBuffer. Este valor de contagem no inclui o caractere terminador NULL. Ainda no mdulo voc coloca: Public Function NameOfPC(MachineName As String) As Long Dim NameSize As Long Dim X As Long MachineName = Space$(16) NameSize = Len(MachineName) X = GetComputerName(MachineName, NameSize) End Function

Exemplo de um procedimento: Private Sub Command1_Click() Dim PCName As String Dim P As Long P = NameOfPC(PCName) text1.Text = PCName End Sub 76 - Placa de som? Enviado por: Felipe Maion Garcia Como detectar se um computador tem uma placa de som ? Para realizar tal tarefa, voc dever utilizar a funo API waveOutGetNumDevs(). Esta funo retorna o nmero de devices capazes de tocar sons. Porm, antes de us-la, declare-a em um mdulo de cdigo. Ai vai a declarao : Declare Function waveOutGetNumDevs lib "MMSYSTEM" () as integer

Ento, crie a funo Ver_audio(), escrevendo o seguinte cdigo : Function Ver_Audio() as string dim i as integer i = waveOutGetNumDevs() if i > 0 then Ver_Audio = "Sistema capaz de tocar sons" else Ver_Audio = "Sistema incapaz de tocar sons"

williamdsilva@aol.com.br

33

end if end function

77 - Arquivos INI Enviado por: Felipe Maion Garcia Cdigo - Funes para escrever e ler em arquivos .INI pessoais. Estas funes (Get_ini e Write_ini) devem ser colocadas em um mdulo (.BAS). Troque nome_do_arquivo.ini pelo nome do seu arquivo .INI pessoal. no esquea de incluir o caminho completo! A funo get_ini serve para ler em arquivos .INI. Porm, para utiliza-la, necessrio declarar a funo GetPrivateProfileString, na seo de declaraes (declarations) de seu mdulo. A declarao a seguinte ( escreva apenas em uma linha ): Declare Function GetPrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer Aqui vai o cdigo da funo get_ini : Function get_ini (seo$, chave$) As String arquiv$ = nome_do_arquivo.ini Returns$ = Space$(128) x% = GetPrivateProfileString(ByVal seo$, ByVal chave$, "Nenhum valor lido", Returns$, Len(Returns$), ByVal arquiv$) get_ini = Left$(Returns$, x%) End Function A funo write_ini serve para escrever informaes em um arquivo .INI. Antes de us-la. declare a funo WritePrivateProfileString na seo "Declarations" de seu mdulo. Declare Function WritePrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, lpKeyName As Any, lpString As Any, ByVal lplFileName As String) As Integer Feito isso, escreva : Function write_ini (ByVal section$, ByVal chv$, ByVal variavel$) As String arquiv$ = nome_de_arquivo.ini iRet = WritePrivateProfileString(ByVal section$, ByVal chv$, ByVal variavel$, ByVal arquiv$) End Function

78 - Tecla tab como enter Enviado por: Felipe Maion Garcia Como capturar a tecla TAB nos eventos KeyDown e KeyPress? Os eventos KeyDown ou KeyPress no esto disparando em resposta a tecla TAB, mesmo com a propriedade KeyPreview=True. Existe alguma coisa que pode ser feita? Colocando o propriedade KeyPreview para True, possvel capturar a tecla TAB no evento KeyPress do formulrio, SOMENTE quando no existem controles, OU quando um nico controle recebe o focu no formulrio OU, quando a propriedade TabStop colocada para False para todos os controles no formulrio. Quando existir mais de um controle no formulrio, o VB ir capturar a mensagem e mover o focu para o prximo controle de acordo com a propriedade TabOrder, e o evento KeyPress no ser disparado. O mesmo se aplica para os eventos KeyDown e KeyUp. No entanto, existe uma forma de saber se a tecla TAB foi pressionada ou no, usando uma API do Windows. Use a funo API GetAsyncKeyState em um controle Timer. Apesar de voc conseguir saber quando a tecla TAB foi pressionada, voc no conseguir evitar que o comportamento padro ocorra (mover para o prximo controle). Veja o cdigo abaixo: ' Em um arquivo .BAS Declare Function GetAsyncKeyState% Lib "User" (ByVal vKey%)

williamdsilva@aol.com.br

34

Global Const KEY_TAB = &H9 ' Adicione este cdigo no evento Timer no controle Timer (interval=1). retn% = GetAsyncKeyState(KEY_TAB) ' o ltimo bit menos significativo ser 1 quando a tecla TAB for pressionada retn% = retn% And 1 If retn% = 1 Then print "Tecla TAB foi pressionada"

79 - Macro Enviado por: Felipe Maion Garcia O Visual Basic tem macro substituio como o Clipper ? Macro substituio um operador, como o operador "&" do Clipper. Em Clipper voc pode fazer o seguinte: Test := "good morning" ? "Hello, &Test" O resultado do print ser "Hello, good morning". Isto pode ser feito no Visual Basic? Infelizmente, este recurso no est disponvel em VB. O melhor que pode ser feito neste caso, escrever uma funo que receba alguns nomes de variveis e devolva o valor associado destas variveis. Esta funo ter um Select Case com o nome da varivel passado por parametro e em cada caso (Case) uma apropriada varivel acessada. Veja o cdigo abaixo: 'Na seo general Dim Test1, Test2 Function MyMacroOperator (given$) Select Case given Case "Test1": MyMacroOperator = Test1: Exit Function Case "Test2": MyMacroOperator = Test2: Exit Function ' e assim com todas as variveis Case Else ' Precisa conter alguma outra coisa. MyMacroOperator = 0 ' valor invlido End Select End Function Sub Form_Click () ' Para testar a funo MyMacroOperator Test1 = "good morning" Test2 = "bad morning" MsgBox ("Hello " & MyMacroOperator("Test1")) MsgBox ("Hello " & MyMacroOperator("Test2")) End Sub

80 - Message Box 1 Enviado por: Felipe Maion Garcia Como criar um MsgBox (Message Box) que no seja modal ?

williamdsilva@aol.com.br

35

A funo MsgBox do Visual Basic no contempla esta opo. Porm, possvel fazer usando a funo API MessageBox. Declare e chame a API como segue (cdigo VB 3.0): Declare Function MessageBox% Lib "User" (ByVal hWnd%, ByVal lpText$, _ ByVal lpCaption$, ByVal wType%) Const MB_OKCANCEL = &H1 Dim ret% ret = MessageBox(0, "I am a Modeless MessageBox", "Modeless MessageBox " _ , MB_OKCANCEL) Obs.: possvel tambm criar um formulrio com as mesmas caractersticas de um MessageBox e exib-lo de forma no modal. 81 - FRX Enviado por: Felipe Maion Garcia O Visual Basic grava os forms nos formatos: Binrio (padro) or ASCII. Quando o desenvolvedor escolhe o formato ASCII (Marcando a opo "Save as Text" na janela "Save File As"; ou no menu "Options", "Environment", marque "Default Save As Format = Text"), o VB ento grava os arquivos no formato ASCII. No entanto, alguns controles tem propriedades cuja informao binria (Por exemplo: propriedade Picture de um PictureBox). O VB grava todas estas informaes binrias do formulrio, em um arquivo binrio, separado do arquivo ASCII. Estes arquivos so armazenados no mesmo diretrio que os arquivos .FRM, e com o mesmo nome, mas com a extenso FRX. O VB l estes arquivos enquanto os arquivos no formato ASCII so carregados. Se um projeto gravado no formato ASCII; logo todo o formulrio que tiver informaes binrias, dever ser acompanhado de um arquivo FRX correspondente 82 - Resoluo Enviado por: Felipe Maion Garcia Eu preciso obter a resoluo da tela, onde a minha aplicao est rodando por vrias razes, por exemplo ajustar o tamanho de alguns controles em run-time. Voc pode utilizar algumas propriedades do objeto Screen para calcular a resoluo da tela. Veja o seguinte cdigo (VB 3.0): Dim xTwips%, yTwips%, xPixels#, YPixels# xTwips = Screen.TwipsPerPixelX yTwips = Screen.TwipsPerPixelY YPixels = Screen.Height / yTwips xPixels = Screen.Width / xTwips Print "A Resoluo : " & Str$(xPixels) + " por " + Str$(YPixels)

83 - SQL Enviado por: Felipe Maion Garcia A linguagem SQL(Structured Query Language) uma linguagem de alto nvel para manipulao de dados dentro do modelo relacional. Seu objetivo fornecer uma interface de alto nvel ao usurio. uma linguagem no procedural, e, no cabe ao usurio definir como o gerenciador de banco de dados executar uma tarefa, mas somente o ele que deve fazer. Uma instruo SQL consiste em trs partes: As declaraes de parmetros A instruo manipulativa As declaraes de opes Para termos uma idia do seu poder, imagine que temos que atualizar o campo valor em 10% de uma tabela com diversos registros. Na abordagem procedural teriamos os seguintes passoa a seguir: 1. Abrir a tabela 2. Posicionar o ponteiro no incio da tabela

williamdsilva@aol.com.br

36

3. Atualizar o campo valor em 10% 4. Atualizar tabela 5. Movermos o ponteiro para o prximo registro 6. Continuar a atualizao do campo valor at o final da tabela O cdigo poderia Ter o seguinte aspecto: Dim db as database Dim tabela as recordset set db=workspaces(0).Opendatabase("c:\base.mdb") set tabela=db.Openrecordset("tabela") While not tabela.eof Tabela.edit Tabela.valor=tabela.valor*1.10 Tabela.update Tabela.movenext Wend Tabela.close

Agora utilizando uma instruo SQL teriamos o seguinte cdigo: Dim db as Database Set db=Workspaces(0).Opendatabase("c:\base.mdb") Db.execute "UPDATE tabela SET valor=valor*1.10" Db.close

Observe a utilizao da instruo UPDATE, bem mais simples, no ? Vejamos abaixo as clusulas manipulativas e suas finalidades: Instruo SELECT - Obtm um grupo de registros e insere os registros em um dynaset ou em uma tabela UPDATE - Define os valores dos campos de uma tabela em uma atualizao TRANSFORM - Cria uma tabela de resumo, utilizando o contedo de um campo como cabealho de cada coluna DELETE FROM - Remove registros de uma tabela INSERT INTO - Acrescenta um grupo de registros a uma tabela. Vejamos alguns exemplos da instruo SELECT: 1. Seleciona os campos "Primeiro nome" e "Sobrenome" de todos os registros da tabela Empregados. SELECT [Primeiro nome],[Sobrenome] FROM Empregados 2. Seleciona todos os campos da tabela Empregados. Note o uso do parmetro (*) indicando todos os campos da tabela indicada. SELECT Empregados.* FROM Empregados 3. Conta o nmero de registros que tm uma entrada no campo "Cdigo postal" e coloca o ttulo contagem no topo da coluna. SELECT Count([Cdigo postal]) AS Contagem FROM Clientes 4. Seleciona os campos "Primeiro nome" e "Sobrenome" de cada registro cujo sobrenome seja Pereira. SELECT [Primeiro nome],[Sobrenome] FROM Empregados WHERE [Sobrenome]='Pereira' 5. Seleciona os campos "Primeiro nome" e "Sobrenome" para Empregados cujos sobrenomes comeam pela letra S.

williamdsilva@aol.com.br

37

SELECT [Primeiro nome],[Sobrenome] FROM Empregados WHERE [Sobrenome] Like 'S*' FROM - Indica as tabelas utilizadas como fonte de dados WHERE - Especifica as condies que os registros devem satisfazer para compor o subconjunto de dados.

84 - Copia o arquivo especificado Enviado por: Felipe Maion Garcia Copia o arquivo especificado. Sintaxe: FileCopy Exemplo: Public Function MoveArquivo(Origem As String, Destino As String) As Boolean On Error GoTo ErroMovendoArquivo FileCopy Origem, Destino Kill Origem MoveArquivo = True Exit Function ErroMovendoArquivo: MoveArquivo = False Exit Function End Funciotn

85 - Form circular Enviado por: Felipe Maion Garcia Adicione nas declaraes da form: Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As _ Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd _ As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Agora no form load: Dim hr&, dl& Dim usew&, useh& usew& = me.Width / Screen.TwipsPerPixelX useh& = me.Height / Screen.TwipsPerPixelY x=0 hr& = CreateEllipticRgn(0, 0, usew, useh) 'Faz a _ 'forma da janela numa forma de um crculo descrito por x1,y1,x2,y2 dl& = SetWindowRgn(me.hWnd, hr, True) Obs.: mude o nome "Screen" para o nome do seu formulrio

williamdsilva@aol.com.br
86 - Centralizando forms Enviado por: Felipe Maion Garcia

38

Centralizar forms muito til, alm de ser muito fcil e com pouca codificao. Coloque o seguinte cdigo no evento Form_Load () do form que voc quiser centralizar: Left = (Screen.Width - Width) \ 2 Top = (Screen.Height - Height) \ 2

87 - Bitmap Enviado por: Felipe Maion Garcia Voc pode utilizar o controle PictureBox com a propriedade AutoSize=True. Carregue o bitmap no PictureBox, usando a funo LoadPicture. O controle ir ajustar o seu tamanho automaticamente, para que o bitmap caiba nele. As propriedades Height e Width deste controle contm as dimenses do bitmap. Note que os valores destas propriedades esto em Twips. Uma outra forma, utilizar a API GetObject. Esta funo retorna a estrutura do Bitmap em dois membros, bmWidth e bmHeight representando as dimenses do bitmap em pixels. Veja o exemplo abaixo: Coloque o seguinte cdigo em um arquivo .BAS Type BITMAP '14 bytes Integer bmHeight As Integer bmWidthBytes As Integer bmPlanes As String * 1 bmBitsPixel As String * 1 bmBits As Long End Type Declare Function GetObjectAPI% Lib "GDI" Alias "GetObject"(ByVal hObject%, ByVal nCount% , lpObject As Any) Coloque o seguinte cdigo aonde voc quer obter as dimenses do bitmap. (O Bitmap deve ser carregado em um PictureBox chamado Picture1): Dim bmp As BITMAP, ret% ret = GetObjectAPI(picture1.Picture, Len(bmp), bmp) Print "width = " + Str$(bmp.bmwidth) + ", height = " + Str$(bmp.bmheight)

88 - Como criar um banco de dados Access, contendo tabelas e ndices (index) Enviado por: Felipe Maion Garcia 1. Criando o banco de dados A criao de um banco de dados relativamente simples : CHDRIVE App.Path CHDIR App.Path dim db as database CONST DB_LANG_GENERAL = ";LANGID=0x0809;CP=1252;COUNTRY=0" SET db = CREATEDATABASE("banco.mdb", DB_LANG_GENERAL) 2. Criando uma tabela Uma tabela contm vrios campos, com vrias propriedades. Ento, para cada campo, deve-se atribuir valores a estas propriedades, assim como se voc fosse criar um campo em uma tabela usando o Data Manager, que vem com o VB: Neste exemplo, a tabela conter dois campos : NOME e IDADE. Veja o cdigo a seguir :

williamdsilva@aol.com.br

39

CONST DB_TEXT = 10 CONST DB_INTEGER = 3 Dim db as database Dim tb as New TableDef Dim campo1 as New field Dim campo2 as New field set db = OpenDatabase("banco.mdb") tb.name = "Tabela" campo1.Name = "NOME" campo1.Type = DB_TEXT campo1.Size = 60 campo2.Name = "IDADE" campo2.Type = DB_INTEGER tb.Fields.Append campo1 tb.Fields.Append campo2 db.TableDefs.Append tb tb.close set tb = nothing db.close set db = nothing 3 - Criando ndices ndices so muito teis em rotinas de procura de dados em tabelas. Alm de serem mais rpidos, eles requerem menos cdigo para realizar estas buscas. Veja como criar um ndice de um campo em uma tabela j existente: Dim index1 as New Index Dim index2 as New Index Dim db as database Dim tb as table set db = OpenDatabase("banco.mdb") set tb = db.OpenTable("tabela") index1.name = "nome" index1.fields = "NOME" index1.unique = true index1.primary = true index1.name = "idade" index2.fields = "IDADE" index2.unique = false index2.primary = false tb.Indexes.Append index1

williamdsilva@aol.com.br

40

tb.Indexes.Append index2 tb.close set tb = nothing db.close set db = nothing

89 - BeginTrans e CommitTrans Enviado por: Felipe Maion Garcia Use os comandos BeginTrans e CommitTrans para aumentar a velocidade de operaes com banco de dados. O comeo de uma transao (operao de atualizao de banco de dados) deve ser marcado com o comando BeginTrans e o fim de uma transao, com CommitTrans. A aumento de velocidade se d porque estas transaes se do sem acesso ao disco toda vez que h um comando para atualizar o banco de dados (o mtodo update). Ao invs disso, as mudanas so armazenadas na memria, at que h o comando CommitTrans, que quando ocorre a gravao dos dados no disco. Assim, s h acesso ao disco uma vez. Observe o exemplo de como se usa estes comandos. Dim db as database dim tb as table set db = OpenDatabase("data_base.mdb") set tb = db.OpenTable("table") BeginTrans for a = 1 to 10 tb.addnew tb!numero = "nmero" & a tb.update next a CommitTrans 'as informaes sero atualizadas aqui! tb.close set tb = nothing 'libera a memria alocada pela tabela db.close set db = nothing 'libera a memria alocada pelo banco de dados

90 - Porque o Visual Basic no faz contas corretas com ponto fluante? Enviado por: Felipe Maion Garcia Algum j notou que o Visual Basic no muito bom em matemtica? Tente fazer 18.51 + (-17.59) e voc ir receber . 9200000000000002. Isso ocorre, porque no Visual Basic, os valores com ponto flutuante so armazenados no formato padro IEEE. A representao da mquina sobre valores numricos em binrio. Qualquer valor inteiro pode ser representado "EXATAMENTE" na forma binria. Mas nos casos de valores com ponto flutuante, isso no verdade.

williamdsilva@aol.com.br

41

Por exemplo, o decimal 0.0001 no pode ser representado exatamente em binrio (0.0001 uma frao repetitiva com um perodo de 104 bits!). Ento, os valores com ponto flutuante so aproximados para o prximo valor que pode ser representado em binrio. Logo, eles tendem a causar algum erro nos calculos quando so utilizados. No nosso exemplo, ambos 18.51 e 17.59 no podem ser representados exatamente pelo padro de ponto flutuante. A soma deles incluir um pequeno erro. Observe que o erro bastante pequeno e essencialmente a soma (quando vista em uma preciso de 14/15 pontos decimais usando a funo Format$) correta. Para exibir o resultado exato para o usurio, faa o seguinte: Format$(18.51 + (-17.59), "###.#####")

91 - Banco de dados Enviado por: Felipe Maion Garcia Podemos entender por banco de dados qualquer sistema que rena e mantenha organizada uma srie de informaes relacionadas a um determinado assunto em uma determinada ordem. A lista telefnica um exemplo, nela percebemos que todos os dados referentes a uma pessoa esto na mesma linha, a isso chamamos registros. O tipo ou categoria da informao (nome,telefone,etc.) sobre uma pessoa est separada em colunas, as quais chamamos campos. Um Sistema Gerenciador de banco de dados relacionais(SGBDR) usado para armazenar as informaes de uma forma que permita s pessoas examin-las de diversas maneiras. O Gerenciador relacional de banco de dados do Visual Basic e do Access o Microsoft Jet, ele pertence a uma categoria diferente dos Gerenciadores tradicionais, como o Dbase e o Paradox, pois possuem caractersticas em comum com os banco de dados cliente-servidor. Tais caractersticas comuns so: Todas as tabelas, indces, consultas, relatrios e cdigo so armazenados num nico arquivo .MDB Os campos de data suportam informao de hora. Admite o armazenamento permanente de comandos SQL. possvel forar a integridade referencial entre as tabelas. Os campos suportam valores nulos (Null). No Dbase/Clipper banco de dados significa um arquivo que contm a estrutura de dados(campos) e os dados (Arquivo padro DBF). Para o padro MDB este conjunto de dados e sua estrutura denomina-se Tabela. Portanto aquilo que o Dbase/Clipper considera um banco de dados o Access e o Visual Basic considera como uma Tabela. Para o Access e o Visual Basic todos os componentes do sistema esto em um nico arquivo com extenso MDB, a este "pacote" consideramos o banco de dados. Logo quando abrimos um arquivo MDB temos acesso a todos os componentes do sistema: tabelas, consultas, macros, relatrios, etc. A esses componentes chamamos objetos do sistema.

92 - Mudar cor do texto conforme resultado Enviado por: Mauro Sakamoto Supondo que voc esteja tirando uma listagem de alunos. Se a mdia for menor que 5 imprima em vermelho reprovado, seno imprima em preto aprovado. Para fazer isso utilize dois campos frmula sobrepostos. No primeiro d o nome de aprovado e insira o seguinte cdigo: IF({Tabela.Mdia}>=5) THEN "Aprovado"

No segundo faa: IF({Tabela.Mdia}<5) THEN "Reprovado" Em seguida formate o segundo para vermelho (clique com o boto direito do mouse e escolha change Font. Escolha a cor Veremlho).

williamdsilva@aol.com.br

42

Est pronto quando o valor mdia da tabela for maior que cinco aparecer no relatrio em preto a palavra aprovado, caso contrrio aparecer em vermelho reprovado. 93 - Enviando texto para barra de status Enviado por: Mauro Sakamoto Suponha que voc tenha uma aplicao e ao passar por um boto, voc queira que emita uma mensagem na barra de status. Para isso primeiramente v at o menu Project-Componentes e Selecione Microsoft Windows Common Controls 5.0 (para o vb 5.0) Em seguida escolha o controle StatusBar. Clicando com o boto direito do mouse possvel personalizado (Nmero de paineis, mostrar data, hora, Status do Coaps Lock e Num Lock, etc). Deixe o segundo painel o destinado para a mensagem. Uma vez personalizada a barra de status v at o seu boto e insira os seguintes cdigos no evento MouseMove Sub CmbBotao_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) StatusBar1.Panels(1).Text="Texto desejado" 'inicia no zero End Sub Agora v at o evento MouseMove do seu Form e faa StatusBar1.Panels(1).Text="" 'inicia no zero

94 - Retornar para formulrio valor selecionado no DBGrid Enviado por: Mauro Sakamoto Supondo que vc tenha um formulrio "Form1" (sem DataControl) e um boto que chama um outro formulrio "Fomr2" que possue um DBGrid. Esse DBGRid utilizado para pesquisa, ou seja ao selecionar um registro no DBGrid, quero que ao sair do "Form2" esse valor seja exibido no "Form1". Para fazer isso utilize os seguintes cdigos no evento Click do boto retornar. Dim MyDB As Database Dim MySet As RecordSet 'declarao de variveis Set MyDB=OpenDatabase("File.mdb") 'abre o banco de dados Set MySet=MyDB.OpenRecordSet("MyTable") 'abre a tabela MySet.Index = "PrimaryKey" 'busca pelo campo chave MySet.Seek "=",DBGrid.Columns(0).CellValue(DBGrid.GetBookMark(0)) 'valor a ser encontrado Form1.TxtCampo1.Text=MySet("Campo1") Form1.TxtCampo2.Text=MySet("Campo2") Form1.TxtCampo3.Text=MySet("Campo3") Form1.TxtCampo4.Text=MySet("Campo4") 'e assim sucessivamente Form1.TxtCampoN.Text=MySet("CampoN") Unload Me Obs: Nesse exemplo estou considerando que a minha coluna 0 tem o valor do ndice da minha tabela (Columns(0)). J GetBookMark(0) retorna a linha selecionada.

95 - Tenha uma linha 3D entre um menu pulldown e uma barra de ferramentas Enviado por: Henrique Angelo Desenhe um 3DPanel com um tamanho (height) de 30. Este tamanho no fcil de ser desenhado manualmente.

williamdsilva@aol.com.br

43

Apague a Caption, mude o BevelOuter para 1 (inset), border para 1 e Align para Top. Desenhe a barra de ferramentas e o menu.

96 - Livre-se dos zeros inteis Enviado por: Henrique Angelo Vamos retirar os zeros inteis da varivel mystring (que contm "00030"). Abaixo, um interessante caminho para isto. Mystring = CStr(CInt(mystring)) Outro caminho : Mystring = Str(Val(mystring))

97 - Objetos vazios? Enviado por: Henrique Angelo No se pode usar a funo IsEmpty 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. If Not frmChild Is Nothing Then Unload frmChild End If

98 - Destacando uma linha em um DBGrid Enviado por: Henrique Angelo Para destacar uma linha no controle DBGrid, adicione o registro corrente SellBookmarks Collection: Private Sub DBGrid_RowColChange _ (LatRow As Variant, ByVal LasRow As Integer) If Data1.RecordSet.RecordCount Then DBGrid.SelBookmarks.Add _ Data1.RecordSet.Bookmark End If End Sub

99 - Atualizando Bound Controls por uma List Box Enviado por: Henrique Angelo Quando voc desejar que os Bound Controls (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.SelectedItem Como resultado, seu registro corrente passar a ser o registro com a chave indicada na lista ou combo. Todos os Bound Controls so atualizados automaticamente. necessrio definir apenas as propriedades RowSource e ListField. Assim, economiza-se tempo que seria gasto em converses de dados e atualizao de campos.

100 - Valores de retorno no requeridos

williamdsilva@aol.com.br
Enviado por: Henrique Angelo

44

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 = Int(Rnd * 6) + 1 MsgBox "Esta uma rotina que no retorna valor" End Function

101 - Procurando por nulos retornados por chamadas DLL Enviado por: Henrique Angelo

Aps uma chamada a DLL (API), o valor retornado pode conter um nulo. Um dos meios de eliminar este nulo procurar o caracter Chr$(0), como neste exemplo.
'yourstring a string retornada pela API, e pode conter um nulo Dim CheckForNull as Integer CheckForNull = Instr(YourString, Chr$(0)) If CheckForNull > 0 then Left$(YourString, CheckForNull - 1)

102 - Como calcular as coordenadas (x,y) de qualquer posio de um crculo Enviado por: Henrique Angelo A rotina abaixo (parte da biblioteca CodeBank) 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, X as Long, Y as Long) Dim Convert as Double Convert = 3.141593 /180 ' PI/180 X = CenterX - (Sin(-Degree * Convert) * RadiusX) Y = CenterY - (Sin((90 + Degree) * Convert) * RadiusX) End Sub 103 - Movendo itens em uma list box Enviado por: Henrique Angelo 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 Integer Dim New_index As Integer 'mouse events: RadiusX as Long, RadiusY as Long, _

williamdsilva@aol.com.br

45

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

104 - Usando SendKeys Enviado por: Henrique Angelo A funo SendKeys (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) If cCnt.Enabled Then cCnt.SetFocus SendKeys KeyValue End Sub

105 - Bloqueando funes Copiar e Colar em caixas de texto Enviado por: Henrique Angelo 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 KeyDown consegue detectar CTR+C e CTRL+V, mas no detecta. No evento KeyPress, estas teclas podem ser capturadas: Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii = 3 Or KeyAscii = 22 Then KeyAscii = 0 'CTRL+C = 3 e CTRL+V = 22, valores no constantes na tabela ANSI, 'geram estas combinaes. Recurso no documentado End Sub

106 - Forando caracteres maisculos Enviado por: Henrique Angelo Para facilitar a digitao de maisculos, independente do pressionamento de CAPS LOCK, converta cada caracter no evento KeyPress.

williamdsilva@aol.com.br

46

Private Sub Form_KeyPress (KeyAscii as Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) End Sub Para que esta rotina funcione para todos os campos do form, altere a propriedade KeyPreview do mesmo para true.

107 - Bloqueando funes Copiar e Colar em caixas de texto Enviado por: Henrique Angelo 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 KeyDown consegue detectar CTR+C e CTRL+V, mas no detecta. No evento KeyPress, estas teclas podem ser capturadas: Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii = 3 Or KeyAscii = 22 Then KeyAscii = 0 'CTRL+C = 3 e CTRL+V = 22, valores no constantes na tabela ANSI, 'geram estas combinaes. Recurso no documentado End Sub

108 - Forms redimensionveis sem barra de ttulo Enviado por: Henrique Angelo 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! 109 - Removendo o move Enviado por: Henrique Angelo Em alguns casos, interessante impedir o usurio de mover um form. No VB isto pode ser implementado com APIs: Declare Function GetMenu% Lib "User" (ByVal hWnd%) Declare Function RemoveMenu% Lib "User" (ByVal hWnd%, ByVal nPosition%, ByVal wFlags%) '... Dim Res% Res = RemoveMenu(GetMenu(Form.hWnd), SC_MOVE, MF_BYPOSITION)

110 - Economize memria com uma picture box Enviado por: Henrique Angelo 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 AutoRedraw 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) for pequeno em relao ao form, voc economizar memria se utilizar uma picture box com AutoRedraw = true e BorderStyle = 0, enquanto o AutoRedraw do form ser desativado (false). 111 - Programando de forma diferente em tempo de desenho e execuo Enviado por: Henrique Angelo 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. If InsStr(App.Path, "VB") Then

williamdsilva@aol.com.br

47

'execute os processos prprios 'de debug e no de sistema executvel End IF Uma variao : If InsStr(App.Path, "VB") Then Stop Voc pode inserir este cdigo para depurao (debug); se voc esquecer, isto no causar - repetimos - problemas ao usurio. 112 - Animao Enviado por: Felipe Maion Garcia Agora, voc dar um grande passo na programao de jogos. Trata-se da Animao de Personagens. Como j foi dito anteriormente, encontrei muitos desenhos para animaes simples no SpriteLib. Infelizmente, cada um desses arquivos contm todos os movimentos de um determinado personagem; assim, caber a vocs recortar cada posio, salvando-a com um novo nome de arquivo. Depois de feito o recorte, abra o Visual Basic e comece um EXE normal. Coloque, ento, um PictureBox, um Timer e um ImageList (VB 4 ou superior apenas). No ImageList, selecione as imagens que faro parte da animao. Note que para cada imagem dessa lista h um nmero. O PictureBox dever ter sua prpriedade "AutoSize" ajustada para "True", uma vez que praticamente impossvel recortar todas as imagens com o mesmo tamanho. Lembre-se tambm de ajustar, ainda no PictureBox, o estilo normal, e no "3D", que o padro. Alm disso, voc deve tirar a borda do PictureBox e no Form1, programar a propriedade "BackColor" com uma cor preta. Depois disso, no evento Form1_Load, insira o seguinte cdigo: Set Picture1.Picture = ImageList1.ListImages(1).Picture

Esse comando faz com que a figura que aparecer no PictureBox seja a mesma com o nmero 1 do ImageList (o nmero entre parnteses o nmero da imagem na lista). Depois, ajuste o Timer com "Interval" de 100 milissegundos. No evento Timer1_Timer, coloque: If Picture1.Picture = ImageList1.ListImages(1).Picture Then Set Picture1.Picture = ImageList1.ListImages(2).Picture Picture1.Top = Picture1.Top + 50 Exit Sub End If

If Picture1.Picture = ImageList1.ListImages(2).Picture Then Set Picture1.Picture = ImageList1.ListImages(1).Picture Picture1.Top = Picture1.Top + 50 Exit Sub End If Apesar de parecerem complexos, esses comandos so simples: a cada 100 milissegundos, o programa ir checar qual a imagem da animao e a trocar para outra. Ao mesmo tempo, esses comandos faro com que o PictureBox se mova para baixo. Como neste exemplo usei imagens de um homem andando para baixo na tela, a animao conseguiu mesmo passar esta impresso.

113 - Movimento de objeto atravs do teclado Enviado por: Felipe Maion Garcia Movimentando Objetos Atravs do Teclado Isso simples, apesar de no parecer. Suponhamos que voc tenha uma forma (Shape1) em seu projeto, e quer mov-la pela tela usando as setas do teclado. Crie um relgio (Timer1). No General_Declarations, digite: Dim Baixo As Integer Dim Cima As Integer

williamdsilva@aol.com.br

48

Dim Direita As Integer Dim Esquerda As Integer O cdigo acima foi utilizado para declarar as variveis Baixo, Cima, Direita e Esquerda. Voc pode alterar o nome das variveis aqui, mas lembre-se de mudar tambm TODAS as referncias a estas variveis pelas condies novas. Agora, no evento Form_KeyDown, digite: If (KeyCode = vbKeyLeft) Then Esquerda = True End If If (KeyCode = vbKeyRight) Then Direita = True End If If (KeyCode = vbKeyUp) Then Cima = True End If If (KeyCode = vbKeyDown) Then Baixo = True End If Este cdigo programa as setas para interagirem com as variveis declaradas acima. Logo depois, no evento Form_KeyUp, digite: If (KeyCode = vbKeyLeft) Then Esquerda = False End If If (KeyCode = vbKeyRight) Then Direita = False End If If (KeyCode = vbKeyUp) Then Cima = False End If If (KeyCode = vbKeyDown) Then Baixo = False End If Repare que este cdigo foi bem parecido com Form_KeyDown. Agora, no evento Timer1_Timer, digite: If Esquerda = True Then Shape1.Left = Shape1.Left - 30 End If If Direita = True Then Shape1.Left = Shape1.Left + 30 End If

williamdsilva@aol.com.br

49

If Cima = True Then 7Shape1.Top = Shape1.Top - 30 End If If Baixo = True Then Shape1.Top = Shape1.Top + 30 End If Repare que a propriedade Interval do objeto Timer1 deve estar ajustada para 1. Agora, basta executar o jogo e ver o funcionamento deste cdigo. NOTA: em todos os lugares onde h algo como "...Top+30" ou ..."Top-30" ou "...Left+30" ou "...Left-30", voc pode mudar o nmero "30" de acordo com a velocidade do Shape1. Quanto menor o nmero, menor a velocidade, e quanto maior o nmero, maior a velocidade. Porm, se voc aumentar demais a velocidade, passa a perder muito na suavidade dos movimentos. Preferimos usar 30.

114 - Efeitos sonoros Enviado por: Felipe Maion Garcia Tambm possvel, alm de usar os fundos musicais (MID), usar efeitos sonoros (WAV) sem que seja necessrio interromper a msica de fundo, porm enquanto este efeito sonoro toca, os comandos do jogo "travam" at que ele acabe. O cdigo abaixo se refere ao seguinte exemplo: voc quer que, quando o jogo seja fechado, o efeito sonoro "Repique.wav" seja tocado. Para que isso seja possvel, insira este cdigo em um Mdulo de seu projeto: Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Repare que todo este cdigo deve ser colocado em uma nica linha. Depois disso, no evento Form_Unload, referente ao momento em que o jogo fechado, coloque o seguinte cdigo: result = sndPlaySound("C:\Windows\Repique.wav", SND_ASYNC Or SND_NODEFAULT) PRONTO! Isso tudo que um jogo precisa para tocar efeitos sonoros. NOTA: voc pode mesclar os tpicos 01 e 02 para ter uma msica de fundo e efeitos sonoros ao mesmo tempo, e o melhor, voc no perde velocidade com isso. OBS: Se voc estiver usando o Windows 3.1, ir perceber que este cdigo no ir funcionar. Calma, basta mudar, no Mdulo, a palavra "winmm.dll" por "mmsystem.dll".

115 - Musica de fundo Enviado por: Felipe Maion Garcia Caso voc no saiba, possvel tocar uma msica de extenso MID em um programa e realizar outras tarefas ao mesmo tempo. Basta colocar em um mdulo de declaraes (*.BAS) o seguinte cdigo. NOTA: tudo isso apenas uma linha de texto e no vrias, como aparenta). Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uRetrunLength As Long, ByVal hwndCallback As Long) As Long Suponhamos que voc queira que esta msica toque sempre que o programa se iniciar (Form_Load) e pare sempre que o mesmo for fechado (Form_Unload). Ento, no evento Form_Load, insira o cdigo: result = mciSendString("open C:\Windows\Canyon.mid type sequencer alias musica", 0, 0, 0) result = mciSendString("play musica", 0, 0, 0)

Desta vez, so duas linhas mesmo. Assim, quando voc iniciar seu programa, o som "Canyon.mid" ir tocar. Repare, depois da palavra "alias", que a palavra "musica" pode ser substituida por outra varivel, mas no se esquea de mudar esta varivel tambm na segunda linha, ou o programa no ir iniciar corretamente. Agora, no evento Form_Unload, insira o seguinte cdigo: result = mciSendString("open C:\Windows\Canyon.mid type sequencer alias musica", 0, 0, 0)

williamdsilva@aol.com.br

50

result = mciSendString("stop musica", 0, 0, 0) Novamente so duas linhas de cdigo. Se voc mudou a varivel "musica" no evento Form_Load, no esquea de mud-la aqui tambm. PRONTO! Agora, sempre que voc iniciar o Jogo, o som escolhido comear a tocar, e, na hora da sada, este som ir parar. NOTA: se voc estiver rodando o programa por dentro do VB, no o pare com o boto "Stop", e sim feche o Form. Se voc no fizer isso, o som ir continuar tocando! OBS: Se voc estiver usando o Windows 3.1, ir perceber que este cdigo no ir funcionar. Calma, basta mudar, no Mdulo, a palavra "winmm.dll" por "mmsystem.dll".

116 - Mltipla seleo numa list box. Enviado por: Mauro Sakamto Para conseguir mltipla seleo numa list box basta mudar uma propriedade MultiSelect para 1-Simple (basta um click para selecionar os itens). 2-Extended ( necessrio clicar Shift+click or shift + tecla de direo) Para utilizar os valores selecionados preciso fazer um for. Ex: For n=0 to (List.ListCount-1) If List.Selected(n)=True then 'se verdadeiro est selecionado showmessage('o item '+ list.List(n) +' est selecionado') end if Next n

117 - Simulando um ToolTipText (VB3 ou VB4) Enviado por: Mauro Sakamoto Um ToolTipText aquele texto com um micro help que aparece quando passamos em cima de algum boto (na maioria das vezes). No VB5 ele j vem como sendo uma propriedade dos controles, mas no VB3 ou 4 essa propriedade no existe. Porm existe uma maneira bem simples de cri-la. Primeiramente insira um label prximo de um boto. Em seguida mude o texto (esse vai ser o texto do seu micro help), o BackColor para &H00C0FFFF& e coloque a propriedade visible=false Agora no evento MouseMove do formulrio coloque If Label1.Visible=True then Label1.Visible=False End if Em seguida v at o evento MouseMove do Boto e coloque If Label1.Visible=False then Label1.Visible=True End if Dessa forma quando voc posicionar o cursor do mouse sobre o boto o label ficar visvel mostrando seu micro help. E quando voc estiver sobre o formulrio este ficar invisvel.

118 - Imprimindo Relatrio do Access a partir do VB Enviado por: Mauro Sakamoto Se vc est migrando do Access par o VB saiba que possvel aproveitar seus relatrios feitos em access. Para isso utilize os seguintes comandos

williamdsilva@aol.com.br

51

Dim ObjectAccess As Object Set ObjectAccess = CreateObject("Access.Application") With ObjectAccess .OpenCurrentDatabase filepath:="File.mdb" .Visible = True .DoCmd.OpenReport ReportName:="Report File Name", View:=Access.acPreview End With 'para visualizar 'E With ObjectAccess .OpenCurrentDatabase filepath:="File.mdb" .DoCmd.OpenReport ReportName:="Report File Name" End With 'para imprimir sem visualizar

119 - Utilizando o pkzip para fazer backup em vrios disquetes Enviado por: Mauro Sakamoto Muitas vezes devido ao grando tamanho de um banco de dados complicado fazer seu backup para um disquete. Principalmente para usurios leigos. Para simplificar a operao podemos utilizar o pkzip (compactador de arquivos) e uma funo chamada shell. Ento basta colocar os seguintes cdigos na opo de backup Dim X as variant X=Shell("pkzip.exe a:\file.zip -& c:\path\file.mdb",0) 'executa o pkzip em janela oculta. SendKeys "%{F4}", True 'fecha a janela possivel utilizar outros compactadores como arj ou outro qualquer Para descompactar utilize o pkunzip: Dim X as variant X=Shell("pkunzip.exe a:\file.zip c:\path",0) 'executa o pkunzip em janela oculta. SendKeys "%{F4}", True 'fecha a janela

120 - Permitir apenas nmeros numa caixa de texto (sem utilizar mscara de entrada) Enviado por: Mauro Sakamoto Para permitir que apenas nmeros sejam digitados em uma caixa de texto insira as seguintes linhas de cdigo no evento KeyPress da caixa de texto. If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 Beep End If

williamdsilva@aol.com.br
121 - Mudar a impressora em tempo de execuo. Enviado por: Mauro Sakamoto

52

Para alterar em tempo de execuo a impressora preciso inserir o Controle Common Dialog. Em seguida insira o seguinte cdigo: CommonDialog1.ShowPrinter

122 - Limpar campos (caixa de texto) do formulrio Enviado por: Mauro Sakamoto Existe uma maneira bem simples e rpida de limpar todos os campos de um formulrio de uma nica vez. Para isso utiliza a seguinte sintaxe: Dim i as integer For i=1 to Form1.Controls.Count-1 If TypdeOf Form1.Controls(i) Is TextBox then 'verifica so caixa de texto Form1.Controls(i).Text="" end if Next i

123 - Utilizando Grid para Simular DBGrid Enviado por: Mauro Sakamoto Para quem usurio do VB 3.0 e deseja utilizar um DBGrid para visualizar uma tabela ou uma consulta, isso pode ser feito utilizando-se um Grid. Primeiramente insira o controle Grid. Em seguida v na prpriedade cols e escolha o nmero igual ao nmero de colunas que vc deseja exibir mais um. Agora v at o evento Load de seu formulrio e insira os cdigos Sub Form_Load() Dim MyDB As DataBase Dim MyTable As Table Dim Linhas As integer 'Declarao de variveis

Grid1.ColWidth(0) = 100 'formata o Grid Grid1.ColWidth(1) = 3000 'e assim sucessivamente. Os valores so referentes a largura das colunas no Grid. Elas devem ser ajustadas conforme o tamanho do campo a ser exibido. ... Grid1.ColWidth(N) = 3500 'ltima coluna Grid1.Row=0 Grid1.Col=1 'seleciona a primeira linha e a segunda coluna.

williamdsilva@aol.com.br

53

Grid1.Text = "Campo1" Grid1.Col=2 'seleciona a primeira linha e a terceira coluna. Grid1.Text = "Campo2" 'e assim sucessivamente. Os so referentes ao nome dos campos da tabela. ... Grid1.Col=N 'seleciona a primeira linha e a ltima coluna. Grid1.Text = "CampoN"

Set MyDB=OpenDataBase("File.mdb")'abre o Banco de dados Set MyTable=MyDB.OpenTable("TableName") 'abre a tabela a ser exibida

Linhas = 1 'seta o nmero de linhas (comea em zero) MyTable.MoveFirst 'move para primeiro registro da tabela Do Until MyTable.EOF 'enquanto no chegar ao final do arquivo, mostra registros no Grid Grid1.Rows = Linhas 'incrementa o nmero de linhas do Grid Grid1.Row=Linhas 'seleciona linha Grid1.Col=1 ' seleciona coluna 1 If Not IsNull(MyTable("Campo1")) then Grid1.Text=MyTable("Campo1") Else Grid1.Text="" End if Grid1.Col=2 'seleciona coluna 2 If Not IsNull(MyTable("Campo2")) then Grid1.Text=MyTable("Campo2") Else Grid1.Text="" End if ' e assim sucessivamente.

Grid1.Col=N 'ultima coluna If Not IsNull(MyTable("CampoN")) then Grid1.Text=MyTable("CampoN") Else Grid1.Text="" End if Linhas=Linhas+1

williamdsilva@aol.com.br

54

Loop

End Sub 124 - Selecionar registros conforme intervalo de datas digitadas em formulrio Enviado por: Mauro Sakamoto Suponha que vc queira fazer uma consulta que leve em conta todos os registros cujo a Data esteja entre uma Data Inicial e uma DataFinal. Escreva o seguinte cdigo. Dim MyDB As DataBase Dim MyQuery As SnapShot Dim MySQL As String 'Declarao de variveis. Set MyDB = OpenDatabase("File.mdb") 'Abre o Banco de Dados MySQL= " SELECT * FROM [Tabela] " MySQL= MySQL & " WHERE [Tabela].[Data] BETWEEN " MySQL= MySQL & Chr(35) & Format(TxtDataInicial.Text,"mm/dd/yy") & Chr(35) & " AND " & Chr(35) & Format(TxtDataFinal.Text,"mm/dd/yy") & Chr(35) Set MyQuery=MyDB.OpenCreateSnapShot(MySQL) Supondo que TxtDataInicio="31/01/97" e TxtDataFinal="31/12/97" a Query ficar da seguinte maneira SELECT * FROM [Tabela] WHERE [Tabela].[Data] BETWEEN #01/31/97# AND #12/31/97#

Obs:- Quando vc utliza campos do tido data importante observar que a data no formato ms-dia-ano, porisso preciso utilizar a funo format.

125 - Reparando Banco de Dados Corrompido Enviado por: Mauro Sakamoto Para reparar o banco de dados quando ele est corrompido (erro que ocorre quando o micro desligado por algum motivo no momento em que o banco de dados estava sendo acessado) deve utilizar a seguinte sintaxe: If Err = 3224 Then 'verifica o nmero do erro MsgBox "O Banco de Dados est corrompido ! Pressione Ok para Reparar", 16, "Opo" DBEngine.RepairDatabase ("c:\path\file.mdb") 'repara o Banco de Dados DBEngine.CompactDatabase "c:\path\file.mdb","c:\path\fileBack.mdb" 'compacta banco de dados e renomeia Kill ("c:\path\file.mdb") 'apaga o BD antigo Name "c:\path\fileBack.mdb" As "c:\path\file.mdb" 'renomeia o Banco de Dados End if importante compactar o banco de dados aps repar-lo devido ao aumento de tamanho do mdb.

126 - Como fazer o mouse desaparecer do form Enviado por: Henrique Angelo 'declare em general: Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long 'crie um botao para desativar o mouse:

williamdsilva@aol.com.br

55

Private Sub "nome do botao"_Click()

ShowCursor False

End Sub

'para aparecer o mouse crie um boto: Private Sub "Nome do Boto"_Click()

While ShowCursor(True) < 0 Wend

End Sub

127 - Performance com a SQL Passthrough Enviado por: Henrique Angelo Quando voc acessa uma base dados via ODBC (Open Database Connectivity), os drivers ODBC atuaro como tradutores dos seus comandos SQL. A razo disto que, existe uma linguagem SQL genrica (SQL ANSI) 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 Informix, o SQL da Sybase etc. Escrevendo seus comandos em SQL ANSI, 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 portabilidade de cdigo fonte, existe o ganho em interoperabilidade: 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 Integer 'cdigo 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 parmetro para "pular" a traduo. No VB4, a constante chama-se dbSQLPassThrough. O comando SQL passado deve estar na sintaxe especfica do SGBD (ou DBMS) utilizado. Mesmo assim, o sistema poder continuar como portvel e interopervel, 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.

williamdsilva@aol.com.br

56

2) Execute a consulta especfica do banco tal no momento tal. A informao de qual banco poder estar em entradas de arquivos INI ou no Registry.

128 - Propriedade Count, de Control Array, no documentada Enviado por: Henrique Angelo No VB4, cada control array (vetor de controles) uma collection e possui uma propriedade Count. Isto 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 Item 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 Integer As Integer For ij = 0 to Option1.Count - 1 If Option(ij).Value Then MsgBox str(ij),0, "Opo Selecionada" End If 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.

129 - Soluo para bug no DBGrid Enviado por: Henrique Angelo H um srio bug (erro) em VB4, no controle Databound Grid 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 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 Caller.Enabled = false no evento Load do form "modal". Volte para true no evento Unload.

130 - Identificando uma unidade de CD em Rede Enviado por: Henrique Angelo A API de 32 bits bem mais rica que a de 16 bits. Entretanto, a funo GetDriveType mostra os Drives CDs em Rede, apenas como DRIVE_REMOTE (de rede). Isto uma verdade, mas no completa. Combine a chamada a GetDriveType com uma chamada a GetVolumeInformation para determinar se o drive , ao mesmo tempo, de rede e CD. A chamada indica o sistema de arquivos: FAT, NTFS, HPFS ou CDFS (CD File System). Declare Function GetVolumeInformation _ Lib "Kernel32" _

williamdsilva@aol.com.br

57

Alias "GetVolumeInformationA" _ (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 = GetVolumeInformation _ (pstrRoothPath, pstrVolName, _ plngVolNameSize, plngVolSerialNum, plngMaxFileNameLen, plngSysFlags, _ pstrSystemType, plngSysTypeSize)

131 - Prevenindo interao do usurio, via MousePointer e Enabled Enviado por: Henrique Angelo Mudar a propriedade MousePointer 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 MDI parent forms (janelas principais de interface mltipla) e seus MDI children forms (janelas filhas). Em alguns processos demorados (como carga de banco de dados) mude a propriedade enabled de um MDI child para false, assim: 'antes Me.Enabled = False Me.MousePointer = 11 'hourglass (ampulheta) ExecutarProcessoDemorado 'depois Me.Enabled = True Me.MousePointer = 0 'padro No caso de um MDI com muitos filhos ativos, crie uma Forms Collection e desative (enabled = false) cada form. Depois de desativ-los, use MDIForm.Hourglass = false. 132 - Ordenando Colunas da ListView Enviado por: Henrique Angelo D ao seu controle ListView (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_ColumnClick _

williamdsilva@aol.com.br

58

(ByBal ColumnHeader As ColumnHeader) Whith ListView1 If (ColumnHeader.Index -1) = .SortKey Then .SortOrder = (.SortOrder + 1) Mod 2 Else .Sorted = False .SortOrder = 0 .SortKey = ColumnHeader - 1 .Sorted = True End IF End With End Sub

133 - Limpando Combos Read-Only Enviado por: Henrique Angelo Numa ComboBox com a propriedade Style = 2 (dropdown list), a propriedade Text somente-para-leitura. Isto impede limpeza e troca de contedo por esta propriedade, em construes como estas: Combo1.text = "" 'ou Combo1.text = "novo contedo" A soluo limpar a combo com o mtodo clear e adicionar o valor novo. Combo1.Clear Combo1.AddItem "novo contedo "

134 - Inconsistncia no caminho da aplicao (app.path) Enviado por: Henrique Angelo 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:\SUBDIR). Para testar e acrescentar a barra, use o cdigo abaixo que, retornar C:\SUBDIR\. MyPath = App.Path If Not Right(MyPath, 1) = Chr(92) then 'chr 92 = "\" MyPath = MyPath & Chr(92) End If

135 - Mantendo constantes Enviado por: Henrique Angelo 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). Inclua MYCONST.TXT no seu projeto (menu File Add File). Substitua (menu Edit Replace 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). 136 - Painel de Percentual com SQL Count

williamdsilva@aol.com.br
Enviado por: Henrique Angelo

59

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 Count (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 Grid 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 DICA ANTERIOR '... limpar o Grid '... formatar TB_Cidade.text 'query VA_Cmd = "Select * From CIDADE" If Len(TB_Cidade.Text) > 0 Then VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' " VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' " End If Set dynatemp = db.CreateDynaset(VA_Cmd, VGl_SQLop) 'query do contador VA_Cmd = "Select Count(*) From CIDADE" If Len(TB_Cidade.Text) > 0 Then VA_Cmd = VA_Cmd + " Where CIDADE.Nome >= '" & (TB_Cidade.Text) & "' " VA_Cmd = VA_Cmd + "And CIDADE.Nome <= '" & (TB_Cidade.Text) & Chr(255) & "' " End If Set dynacont = db.CreateDynaset(VA_Cmd, VGl_SQLop) If Not dynacont.EOF Then VA_Cont = dynacont(0) Else VA_Cont = 0 End If If VA_Cont = 0 Then

williamdsilva@aol.com.br

60

MsgBox "Nenhum registro de cidade encontrado." SU_Aguarde False, "" Gr_Grid.Row = 1 '... marcar outra linha do grid Exit Sub End If 'carga do grid Gr_Grid.Rows = VA_Cont + 1 VA_Curr = 1 Do While Not dynatemp.EOF SU_BarraPerc CInt(VA_Curr * 100 / VA_Cont), False 'rotina explicada na DICA ANTERIOR 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, false '... demais lgicas '... (tratamento de erro e formataes) End Sub Como esta rotina de carga de grid enorme (e no VB4, o DBGrid faz isto sozinho), o cdigo acima apenas mostra a formao do Select Count e a chamada a SU_BarraPerc. ____________ 137 - Painel de Percentual Enviado por: Henrique Angelo 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 3D Panel como barra de percentual, siga estes passos: 1) Insira um 3D Panel, com nome PA_Status, no MDIForm (aqui chamado de F00). Atribua Align = Alig Botton. 2) Insira em um mdulo (.BAS) a rotina SU_BarraPerc. Sub SU_BarraPerc (Perc As Integer, Acum As Integer) 'recebe perc, um nmero de 0 a 100

williamdsilva@aol.com.br

61

'100 = "desliga" a barra 'Acum = boolean, acumula o anterior ou no (true/false) Static VA_Vez Static VA_SaveCor As Long If Acum Then Perc = Perc + F00.PA_Status.FloodPercent End If If Perc > 100 Or Perc < -1 Then MsgBox "Perc deve estar entre -1 e 100", 16, "Erro de parmetro _ em SU_BarraPerc" Exit Sub End If If IsEmpty(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 If If Perc < 100 Then If Perc > 48 Then F00.PA_Status.ForeColor = RGB(255, 255, 255)'branco End If '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

williamdsilva@aol.com.br

62

F00.PA_Status.FontSize = 8.25 F00.PA_Status.ForeColor = VA_SaveCor F00.PA_Status.FloodShowPct = False VA_Vez = 1 End If End Sub Para chamar a rotina, basta passar o valor atual do percentual. O segundo 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 Integer 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

138 - Melhorando as declaraes API (I) Enviado por: Henrique Angelo Muitas rotinas API so declaradas como funo, mas, o valor de retorno no sempre utilizado. A funo SendMessage, 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 Integer dummy = SendMessage(Text1.hWnd, WM_PASTE, 0, 0&) A varivel s foi necessria por causa da declarao. Uma alternativa, declarar a funo 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 no pelo original: SUB_SendMessage Text1.hWnd, WM_PASTE, 0, 0& Observe que, seu cdigo ficou mais produtivo de ser mantido. 139 - GetModuleUsage em 32 bits Enviado por: Henrique Angelo Encontrei uma soluo para o problema, da API GetModuleUsage no trabalhar em VB4 a 32 bits. A TaskID retornada pela funo Shell pode ser usada por AppActivate. Assim: TaskID = Shell("DOSAPP.exe", vbNormalFocus) On Error GoTo finished While True DoEvents AppActivate TaskID Wend Finished:

williamdsilva@aol.com.br

63

On Error GoTo 0

140 - Ativando Num Lock por um cdigo Enviado por: Henrique Angelo Coloque isto nas declraes gerais de um mdulo .BAS Public Const VK_NUMLOCK = &H90 Public Type KeyboardBytes kbByte(0 To 255) As Byte End Type Public kbArray As KeyboardBytes Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long Public Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long Public Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long No form adicione 3 botes (cmdToggle, cmdTurnOn, cmdTurnOff) e um label. Adicione o seguinte cdigo no Form: Private Sub cmdToggle_Click() GetKeyboardState kbArray kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1) SetKeyboardState kbArray End Sub Private Sub cmdTurnOn_Click() GetKeyboardState kbArray kbArray.kbByte(VK_NUMLOCK) = 1 SetKeyboardState kbArray End Sub Private Sub cmdTurnOff_Click() GetKeyboardState kbArray kbArray.kbByte(VK_NUMLOCK) = 0 SetKeyboardState kbArray End Sub

141 - Ativando Caps lock por um cdigo Enviado por: Henrique Angelo Coloque isto nas declaraes gerais de um mdulo .BAS Public Const VK_CAPITAL = &H14 Public Type KeyboardBytes kbByte(0 To 255) As Byte End Type Public kbArray As KeyboardBytes Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long

williamdsilva@aol.com.br

64

Public Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long Public Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

Em um form, coloque 3 command buttons (cmdToggle, cmdTurnOff, cmdTurnOff) e uma label. Coloque oo seguinte cdigo no form: Private Function CapsLock() As Integer CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1 End Function Private Sub Form_Load() If CapsLock() = 1 Then Label1 = "On" Else Label1 = "Off" End Sub Private Sub cmdToggle_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)

SetKeyboardState kbArray Label1 = IIf(CapsLock() = 1, "On", "Off") End Sub Private Sub cmdTurnOn_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = 1 SetKeyboardState kbArray Label1 = IIf(CapsLock() = 1, "On", "Off") End Sub Private Sub cmdTurnOff_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = 0 SetKeyboardState kbArray Label1 = IIf(CapsLock() = 1, "On", "Off") End Sub

142 - J estou no ar? Enviado por: Henrique Angelo 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 If App.PrevInstance Then

williamdsilva@aol.com.br

65

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 If 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. Isto tambm pode ser feito por APIs (FindWindow, ShowWindow e SetFocus, da bilblioteca User), mas, tem o mesmo efeito e mais trabalhoso. 143 - Menu Colar Alternativo Enviado por: Henrique Angelo 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&lar" + Chr$(9) + "Ctrl + V" na Sub Main ou no form_Load. 144 - Listas erradas de API Enviado por: Henrique Angelo Os utilitrios APILOD16.EXE e APILOD32.EXE acessam o arquivo WIN32API para passar os parmetros de tipos de dados (Type Declarations) necessrios para chamar funes Win32 API. Porm existem erros. Por exemplo: WIN32API.TXT (incorretamente)diz: Type COMSTAT fCtsHold As Long fDsrHold As Long fRlsHold As Long fXoffHold As Long fXoffSnet As Long fEof As Long fTxim As Long fReserved As Long cbInQue As Long cbOutQue As Long End Type WINT31APITXT, corretamente, diz: Type COMSTAT bunch_Of_Bits As Long cbInQue As Long cbOutQue As Long 'errado 'errado 'errado 'errado 'errado 'errado 'errado 'errado

williamdsilva@aol.com.br

66

End Type

145 - Validando CGC e CPF Enviado por: Henrique Angelo Essa brasileirssima. Os nmeros de CGC e CPF possuem dgitos verificadores para... adivinhem ... verificar! Isto 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 (Vl_CgcCpf As String) ' Esta Rotina Devolver True Se o Cgc/Cpf Informado For valido ' 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 ' If Fu_consistir_CgcCpf(Vl_CgcCpf) = False then ' MsgBox "( Cgc/Cpf Informado No um Cgc/Cpf Correto )" ' Me.CgcCpf.SetFocus ' Exit Sub ' End if Fu_consistir_CgcCpf = False Dim VA_CgcCpf 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

williamdsilva@aol.com.br

67

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 diviso ' 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 diviso ' 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

williamdsilva@aol.com.br

68

If VA_resto1 <> Numero(14) Then Exit Function End If End If Fu_consistir_CgcCpf = True End Function

146 - Problemas com o Print Enviado por: Henrique Angelo O cdigo abaixo funciona em VB3: Cls Print Spc(10); "Informe seu nome:"; currentX = 0 currentY = currentY +1 Print Spc(10); "Informe seu nome:"; Este cdigo falha em VB4. Retirando o ltimo ponto-e-vrgula do primeiro print: Print Spc(10); "Informe seu nome:" Acrescente Debug. antes de Print para testar: Cls Debug.Print Spc(10); "Informe seu nome:" currentX = 0 currentY = currentY +1 Debug.Print Spc(10); "Informe seu nome:"; Ou mude o comando para: Print Space(10); "Informe seu nome:";

147 - Desmarcar todos os itens de uma lista Enviado por: Henrique Angelo Uma forma rpida de retirar qualquer seleo de uma listbox : list1.selected (-1) = False

Isto no funciona em VB4. 148 - Pinte meu mundo ... nas cores padro! Enviado por: Henrique Angelo Apenas aps executar o ltimo "make EXE", troque seu esquema de cores e veja quantos fundos de cores voc possui fora do padro (escolhido pelo usurio final, via Painel de Controle). Infelizmente, 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. Isto o ajudar a testar suas aplicaes de cores. O VB4 dispe de 24 cores de sistema como constantes. No VB Help, procure por "Color Constants" ou "VBTranslateColor". Copie o valor hexadecimal para a propriedade de cor de seu objeto se ele foi erroneamente redefinido (fora do padro). Tambm possvel copiar os valores de controles que estejam corretos, mas cuidado, a face do boto por exemplo, pode no ser cinza. Por Clint Walker* Na nova paleta de cores do VB4, h um boto Default, que altera as cores do objeto selecionado para o padro do Windows. Verifique se a propriedade Appearance 3D para obter melhores resultados. Notas do Frum Access (Charles A. Mller): 1) uma regrinha antiga. Nunca mude as cores que, o usurio, que o cliente, define externamente (no Windows), a menos que isto traga utilidade. Nestes casos, esteja atento para o significado das cores e sua harmonia (afinal, penteadeiras de camarim na tela 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

williamdsilva@aol.com.br

69

de cores, uma lista de alterao automtica para as cores padro (alm do boto default).

149 - Brancos no controle Masked Edit Box Enviado por: Henrique Angelo O controle MS Masked Edit apenas aceita entrada de dados dentro da mscara formatada (mask). Isto 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: 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_ValidationError quando adiciono um novo registro. 150 - Piscar ou no piscar Enviado por: Henrique Angelo Geralmente, ao criar uma ajuda de barra de situao (status bar help), voc ir adicionar cdigo no evento MouseMove de controles e forms. A barra de status poder ser uma picture box com um label, um controle statusbar (VB4-32 bits) ou - como mais usado - um painel 3D. O problema que o mouse se movimenta 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_EXPLICAPADRAO = "Pressione F1 para obter ajuda." '... Sub SU_Explica (oque As String) 'rotina em VB3, usa um painel 3D oque = Trim(oque) If oque = "" Then oque = CG_EXPLICAPADRAO If Len(oque) > 1 And Right$(oque, 1) <> "." Then oque = oque & "." 'acrescenta ponto final End If 'muda a inicial para maiscula If Len(oque) > 1 Then oque = UCase(Left(oque, 1)) & Right(oque, Len(oque) - 1) Else oque = UCase(oque) End If 'altera a barra se o novo contedo for diferente If MainForm.PA_Status.Caption <> oque Then MainForm.PA_Status.FloodShowPct = False MainForm.PA_Status.FloodType = 0 MainForm.PA_Status.Caption = oque End If End Sub

williamdsilva@aol.com.br

70

A funo usa uma constante (CG_EXPLICAPADRAO) 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 Integer, Shift As Integer, X As Single, _ Y As Single) SU_Explica "Grava as alteraes no banco de dados." End Sub Pode ser utilizado tambm o evento GotFocus (para resposta ao teclado). Neste caso, o LostFocus dever limpar a barra de status (como a frase genrica). Sub txtNome_LostFocus ( ) SU_Emplica "" End Sub

151 - F1 e o Help de Contexto Enviado por: Henrique Angelo 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 HelpContextID do form ou controle. A soluo ao programador pode ser o uso de API, com a funo 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

152 - Onde est o fim? Enviado por: Henrique Angelo 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 End. Este ltimo, fecha todos os arquivos e limpa todas as variveis. 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 funo pblica (codificada em um .BAS) que "substituir" o End. Somente esta funo ter End, facilitando o controle do cdigo. 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

153 - Capturando parmetros Enviado por: Henrique Angelo 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,

williamdsilva@aol.com.br

71

este recurso ainda utilizado, principalmente quando se deseja automatizar tarefas. O prprio Registry 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 Command: 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

154 - Sub Main, iniciando um projeto sem interface Enviado por: Henrique Angelo 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 Registry ou arquivos INI, 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 - Options Project Start Up Form = Sub Main.) 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

155 - Descarregando DLLs fora de controle Enviado por: Henrique Angelo 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: EXIT No Windows 95, criei um atalho para este BAT. O modo DOS selecionado, nas propriedades, como Program / Advanced. Este caminho muito mais rpido que um reboot. Por Michael J. Dyer 156 - Evitando Erros de Atualizao em Bases Access Enviado por: Henrique Angelo Evite o erro de acesso 3260 ("Couldn't update; currently record is locked by user '' on machine ''"), que ocorre quando

williamdsilva@aol.com.br

72

duas ou mais aplicaes acessam a mesma tabela de uma base de dados Access (Jet). O acesso realizado por objetos recordset (como table ou dynaset), sobre uma tabela que contenha uma chave (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 Idle dbFreeLOcks aps o recordset ser aberto. Se for um table recordset, inclua-o aps ter definido a propriedade Index. Veja um exemplo: Set db = Workspaces(0).Opendatabase("Test.mdb") Set TB = Db.OpenRecordSet("Customer_Master", dbOpenTable) TB.Index = "PrimaryKey" DB.Engine.Idle (dbFreeLocks)

157 - O desafio de criar Add-ins Enviado por: Henrique Angelo 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. Por exemplo, no Windows 95, aparecem mensagens como "Este programa causou um erro e vai ser encerrado" ou "se o problema persistir, contate o fornecedor". No Windows 3.1x, podem ser causados GPFs. Este erros ocorrem quando a IDE est sendo descarregada (unloaded) e ser executada numa posterior abertura do VB com o aviso "xxxxx add-in could not be loaded, do you want to remove it from the list of add-ins?" 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 VBIDE Instance Object, como AcitveProject.FileName no evento ConnectAddin da Conector Class. 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. 158 - Usando o CHR() para ocultar "mensagens" Enviado por: Gerson Keiti Motoyama Para quem no sabe, infelizmente, possvel "espiar", ou at mesmo "alterar" o cdigo de um executvel (somente as "mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usurio de nvel intermedirio. Para que isso no ocorra, ou pelo menos para dificultar alguma alterao, quando quiser escrever uma mensagem, por exemplo do tipo: msgbox "Ol, blz?" Utilizando o sintaxe: Chr(charcode), faa o seguinte: msgbox chr(79) & chr(108) & chr(225) & chr(44) & chr(160) & chr(98) & chr(108) & chr(122) & chr(63) Obs: Consulte os valores para o charcode no Help do VB: Character Set (0-127)/(128-255)

159 - Determinando se um objeto foi definido (Set) Enviado por: Henrique Angelo 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: Public Function IsSomething (ob As Object) As Long Dim J as Long Err.Clear On Error Resume Next

williamdsilva@aol.com.br

73

If TypeOf ob Is TextBox Then J=1 End If Select Case Err.Number Case 91 'error 91 = object not set IsSomethig = false Case 0 IsSomething = true Case Else '... outro erro ocorreu End Select On Error GoTo 0 End Function

160 - Depure simultaneamente o servidor OLE e a aplicao Enviado por: Henrique Angelo O VB4 no apenas permite a criao de servidores OLE, mas, tambm permite depurar (debug) o servidor e a aplicao cliente ao mesmo tempo. Se voc criar um servidor OLE remoto, altere a propriedade Instancing para Creatable SingleUse. Isto tornar o debugging muito mais interessante. Cada vez que a classe for chamada, a 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 Instancing = Creatable MultiUse para uso nos testes. No se esquea de voltar para Creatable SingleUse antes de compilar o servidor OLE. 161 - Passe nothing aos forms com cautela Enviado por: Henrique Angelo uma boa idia passar o valor nothing 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 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_Unload. Private Sub Form_Unload (Cancel As Integer) Dim Form As Form For Each Form In Forms If Form Is Me Then

williamdsilva@aol.com.br

74

Set Form = Nothing Exit For End If Next Form End Sub

162 - Adicionando segurana a uma base de dados Jet Enviado por: Henrique Angelo 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 Workgroup Administrator para criar um novo grupo de trabalho, com uma no nula Workgroup ID. 2) Inicie 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. 163 - Eliminando o IF quando possvel Enviado por: Henrique Angelo Se voc atribui true ou false para uma varivel (ou propriedade), aps testar certas condies, poderia faz-lo sem o IF. Veja: If (age > 18 and sex = "M") and (NecessitaSeContigente = true ) Then ServicoMilitar = true Pode substituir por: ServicoMilitar = (age > 18 and sex = "M") and (NecessitaSeContigente) Outro exemplo: IF (age > 25 and Category = "M1") or (age > 35 and Category = "C1") or _ (Age > 45 and Category = "P1") then ExecuteDemissao Poderia ser: Dim condicao as Integer 'boolean condio = (age > 25 and Category = "M1") or (age > 35 and Category = "C1")_ or (Age > 45 and Category = "P1") If condicao Then ExecuteDemissao

164 - Simplificando a condio de um IF Enviado por: Henrique Angelo Quando voc escreve um comando IF (Se) assim: If Category = "CM" or Category = "M2" or Category = "P1" or Category = "ZZ" then ProcesseEmpregado End If Poderia simplificar para: Dim ValidValues as string ValidValues = "CM M2 P1 ZZ" If (InStr(1, ValidValues, Category)) > 0 then

williamdsilva@aol.com.br

75

ProcesseEmpregado End If Isto 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 Singh* Notas de Redao (Charles A. Mller): 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) If (InStr(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 Case, separando os valores vlidos por vrgulas: Select Case Category Case "CM", "M2", "P1", "ZZ" ProcesseEmpregado End Select

165 - TAB automtico para o prximo campo Enviado por: Henrique Angelo Esta dica til para desenvolvimento de aplicaes VB com a forma de edio de terminais 3270 (IBM 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) If keycode > 47 and keycode < 123 then If Len(Me.ActiveControl.Text) = (Me.ActiveControl.MaxLenght) then Sendkeys "{TAB}" End If End If End Sub

166 - Onde est o Beep? Enviado por: Henrique Angelo 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) If KeyAscii = 13 or KeyAscii = 9 Then KeyAscii = 0 End If End Sub

167 - Use o Code Profiler para depurao (debug) Enviado por: Henrique Angelo Algumas vezes, um erro de execuo se manifesta apenas aps a criao de um EXE e no em tempo de debug. O add-in Code Profiler poder ajud-lo.

williamdsilva@aol.com.br

76

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 Line Hit Count. 5) Selecione o boto Add Profiler Code. 6) Compile (make EXE) o programa (MYAPP.EXE). 7) Execute o seu cdigo com erro. 8) Volte ao Code Profiler e selecione View Results no menu File. 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. 168 - Otimizando consultas no Jet 3 Enviado por: Henrique Angelo Se voc precisa analisar a performance de uma query (consulta) no Jet Engine 3.0 (banco .MDB), atravs de um plano de execuo de consultas, voc deve adicionar esta chave de Registry e execut-la no RegEdit. \\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.0\Engines\Debug Para a nova chave Debug, adicione o nome JETSHOWPLAN (tudo maisculo) e valor ON. O Jet ir gerar um arquivo chamado SHOWPLAN.OUT, que ir mostrar planos de execuo de queries 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 Rushmore. Bases e consultas mal definidas exibem apenas uma leitura de tabela.

169 - Identificando um controle genrico Enviado por: Henrique Angelo Quando uma rotina pode trabalhar com muitos tipos de controles diferentes, a funo TypeOF pode detectar o tipo de controle em tempo de execuo: Function MyFunc (ctl as Control) If TypeOf ctl Is TextBox Then '... ElseIf TypeOf ctl Is CommandButton Then '... '... End If End Function 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 TypeName que indica (numa string) o nome da classe do objeto: Function MyFunc (ctl as Control) Dim sClassType As String 'typeName novidade do VB4 sClassType = TypeName(ctl) Select Case sClassType Case "TextBox" '... Case "CommandButton"

williamdsilva@aol.com.br

77

'... 'case ... End Select End Function Os nomes das classes de controle, no ambiente do VB, aparecem na Properties Window (janela de propriedades, ao lado do nome do controle). 170 - Determinando a classe de qualquer objeto Enviado por: Henrique Angelo No VB4, o comando TypeOf trabalha com qualquer objeto vlido. Exemplo: 'Esta rotina imprime informaes especficas de objetos Public Sub PrintObjectInfo (YourObject As Object) If TypeOf YourObject Is CDesk then Print "Object Type: Mesa" Print "Nmero de pernas: " & YourObject.NumberOfLegs ElseIf TypeOf YourObject Is CHouse Then Print "Object Type: Casa" Print "Nmero de portas: " & YourObject.NumberOfDoors End If 'impresso das propriedades de mesmo nome Print "Data de Venda: " & YourObject.Date Print "Preo de Venda: " & YourObject.Price '... End Sub 171 - Converso de Nulos Enviado por: Henrique Angelo Em consultas a bancos de dados, o retorno de uma varivel, quando nula, poder no ser 0 (numrico) ou "" (string). Geralmente se resolve assim: If Not IsNull(myrecordset.myfield) Then myvar = myrecordset.myfield Else myvar = "" 'myvar = 0, no caso de numricos End If Uma forma mais simples myvar = "" & myrecordset.myfield Ou myvar = val(0 & myrecordset.myfield) ' para numricos 172 - Uma histria de trs beeps Enviado por: Henrique Angelo Seus programas no esto executando instrues em VB4 como executavam em VB3? Tente isto , em Qbasic, VB3 e VB4.

williamdsilva@aol.com.br

78

BEEP: BEEP: BEEP Ao depurar com passo (F8), este mui complexo cdigo, voc ir ouvir trs Beeps, exceto no VB4. No VB4, palavras reservadas seguidas de dois pontos (:) so consideradas labels (rtulos de desvio). Assim funciona: Beep Beep Beep E voc ouvir os to esperados trs beeps. 173 - Lembra-se do SWAP? Enviado por: Henrique Angelo 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

174 - Posicionando uma Common Dialog Enviado por: Henrique Angelo 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: Inicie 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 Left e Top conforme desejar e inicie a common dialog deste form. No Windows 95 (VB 4-32 bits) , a common dialog ir aparecer na posio do form que a chamou. Como o form hide (oculto), isto imperceptvel para o usurio. 176 - Criando senhas para banco de dados Enviado por: Henrique Angelo 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 DB Password (senha de BD) como o de workgroup (grupos), ao mesmo tempo (isto , que dar mais segurana). Manipule uma DB Password no VB, usando o novo mtodo NewPassword (database object), com cdigos como este: Dim wrk As Workspace Dim db As Database Set wrk = DBEngine. Workspace(0)

williamdsilva@aol.com.br

79

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

177 - Simplificando chamadas API atravs de funes prprias Enviado por: Henrique Angelo Algumas chamadas funo API (DLL) so bastante complexas. Uma dica criar uma funo de cdigo VB que chama a API. Assim, a complexidade da API s ir aparecer uma vez. Por exemplo, a funo GetPrivateProfileString que, captura uma configurao 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 funo ficaria assim: Global Const Ini_File = App.path & "\Myapp.INI) '... Dim VA_LastUser 'chamada a API para capturar o contedo de "lastuser" na seo "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 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 = 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 cdigo. A API no retorna a string procurada e sim um buffer. 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 INI) foi implementada uma chamada assim:

williamdsilva@aol.com.br

80

Global Const Ini_File = App.path & "\Myapp.INI) '... Dim VA_LastUser 'chamada a API para capturar o contedo de "lastuser" na seo "options" Global Const Ini_File = "MYAPP.INI" ... VA_LastUser = FU_Le_MeuINI ("options", "lastuser", 30) Abaixo, um exemplo de funo "tradutora" de API: Function FU_Le_MeuIni (VL_Sec As String, VL_Key As String, VL_Size As Integer) As String 'recebe nome da seo e do pargrafo 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 no 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 funo usada como exemplo do VB3, podendo ser usada em VB4 se sua aplicao for em 16 bits. Mas, o conceito de criar funes "traduzidas" ou "facilitadas" de API aplicvel a qualquer verso do Visual Basic. 178 - Melhorando as declaraes API (II - a volta do SendMessage) Enviado por: Henrique Angelo Quando falava de SendMessage (veja 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_LINESCROLL 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

williamdsilva@aol.com.br

81

... SUB_SendMessage Text1.hWnd, EM_LINESCROLL, 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 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 combinao de dois valores word combinados. 179 - Mova e redimensione controles com preciso Enviado por: Henrique Angelo 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 SHIFT 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 Chris Kunicki, repassada por John Chmela (VB Developer's Network)* Nota da Redao: Os autores informam que a dica (A e B) se aplica ao VB3, mas, no funciona. Acrescentamos, ainda, alguns dados abaixo. 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 volta dos controles. Isto no se aplica a controles contidos em outros objetos (como painis, frames e picture boxes). D - Maior preciso Use os valores numricos de tamanho e posio: left, top, height e width - correspondentes a x, y' (eixo y do topo para baixo) , h (altura) e b (base), respectivamente - na Janela de Propriedades ou Janela de Cdigo. Esta tarefa um pouco rdua, ento, desenhe o controle com medidas aproximadas para depois, ajustar, via digitao de valores. 180 - Alteraes com Mid Enviado por: Henrique Angelo 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 STRING" If Mid(mystring, 2, 1) = "O" Then Mid(mystring, 2, 1) = "A" ' substituindo caracter End If

181 - Destacando uma linha em um DBGrid Enviado por: Henrique Angelo Para destacar uma linha no controle DBGrid, adicione o registro corrente SellBookmarks Collection:

williamdsilva@aol.com.br

82

Private Sub DBGrid_RowColChange _ (LatRow As Variant, ByVal LasRow As Integer) If Data1.RecordSet.RecordCount Then DBGrid.SelBookmarks.Add _ Data1.RecordSet.Bookmark End If End Sub

182 - Mostra o nome que foi usado pelo usurio para se logar no Win95/NT Enviado por: Henrique Angelo Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long gsUserId = ClipNull(GetUser()) Function GetUser() As String Dim lpUserID As String Dim nBuffer As Long Dim Ret As Long lpUserID = String(25, 0) nBuffer = 25 Ret = GetUserName(lpUserID, nBuffer) If Ret Then GetUser$ = lpUserID$ End If End Function Function ClipNull(InString As String) As String Dim intpos As Integer If Len(InString) Then intpos = InStr(InString, vbNullChar) If intpos > 0 Then ClipNull = Left(InString, intpos - 1) Else ClipNull = InString End If End If End Function

183 - Movimentando um label pela tela Enviado por: Henrique Angelo

williamdsilva@aol.com.br

83

Inicie um novo projeto, coloque um label(name=Label1) e um timer(name=Timer1). Nas prorpiedades do timer coloque: Interval = 1 Enabled = False No Form_Load() timer1.enabled = true No Timer1_Timer() While Label1.left <= 5000 Label1.left = label1.left + 2 wend 184 - Apagando todo o contedo de todos os campos texto Enviado por: Henrique Angelo 'Essa rotina varre o formulrio e apaga o contedo dos campos texto Public Sub ClearTxt(NomeForm As Form) Dim Controle As Control For Each Controle In NomeForm.Controls If TypeOf Controle Is TextBox Then Controle.Text = "" Next Controle End Sub 185 - Fechando todos os MdiForms abertos Enviado por: Henrique Angelo 'Varre um MdiForm e fecha as janelas abertas Sub CloseChild() Dim i As Integer While Forms.Count > 1 i = Forms.Count - 1 If Forms(i).MDIChild Then Unload Forms(i) Wend End Sub

186 - Abrindo o Bloco de Notas a partir de um programa Enviado por: Henrique Angelo 1-Coloque um Command Button em um form 2-Coloque o seguinte nas declaraes do form: Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal

williamdsilva@aol.com.br

84

dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const SYNCHRONIZE = 1048576 Const NORMAL_PRIORITY_CLASS = &H20& Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type

3-Agora coloque no Command1_Click: Dim pInfo As PROCESS_INFORMATION Dim sInfo As STARTUPINFO Dim sNull As String

williamdsilva@aol.com.br

85

sInfo.cb = Len(sInfo) success& = CreateProcess(sNull, "notepad.exe e:\anexis\vbpage\vbisland.html", ByVal 0&, ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, sNull, sInfo, pInfo) MsgBox "Notepad has been started. Click OK to end it." ret& = TerminateProcess(pInfo.hProcess, 0&) ret& = CloseHandle(pInfo.hThread) ret& = CloseHandle(pInfo.hProcess) MsgBox "Notepad has been shut down."

187 - Usando UNLOAD e HIDE Enviado por: Gerson Keiti Motoyama Use o Hide para apenas esconder o formulrio, sendo que a propriedade Visible do formulrio recebe o valor False. Mas se no quiser mais utilizar os dados alterados no formulrio pelo usurio, ento use o Unload, que estar realmente descarregando, e voltando aos valores padres definido no cdigo. 188 - Utilize o Registro do Windows Enviado por: Gerson Keiti Motoyama Armazene qualquer informao no registro do Windows, e depois retorne para ser utilizado no programa. Por exemplo, para salvar o nome e n. de telefone do proprietrio do programa, faa assim: SaveSetting "MyApp","User", "Name", "Gerson" SaveSetting "MyApp","User", "Tel", "12345678" E para retornar este valor ao programa: Nome = GetSetting("MyApp","User", "Name") Telefone = GetSetting("MyApp","User", "Tel") Se quiser excluir: DeleteSetting "MyApp", "User"

189 - Deixe seu programa menor Enviado por: Gerson Keiti Motoyama Algumas dicas para diminuir o tamanho do seu arquivo compilado: - Evite deixar espaos (caracteres) no cdigo. - Utilize o 'With Statement' para no ter que repetir nomes de objetos no cdigo. - Os comentrios, embora sejam teis, so uns ocupadores de espao. Portanto, se tiver muito deles, quando for compilar, retire todos os comentrios e salve ento em um *.exe. Mas no salve no projeto. - Se seu cdigo possuir estruturas de controle multiniveladas, retire-o ao compilar. Afinal, para o programa, no tem diferena nenhuma. Mas no salve no projeto. 190 - Como detectar erros inexplicveis? Enviado por: Gerson Keiti Motoyama comum as pessoas, para quem vc destrubuiu um programa, receber mensagens de erros do tipo: Run-time error, e em seguida ser finalizado sem saber a origem em que causou o erro. Para isso faa o programa detectar o erro (embora no aponte especficamente) dessa forma: Insira o seguinte cdigo no INCIO da procedure em que quiser detectar: On Error GoTo Erro: Em seguida no final da procedure, coloque: MsgBox "O (Nome do programa) causou um erro desconhecido. Informe as _

williamdsilva@aol.com.br

86

seguintes 'instrues de erro' ao desenvolvedor :" & Chr(10) & _ Err.Number & Chr(10) & Err.Description & Chr(10) & Err.Source & _ Chr(10) & App.Revision, 16, "Erro Desconhecido"

191 - Como saber se o programa est rodando no Windows95 (ou em suas futuras verses)? Enviado por: Gerson Keiti Motoyama Insira no mdulo .BAS, o seguinte: Declare Function GetWinPlatform Lib "VB5STKIT.DLL" () As Long Agora chame a funo assim: Function IsWindows95() As Boolean Const dwMask95 = &H2& If GetWinPlatform() And dwMask95 Then IsWindows95 = True Else IsWindows95 = False End If End Function

192 - Usando o CHR() para ocultar "mensagens" Enviado por: Gerson Keiti Motoyama Para quem no sabe, infelizmente, possvel "espiar", ou at mesmo "alterar" o cdigo de um executvel (somente as "mensagens"), seja ele compilado pelo VB, ou em qualquer outra linguagem, por um usurio de nvel intermedirio. Para que isso no ocorra, ou pelo menos para dificultar alguma alterao, quando quiser escrever uma mensagem, por exemplo do tipo: msgbox "Ol, blz?" Utilizando o sintaxe: Chr(charcode), faa o seguinte: msgbox chr(79) & chr(108) & chr(225) & chr(44) & chr(160) & chr(98) & chr(108) & chr(122) & chr(63) Obs: Consulte os valores para o charcode no Help do VB: Character Set (0-127)/(128-255) 193 - Criar Atalhos no Menu Iniciar usando DDE Enviado por: Antonio f. Marques Junior Uma maneira fcil de criar atalhos no menu iniciar usando os comandos DDE usados anteriormente no Windows 3.1, que tambm vale para Win95. Os comandos so: AddItem, CreateGroup, DeleteGroup, DeleteItem, ShowGroup, ReplaceItem, Reload. Por exemplo, para se criar uma pasta no menu iniciar, e um atalho dentro dela, faz-se o seguinte: 1. Crie um Form adicione uma TextBox e um CommandButton. 2. No evento Load do Form, escreva o cdigo: Sub Form_Load Text1.LinkTopic = "Progman|Progman" Text1.LinkMode = 2 End Sub 3. No evento Click do Boto, escreva o cdigo: Sub Command1_Click cmd = "[CreateGroup(Teste)]"

williamdsilva@aol.com.br

87

cmd = cmd & "[AddItem(c:\windows\calc.exe, Calculadora)]" Text1.linkexecute cmd Se por acaso voc quer exibir uma pasta do menu Iniciar existente defina a string cmd como: cmd = "[showgroup(" & "Acessrios" & ",1" & ")]" Se quiser que aparea Minimizada, mude o parmetro para 2. 194 - Arquivo que guarda as Preferencias do Programa Enviado por: Anderson Calixto Faz um tempo que tive difculdade em fazer um programa que guardasse as suas preferencias (local do banco de dados, cor do form, usurios registrados, e local das imagens, etc). A descobri que poderia fazer um arquivo com a funo "open" e assim poderia estar gravando e alterando a qualquer momento as preferencias do meu programa. 1 - Crie um modulo.bas onde vc vai declarar uma varivel de Registro: 'Cria uma varial de gravao Type record dbLocalFile As String * 200 'Variavel onde ser guardada o local do Banco de Dados vRegistroDoUsuario As String * 40 vCorDeFundo As String * 10 vImagemDeFundo as String * 200 End Type Global vPreferencias As record 2- Sub Rotina Para Gravar as Informaes A=FreeFile Open "preferencias.dat" For Random As #A Len = Len(vPreferencias) 'Abre o arquivo vPreferencias.dbLocalFile = RTrim(txtLocalDoBanco.Text) vPreferencias.vRegistroDoUsuario = RTrim(txtNome.Text) vPrefetencias.vCorDeFundo = RTrim(txtCorDeFundo.Text) vPrefetencias.vImagemDeFundo = RTrim(txtImagemDeFundo.Text) Put #A, 1, vPreferencias ' Faz a Gravaao do arquivo. Close #A 3- Sub Rotina Para Ler as Informaes A = FreeFile Open vArquivo For Random As #A Len = Len(vPreferencias) 'Abre o arquivo Get #A, 1, vPreferencias ' Faz Leitura do arquivo. txtLocalDoBanco.Text = RTrim(vPreferencias.dbLocalFile) txtNome.Text = RTrim(vPreferencias.vRegistroDoUsuario) txtCorDeFundo.Text = RTrim(vPrefetencias.vCorDeFundo) txtImagemDeFundo.Text = RTrim(vPrefetencias.vImagemDeFundo) Close #A

195 - Verificar preciso a resoluo do monitor Enviado por: Anderson Calixto

williamdsilva@aol.com.br

88

muito simples a rotina que verifica com preciso a resoluo do monitor para VB4.0 e VB 5.0 usando o Sistema API: 'Declarao da Funo de busca da Resoluo Declare Function GetSystemMetrics Lib "User32" (ByVal nIndex As Integer) as Integer Sub Form_Resize( ) dim xResolucao As Integer dim yResolucao As Integer xResolucao = GetSystemMetrics(0) yResolucao = GetSystemMetrics(1) If xResolucao < 1024 and yResolucao < 768 Then 'Rotina que ser ativada ao verificar que a resoluo do monitor menor que 1024x768 End If End Sub

196 - Video .AVI Enviado por: Felipe Maion Garcia Como visualizar um vdeo .AVI em tela cheia. A funo API mciSendString serve para manipular recursos de multimidia, como visualizao de vdeos .AVI, tocar sons MIDI e .WAV. Em relao aos vdeos, pode-se, ainda, visualiz-los em tela cheia. Para obter este efeito, siga os passos a seguir : 1 - Declare a funo mciSenString em um mdulo de cdigo: Declare Function mciSendString lib "MMSystem" (byval lpstrCommand$, byval lpstrReturnStr as Any, Byval wReturnLen%, byval hCallBack%) as Long 2 - No evento Load do form, escreva o seguinte cdigo : arquivo$ = InputBox ("Digite o caminho completo e o nome do arquivo a ser visualizado:") comando$ = "play " & arquivo$ & " fullscreen" x& = mciSendString (comando$, 0&, 0, 0&) Rode o programa. Assim que ele for carregado aparecer uma caixa onde voc dever o nome e o caminho completo do arquivo .AVI a ser visualizado. 197 - Janela de Sobre Enviado por: Julio Gavioli Esta API muito interessante: ShellAbout. Com ela vc pode abrir a janela padrao de 'sobres' do Windows. Nas declaracoes gerais vc coloca(se vc colocar em um modulo, remova o "Private"): Private Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" _ (ByVal hWnd As Long, ByVal szApp As String, ByVal szOtherStuff _ As String, ByVal hIcon As Long) As Long Esta funcao pede 4 parametros: 1) Handle da janela 2) Nome do aplicativo 3) Algum Oba-Oba que vc queira colocar 4) Um icone Ex.:

williamdsilva@aol.com.br

89

ShellAbout Form1.hWnd, "Meu Programa", "Desenvolvido por: Mim", Form1.Icon Obs.: vc pode utilizar no ultimo parametro uma imagem(tem que ser no formato .ico) que esteja em um objeto Picture ou Image. Caso vc coloque um valor nulo, a funcao ira colocar o icone padrao do Windows. 198 - Configurar Porta Enviado por: Julio Gavioli Seria muito legal se tivessemos uma area so para API!! Para vc configurar uma das portas do seu computador, vc precisa utilizar uma API: ConfigurePort(Declare Function ConfigurePort Lib "winspool.drv" Alias "ConfigurePortA" (ByVal pName As String, ByVal hWnd As Long, ByVal pPortName As String) As Boolean). Ela pede 3 parametros: 1) Nome do servidor 2) Handle da janela 3) Nome da porta Ex.: ConfigurePort "", Form1.hWnd, "COM1" Substitua "COM1" pela porta que deseja configurar! Para certificar se a funcao funcionou, verifique se ela retornou uma valor igual a 1 ou True. 199 - Funes prticas Enviado por: Sirlon Farnei J. Oliveira ' Uma funo que formata CEP e um If sem um End If Public Function FormataCEP(Q_Cep As String) As String FormataCEP = IIf(Len(Q_Cep) > 7, Format(Q_Cep, "@@@@@-@@@"), Q_Cep) End Function ' Uma funo que formata CIC e outro exemplo de If Public Function FormataCIC(Q_Cic As String) As String FormataCIC = IIf(Len(Q_Cic) > 11, _ Format(Q_Cic, "@@.@@@.@@@/@@@@-@@"), _ Format(Q_Cic, "@@@.@@@.@@@-@@")) End Function ' Uma funo que testa entrada de teclado para somente nmeros Public Function Testa_NumAbs(KeyNum) As Integer ' Permite a digitao do BackSpace If KeyNum = 8 Then Testa_NumAbs = (KeyNum) Exit Function End If Testa_NumAbs = IIf(KeyNum < 48 Or KeyNum > 57, 0, KeyNum) End Function ' Uma funo que testa entrada de valores ou percentuais (funciona em conjunto com a funo Testa_NumAbs) Public Function Testa_Moeda(KeyAscii) As Integer

williamdsilva@aol.com.br

90

' Permite a digitaao do ponto como separador decimal Testa_Moeda = IIf(KeyAscii = 46, KeyAscii, Testa_NumAbs(KeyAscii)) End Function ' Uma funo que limpa campos formatados com CIC, CEP e outros Public Function LimpaCampo(Q_Campo) As String Dim CampoLimpo As String, X As Integer For X = 1 To Len(Q_Campo) If Mid(Q_Campo, X, 1) <> "/" And Mid(Q_Campo, X, 1) <> "-" And _ Mid(Q_Campo, X, 1) <> "." And Mid(Q_Campo, X, 1) <> ":" And _ Mid(Q_Campo, X, 1) <> "," And Mid(Q_Campo, X, 1) <> "_" And _ Mid(Q_Campo, X, 1) <> "," Then CampoLimpo = CampoLimpo & Mid(Q_Campo, X, 1) Next X LimpaCampo = IIf(Len(CampoLimpo) = 0, "", CampoLimpo) End Function ' Uma funo que prepara um campo para ser repassado para um Mainframe Public Function Texto_MainFrame(QTexto As String) As String Dim y As Integer For y = 1 To Len(QTexto) Select Case Mid(QTexto, y, 1) Case "", "", "", "", "", "" Mid(QTexto, y, 1) = "A" Case "", "" Mid(QTexto, y, 1) = "C" Case "", "", "", "" Mid(QTexto, y, 1) = "E" Case "", "", "", "" Mid(QTexto, y, 1) = "I" Case "", "", "", "", "", "" Mid(QTexto, y, 1) = "O" Case "", "", "", "" Mid(QTexto, y, 1) = "U" End Select Next Texto_MainFrame = UCase(QTexto) End Function ' Uma funo que monta uma grade utilizando o MsFlexGrid ' Devem ser passados como parametros o Recordset e o Objeto da grade

williamdsilva@aol.com.br

91

' Os ttulos das colunas assim bem como o seu tamanho sero obtidos ' diretamente no banco de dados ' Public Sub Faz_Grade(Rs_X As Recordset, Q_Grade As Object) Dim Linha, Coluna As Integer Dim DaoRs As DAO.Property ' Define o numero de colunas da grade Q_Grade.Cols = Rs_X.Fields.Count ' Monta o cabealho da grade Q_Grade.Rows = 1 Q_Grade.Row = 0 For Coluna = 0 To Q_Grade.Cols - 1 Q_Grade.Col = Coluna For Each DaoRs In Rs_X.Fields(Coluna).Properties If DaoRs.Name = "Caption" Then Q_Grade.Text = DaoRs.Value Q_Grade.ColWidth(Coluna) = 99 * IIf(Len(Q_Grade.Text) > Rs_X.Fields(Coluna).Size, Len(Q_Grade.Text), Rs_X.Fields(Coluna).Size) + 200 End If Next Next If Rs_X.RecordCount = 0 Then Q_Grade.Rows = 2 Exit Sub End If Rs_X.MoveFirst Do Until Rs_X.EOF Coluna = 0 Linha = Rs_X.AbsolutePosition + 1 With Q_Grade .Rows = Linha + 1 .Row = Linha For Coluna = 0 To .Cols - 1 .Col = Coluna .Text = IIf(Not IsNull(Rs_X.Fields(Coluna)), Rs_X.Fields(Coluna), "") Next End With

williamdsilva@aol.com.br

92

Rs_X.MoveNext Loop End Sub

' Uma funo para contar os registros de uma tabela ' O nome da tabela deve ser passado como parmetro e dever ser uma string Public Function ContaRegistros(QTab As String) Dim RsQ As Recordset Dim Sql As String Sql = "SELECT Count(*) AS QuantReg FROM " & QTab Set RsQ = CobDB.OpenRecordset(Sql, dbOpenSnapshot) ContaRegistros = RsQ!QuantReg RsQ.Close End Function

' ' As funes a seguir trabalham em conjuto e calculam dgitos ' verificadores nas bases 10 e 11, incluindo CGC, CPF ' ' Funo de direcionamento para teste de CIC ' Public Function Valida_CIC(Q_Cic As String) As Boolean Q_Cic = LimpaCampo(Q_Cic) Select Case Len(Q_Cic) Case Is < 11 Valida_CIC = False Case Is > 14 Valida_CIC = False Case 12 To 14 Valida_CIC = ValidaCGC(Q_Cic) Case Else Valida_CIC = ValidaCPF(Q_Cic) End Select End Function ' Testa digito verificador do CPF Public Function ValidaCPF(CPF As String) As Boolean Dim Digito, X, Soma, Resto As Integer, Regua As Variant If Len(Trim(CPF)) < 11 Then

williamdsilva@aol.com.br

93

ValidaCPF = False Exit Function End If ' Calcula o primeiro dgito verificador Regua = Array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2) For X = 1 To 9 Soma = Soma + (Regua(X) * Mid(CPF, X, 1)) Next X Resto = Soma Mod 11 Digito = IIf(Resto = 0 Or Resto = 1, "0", Trim(11 - Resto)) ' Calcula o segundo dgito verificador Soma = 0 Resto = 0 For X = 0 To 9 Soma = Soma + (Regua(X) * Mid(CPF, X + 1, 1)) Next X Resto = Soma Mod 11 Digito = Digito + IIf(Resto = 0 Or Resto = 1, "0", Trim(11 - Resto)) ValidaCPF = IIf(Mid(CPF, 10, 2) <> Digito, False, True) End Function ' Testa digito verificador do CGC Public Function ValidaCGC(CGC As String) As Boolean ' Valida primeiro digito ValidaCGC = TestaDig(Left(CGC, 13), 11) ' Valida segundo digito If ValidaCGC = True Then ValidaCGC = TestaDig(Trim(CGC), 11) End Function ' Funo que testa outros dgitos verificadores ' O dado a ser testado e a base desejada devem ser passados como parmetro Public Function TestaDig(Q_Dado As String, Q_Base As Integer) As Boolean If Q_Base = 10 Then ' Testa dgito na base 10 TestaDig = IIf(Base_10(Left(Trim(Q_Dado), Len(Trim(Q_Dado)) - 1)) <> Right(Trim(Q_Dado), 1), False, True) ElseIf Q_Base = 11 Then ' Testa dgito na base 11 TestaDig = IIf(Base_11(Left(Trim(Q_Dado), Len(Trim(Q_Dado)) - 1)) <> Right(Trim(Q_Dado), 1), False, True) End If End Function

williamdsilva@aol.com.br

94

' Calcula dgito no mdulo 10 Public Function Base_10(Q_Dado) As String Dim DadoCalc, Peso, Soma, Resto, X As Integer, Regua As String DadoCalc = LimpaCampo(Q_Dado) Peso = 2 For X = Len(DadoCalc) To 1 Step -1 Regua = Regua + Trim((Mid(DadoCalc, X, 1) * Peso)) Peso = IIf(Peso = 1, 2, 1) Next X X=1 For X = 1 To Len(Regua) Soma = Soma + Val(Mid(Regua, X, 1)) Next X Resto = Soma Mod 10 Base_10 = Right(Trim(10 - Resto), 1) End Function ' Calculo do digito modulo 11 Public Function Base_11(QNumero As String) As String Dim Numero, i, Produto, Multiplicador, Digito As Integer Numero = Trim(QNumero) ' Calcula digito do modulo 11 Multiplicador = 2 For i = Len(Numero) To 1 Step -1 Produto = Produto + Val(Mid(Numero, i, 1)) * Multiplicador Multiplicador = IIf(Multiplicador = 9, 2, Multiplicador + 1) Next ' Exceo Digito = 11 - Int(Produto Mod 11) Digito = IIf(Digito = 10 Or Digito = 11, 0, Digito) Base_11 = Trim(Str(Digito)) End Function Qualquer sugesto para melhorias das funes acima ou dvidas com relao ao uso, podero ser enviadas para o meu e-mail sirlec@gold.com.br ou pelo fone abaixo. 200 - Programa com cone animado Enviado por: Henrique Angelo Crie um novo projeto, coloque no Form uma ImageList, coloque os cones da animao nesta mesma Imagelist. Coloque um Timer. Na Propriedade Form_Load() coloque:

williamdsilva@aol.com.br

95

Set Form1.icon = ImageList1.ListImages(1).Picture Na propriedade Timer1_Timer() coloque: If Form1.icon = ImageList1.ListImages(1).Picture Then Set Form1.icon = ImageList1.ListImages(2).Picture Exit Sub End If If Form1.icon = ImageList1.ListImages(2).Picture Then Set Form1.icon = ImageList1.ListImages(1).Picture Exit Sub End If No Timer1, coloque um intervalo de 100. 201 - Ttulo Animado Enviado por: Henrique Angelo Coloque um Timer no form com intervalo de 1. No Form_Load coloque: Form1.caption = "T" No Timer1_Timer() coloque: If Form1.caption = "T" form1.caption = " e" If Form1.caption = " e" form1.caption = " s" If Form1.caption = " s" form1.caption = " t" If Form1.caption = " t" form1.caption = " If Form1.caption = " form1.caption = "T" endif e" e"

202 - Relatrios via cdigo-quebre uma string em x linhas e por n colunas Enviado por: Mauricio Cunha Caros amigos, para aqueles que utilizam relatrios programados a uma dica de como deve ser feito para o relatrio ser impresso: Sub parag() '============================================================================ = 'Cria um pargrafo, para utilizar basta jogar o texto e NL entre os campos '============================================================================ = NL = Chr(13) + Chr(10) End Sub Function QuebrarLinhas(ByVal S As String, N As Integer) As String '==================================== 'Esta funo alinha o String "s" em linhas de no mximo n caracteres(colunas)

williamdsilva@aol.com.br

96

'So utilizadas a funo Token e a sub Parag '==================================== parag Dim L As String Dim R As String Dim P As String L = "" R = "" Do While S <> "" P = Token(S) If P = NL Then R = R & L & NL L = "" ElseIf Len(L) + Len(P) > N Then R = R & L & NL L=P Else L = L & IIf(L = "", P, " " & P) End If If S = "" Then R=R&L End If Loop QuebrarLinhas = R End Function Private Function Token(S As Variant) As String '==================================== 'Esta funo quebra as linhas com divisores '==================================== Dim separadores As String: separadores = "<>/\ " & Chr(13) Dim divisores As String: divisores = ",;.:!" & Chr(10) Dim X As Integer Dim R As String S = LTrim(S) X=1 Do If InStr(1, separadores, Mid$(S, X + 1, 1)) Or InStr(1, divisores, Mid$(S, X, 1)) Then Exit Do End If X=X+1 Loop Until X >= Len(S) R = Left(S, X) S = Right(S, Len(S) - Len(R)) Token = R End Function

Para chamar a funo, basta utilizar: (...) DETALHE = DETALHE & "Expectativas..: " Printer.Print DETALHE TEXTO = IIf(IsNull(RS!EXPEC), "", UCase(RS!EXPEC)) S = TEXTO c = QuebrarLinhas(TEXTO, 115) If S = "" Then Expectativa = "[Nenhuma]" Else Expectativa = Expectativa + c End If Printer.Print Expectativa

203 - Localizando uma rotina perdida Enviado por: Cludio Rocha Vai a uma dica simples Inclua mensagens entre as linhas do seu programa, para identificar um loop, rotina, ou erro no localizado. Assim o mesmo pode ser monitotado. EX: msgbox "ERRO 1" 204 - Como Executar Um Aplicativo .EXE Atravs de Um Command Button

williamdsilva@aol.com.br
Enviado por: Anderson da S. Nogueira Coloque em Command1_Click Isso: Shell "Local do .Exe, Incluindo o Drive e Pastas !!!)

97

205 - Parametros iniciais VB5 Enviado por: Fabio F. Moreirao Para fazer com que um programa receba parmetros externos, use a funco 'command' no Form_Load. Ex: Dim sParametro as String sParametro = Command

206 - Reiniciando o Computador atravs do seu programa ( BOOT ) Enviado por: Paulo Costa No Modulo ( General) adicione a seguinte linha : Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Essa linha seguinte Vai dar o Boot, coloque a em um boto por exemplo : Call ExitWindowsEx(2, 0)

207 - Microsoft Internet Transfer Protocol Enviado por: marcio fritsch Bem, minha sugesto da transferncia automatizada via ftp o seguinte: Crie o controle no seu forms e um boto de comando com o seguinte: ***************************** *Dim strURL As String *Dim bData() As Byte *Dim intFile As Integer *strURL = "ftp://aaaaa:zzzzzz@ftp.mercur.com.br/home/user/mercur/usuario.txt" *intFile = FreeFile() *bData() = Inet1.OpenURL(strURL, icByteArray) *Open "C:\usuario.txt" For Binary Access Write As #intFile *Put #intFile, , bData() *Close #intFile '*************************************************** 'Alm disso, crie no inet1: 'esse procedimento faz com que o arquivo seja 'copiado integralmente. '*********************************************** Private Sub Inet1_StateChanged(ByVal State As Integer) On Error GoTo fim_anormal2 Select Case State Case icError, icDisconnected MsgBox "Erro na comunicao --> " & Err.Description GoTo Fim_a Case icResponseReceived ' 12 Dim vtData As Variant ' Data variable. Dim strData As String: strData = "" Dim bDone As Boolean: bDone = False vtData = Inet1.GetChunk(1024, icString) Do While Not bDone strData = Data & vtData vtData = Inet1.GetChunk(1024, icString) If Len(vtData) = 0 Then bDone = True End If Me.Text1 = Me.Text1 + 1 If Me.Text1 > 100 Then Me.Text1 = 1

williamdsilva@aol.com.br

98

End If ProgressBar1.Value = Me.Text1 Dim TempoDePausa, Incio, Fim, TempoTotal TempoDePausa = 1 ' Define a durao. Incio = Timer ' Define a hora inicial. Do While Timer < Incio + TempoDePausa DoEvents ' Submete-se a outros processos. Loop Fim = Timer ' Define a hora final. TempoTotal = Fim - Incio ' Calcula o tempo total. Loop End Select GoTo Fim_a fim_anormal2: Dim a a = MsgBox("Erro de copia! " & Err.Description, vbCritical, "Erro") Fim_a: End.

208 - Gravando e Reutilizando informaces no registry VB5 Enviado por: Fabio F. Moreirao Voc pode manipular suas informaces que ficam armazenadas banco de dados do Windows. Ex: Para salvar informaes: Dim sValor as String SaveSetting "Nome da Aplicacao", "Secao", Chave", sValor

Para recuperar informaes 'sValor receber o retorno': Dim sValor as String sValor = GetSetting(AppName:="Nome daAplicacao", section:="Secao", Key:="Chave")

Para excluir informaes: DeleteSetting "Nome da Aplicacao", "Secao", "Chave" Obs: Se voc informar apenas o Nome da aplicaco com a Seco todas as Chaves sero excludas 209 - Mapear unidade de rede Enviado por: Fabio P. Arajo Mapear uma unidade de rede; Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal _ lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName _ As String) As Long Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" _ (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName _ As Long) As Long Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _ (ByVal lpszName As String, ByVal bForce As Long) As Long Dim Caminho As String, Unidade as String Caminho = "\\Computador\Caminho" Unidade = "I:"

williamdsilva@aol.com.br

99

'Realiza conexo WNetAddConnection Caminho , "Se tiver senha, digite aqui", unidade 'Consulta caminho de uma determinada conexo, _ 'neste caso, na varivel caminho ser armazenado o local do caminho _ 'atual ref. a unidade WNetGetConnection Unidade, Caminho, 255) 'Desconecta WNetCancelConnection Unidade, True

210 - Saber qual o nome do Usurio atual e da Mquina Enviado por: Fabio Pereira Arajo Para vc verificar qual o usurio atual que logou no windows, basta criar um mdulo e adcionar o seguinte: Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 'Depois, crie a varive usurio Dim Usuario As String Usuario = Space(256) GetUserName Usuario, 256 'Na varivel usurio estar guardado o nome do usurio. 'Para vc verificar qual o nome da mquina atual; 'No mdulo coloque Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Dim maquina As String maquina = Space(30) GetComputerName maquina, 30 'Na varivel maquina estar guardado o nome do computador.

211 - Travar Ctrl+Alt+Del Enviado por: Fabio Pereira Arajo Travar pressionamento das teclas Ctrl + Alt + Del: Private Const SPI_SCREENSAVERRUNNING = 97& Private Declare Function SystemParametersInfo Lib "User32" Alias "SystemParametersInfoA" _ (ByVal uAction As Long, ByVal uParam As Long, _ lpvParam As Any, ByVal fuWinIni As Long) As Long Dim lngRet As Long Dim blnOld As Boolean 'Para desabilitar estas teclas:

williamdsilva@aol.com.br

100

lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, _ True, blnOld, 0&) 'Para abilitar: lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, blnOld, 0&)

212 - Calculo do digitos de CGC e CPF Enviado por: Antonio CArlos e Carlos Gama Vimos uma funo de calculo digito para controle de CPF e CGC muito extensa; Temos a mesma funo mais simples para ler. Abaixo segue o Cdigo: Public Function Calc_CGC(VALOR As String) As Boolean Dim Mult1 As String Dim Mult2 As String Dim dig1 As Integer Dim dig2 As Integer Dim X As Integer Mult1 = "543298765432" Mult2 = "6543298765432" For X = 1 To 12 dig1 = dig1 + (Val(Mid$(VALOR, X, 1)) * Val(Mid$(Mult1, X, 1))) Next For X = 1 To 13 dig2 = dig2 + (Val(Mid$(VALOR, X, 1)) * Val(Mid$(Mult2, X, 1))) Next dig1 = (dig1 * 10) Mod 11 dig2 = (dig2 * 10) Mod 11 If dig1 = 10 Then dig1 = 0 If dig2 = 10 Then dig2 = 0 Calc_CGC = True If dig1 <> Val(Mid$(VALOR, 13, 1)) Then Calc_CGC = False If dig2 <> Val(Mid$(VALOR, 14, 1)) Then Calc_CGC = False End Function Public Function Calc_CPF(VALOR As String) As Boolean 'Inicializa variaveis Dim dig1 As Integer Dim dig2 As Integer Dim Mult1 As Integer Dim Mult2 As Integer Dim X As Integer Mult1 = 10 Mult2 = 11 For X = 1 To 9 dig1 = dig1 + (Val(Mid$(VALOR, X, 1)) * Mult1) Mult1 = Mult1 - 1 Next For X = 1 To 10 dig2 = dig2 + (Val(Mid$(VALOR, X, 1)) * Mult2) Mult2 = Mult2 - 1 Next dig1 = (dig1 * 10) Mod 11 dig2 = (dig2 * 10) Mod 11 If dig1 = 10 Then dig1 = 0 If dig2 = 10 Then dig2 = 0 Calc_CPF = True If Val(Mid$(VALOR, 10, 1)) <> dig1 Then Calc_CPF = False If Val(Mid$(VALOR, 11, 1)) <> dig2 Then Calc_CPF = False End Function

Modo de uso: x = calc_CPf(11111111111) if x = true then msgbox "CPF Correto" x = Calc_CGC(11111111111111) if x = true then msgbox "CGC Correto"

williamdsilva@aol.com.br

101

213 - Diretorio da App Enviado por: Death Angel Para vc abrir um programa que esteja no mesmo diretrio que o seu projeto, sem ter que especificar um diretrio para ele, soh' fazer o seguinte comando!! 'Abre no mesmo diretrio Shell (".\nome_do_programa.xxx") 'Fim da String

214 - Forando a caixa de texto a ler somente Valores Numricos Enviado por: Klayton Marcio Fratoni No Mdulo crie uma variavel pblica chamada - Tecla. public tecla as integer

Na propriedade da caixa de texto ( text3 ), deixe a "text = 0". '**** Private Sub Text3_GotFocus() Text3.SelStart = 0 Text3.SelLength = Len(Text3) End Sub '**** Private Sub Text3_Change() If Text3.Enabled = True Then If Tecla = 0 Then Text3 = Val(Text3) End If Tecla = 0 Text3.SelStart = Len(Text3) End If End Sub '**** Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 96 Or KeyCode = 110 Then Tecla = 1 End If End Sub

215 - Abrindo arquivos com senha

williamdsilva@aol.com.br
Enviado por: Marcos Sixel Aps algum tempo sempre recebendo a mensagem senha invlida no VB consegui algo no mnimo interessante. S faltava eu especificar os padres default... set base = opendatabase("tal.mdb",,,";PWD=SENHA") ' sempre dava errado :(

102

set base = opendatabase("tal.mdb",false,false,";PWD=SENHA") ' funciona. :o)

Detalhe... os valores false so default :) Espero ter ajudado algum... 216 - Como impossibilitar que o form seja fechado. Enviado por: Ricardo Ele s fechado se o micro renicializado, isso fui eu que descobri, e bem simples: Private Sub Form_Unload(Cancel As Integer) Dim ReAbre as string ReAbre = Shell("Nome do Programa em EXE",1) End Sub

OBS: Ateno para que de certo, voc precisa transformar o Form em exe, e coloca-lo no comando shell explicado anteriormente. 217 - Verifica se o programa j est aberto Enviado por: Fernando Bettine No load do formulrio adicionar a linha de comando abaixo: Private Sub Form_Unload(Cancel As Integer) If App.PrevInstance Then MsgBox "O sistema j est aberto." Unload Me End If

218 - Limpando strings de funes API Enviado por: Gregrio V. Dettmann Private Sub Form_Unload(Cancel As Integer) 'Envie a string retornada de uma funo API como por exemplo GetWindowsDirectoryA para essa funo e ela retornar uma string limpa. Function SpaceCut(ByVal strString As String) As String Dim intZeroPos As Integer intZeroPos = InStr(strString, Chr$(0)) If intZeroPos > 0 Then StripTerminator = Left$(strString, intZeroPos - 1) Else StripTerminator = strString

williamdsilva@aol.com.br

103

End If End Function 219 - Criptografar e Descriptografar Senhas de seu Programa Enviado por: Klayton Marcio Fratoni Criptografar e Descriptografar usado geralmente para segurana nos programas, se voc guarda no seu bando de dados as senhas do sistema, qualquer pessoa pode acessa-l ( por exemplo utilizando o Access ) . No mdulo ( .bas ), crie uma varivel "SENHA" tipo String. Private Sub Form_Unload(Cancel As Integer) Global Senha As String Sugiro que as rotinas aqui mencionadas sejam editadas dentro do mdulo para poderem ser utilizadas a qualquer momento dentro de seu programa. Private Sub Form_Unload(Cancel As Integer) '**** Public Function Criptografar(Texto) Senha = "" Dim I As Integer Dim P As Integer Dim LN1 As Currency I=0 Do While Not I = Len(Texto) I=I+1 LN1 = Asc(Mid(Texto, I, 1)) + 16 Senha = Senha & Chr(LN1) Loop End Function '**** Essa funo vai transformar a senha em uma outra palavra ou conjunto de caracteres, na sintaxe : Private Sub Form_Unload(Cancel As Integer) Criptografar suasenha senha = caracteres 'ex: Criptografar klayton senha = {|lq%@# '**** Para Descriptografar e s inverter a funo. Private Sub Form_Unload(Cancel As Integer) Public Function Descriptografar(Texto) Senha = "" Dim I As Integer Dim P As Integer Dim LN1 As Currency I=0

williamdsilva@aol.com.br

104

Do While Not I = Len(Texto) I=I+1 LN1 = Asc(Mid(Texto, I, 1)) - 16 Senha = Senha & Chr(LN1) Loop End Function '**** 'ex : Descriptografar {|lq%@# senha = klayton '**** Reparem que o nmero 16 foi utilizado nas funes. Se alterar o nmero 16, a senha a ser transformada muda de valor. Podendo assim utilizar qualquer nmero no lugar de 16 a senha ter valor diferente. 220 - Acessando uma Tabela do Access 97 com VBA Enviado por: MARCELO C SANTOS No evento "Form_Load" do Formulrio desejado devemos incluir os seguintes cdigos: Private Sub Form_Unload(Cancel As Integer) Dim Banco as Database 'varivel do tipo Banco de Dados Dim Tabela as RecordSet 'varivel do tipo conjunto de registros Set Banco = CurrentDB 'Carrega a varivel Banco com o Banco de Dados Ativo Set Tabela = Banco.OpenRecordSet("Nome_da_Tabela") 'Carrega a varivel Tabela com a tabela "Nome_da_Tabela"

Me.Campo_Do_formulrio = Tabela!Nome_do_Campo_da_Tabela 'Carrega o Campo do formulrio atual com o campo da tabela. Qualquer dvida ou sugesto enviar E-Mail. 221 - Icone animado de maneira mais simples Enviado por: Paulo Bezerra Inicialmente adicione um timer e um imagelist ao seu form logo apos s seguir os passos. Primeiro: Voc coloca no imagelist os icones que serviram para a animao. Segundo: Voc declara no general uma varivel denominada "icone", tipo integer. Terceiro: Declare um valor para a variavel no form_load, um valor = 0. Quarto: Voc coloca as seguintes linhas de codigo no componente timer. Private Sub Form_Unload(Cancel As Integer) icone = icone + 1: If icone = (total de figuras + 1) Then icone = 1 MousePointer = 99 MouseIcon = ImageList1.ListImages(icone).Picture Enfim o programa devera ficar assim: Private Sub Form_Unload(Cancel As Integer) 'Declarao no general Dim icone As Integer 'Declarao no form_load Private Sub Form_Load()

williamdsilva@aol.com.br

105

icone = 0 End Sub 'Declarao no timer1_timer Private Sub Timer1_Timer() icone = icone + 1: If icone = (total de figuras + 1) Then icone = 1 MousePointer = 99 MouseIcon = ImageList1.ListImages(icone).Picture End Sub Bem so isso assim as linhas de cdigo ficam reduzidas a bem menos. Qualquer dvida ou sugesto enviar E-Mail. 222 - Como no deixar que o form feche Enviado por: Pedro Henrique Para no deixar que a form feche, s digitar na linha de cdigo: Private Sub Form_Unload(Cancel As Integer) Private Sub Form_Unload(Cancel As Integer) Cancel = 1 End Sub

223 - Selecionar todo o texto em um textbox (em 2 linhas de codigo) Enviado por: Rogrio Barreto Para selecionar um text em um text box s usar este comando: Private Sub Form_Unload(Cancel As Integer) textbox1.selstart = 0 textbox1.sellenght = (len(textbox1.text))

224 - Digitao fcil nas caixas de texto Enviado por: Thiago Rosso Adams Quando precisar entrar com vrios dados atravs de caixas de texto pode-se usar estas rotinas abaixo para facilitar a entrada de dados. Atravs delas aps digitar um valor em uma caixa de texto com "Index" e for pressionado "Enter" ou seta para baixo a prxima caixa de texto ser selecionada se for pressionada seta para cima a caixa anterior ser selecionada. Private Sub Form_Unload(Cancel As Integer) ' Esta sub faz com que o texto fique selecionado Private Sub Dado_GotFocus(Index As Integer) Dado(Index).SelStart = 0 Dado(Index).SelLength = Len(Dado(Index)) End Sub Private Sub Dado_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyDown, 13 If Index < Dado.uBound Then Index = Index + 1 Else Index = Dado.lBound Dado(Index).SetFocus

williamdsilva@aol.com.br

106

Case vbKeyUp If Index > Dado.lBound Then Index = Index - 1 Else Index = Dado.uBound Dado(Index).SetFocus End Select End Sub

225 - Defina uma lista de valores para uma propriedade no seu UserControl. Enviado por: Clark Para definir uma lista de valores para uma determinada propriedade do seu UserControl, siga o exemplo abaixo: 1) Crie um ENUMERAO contendo os valores: Private Sub Form_Unload(Cancel As Integer) Public Enum MeusValores mvLeft = 0 mvCenter = 1 mvRight = 2 End Enum

2) Crie a propriedade declarando seu parmetro como sendo a enumerao criada acima: Private Sub Form_Unload(Cancel As Integer) Public Property Let Alinhamento( byVal vValor as MeusValores ) . . . End Property

vValor as MeusValores - Define que vValor a enumerao MeusValores, ou seja, quando a propriedade for publicada na janela Properties do VB, a mesma apresentar uma lista (Combo) contendo os valores definidos na emumerao. Legal, no ? Clark

226 - Consulta no Data Link(vb6) Enviado por: Cristiano Azevedo Costa Basta inserir o seguinte cdigo: Private Sub Form_Unload(Cancel As Integer) sql = "Select * from MinhaTabela" MeuDataLink.rsMeuComando.Close MeuDataLink.rsMeuComando.Source = sql MeuDataLink.rsMeuComando.Open MeuDataLink.rsMeuComando.Properties.Refresh Sql um comado sql

williamdsilva@aol.com.br
MeuDataLink um data link rsMeuComando um command(recorset) 227 - Piscar um texto na tela Enviado por: Fernando D.

107

Para fazer um texto piscar basta adicionar uma Label contendo o texto que deseja fazer piscar e digitar a seguinte linha no evento Timer. Private Sub Form_Unload(Cancel As Integer) label1.visible = not(label1.visible)

228 - Busca Rpida Enviado por: Rgis Augusto Quinelato


Private Sub Form_Unload(Cancel As Integer) 'Vou precisar de um text1, List, quando _ 'vc digitar a primeira letra automaticamente, _ 'a palavra que vc procura ser marcada. '---Declaro as Variveis--Dim Search As String Dim Searchlen As String '-------------------------Search = UCase(TxtProcura.Text) Searchlen = Len(Search) If Searchlen Then For Contador = 0 To Lista.ListCount - 1 If UCase(Left(Lista.List(Contador), Searchlen)) = Search Then Lista.ListIndex = Contador Exit For End If Next Contador End If

229 - Utilizao de um Combo Magico Enviado por: WIlliam Rogerio Correa Rotina para posicionar o texto e o item data de um combo de acordo com que for digitado. O combo devera esta com o style = 0 - dropDown Combo. Colocar esta rotina no modulo bas Private Sub Form_Unload(Cancel As Integer) Public Const CB_ERR = -1 Public Const CB_FINDSTRING = &H14C Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Sub ComboMagico(cbo As ComboBox, KeyAscii As Integer)

williamdsilva@aol.com.br

108

Dim sBuffer As String Dim lRetVal As Long sBuffer = Left(cbo.Text, cbo.SelStart) & Chr(KeyAscii) lRetVal = SendMessage((cbo.hWnd), CB_FINDSTRING, -1, ByVal sBuffer) If lRetVal <> CB_ERR Then cbo.ListIndex = lRetVal cbo.Text = cbo.List(lRetVal) cbo.SelStart = Len(sBuffer) cbo.SelLength = Len(cbo.Text) KeyAscii = 0 End If End Sub e no combo no change colocar o seguinte : Private Sub Form_Unload(Cancel As Integer) call ComboMagico(,keyascii) e pronto... 230 - Menu com texto animado Enviado por: Andr Barros Na propriedade do menu voc coloca... Private Sub menu_Load() Menu.Caption = "M" Timer1.Enabled = True End Sub Voc coloca 4 timers no form o primeiro timer com 1000 o segundo timer com 2000 o terceiro timer com 3000 o quarto timer com 4000 Private Sub Timer1_Timer() Menu.Caption = " e" Timer1.Enabled = False Timer2.Enabled = True End Sub Private Sub Timer2_Timer() Menu.Caption = " n" Timer2.Enabled = False Timer3.Enabled = True End Sub

williamdsilva@aol.com.br

109

Private Sub Timer3_Timer() Menu.Caption = " u" Timer3.Enabled = False Timer4.Enabled = True End Sub Private Sub Timer4_Timer() Menu.Caption = "Menu" Timer4.Enabled = False End Sub

231 - Pesquisando por nome, sobrenome sem Data Enviado por: angelo da silva dim texto as boolean dim pat as string pat="Silva" texto = InStr(1, UCase(Trim(rsequi("uti_equi"))), UCase(Trim(pat))) Instr=true se estiver contindo, ou false se no.

232 - Minimizando Todas as Janelas Enviado por: Antonio Ferreira Marques Junior Para minimizar todas as janelas de uma maneira bem simples, basta simularmos, via API, o pressionamento das teclas Alt+M, que seria vc clicando com o boto direito do mouse na barra de tarefas e escolhendo a opo Minimizar todas as janelas. simples: Num mdulo: Declare Sub Keybd_event lib "user32" (ByVal bvk as byte, byval bscan as byte, byval dwflags as long, byval dwextrainfo as long const vk_lwin = &H5B const keyeventf_keyup = &H2 const vk_apps = &H5D Num evento click de um boto keybd_event vk_lwin,0,0,0 keybd_event &H4D, 0,0,0 keybd_event vk_lwin,0,keyeventf_keyup,0 Boa Sorte 233 - Aplicaes Client/Server Enviado por: Daniel(Shadow) Para fazer um cliente de qualquer aplicao em Visual Basic, para qualquer tipo de aplicativo server. Voc tem apenas que colocar um controle Microsoft Winsock 6.0 no form, e em qualquer boto ou na propriedade load do form, voc coloca o seguinte comando:

williamdsilva@aol.com.br

110

winsock1.connect (endereo ip),(porta) Por exemplo: winsock1.connect 127.0.0.1, 5555

234 - Nomes das letras maisculas e sem espacs a mais Enviado por: Eduardo Mazzarino Costa Public Function Maiusc(Palavra As String) As String 'converte as primeiras letra dos nomes em maisculas(menos: de, da, do, das, 'dos, a, e e) 'retira os espaos em branco excedentes entre as palavras, exemplo: 'string inicial = "nome sobrenome1 dos sobrenome2 "

'string de retorno = "Nome Sobrenome1 dos Sobrenome2" ' EDUARDO MAZZARINO COSTA, 21 / 3 / 99 Dim Resto As String, Parte As String, Posic As Byte Resto = Trim(LCase(Palavra)) & " " Do Until Resto = " " Posic = InStr(1, Resto, " ") Parte = Mid(Resto, 1, Posic) If Trim(Parte) <> "e" And Trim(Parte) <> "a" And Trim(Parte) _ <> "do" And Trim(Parte) <> "dos" And Trim(Parte) <> "da" _ And Trim(Parte) <> "das" And Trim(Parte) <> "de" Then Parte = UCase(Left(Parte, 1)) & Mid(Parte, 2) End If Maiusc = Maiusc & Parte Resto = Trim(Mid(Resto, Posic)) & " " Loop Maiusc = Trim(Maiusc) End Function

235 - Proibindo campos nulos Enviado por: FBIO FUR Na Proc LostFocus de uma caixa de texto voc digita: if trim(text1.text) = "" then msgbox "Preenchimento do campo obrigatrio!" text1.text = "" text1.setfocus Exit sub End If

williamdsilva@aol.com.br
236 - Organizando nmeros numa Combo Box Enviado por: Gregrio V. Dettmann

111

'Sub que orderna os nmeros de uma ComboBox em ordem crescente ou decrescente. 'ByRef: 'Combo-> Objeto(ComboBox) onde seus nmeros sero organizados na ordem de SortType 'ByVal: 'SortType-> Tipo de ordem (constantes abaixo) 'Obs: Este sub gerar um erro se em alguma entrada houver caracteres no-numricos, por isso, 'certifique-se de que s existam nmeros em todas os Itens do ComboBox. Const COMBOSORTASCENDING% = 0 Const COMBOSORTDESCENDING% = 1 Sub SortComboBox(ByRef Combo As ComboBox, ByVal SortType As Long) Const ASCEND% = 1 Const DESCEND% = -1 'Variveis de organizao Dim Sort As Boolean Dim I As Long Dim I2 As Long Dim Itens() As Long Dim TmpValue As Long If Combo.ListCount = Empty Then Exit Sub ReDim Preserve Itens(Combo.ListCount - 1) As Long For I = 0 To UBound(Itens) Step 1 Itens(I) = Combo.List(I) Next I Combo.Clear Sort = (SortType = COMBOSORTASCENDING) For I = 0 To UBound(Itens) Step 1 For I2 = IIf(Sort, I + 1, UBound(Itens)) To IIf(Sort, UBound(Itens), UBound(Itens) _ - (UBound(Itens) - I)) Step IIf(Sort, ASCEND, DESCEND) If Sort Xor (CLng(Itens(I2)) > CLng(Itens(I))) Then Swap Itens(I), Itens(I2) End If Next I2 Combo.AddItem Itens(I) Next I End Sub

williamdsilva@aol.com.br
237 - Limpando Combos Read-Only 2 Enviado por: Jeferson Luiz Ravate Complementando dica enviada por Henrique Angelo Como diz o autor da dica, no pode-se usar a propriedade Text para limpar um Combo Read-Only. Mas pode posicionar o List da Combo numa posio com contedo vazio. Ao invs de Combo.Text = "", faz-se Combo.List = -1

112

O texto da combo ficar em branco sem alterar seu contedo.

238 - Mensagem randonica Enviado por: Jos Roberto de Paula Passe para esta funao sua mensagem e o tamanho do objeto que a contem ex: Randon_Msg(Label1.Caption,Label1.Width) Function Randon_Msg(MENSAGEM, TAMANHO As Integer) Dim ESPAO As String Dim Z As Integer On Error Resume Next If TAMANHO > Len(MENSAGEM) Then TAMANHO = Len(MENSAGEM) For Z = 0 To TAMANHO ESPAO = ESPAO & " " Next If X < Len(ESPAO) Then X=X+1 NEWS = Mid(ESPAO, X, Len(ESPAO)) & Mid(MENSAGEM, 1, X) End If If X = Len(ESPAO) Or X = Len(ESPAO) + 1 Then Y=Y+1 NEWS = Mid(MENSAGEM, Y, Len(MENSAGEM)) If Y = Len(MENSAGEM) Then Y=0 X=0 End If End If End Function

239 - Propriedades da Barra de Tarefas Enviado por: Junior

williamdsilva@aol.com.br

113

Digamos que vc quer realizar as operaes daquelas que vc clica com o Direito do mouse, tipo minimizar todas janelas, lado a lado, etc, Pois bem, o cdigo este: Const WM_COMMAND As Long = &H111 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Enum AesWindows Cascata = 403 LadoLadoV = 405 LadoLadoH = 404 Propriedades = 413 MinimizarTudo = 416 DesfazMinimizeCascata = 419 End Enum Sub ExecutaTarefas(Ao as AesWindows) Dim lRetVal As Long Dim hwnd As Long hwnd = FindWindow("Shell_TrayWnd", vbNullString) lRetVal = PostMessage(hwnd, WM_COMMAND, Ao, 0&) End Sub Agora no evento click de um boto: ExecutaTarefas Aao Obs.: Se vc tiver usando VB5 ou superior, o argumento ao vc escolher automaticamente depois de vc digitar o ExecutaTarefas. Se vc tiver usando VB4, despreze o bloco Enum/End Enum e coloque no Click do boto: ExecutaTarefas 416 (Por Ex.: para minimizar todas as janelas). 240 - Abrindo qualquer tipo de objeto do Access Enviado por: Luiz Dim objAccess As Access.Application Set objAccess = New Access.Application 'Abre o MDB 'GetSetting e usado na inicializacao junto com 'SaveSetting salvando o local do arquivo objAccess.OpenCurrentDatabase _ filepath:=GetSetting (NOME_SISTEMA, "MDB", "0") 'se for relatorio objAccess.DoCmd.OpenReport reportname:=rptname _(1), View:=Access.acPreview, _ wherecondition:=Condicoes objAccess.Visible = True objAccess.Docmd.Maximize

williamdsilva@aol.com.br

114

'se for macro objAccess.DoCmd.RunMacro ("NomedaMacro") 'e assim por diante Set objAccess = Nothing

241 - fundo degrade Enviado por: Marcio fritsch 'no Resize() de um formulrio qualquer coloque: 'simples e rpido. Dim i as Integer Dim y as Integer Me.AutoRedraw = True Me.DrawStyle = 6 Me.DrawMode = 13 Me.DrawWidth = 2 Me.ScaleMode = 3 Me.ScaleHeight = (256 * 2) For i = 255 To 0 Step -1 Me.Line (0, y)-(Me.Width, y + 2), RGB(0, 0, i), BF y=y+2 Next i

242 - Verificar se programa esta ativo Enviado por: Nilson M. Uehara Private Declare Function FindWindow Lib "User32" _ Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Sub() Dim hWindow As Long Dim lngResult As Long Dim lngReturnValue As Long 'Verifica se a calculadora esta ativa hWindow = FindWindow(vbNullString, "Calculadora") If IsWindow(hWindow) < 0 Then 'esta Ativa Else

williamdsilva@aol.com.br

115

'esta Inativa End If

243 - Mover o Boto de lugar ao passar o Mouse por cima Enviado por: O Sensacional Use a propriedade Mouse Move, e 2 command button. O 2, com o false do "Visible" ativado. Dentro do command1, digite : Command1.visible = false Command2.visible = true Dentro do command2, digite: Command2.visible = false Command1.visible = true

244 - Marcar o Texto de um Campo... Enviado por: Pablo R. Till Crie um mdulo (.Bas) e dentro do mesmo digite... Public Function MarcaTexto(Campo) With Campo .SelStart = 0 .SelLenght = Len(.Text) End With End Function A funo bem simples mas pode ajudar... 245 - Mudar a cor do Label quando o mouse passar sobre o label, dando a aparencia de um link Enviado por: Thadeu R. Ferraz Para vc mudar a cor da label conforme o mouse passa sobre ele, basta colocar o seguinte comando abaixo. Private Sub Form_MouseMove(Button As Integer, Label1.ForeColor = &H80000012 End Sub Private Sub Label1_MouseMove(Button As Integer, Label1.ForeColor = &HFF& End Sub

246 - Como Listar os registros de um campo de uma tabela num Textbox (sem SQL) Enviado por: Thiago Para listar todos os registros de um Campo de uma Tabela separando os mesmo por uma vgula, sem utilizar SQL, utilize o seguinte cdigo: RS.MoveFirst TXT.Text = RS("Campo") RS.MoveNext

williamdsilva@aol.com.br

116

While Not RS.EOF texto = RS("Campo") TXT.Text = TXT.Text & ", " & texto RS.MoveNext Wend Obs: O textbox (no caso TXT), deve ter a propriedade Multiline = True e ScroolsBar = 2 (vertical). RS: Nome da variavel declarada como Recordset DB: Nome da variavel declarada como DataBase 247 - Comando Printer Enviado por: Anderson A Lopes

Com o comando printer podemos imprimir vrias coisas rapidamente, por exemplo: Printer.Print "String a ser Impressa" Voc pode definir margem de quantos centmetros voc quiser usando: Printer.ScaleLeft = - Valor da margem... Bom isso a pessoal.... 248 - Testando um Lao For... Enviado por: AndreRP

Escreva em um boto de Comando a seguinte codificao : var1 = "TESTANDO" For i = 1 To 8 MsgBox Mid(var1, i, 1) Next i

249 - Buscar data/hora em outro computador da rede Enviado por: Antonio Aristides Mochi Junior

Option Explicit Private Declare Function NetRemoteTOD Lib "NETAPI32.DLL" (ByVal server As String, buffer As Any) As Long Private Declare Function NetApiBufferFree Lib "NETAPI32.DLL" (ByVal buffer As Long) As Long Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) Private Type TIME_OF_DAY t_elapsedt As Long t_msecs As Long t_hours As Long t_mins As Long t_secs As Long t_hunds As Long t_timezone As Long t_tinterval As Long t_day As Long t_month As Long t_year As Long t_weekday As Long End Type ' ' Funo para retornar a Data/Hora de um computador na rede ' RETORNO: ' string no formato dd/mm/yyyy-hh:mm:ss ' PARAMETROS: ' sComputador: Nome de um computador da rede. Ex: \\SERVIDOR1 '

williamdsilva@aol.com.br

117

Private Function BuscarDataHora(sComputador As String) As String Dim sRetorno As String Dim todTime As TIME_OF_DAY Dim ptrTime As Long Dim lRetorno As Long Dim sServidor As String Dim dRemoto As Date On Error GoTo ERRO sRetorno = "" Screen.MousePointer = vbHourglass sServidor = StrConv(sComputador, vbUnicode) lRetorno = NetRemoteTOD(sServidor, ptrTime) If lRetorno = 0 Then CopyMemory todTime, ByVal ptrTime, Len(todTime) 'COPIA O PONTEIRO RETORNADO PARA A ESTRUTURA TIME_OF_DAY dRemoto = DateSerial(70, 1, 1) + (todTime.t_elapsedt / 60 / 60 / 24) 'CONVERTE O TEMPO DECORRIDO DESDE 1/Jan/70 PARA UMA DATA dRemoto = dRemoto - (todTime.t_timezone / 60 / 24) 'AJUSTAR PARA DIFERENAS DO TimeZone sRetorno = Format(dRemoto, "dd/mm/yyyy") & "-" & Format(dRemoto, "hh:mm:ss") NetApiBufferFree (ptrTime) 'LIBERA O PONTEIRO DA MEMRIA Else 'Erro 53: cannot find server MsgBox "No pode encontrar o servidor." & vbCrLf & vbCrLf & sServidor, vbExclamation, "Ateno" End If GoTo FIM ERRO: MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Erro" FIM: Screen.MousePointer = vbDefault BuscarDataHora = sRetorno Exit Function End Function 250 - Iniciando programa de E-Mail e Browser pelo VB Enviado por: Daniel Sitnik

'Este tutorial no serve s para abrir o programa de E-Mail ou o Browser, pode ser usado para qualquer outro programa. E o melhor, o comando de apenas 1 linha!! 'Para abrir o programa de E-Mail, coloque um Command Button no form e digite o seguinte no seu evento Click: Private Sub Command1_Click() Shell "start mailto:seu@email.com.br" End Sub 'Para iniciar o Browser digite o cdigo abaixo, tambm no evento Click de um boto: Private Sub Command2_Click() Shell "start http://www.homepage.com.br" End Sub 'Muito simples no? Tambm pode ser usado para abrir um arquivo de texto no notepad: Private Sub Command3_Click() Shell "start arquivo.txt" 'E assim por diante, voc pode abrir qualquer programa que quiser!!

251 - Desligando o computador pelo VB Enviado por: Daniel Sitnik

'Primeiro adicione um Mdulo .BAS no seu programa e coloque a declarao abaixo nele: Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 'Pronto, agora volta para o formulrio e coloque o cdigo abaixo num boto de comando ou no evento Form_Click(): Private Sub Form_Click() If MsgBox("Sair do Windows?", 36, "Sair") = 6 Then Call ExitWindowsEx(1, 1) Else Exit Sub

williamdsilva@aol.com.br

118

End If End Sub 'Ao clicar o boto ou o formulrio uma MsgBox aparecer perguntando se voc quer desligar o Windows, se voc clicar 'Sim' aquela famosa tela 'Seu Computador J Pode Ser Desligado....' vai aparecer e o computador ser desligado. Ao clicar 'No' nada acontecer.

252 - Imprimindo Enviado por: Elder Paes

Para vc imprimir um documento, utilize o comando Printer ao invs do comando PrintForm. Vamos fazer com um TextBox e um PictureBox: Private Sub command1_click() Printer.Print Text1.Text Printer.Print Picture1.Picture

253 - Funo para transformar sifras em extenso Enviado por: Evandro Massini

'Funo para transformar sifras em extenso Option Explicit Dim unidade(1 To 9) As String Dim dezena(17) As String Dim centena(1 To 9) As String Dim inteiro As String Dim tamanho As Integer Public Function unidades(numero As String) As String unidades = unidade(numero) End Function Public Function dezenas(numero As String) As String If numero > 9 And numero < 21 Then dezenas = dezena(numero - 10) ElseIf numero >= 21 And numero <= 99 Then If Right(numero, 1) = "0" Then dezenas = dezena(Int(Left(numero, 1) + 8)) Else dezenas = dezena(Int(1 & Int(Left(numero, 1) - 2))) & " e " & unidade(Int(Right(numero, 1))) End If End If End Function Public Function centenas(numero As String) As String If Mid(numero, 2, 2) = 0 Then If numero = 100 Then centenas = "cem" Else centenas = centena(Left(numero, 1)) End If ElseIf Mid(numero, 3, 1) = 0 Then centenas = centena(Left(numero, 1)) & " e " & dezenas(Mid(numero, 2, 2)) ElseIf Mid(numero, 2, 1) = 0 Then centenas = centena(Int(Left(numero, 1))) & " e " & unidade(Int(Right(numero, 1))) Else centenas = centena(Int(Left(numero, 1))) & " e " & dezenas(Int(Right(numero, 2))) End If End Function Public Function ext(numero As Currency) As String If numero > 999999.99 Then ext = "Nmero fora dos padres vlidos !": Exit Function unidade(1) = "um" unidade(2) = "dois" unidade(3) = "trs" unidade(4) = "quatro" unidade(5) = "cinco" unidade(6) = "seis" unidade(7) = "sete" unidade(8) = "oito" unidade(9) = "nove" dezena(0) = "dez" dezena(1) = "onze"

williamdsilva@aol.com.br

119

dezena(2) = "doze" dezena(3) = "treze" dezena(4) = "quatorze" dezena(5) = "quinze" dezena(6) = "dezesseis" dezena(7) = "dezessete" dezena(8) = "dezoito" dezena(9) = "dezenove" dezena(10) = "vinte" dezena(11) = "trinta" dezena(12) = "quarenta" dezena(13) = "cinquenta" dezena(14) = "sessenta" dezena(15) = "setenta" dezena(16) = "oitenta" dezena(17) = "noventa" centena(1) = "cento" centena(2) = "duzentos" centena(3) = "trezentos" centena(4) = "quatrocentos" centena(5) = "quinhentos" centena(6) = "seissentos" centena(7) = "setessentos" centena(8) = "oitocentos" centena(9) = "novecentos" inteiro = Int(numero) tamanho = Len(inteiro) Select Case tamanho Case 1 ext = unidades(inteiro) Case 2 ext = dezenas(inteiro) Case 3 ext = centenas(inteiro) Case 4 If Right(inteiro, 3) = 0 Then ext = unidades(Left(inteiro, 1)) & " mil" Else If Int(Right(inteiro, 3)) > 99 Then ext = unidades(Left(inteiro, 1)) & " mil e " & centenas(Int(Right(inteiro, 3))) ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then ext = unidades(Left(inteiro, 1)) & " mil e " & dezenas(Int(Right(inteiro, 3))) ElseIf Int(Right(inteiro, 3)) < 10 Then ext = unidades(Left(inteiro, 1)) & " mil e " & unidades(Int(Right(inteiro, 3))) End If End If Case 5 If Right(inteiro, 3) = 0 Then ext = dezenas(Left(inteiro, 2)) & " mil " Else If Int(Right(inteiro, 3)) > 99 Then ext = dezenas(Left(inteiro, 2)) & " mil e " & centenas(Right(inteiro, 3)) ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then ext = dezenas(Left(inteiro, 2)) & " mil e " & dezenas(Int(Right(inteiro, 3))) ElseIf Int(Right(inteiro, 3)) < 10 Then ext = dezenas(Left(inteiro, 2)) & " mil e " & unidades(Int(Right(inteiro, 3))) End If End If Case 6 If Right(inteiro, 3) = 0 Then ext = centenas(Left(inteiro, 3)) & " mil " ElseIf Int(Right(inteiro, 3)) > 99 Then ext = centenas(Left(inteiro, 3)) & " mil e " & centenas(Int(Right(inteiro, 3))) ElseIf Int(Right(inteiro, 3)) > 9 And Int(Right(inteiro, 3)) < 100 Then ext = centenas(Left(inteiro, 3)) & " mil e " & dezenas(Int(Right(inteiro, 3))) ElseIf Int(Right(inteiro, 3)) < 10 Then ext = centenas(Left(inteiro, 3)) & " mil e " & unidades(Int(Right(inteiro, 3))) End If End Select ext = ext & " reais" If numero - Int(numero) <> 0 Then Dim fra As String fra = Right(numero, 2) If InStr(1, fra, ",") <> 0 Then fra = Right(fra, 1) * 10

williamdsilva@aol.com.br

120

If fra >= 10 Then ext = ext & " e " & dezenas(fra) & " centavos" ElseIf fra < 10 Then ext = ext & " e " & unidades(fra) & " centavos" End If End If End Function

254 - Usando o controle MsFlexGrid Enviado por: FabioFur

Usando o controle MsFlexGrid Para adicionar Dados: Declare uma Varivel em um boto de comando com o nome messes Dim messes(12) as string 'logo abaixo digite: messes(1) = "Janeiro" messes(2) = "Fevereiro" messes(3) = "Maro" messes(4) = "Abril" messes(5) = "Maio" messes(6) = "Junho" messes(7) = "Julho" messes(8) = "Agosto" messes(9) = "Setembro" messes(10) = "Outubro" messes(11) = "Novembro" messes(12) = "Dezembro" Dim contador as integer for contador = 1 to 12 grid1.TextMatrix(contador,1) = messes(contador) Next contador Obs.: A propriedade Rows do controle MsFlexGrid deve ser definida com o Mnimo 13. 255 - Efeito de profundidade Enviado por: Fernando Augusto dos Santos

muito simples. Se quiser colocar essa oba-oba no seu projeto : 1 - adicione um label. 2 - deixe o fontsize dele com tamanho 10. 3 - deixe a propriedade alignment = 2 4 - no MouseDown adicione o seguinte cdigo : label1.fontsize = 8 5 - no MouseUp adicione o seguinte cdigo : label1.fontsize = 10 OBS : Utilize este recurso para substituir botes, usando o evento click do label para executar aes. 256 - Flip Horizontal e Vertical Enviado por: Gustavo (Toni)

'coloque os dados abaixo em um module #If Win32 Then Declare Function StretchBlt% Lib "GDI32" (ByVal hDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal nSrcWidth%, ByVal nSrcHeight%, ByVal dwRop&) #ElseIf Win16 Then Declare Function StretchBlt% Lib "GDI" (ByVal hDC%, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC %, ByVal XSrc%, ByVal YSrc%, ByVal nSrcWidth%, ByVal nSrcHeight%, ByVal dwRop&) #End If Const SRCCOPY = &HCC0020 'Flip Horizontal Public Sub imgFlipH(PicOrigem As PictureBox, PicDestino As PictureBox) Dim xX As Integer, yY As Integer, ReturnV As Integer PicOrigem.ScaleMode = 3

williamdsilva@aol.com.br

121

PicDestino.ScaleMode = 3 PicDestino.Cls xX = PicOrigem.ScaleWidth yY = PicOrigem.ScaleHeight ReturnV = StretchBlt(PicDestino.hDC, xX, 0, -xX, yY, PicOrigem.hDC, 0, 0, xX, yY, SRCCOPY) End Sub 'Flip Vertical Public Sub imgFlipV(PicOrigem As PictureBox, PicDestino As PictureBox) Dim xX As Integer, yY As Integer, ReturnV As Integer PicOrigem.ScaleMode = 3 PicDestino.ScaleMode = 3 PicDestino.Cls xX = PicOrigem.ScaleWidth yY = PicOrigem.ScaleHeight ReturnV = StretchBlt(PicDestino.hDC, 0, yY, xX, -yY, PicOrigem.hDC, 0, 0, xX, yY, SRCCOPY) End Sub

257 - Cores do Sistema Enviado por: Ivan

Para nao ocorrer de voc colocar um controle em cor Cinza, por exemplo, e o seu usuario trocar as cores do sistema para o padrao "Deserto" e seu controle continuar cinza, use o SystemColorConstants Ex: Controle.BackColor = SystemColorConstants.vb3DDKShadow Controle.BackColor = SystemColorConstants.vb3DFace Controle.BackColor = SystemColorConstants.vbActiveTitleBar E assim por diante.

258 - Como sair no msgbox... Enviado por: Jos Pereira

Crie um MsgBox com sinal de interrogao e com os botes Vbyes e Vbno.Crie um boto: Private Sub comman1_Click() resp = MsgBox("Tem certeza que deseja sair?", 36, "SADA") If resp = vbYes Then End Else MsgBox ("Continue seu trabalho!") End If End Sub

259 - Criando toolbars dockaveis Enviado por: Leon Serfaty Kacowicz

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long Declare Function ReleaseCapture Lib "user32" () As Long Sub Toolbar1_MouseDown(Button as integer, Shift as integer, X as single, Y as single) ReleaseCapture Dim a& a& = SendMessage(ToolBar1.hwnd, 161, 2, 0&) End Sub

williamdsilva@aol.com.br

122

260 - Apagando todos os registros de uma tabela com apenas um click!! Enviado por: Lucas Belkys

Insira um controle timer no formulrio e defina a propiedade interval = 10; Defina a propiedade enabled = false do timer; em um boto de comando digite: timer1.enabled = true No timer: on error resume next data1.recordset.delete data1.recordset.movenext Espero ter ajudado!! 261 - Enviando registros para Excel Enviado por: luiz Private Sub Command1_Click() 'aconselhavel para poucos registros Dim rs As Recordset Dim cn As Connection Set cn = New Connection Set rs = New Recordset 'estabelece coneccao cn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=D:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb" 'abre recordset rs.Open "Select * From Authors", cn, adOpenStatic, adLockReadOnly Exporta rs rs.Close cn.Close Set cn = Nothing Set rs = Nothing End Sub Sub Exporta(ByVal RSConeccao As Recordset) Dim MCampos() As String Dim mExcelApp As Excel.Application Dim c As Range Const ALFABETICO As String = "ABCDEFGHIJKLMNOPQRSTUVXYWZ" Set mExcelApp = New Excel.Application ReDim MCampos(RSConeccao.Fields.Count) 'armazena nomes dos campos Dim temp As Long For temp = 0 To RSConeccao.Fields.Count - 1 MCampos(temp) = RSConeccao.Fields(temp).Name Next If Not RSConeccao.EOF Then 'popula recordset RSConeccao.MoveLast RSConeccao.MoveFirst Else RSConeccao.Close Exit Sub End If 'instancia excel Set mExcelApp = New Excel.Application mExcelApp.Visible = True mExcelApp.Workbooks.Add 'imprime nome dos campos Dim ABCD For temp = 1 To RSConeccao.Fields.Count ABCD = Mid(ALFABETICO, temp, 1) & "1" For Each c In mExcelApp.ActiveWorkbook.Worksheets.Application.Range(ABCD) c.Value = MCampos(temp - 1) Next c Next Dim TTemp2 TTemp2 = 1 'para cada registro Do

williamdsilva@aol.com.br

123

TTemp2 = TTemp2 + 1 'para cada campo 'imprime dados do registro For temp = 1 To RSConeccao.Fields.Count For Each c In mExcelApp.ActiveWorkbook.Worksheets.Application.Range(Mid(ALFABETICO, temp, 1) & TTemp2) c.Value = RSConeccao(MCampos(temp - 1)) Next c Next RSConeccao.MoveNext 'ate fim dos registros Loop While Not RSConeccao.EOF Set RSConeccao = Nothing Set mExcelApp = Nothing End Sub

262 - Max lenght Combo-box Enviado por: Marcelo 'Maxlenght no Combo-box Private Sub Combo1_Change() If Len(Combo1.Text) >= 10 Then Combo1.Text = Left$(Trim(Combo1.Text), 10) End if End Sub Private Sub Combo1_KeyPress(KeyAscii As Integer) 'use send keys quando o form tiver mais 1 controle 'que receba o foco If KeyAscii = 13 Then SendKeys "{Tab}" If Len(Combo1.Text) = 10 Then If KeyAscii <> 8 And KeyAscii <> 13 Then KeyAscii = 0 Combo1.Locked = True Beep Combo1.Locked = False End If End If End Sub

263 - Preencher Combo Datas Enviado por: Marcelo 'Rotina para adicionar datas do mes corrente, desde o dia de hoje at o ultimo dia do ms: 'cdigo para o mdulo: Option Explicit Sub G_Preenche_Combo_Data(ComboDatas As Control) Dim I, DiaCorrente, MesCorrente, AnoCorrente, UltimoDia As Integer DiaCorrente = Day(Now) MesCorrente = Month(Now) AnoCorrente = Year(Now) UltimoDia = Day(DateValue("01/" & _ Str(MesCorrente + 1) & _ "/" & Str(AnoCorrente)) - 1) If MesCorrente = 12 Then UltimoDia = Day(DateValue("31/" & "12/" & Str(AnoCorrente))) End If For I = DiaCorrente To UltimoDia ComboDatas.AddItem Format(I, "0#") & "/" & Format(Now, "mm") & "/" & Format(Now, "yyyy") Next End Sub 'cdigo para o formulrio: 'insira 1 Combo-box no formulrio Private Sub Form_Load() G_Preenche_Combo_Data Combo1 End Sub

williamdsilva@aol.com.br
264 - Centralizar Form Enviado por: Mimo

124

Para centralizar um Form siga estes passos: Clique no Form, tecle F4, em Properties altere StartUpPosition para 2. 265 - Como saber se o seu Computador est preparado para o ano 2000. Enviado por: MPS Informtica Ltda. Private Sub Command1_Click() Dim Test As Date Test = Text1 Text2 = Format(Test, "long date") End Sub

266 - Tab Automtico sem codificao Enviado por: Nildo Veras

Use o MaskEdBox setando o valor da propriedade autotab com true. todas as vezes que for preenchido com o valor igual ao de maxlength automticamente passar para o prximo controle sem codificao... 267 - TROCAR PONTO POR VRGULA Enviado por: PAULO EDUARDO PACHECO

Funo para trocar o ponto de um TEXTBOX por vrgula. Recentemente, estava importando uma base de dados do DATAFLEX, e deparei com o problema com a casa decimal. Aps uma pequena surra, descobri a soluo: Importe a base de dados, e onde aparecer este campo com o ponto decimal, mude a propriedade para TEXTO (estou falando da importao do ACCESS). Execute a funo abaixo. E depois volte ao ACCESS e mude para MOEDA. O problema estar resolvido. Exemplo: TEXT1.TEXT=TROCAR(TEXT2.TEXT) Function trocar(NumeroTexto) Dim Posicao1, Posicao2, Tamanho As Integer Tamanho = Len(Trim(NumeroTexto)) Posicao1 = InStr(1, NumeroTexto, ".") 'Achar o ponto Tamanho = Tamanho - Posicao1 'Para saber qtos item sero coletados If Posicao1 <> 0 Then 'Achou o ponto Posicao1 = Posicao1 - 1 Posicao2 = Posicao1 + 1 'P/ encontrar o prximo espao trocar = Mid(NumeroTexto, 1, Posicao1) + "," + Right(NumeroTexto, Tamanho) Else trocar = NumeroTexto End If End Function

268 - Como No Deixar que o form se feche 2 Enviado por: Pedro

No form unload ponha o seguinte comando: Cancel =-1 No sei se funciona em outras verses do VB alem da 5.0. 269 - Como re-abrir um projeto do VB6 no VB5 Enviado por: Robson

Tive uma grande supresa quando abri e rodei um projeto no VB6 e depois quis abrir-lo no VB5. Ao tentar fazer isto o VB5 mostrou a seguinte mensagem:

williamdsilva@aol.com.br

125

"'Retained' is an invalid key. The file .... cant be loaded" Para quem quiser consertar o problema, abra o arquivo nomedoprojeto.vbp com o notepad (ou outro editor de texto) e retire a linha com o seguinte comando: Retained=0. Boa sorte. 270 - Nome do processador Enviado por: Rodolfo Nunez Lac Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO) Private Type SYSTEM_INFO dwOemID As Long dwPageSize As Long lpMinimumApplicationAddress As Long lpMaximumApplicationAddress As Long dwActiveProcessorMask As Long dwNumberOrfProcessors As Long dwProcessorType As Long dwAllocationGranularity As Long dwReserved As Long End Type Function GetCPUInfo() As String Dim Proc As String Dim INFO As SYSTEM_INFO INFO.dwOemID = Len(INFO) Call GetSystemInfo(INFO) Select Case INFO.dwProcessorType Case Is = 860 Proc = INFO.dwNumberOrfProcessors & " Intel 8086" Case Is = 386 Proc = INFO.dwNumberOrfProcessors & " Intel 80386" Case Is = 486 Proc = INFO.dwNumberOrfProcessors & " Intel 80486" Case Is = 586 Proc = INFO.dwNumberOrfProcessors & " Intel Pentuim" Case Is = 2000 Proc = INFO.dwNumberOrfProcessors & " MIPS R2000" Case Is = 3000 Proc = INFO.dwNumberOrfProcessors & " MIPS R3000" Case Is = 4000 Proc = INFO.dwNumberOrfProcessors & " MIPS R4000" Case Is = 21064 Proc = INFO.dwNumberOrfProcessors & " ALPHA 21064" Case Is = 601 Proc = INFO.dwNumberOrfProcessors & " Power PC 601" Case Is = 603 Proc = INFO.dwNumberOrfProcessors & " Power PC 603" Case Is = 604 Proc = INFO.dwNumberOrfProcessors & " Power PC 604" Case Is = 620 Proc = INFO.dwNumberOrfProcessors & " Power PC 620" End Select GetSysInfo = Proc End Function

271 - Salvando uma Picture Enviado por: ton

SAVEPICTURE picture1.image, "c:\imagem.bmp"

272 - Validar conteudo do MaskEdit Enviado por: Vava

Private Sub Command1_Click() If Mask1.Mask = "(###)###-####" Then If Mask1.Text = "(___)___-____" Then

williamdsilva@aol.com.br

126

MsgBox "Vazio" Else: Dim d d=1 Do While Not d = Mask1.MaxLength + 1 texto = Mid(Mask1.Text, d, 1) If texto = "_" Then MsgBox "Vazio" Exit Sub Else d=d+1 End If Loop MsgBox "cheio" End If End If End Sub

273 - Limpar todos os TextBox de todos os Formularios Enviado por: Alexandre Sergio Nakano

Outra dica de como limpar os textbox dos formulrios. Dim formulario As Form Dim controle As Control For Each formulario In Forms For Each controle In formulario.Controls If TypeOf controle Is TextBox Then controle.Text = "" End If Next controle Next formulario

274 - Verificaao de Data Enviado por: Andr Luiz Ribeiro de Arajo

Public Function Verifica_Data(Datas As String) As Boolean Dim DiasMes, Dia, Mes, Ano, Primeiro_Numero_Ano As Integer Dim Mensagem As String On Error GoTo Tratamento_Data Dia = CInt(Mid(Datas, 1, 2)) Mes = CInt(Mid(Datas, 4, 2)) Ano = CInt(Mid(Datas, 7, 4)) Primeiro_Numero_Ano = CInt(Mid(Datas, 7, 1)) If Primeiro_Numero_Ano = 0 Then Verifica_Data = False Exit Function End If If Mes = 4 Or Mes = 6 Or Mes = 9 Or Mes = 11 Then DiasMes = 30 Else If Ano Mod 4 = 0 Then DiasMes = 29 Else DiasMes = 28 End If If Mes = 1 Or Mes = 3 Or Mes = 5 Or Mes = 7 Or Mes = 8 Or Mes = 10 Or Mes = 12 Then DiasMes = 31 End If End If ' determina quantos dias tera o mes

williamdsilva@aol.com.br

127

If (Ano > 0) And (Mes >= 1) And (Mes <= 12) And (Dia >= 1) And (Dia <= DiasMes) Then Verifica_Data = True Else Verifica_Data = False End If

Tratamento_Data: If Err.Number = 13 Then End If End Function Um exemplo de como funciona: Dim Verificao as boolean Verificao = Verifica_Data(Text1.Text) 'Ir Retornar Verificao = True se a Data Digitada for Vlida, caso contrrio, Retorna Verificao = False 'se a Data Digitada for Invlida. Espero que ajude a resolver seu problema 275 - Qual data ou ms/ano maior Enviado por: Douglas Henrique Castelluber

Simples declare essa funo no .Bas e passe as datas, se for uma string converta com o CDATE e passe, no caso de ms/ano, no tem problema no passe o dia, o importante ser um parametro do tipo data. Boa Sorte. Function FirstDate(Date1 As Date, Date2 As Date) As Integer 'FirstDate************************************************************************************** 'Programador..: Castelluber, Douglas Henrique 'Data/Hora....: 01/12/98 - 19:00 'Funo.......: Retorna a maior data 1 ou 2 para as datas passadas 'Retorno......: 0 (igual),1 (primeira data + antiga) ou 2 (segunda data + antiga) 'Dependncia..: Nenhuma 'Observao...: '*********************************************************************************************** FirstDate = 0 Select Case DateDiff("d", Date1, Date2) Case Is > 0 FirstDate = 1 Case Is < 0 FirstDate = 2 End Select End Function

276 - Enviar E-Mail Enviado por: Erica Pimentel Souza

Dim objSession As Object Dim objMessage As Object Set objSession = CreateObject("MAPI.SESSION") objSession.Logon "Your Profile Name", , False,False Set objMessage = objSession.Inbox.Messages.Add objMessage.Subject = "Mensagem do subject" objMessage.Text = "Texto da Mensagem" objMessage.Attachments.Add "Anexo", , , "C:\anexo.XLS" 'caminho do arquivo em anexo objMessage.Recipients.Add "endereo do e-mail" objMessage.Recipients.Resolve objMessage.Send 'Este codigo funciona adequadamente, quando o outlook da pessoa que envia o e-mail est aberto, caso no quera assim, retire este codigo(,,false,false) da quarta linha. E dar certo ! 'Espero que tirem proveito 'Tchau ! 'Erica P.

williamdsilva@aol.com.br
277 - Como usar os Common Dialogs Enviado por: Marcio A. P.

128

Private Sub Command1_Click() 'para utilizarmos aquelas caixas padro de abrir 'arquivo use: .Filter = "arquivos de texto (*.txt)|*.txt|todos_ os arquivos (*.*)|*.*|" 'a propriedade acima aplica um filtro para os 'arquivos que podem ser abertos .Action = 1 'a propriedade acima abre a caixa abrir 'obs.: a propriedade .filename retorna o nome do 'arquivo, mas 'se o usurio clicar em "cancelar" o valor 'retornado ser nulo podendo causar erros End With End Sub Private Sub Command2_Click() With CommonDialog1 'para usar a caixa padro "salvar como:" use isto: .Filter = "arquivos de texto (*.txt)|*.txt|todos_ os arquivos (*.*)|*.*|" 'a propriedade acima aplica um filtro para os 'arquivos que podem ser gravados .Action = 2 'a propriedade acima abre a caixa "salvar como:" End With End Sub With CommonDialog1 'para usar a caixa padro "cores" use: .Flags = 1 'a propriedade acima muda o estilo da caixa .Action = 3 'a propriedade acima chama a caixa "cores" 'obs. a propriedade .color retorna o valor da cor 'em hexa. podendo ser usada direto no controle End With End Sub Private Sub Command4_Click() With CommonDialog1 'para usar a caixa fontes tente: .Flags = 2 'a propriedade acima muda o tipo da caixa .Action = 4 'a propriedade acima chama a caixa 'as propiedades fontename, fontitalic, fontsize 'etc 'retornam os valores para voce usar End With End Sub Private Sub Command5_Click() With CommonDialog1 'para usar a caixa impressoras .Action = 5 End With End Sub 'o resto das propriedades voce mesmo descobre seno o texto ficaria muito longo.

278 - Discando com o VB Enviado por: Olavo Henrique Dias

Para efetuar uma discagem pelo VB, muito simples, insira o seguinte cdigo: Crie um MsComm no seu Form; Depois Digite: Mscomm1.CommPort = 2 '(N da porta em que est seu FAX/MODEM) Mscomm1.PortOpen = True Mscomm1.Output = "ATDT 1234567" '(Discagem por Tom) MScomm1.Output = "ATDP 1234567" '(Discagem por Pulso)

279 - Limpando Combos Read-Only 3 Enviado por: Pablo R. Till Vale ressaltar que se as opes 1 e 2 no funcionarem faa o seguinte:

williamdsilva@aol.com.br

129

Combo.Listindex = -1 Assim tambm o combo somente leitura vai ficar em branco, ficando tambm seu contedo inalterado. 280 - Correo dos tens "Validando CPF" Enviado por: Adgenor L. Neto & Bernardo T. Lemelle

As duas funes descritas nas dicas existentes no funcionam quando o primeiro dgito do CPF "0".Aqui est a funo com as devidas correes : Public Function Calc_CPF(VALOR As String)As Boolean 'Inicializa variaveis Dim dig1 As Integer Dim dig2 As Integer Dim Mult1 As Integer Dim Mult2 As Integer Dim x As Integer Dim y1 As Integer Dim y2 As Integer Let y1 = 9 Let y2 = 10 Let z2 = 11 Mult1 = 10 Mult2 = 11 If Len(VALOR) = 10 Then Let Mult1 = 9 Let Mult2 = 10 Let z2 = 10 Let y1 = 8 Let y2 = 9 End If For x = 1 To y1 dig1 = dig1 + (Val(Mid(VALOR, x, 1)) * Mult1) Mult1 = Mult1 - 1 Next For x = 1 To y2 dig2 = dig2 + (Val(Mid(VALOR, x, 1)) * Mult2) Mult2 = Mult2 - 1 Next dig1 = (dig1 * 10) Mod 11 dig2 = (dig2 * 10) Mod 11 If dig1 = 10 Then dig1 = 0 If dig2 = 10 Then dig2 = 0 Calc_CPF = True If Val(Mid$(VALOR, y2, 1)) <> dig1 Then Calc_CPF = False If Val(Mid$(VALOR, z2, 1)) <> dig2 Then Calc_CPF = False End Function

281 - Passando parmetros via Form para filtrar registros no Crystal Reports Enviado por: Adriano Faria

Este exemplo utiliza um combobox em um form para filtrar dados em relatorio do Crystal Report (VB6 e CR6): Dim Auxrel as string auxrel = "" auxrel = auxrel & "ToText({Tabela.Campo}) like '*" & Combo1.Text & "*'" CrystalReport1.SelectionFormula = auxrel CrystalReport1.CopiesToPrinter = 1 CrystalReport1.ReportFileName = "c:\caminho\report.rpt" CrystalReport1.Action = 1

williamdsilva@aol.com.br
282 - Abrir Banco de Dados com senha Enviado por: Alvaro Cesar Falido

130

Private Sub Command1_Click() Dim Arq As Database Dim Tabela As Recordset Dim Senha As String Senha = ";pwd=teste" 'Atribua a mesma senha que foi definida no Access Set Arq = OpenDatabase(App.Path + "\dbsenha.Mdb", False, False, Senha) Set Tabela = Arq.OpenRecordset("Tabela1", dbOpenTable) Tabela.MoveFirst While Not Tabela.EOF List1.AddItem Tabela!nome Tabela.MoveNext Wend End Sub

283 - Adicionar Hora e Data no Form Enviado por: Alyson de Lima Holanda

Crie dois Labels. Ex.: Labe1 e Label2. Crie um objeto timer com a propriedade interval = 1000 E coloque essas linhas de cdigo no timer1: label1 . caption = time label2 . caption = date E aparecer automaticamente a hora e a data atualizando de 1 em 1 segundo. 284 - Localizao Detalhada. Enviado por: Antonio Mochi

Errar humano por isto constantemente colocado uma palavra escrita erroneamente em vrios pontos de um sistema, como exemplo podemos escrever "Ecluso" no ttulo de um boto e ao demostrar o sistema s nos resta dar um daqueles sorrisos amarelos e falar que ser ajustado na prxima verso. A ferramenta localizar/substituir do editor de cdigo bem poderosa porm no verifica erros nas propriedades dos objetos, como o Caption de um boto. Para procurar isto utilize a seguinte linha de comando no prompt do DOS no local onde encontra os arquivos FRM: FOR %i IN (*.FRM) DO FIND /I "palavra" %i Com isto podemos verificar se h alguma palavra desejada a ser pesquisada tanto no cdigo quanto na propriedade, se desejar insira TempFile.TXT No final da linha de instruo para enviar a saida para um arquivo texto e facilitar a procura. 285 - Definindo quais caracteres digitar num objeto textbox Enviado por: Caco

Para aceitar s nmeros digite: Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 13 '{Enter}, passa para o prximo campo. KeyAscii = 0 SendKeys "{TAB}" Case 8, 44, 48 To 57 ' {Backspace}, {,}, {0} a {9}, aceita estes caracteres. ' Continua Case 46 ' {.}, troca ponto por virgula. KeyAscii = 44 ' {,} Case Else KeyAscii = 0 ' Demais teclas, no aceita. End Select End Sub

williamdsilva@aol.com.br

131

286 - Travando o Computador Enviado por: Carlos Assuno

Essa dica vai abrir novos programas iguais aos executados, at a memria acabar e travar tudo! No Form, no evento Load, Coloque a linha: Dim REPRO as string repro = shell ("nome do programa.exe" ,1) 'Se colocar essa linha 10 vezes, ira abrir 10 programas, e assim por diante!

287 - Objeto Printer e sua principais propriedades Enviado por: Carlos Peixoto

As propriedades principais do Printer so: ColorMode: Determina ou mostra a capacidade de impresso colorida do dispositivo. Copies: Especifica a quantidade de cpias de uma pgina que deve ser impressa. CurrentX: Determina a coordenada horizontal que a impressora ir imprimir. CurrentY: Determina a coordenada vertical que a impressora ir imprimir. DeviceName: Mostra o nome da impressora padro suportada pelo dispositivo FontName: Determina qual fonte de letra a impressora usar para impresso. FontBold: Determina se a fonte ser em negrito. FontItalic: Determina se a fonte ser em itlico. Fonts: Fornece uma lista de todas as fontes disponveis para impresso. FontSize: Determina o tamanho que a fonte de letra escolhida usar. FontUnderline: Determina se a fonte ser sublinhada. Orientation: Determina a orientao do papel: Retrato ou Paisagem. Usamos as constantes para definir o tipo escolhido: vbPRORPortrait 1 Retrato vbPRORLandscape 2 Paisagem Page : Retorna o nmero da pgina que esta sendo impressa. PaperSize: Determinamos o tamanho do papel. Podemos usamos as seguintes constantes: vbPRPSLetter 1 Letter, 8 1/2 x 11 in. VbPRPSLetterSmall 2 Letter Small, 8 1/2 x 11 in. VbPRPSTabloid 3 Tabloid, 11 x 17 in. VbPRPSLedger 4 Ledger, 17 x 11 in. VbPRPSLegal 5 Legal, 8 1/2 x 14 in. VbPRPSStatement 6 Statement, 5 1/2 x 8 1/2 in. VbPRPSExecutive 7 Executive, 7 1/2 x 10 1/2 in. vbPRPSA3 8 A3, 297 x 420 mm vbPRPSA4 9 A4, 210 x 297 mm vbPRPSA4Small 10 A4 Small, 210 x 297 mm vbPRPSA5 11 A5, 148 x 210 mm vbPRPSB4 12 B4, 250 x 354 mm vbPRPSB5 13 B5, 182 x 257 mm vbPRPSFolio 14 Folio, 8 1/2 x 13 in. VbPRPSQuarto 15 Quarto, 215 x 275 mm vbPRPS10x14 16 10 x 14 in. vbPRPS11x17 17 11 x 17 in. VbPRPSNote 18 Note, 8 1/2 x 11 in. vbPRPSEnv919 Envelope #9, 3 7/8 x 8 7/8 in. vbPRPSEnv10 20 Envelope #10, 4 1/8 x 9 1/2 in. vbPRPSEnv11 21 Envelope #11, 4 1/2 x 10 3/8 in. vbPRPSEnv12 22 Envelope #12, 4 1/2 x 11 in. vbPRPSEnv14 23 Envelope #14, 5 x 11 1/2 in. VbPRPSCSheet 24 C size sheet vbPRPSDSheet 25 D size sheet vbPRPSESheet 26 E size sheet vbPRPSEnvDL 27 Envelope DL, 110 x 220 mm vbPRPSEnvC3 29 Envelope C3, 324 x 458 mm vbPRPSEnvC4 30 Envelope C4, 229 x 324 mm vbPRPSEnvC5 28 Envelope C5, 162 x 229 mm vbPRPSEnvC6 31 Envelope C6, 114 x 162 mm vbPRPSEnvC65 32 Envelope C65, 114 x 229 mm vbPRPSEnvB4 33 Envelope B4, 250 x 353 mm vbPRPSEnvB5 34 Envelope B5, 176 x 250 mm vbPRPSEnvB6 35 Envelope B6, 176 x 125 mm vbPRPSEnvItaly 36 Envelope, 110 x 230 mm

williamdsilva@aol.com.br

132

vbPRPSEnvMonarch 37 Envelope Monarch, 3 7/8 x 7 1/2 in. vbPRPSEnvPersonal 38 Envelope, 3 5/8 x 6 1/2 in. vbPRPSFanfoldUS 39 U.S. Standard Fanfold, 14 7/8 x 11 in. vbPRPSFanfoldStdGerman 40 German Standard Fanfold, 8 1/2 x 12 in. vbPRPSFanfoldLglGerman 41 German Legal Fanfold, 8 1/2 x 13 in. vbPRPSUser 256 User-defined Port: Retorna o nome da porta de impresso que ser usada pela impressora padro. PrintQuality: Determina ou seta a resoluo que a impressora ir usar. VbPRPQDraft -1 Resoluo Draft vbPRPQLow -2 Baixa Resoluo vbPRPQMedium -3 Mdia Resoluo vbPRPQHigh -4 Alta Resoluo Os mtodos: EndDoc: Finaliza a impresso de um relatrio KillDoc: Termina imediatamente a impresso NewPage: Fora a impresso passar para a prxima pgina. Print {expresso} : Imprime uma expresso ou varivel especificada. O Objeto Printer no aparece na caixa de ferramentas, nem possui um cone como outros objetos. Ele interno que no possui formato visual. 288 - Usurio logado (Novel) Enviado por: Davi Diogo

Uma das variveis de ambiente da Novel consegue descobrir o nome do usurio que est logado. Dim Usuario as string Usuario = Environ("User")

289 - Ao escolher um item de um menu, proteger todos os outros menus do formulrio. Enviado por: Emerson Nascimento

Quando o usurio escolher uma determinada opo de um menu qualquer de um formulrio, tornar todos os outros menus do formulrio protegidos, ou seja, o usurio so pode abrir um menu, e escolher somente uma opo do menu aberto. Option Explicit . . . Private Sub opcao1menu1_Click() gl_chamador = 1 ' gl_chamador = 1 indica que o formulrio foi chamado ' pelo menu e no por outro formulrio setar_true_false (False) Form1.MousePointer = 11 Load Form2 Form2.Show Form1.MousePointer = 1 End Sub . . . Private Sub opcao2menu1_Click() gl_chamador = 1 setar_true_false (False) Form1.MousePointer = 11 Load Form3 Form3.Show Form1.MousePointer = 1 End Sub . . . Private Sub opcao1menu2_Click() gl_chamador = 1 setar_true_false (False)

williamdsilva@aol.com.br

133

Form1.MousePointer = 11 Load Form4 Form4.Show Form1.MousePointer = 1 End Sub . . . Private Sub opcao2menu2_Click() gl_chamador = 1 setar_true_false (False) Form1.MousePointer = 11 Load Form5 Form5.Show Form1.MousePointer = 1 End Sub . . . 'Modulo1 Option Explicit . . . Public gl_chamador As Integer Function setar_true_false(tf As Boolean) Form1.menu1.Item(1).Enabled = tf Form1.menu2.Item(2).Enabled = tf Form1.menu3.Item(3).Enabled = tf End Function . . . 'Form2 Private Sub sair_Click() If gl_chamador = 1 Then setar_true_false (True) End If Unload Me End Sub 'Form3 Private Sub sair_Click() If gl_chamador = 1 Then setar_true_false (True) End If Unload Me End Sub 'Form4 Private Sub sair_Click() If gl_chamador = 1 Then setar_true_false (True) End If Unload Me End Sub 'Form5 Private Sub sair_Click() If gl_chamador = 1 Then setar_true_false (True) End If Unload Me End Sub

290 - Como filtrar registros usando uma instruo SQL Enviado por: Fabio Feitoza

* Insira um controle DATA no seu formulrio * V at as propriedades Databasename e especifique o caminho e o nome do arquivo de banco de dados. * Depois verifique se a propriedade RecordsetType do tipo Dynaset ou Snapshot.

williamdsilva@aol.com.br

134

* Abaixo da propriedade RecordsetType estar a Recordsource onde voc poder especificar o nome da Tabela ou um instruo SQL. OBS. Especificando a instruo SQL na propriedade Recordsource de um Data Control quando seu projeto for iniciado o DATA atualizado automaticamente. Mas se voc especificar esse comando dentro da rea de codificao, ter que incluir o cdigo para atualizar o controle. Por exemplo: DATA1.RECORDSOURCE = "SELECT [Campo] FROM [Tabela] WHERE [Campo] [Condio]'"& "[Expresso]" & "'" DATA1.REFRESH [Campo] - Nome do campo do banco de dados [Tabela] - Nome da tabela do banco de dados [Condio] - LIKE, = , > ,< ,<> ,<= ,>=. [Expresso] - O que voc quer filtrar.[texto digitado].

291 - Mudana de caractres em uma string ( + fcil ) Enviado por: Fabio J. P. Silva

Para usar esta funo preciso um textbox e um label para visualizar o resultado. Exemplo: Private Sub Text1_Change() Label1.Caption = MudaTexto(Text1.Text) End Sub Function MudaTexto(palavra As String) As String Dim i As Integer For i = 0 To Len(palavra) palavra = Replace(palavra, "<", "[") palavra = Replace(palavra, ">", "]") palavra = Replace(palavra, "\", "|") palavra = Replace(palavra, ".", ",") 'Quantas mudanas forem nescessrias Next MudaTexto = palavra End Function

292 - Como travar o mouse dentro de um formulrio Enviado por: gabriel

Esta dica muito boa. Com o cdigo a seguir, voc vai poder prender o cursor do mouse dentro de um formulrio qualquer. Primeiro voc cria um mdulo contendo o seguinte cdigo: #If Win16 Then Type Retang esquerda As Integer topo As Integer direita As Integer baixo As Integer End Type Declare Sub ClipCursor Lib "User" (lpRetang As Retang) Declare Sub GetWindowRect Lib "User" (ByVal hWnd _ As Integer, lpRetang As Retang) Declare Function GetDesktopWindow Lib "User" () As Integer #Else Type Retang esquerda As Long topo As Long direita As Long baixo As Long End Type Declare Sub ClipCursor Lib "User32" (lpRetang As Retang) Declare Sub GetWindowRect Lib "User32" (ByVal hWnd _ As Integer, lpRetang As Retang) Declare Function GetDesktopWindow Lib "User32" () As Long #End If

williamdsilva@aol.com.br

135

/pre> Depois voc usa os cdigos abaixo em um boto ou como quiser para travar e destravar: 'restringe o movimento do mouse Dim EstaJanela As Retang GetWindowRect Me.hWnd, EstaJanela ClipCursor EstaJanela 'Libera no desktop Dim DesktopWindow As Retang GetWindowRect GetDesktopWindow(), DesktopWindow ClipCursor DesktopWindow /pre> Pronto! Se voc que entrou nesta dica sabe alguma coisa sobre criao de jogos no VB, pelo amor de Deus, me manda um e-mail!!! email: superforrest@zipmail.com.br 293 - Evitando erros na visualizao Enviado por: Glauco Zamarim Variz

Quando indicamos uma TextBox com um determinado registro do banco de dados, cujo valor nulo, gerado um erro. Para que no acontea isto, uso o seguinte cdigo: textbox.text = "" & Tabela!Campo

294 - Mensagens de erro e solues Enviado por: Helmar Santos Faria

Para quem est usando o VB 6, depois de criar sua aplicao d uma mensagem de "out of memory". Pra solucionar este problema, retire do seu projeto a FM20.DLL da barra de ferramentas, uma DLL que no "distribuitable", alis pra vc ver se uma DLL pode ou no ser distribuda, verifique no CD 1 do VB6 o diretrio COMMON\REDIST\ o arquivo redist.txt, l dentro tem as DLL, que vc pode mandar junto com a sua aplicao!!! isto!!! Abraos 295 - Problema com o setup Enviado por: Heros Carlos da Silva

Se voc usa o controle MSCAL.OCX, no momento da instalao, se ocorrer o seguinte erro : "c:\windows\system\$(dllselfregisterex) could not be registered because it could not be found Adicione no arquivo VB5dep.ini as seguintes linhas : [MSCAL.OCX] Register=$(DLLSelfRegister) Dest=$(WinSysPath) Uses1=

296 - Conversao de bases Enviado por: Joao Bosco Ribeiro

Crie um formulario com 3 (trs) controles textbox com os seguintes nomes: TxtRecebe, TxtConvertido e TxtRetornado. Crie uma frame e dentro dela inclua 4 contoles OpptionButton com o nome Option1 tendo como caption: Binrio, Octal, Decimal de Hexa Informe o nome no TextBox TxtRecebe e selecione a base para qual voce quer converter o nmero.

williamdsilva@aol.com.br

136

Sao duas funcoes: ConvOD e ConvDO. A ConvOD (Converte Outras bases para Decimal) {Function ConvOD(ByVal VlOri As String, ByVal Base As Integer) As Long} recebe como parametro um valor decimal inteiro longo (positivo) e a base para qual se deseja converter este valor. A ConvDO (Converte Decimal para outras bases) {Function ConvDO(ByVal VlOri As Long, ByVal Base As Integer) As String} recebe como parametro uma string que contem um valor em uma base qualquer e a base em que esta este valor O que torna estas funoes bem pequenas a recursividade. Dim MatInd(3) As Integer Dim Caracs As String Private Sub Form_Load() MatInd(0) = 2 MatInd(1) = 8 MatInd(2) = 10 MatInd(3) = 16 Caracs = "0123456789ABCDEF" End Sub Private Sub Option1_Click(Index As Integer) TxtConvertido = ConvDO(CLng(TxtRecebe), MatInd(Index)) TxtRetornado = ConvOD(TxtConvertido, MatInd(Index)) End Sub Function ConvDO(ByVal VlOri As Long, ByVal Base As Integer) As String Dim DVI As Long Dim Rst As Integer DVI = VlOri \ Base Rst = (VlOri Mod Base) + 1 If DVI < Base Then ConvDO = Mid(Caracs, DVI + 1, 1) & Mid(Caracs, Rst, 1) Else ConvDO = ConvDO(DVI, Base) & Mid(Caracs, Rst, 1) End If End Function Function ConvOD(ByVal VlOri As String, ByVal Base As Integer) As Long Dim PCar As Integer Dim Rst As String PCar = InStr(Caracs, Left(Trim(VlOri), 1)) - 1 VlOri = Mid(VlOri, 2) If Len(VlOri) >= 1 Then ConvOD = PCar * Base ^ Len(Trim(VlOri)) + ConvOD(VlOri, Base) Else ConvOD = PCar End If End Function

297 - Fazendo aplicativos do estilo client /server Enviado por: Joo Milliet

muito simples fazer aplicativos client e server. Voc precisa do controle winsock. O que voc deve fazer primeiro um aplicativo server: Inclua o controle winosck no formulrio e determine uma porta local (localPort) . Obs. A porta local no pode ser alterada durante a execuo do programa no caso, voc inclui um boto de comando com o seguinte cdigo: winsock1.Listen

Ou seja, o winsock estar ouvindo para ver se tem algum aplicativo client chamando por conexo. Ento voc da um duplo-clique no controle winsock e seleciona a ao (no menu de aes do editor de cdigo do VB) e seleciona a ao connectionRequest colocando o seguinte cdigo winsock1.accept("") msgBox "pedido de coneco"

O que significa: o winsock vai aceitar a conexo pedida e vai aparecer uma caixa de dilogo com a mensagem "pedido de conexo" OK, o server est feito, agora voc pode dar uns retoques no visual e outros.

williamdsilva@aol.com.br

137

Agora partimos para o aplicativo client Voc deve inserir nele um controle winsock Coloque um campo de texto chamado txtIPhost e outro chamado txtPorta (coloquei estes nomes apenas para simbolizar) insira um boto de comando e coloque o seguinte cdigo: 'confere se o campo de texto txtIPhost est vazio ou idem para o campo txtPorta 'Se algum deles estiver vazio o aplicativo mostrar uma caixa de dilogo com a mensagem if txtIPhost.Text = "" or txtPorta.Text = "" then if txtIPhost.text = "" then msgBox "Voc precisa especificar o endereo da mquina host" end if if txtPorta.text = "" then msgBox "Voc precisa especificar a porta da mquina host" end if else 'Configura o endereo host do winsock atravs do campo de text txtIPhost winsock winsock1.remoteHost = txtIPhost.Text 'Configura o endereo remoto da porta do winsock atravs do campo de texto txtPorta winsock1.remotePort = txtPorta.Text 'Executa coneco Winsock1.Connect Ento voc agora pode criar funes, e depois envia-las, como por exemplo uma mensagem caixa de dilogo: Function exemplo() msgBox "Este um exemplo de funo" End Function Ento coloque o seguinte cdigo num boto de comando (por exemplo) 'dentro do parenteses o nome da funo winsock1.sendData (exemplo) Pronto, temos um esquema client - server! OBS. sAINDA OCORREM ALGUMAS PEQUENAS FALHAS DURANTE A EXECUO DO PROGRAMA 298 - Como deixar seu formulario de ajuda com cara de Internet !!! Enviado por: Laurindo dos Santos

Escolha um controle no controle label coloque como FontUnderline. Na propriedade MouseMove() da label digite : [label].ForeColor = &H00FF0000& E no evento Form_Mousemove() digite : [label].ForeColor = &H0000C000& Se ouver maior quantidade crie Arrays e use o For para mudar a cor dos mesmos. Obs.: Para ficar ainda melhor coloque a propriedade MousePointer = Custom e na propriedade MouseIcon procure o arquivo c:\Windows\Cursor\Hand-m.ico !!! 299 - Enviando erros de um Controle ou DLL para o aplicativo chamador Enviado por: Lenilson Marcenal

Public Sub RaiseError(Optional ByVal SrcName, _ Optional ByVal code = 0, _ Optional ByVal Message, _ Optional ByVal oConsulta As STIDB.Query) Dim sMsg As String Dim nLoop As Integer On Error Resume Next If Not IsMissing(SrcName) Then sMsg = sMsg & " Origem: " & SrcName & vbCr & vbLf If Not IsMissing(code) Then sMsg = sMsg & " Cdigo: " & code & vbCr & vbLf If Not IsMissing(Message) Then sMsg = sMsg & " " & Message & vbCr & vbLf If sLogCreate Then If Not IsMissing(oConsulta) Then If Not oConsulta Is Nothing Then sMsg = sMsg & "----| Parmetros da Consulta |-----------------------" & vbCr & vbLf sMsg = sMsg & " Numero de Parmetros = " & oConsulta.Parameters.Count & vbCr & vbLf If oConsulta.Parameters.Count > 0 Then For nLoop = 0 To oConsulta.Parameters.Count - 1

williamdsilva@aol.com.br

138

sMsg = sMsg & " Parmetro " & nLoop & ") Tipo : " & oConsulta.Parameters(nLoop).DataType & " - Valor : " & Left$(oConsulta.Parameters(nLoop).Value, 100) & vbCr & vbLf Next End If End If End If End If Err.Raise vbObjectError + code, , sMsg End Sub

300 - Alinhando nmeros pela vrgula Enviado por: Lenilson Marcenal

Utilize esta funo ao imprimir via cdigo um relatrio. Public Function AlinhaNumeroVirgula(ByVal Numero As Variant, _ ByVal TamanhoNumero As Integer, _ Optional ByVal QuantDecimais As Integer = 2) As String AlinhaNumeroVirgula = Format$(Format$(Numero, "0" & IIf(QuantDecimais > 0, "." & String(QuantDecimais, "0"), "")), String(TamanhoNumero, "@")) End Function

301 - Setando MousePointer de maneira segura Enviado por: Lenilson Marcenal

Quando tentava fazer uma funo que tomaria algum tempo do usurio, sempre eu colocava a ampulheta do mouse (11) e depois retornava para o ponteiro padrao (0), sendo que se esta funo fosse chamada de dentro de outra funo que j fizesse isto aps a chamada da segunda funo o ponteiro do mouse ficava como padro, agora sempre que vou mudar o ponteiro do mouse utilizo esta funo. Public Function gMousePointer(ByVal nTipodoMouse As MousePointerConstants) As Integer gMousePointer = Screen.MousePointer If Screen.MousePointer <> nTipodoMouse Then Screen.MousePointer = nTipodoMouse End If End Function

302 - como gravar um arquivo texto no HD Enviado por: Marcelo Caetano Costa Leite Dominici

Como gravar um arquivo texo(*.txt) no HD do seu PC? '************************************************ dlg1.filter="arquivo de texo(*.txt) | *.txt" dlg1.showsave if dlg1.filename For Output As #1 open dlg1.filename For Output As #1 print #1,txttexto.text 'Salva string para 'arquivo close #1 end if '*************************************************

303 - Localizar Pastas do Windows Enviado por: Marcelo Zeri

'Cdigo que recupera Pastas do Windows, como Strings:

williamdsilva@aol.com.br

139

'Ex: C:\Windows\Desktop, C:\Windows\Histrico... '------------------'Cdigo para o Form '------------------Option Explicit Private Sub Form_Load() Call AchePastas End Sub Private Sub AchePastas() MsgBox " 0- " & ListaPastas(0) & vbCrLf & _ " 2- " & ListaPastas(2) & vbCrLf & _ " 5- " & ListaPastas(5) & vbCrLf & _ " 6- " & ListaPastas(6) & vbCrLf & _ " 7- " & ListaPastas(7) & vbCrLf & _ " 8- " & ListaPastas(8) & vbCrLf & _ " 9- " & ListaPastas(9) & vbCrLf & _ "11- " & ListaPastas(11) & vbCrLf & _ "19- " & ListaPastas(19) & vbCrLf & _ "20- " & ListaPastas(20) & vbCrLf & _ "21- " & ListaPastas(21) & vbCrLf & _ "26- " & ListaPastas(26) & vbCrLf & _ "27- " & ListaPastas(27) & vbCrLf & _ "32- " & ListaPastas(32) & vbCrLf & _ "33- " & ListaPastas(33) & vbCrLf & _ "34- " & ListaPastas(34), , " Pastas do Windows" Unload Me End Sub '-----------------------'Cdigo para o mdulo BAS '-----------------------Option Explicit 'APIs Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ItemDaLista) As Long 'Constantes Public Type LOCMEIO CB As Long ABID As Byte End Type Public Type ItemDaLista MKID As LOCMEIO End Type 'Funo Pblica Public Function ListaPastas(ByVal CSIDL As Long) As String Dim Zz As Long Dim StrDoPath As String Dim IDL As ItemDaLista Const NOERRO = 0 Const TAM_MAX = 260 On Error GoTo PareFuncao: Zz = SHGetSpecialFolderLocation(Form1.hWnd, CSIDL, IDL) 'troque o nome do Form1 se ele tiver outro nome If Zz = NOERRO Then StrDoPath = Space$(TAM_MAX) Zz = SHGetPathFromIDList(ByVal IDL.MKID.CB, ByVal StrDoPath) If Zz Then ListaPastas = Left$(StrDoPath, InStr(StrDoPath, Chr$(0)) - 1) End If Exit Function PareFuncao: End Function

williamdsilva@aol.com.br

140

304 - PopMenu Randmico Enviado por: Marcelo Zeri

PopMenu Randmico: 1-) Coloque 1 Label ( Label1 ) em 1 formulrio e construa o seguinte Menu: CAPTIONS ( NAMES ) &Arquivo ( mnuArquivo ) ... &Novo ( mnuNovo ) ... ( separa1 ) ... &Abrir ( mnuAbrir ) ... ( separa2 ) ... &Fechar ( mnuFechar ) &Editar ( mnuEditar ) ... &Copiar ( mnuCopiar ) ... ( separa3 ) ... &Recortar ( mnuRecortar ) ... ( separa4 ) ... &Selecionar Tudo ( mnuSeleTudo ) &Informaes ( mnuInfo ) ... &Ajuda ( mnuAjuda ) ... ( separa5 ) ... &Sobre o Programa ( mnuSobre ) 2-) Cole o seguinte cdigo no form: Option Explicit Private Sub Form_Load() Label1.Left = 0 Label1.Width = Me.Width Label1.Alignment = 2 Label1.FontBold = True Label1.FontSize = 12 Label1 = "Clique o form com o boto direito do mouse por diversas vezes" Me.WindowState = 2 End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) Label1 = "" If Button = 2 Then Dim MeuValor% 'Randomize 'sorteia um nmero entre 1 e 3 para exibir l menu 'quando o boto direito do mouse for clicado 'se quiser adicionar + menus substitua 'o nmero 3 pelo numero de menus desejado MeuValor% = Int((3 * Rnd) + 1) Select Case MeuValor% Case 1 Label1.ForeColor = QBColor(12) Label1 = "&Arquivo": PopupMenu mnuArquivo, 2, , , mnuNovo Case 2 Label1.ForeColor = QBColor(9) Label1 = "&Editar": PopupMenu mnuEditar, 2, , , mnuSeleTudo Case 3 Label1.ForeColor = QBColor(1) Label1 = "&Informaes": PopupMenu mnuInfo, 2, , , mnuSobre End Select End If End Sub Private Sub Form_Resize() Label1.Width = Me.Width Label1.Top = Height * 0.75 End Sub Private Sub Fechar_Click() Unload me End Sub

305 - Como fazer clculos com horas facilmente. Enviado por: Marcio A. P.

williamdsilva@aol.com.br

141

Para incio, vamos relembrar 1h = 60min. Isto s para relembrar voc de que para transformar h em min e s multiplicar por 60. Todos os clculos sero realizados em minutos, ento para entrada de dados voc deve ter dois controles diferentes, um para horas e outro para minutos. Converta as horas em minutos depois some com os minutos restantes do outro controle. Agora voc j tem o 1. Valor (vamos chamar de x) . Agora faa o mesmo para um segundo valor (vamos chamar de y). Preste ateno agora que voc tem os dois valores x e y, voc pode realizar qualquer operao com eles. Mas tem um porm, o valor resultante de uma operao entre x e y em minutos. Para resolver este problema crie um while da seguinte forma: Suponhamos que seja feita a seguinte operao x + y = z Neste caso o valor retornado ser sempre positivo e > 0 ento para essa ocasio temos. X = minutos Y = minutos Z = minutos do while z >= 60 z = z 60 horas = horas + 1 Loop Obs.: sendo horas uma varivel declarada. Para exibir o resultado faa text1.text = horas & : & z

Ateno se a operao for subtrao dever ser criado um while para nmeros negativos: Do while z < 0 and z <= -60 z = z + 60 horas = horas +1 Loop Tome cuidado para no ficar preso em um loop infinito. 306 - Imprimir como no DOS. Enviado por: Marcos Joaquim Neto

rea: Impresso Para imprimir utilizando impressoras matriciais, a melhor forma como no antigo DOS, utilizando os prprios carateres da impressora, pois a impresso atravs Gerenciador do Windows muito lenta. Para isso, deve-se abrir a porta da impressora como se fosse um arquivo texto. Exemplo: Open "LPT1:" for output as #1 for x= 1 to 10 print #1, "Isto um teste." next print #1, Chr(12); Close #1 Este exemplo imprime a frase "Isto um teste." em 10 linhas e faz com que o ponto de impresso passe para a prxima pgina. Observao: Alguns caracteres acentuados das impressoras matriciais tem cdigos diferentes daqueles utilizados pelo Windows. 307 - Funo que converte uma cor em VB para cor HTML Enviado por: RodrigoAlves Peres

Public Function ColorTag(ByVal Cor As Long) As String

williamdsilva@aol.com.br

142

Dim Texto As String, corHexa As String Dim Num As Integer corHexa = Hex(Cor) 'Converte a cor nmerica do 'parametro em Hexadeximal 'Obs.: A funo Hex Retorna O Num em Texto Texto = "" For Num = (6 - Len(corHexa)) To 1 Step -1 Texto = Texto & "0" Next ColorTag = "#" & Texto & corHexa 'Retorna #BBGGRR End Function Agora Pode ser Implementado Assim: Label1.Caption=ColorTag(vbblue) 'Retorna #FF0000 Ou usar o CommonDialog: 'Chama a caixa de dilogo de cor CommonDialog1.ShowColor Label1.Caption = ColorTag(CommonDialog1.Color)

308 - Trocar caracteres em uma string Enviado por: Sergio Godoy

possvel criar uma funo simples que troca um caracter por outro em uma string (Semelhante dica j enviada, s que aperfeioada). Declare uma funo: Function TrocaString(ByVal sString as String, sOldChar as String, sNewChar as String) as String While InStr(sString, sOldChar) > 0 Mid(sString,InStr(sString,sOldStr),1)=sNewStr Wend TrocaString = sString End Function Depois, a chamada simples. Exemplo: MsgBox TrocaString("Ganhe muito ????? !","?","$") Isso exibir a mensagem 'Ganhe muito $$$$$ !'. 309 - Iluminar Campo Enviado por: Thadeu R. Ferraz

Estes dois comandos permitem mudar a cor do textbox quando recebe ou deixa o foco. Private Sub text1_GotFocus() text1.BackColor = &HC0FFFF End Sub Private Sub text1_LostFocus() text1.BackColor = &H80000005 End Sub

310 - Nmero de srie do HD, sem API Enviado por: Vanclei Matheus

Para pegar o nmero de srie de um HD utilize o seguinte cdigo: Dim lSerial as Long Dim fso As New FileSystemObject, drvDrive As Drive 'Pega as informaes do drive c: Set drvDrive = fso.GetDrive(left(fso.GetDriveName("c:\"), 2)) 'Pega o nmero de srie do HD

williamdsilva@aol.com.br

143

lSerial = drvDrive.SerialNumber E no esquea de adicionar aos references do seu projeto a seguinte biblioteca "Microsoft Scripting Runtime", seno no funciona 311 - Inserindo textos no crystal a partir do VB Enviado por: Washington Souzedo

As vezes voc sente necessidade de inserir um periodo ou um texto na hora de execuo do seu relatrio. No VB. 1 . objetoCristal.formulas(0) = "NomeFormula = 'Relatorio ....'" NO Cristal. 1. Crie uma formula (D um nome qualquer). Clique em accept e insira o campo de formula no local desejado. Quando o relatorio for impresso o Vb enviara a msg para o cristal eo sustituir on de o nome da formula foi inserido.. 312 - Para o seu texto ficar piscando Enviado por: Web'o

Coloque um timer, e este cdigo no timer com interval para 500. E depois crie uma label. Cdigo do timer: Private Sub Timer1_Click() If Label1.visible = true then Label1.visible=false else Label1.visible=true End if End sub

313 - como criar Credits Scroll Enviado por: Wellington E. Souza

Credits Scroll ' Adicione um timer ao seu form com o valor do intervalo =1 ' Tenha 1 label ou mais em seu form (esse cdigo pode rolar figuras, textboxes ...) Private Sub Timer1_Timer() Label1.Top = Label1.Top - 32 'The bigger the number, the faster the scroll ' add any other labels you want to scroll.... ' also try this: ' Label1.Left = Label1.Left - 32 ' to scroll sideways End Sub

314 - Visualizador de imagem simples Enviado por: William

Para montar um visualizador de imagem simples, basta abrir um noveo projeto, inserir os seguintes controles FileListBox, DirListbox e Image, em seguida escreva as seguites linhas: Private Sub Dir1_Change() File1 = Dir1 'Amarra os arquivos s pasta End Sub Private Sub File1_Click() Chdir(Dir1) 'Quando mudar de dirtrio atualiza o File1 Image1.Picture = LoadPicture(File1) End Sub Private Sub Form_Load() File1.Pattern = *."bmp;*.jpg;*.gif;*.cur;*.wmf;*.ico" 'Filtra o File1, para exibio somente deste arquivos

williamdsilva@aol.com.br

144

End Sub Obviamente que esta ltima lina poder ser substituida, simplesmente inserindo as informaes entre parentese na propriedade Pattern do componente File1. Outra dica e verificar a propriedade Strech da Image, para limeitar ou no o tamanho da imagem a ser exibida. Quem tiver interesse em um visualizador Freeware da Lizaro Software, basta enviar um e-mail para o endereo acima. Um grande abraos a todos e at breve. 315 - Como pegar o diretrio do windows com uma s linha de comando Enviado por: ]Anjo[

Dim Windows 'Nem conta como linha, pois sem ela funciona 'tambm Windows = Environ("Windir") 'Essa varivel de abiente setada no 'c:\msdos.sys, onde armazenado o nome do 'diretrio do windows MsgBox Windows 'Tambm no conta como linha 'Retorna: "C:\Windows" 'Tks ao midnait pelo help

316 - Redimensionamento dos controles no Form Enviado por: Alexandre Gomiero

Se vc precisa deixar habilitado o redimensionamento da janela p/ o usurio e os controles dispem-se automaticamente no form, conforme o tamanho, coloque no Form_Resize() o seguinte: If Me.WindowsState <> 1 Then 'Se quiser que o controle mude de tamanho controle.height = form.height - (diferena entre e o form.height e controle.height, inicialmente) controle.width = form.width - (diferena entre o form.width e controle.width, inicialmente) 'Se quiser que o controle mexa-se no form controle.top = (em alguns casos fixo (0 por exemplo), se no for, faa as contas onde o controle dever aparecer se o form for redimensionado, por exemplo, (form.height/2) - controle.height, se for p/ o controle aparecer no meio do form controle.left = (idem acima, mas em vez de .height .width) End If

317 - Smbolo da moeda Enviado por: Anderson J. C. Garcia

O simbolo da moeda definido nas configuraes regionais do sistema pode ser obtido atravs da API GetLocaleInfo. Segue cdigo: 'Como obter o simbolo da moeda Option Explicit Public gstrCurrencySymbol As String Private Declare Function GetLocaleInfo Lib "kernel32" _ Alias "GetLocaleInfoA" (ByVal Locale As Long, _ ByVal LCType As Long, ByVal lpLCData As String, _ ByVal cchData As Long) As Long Private Declare Function GetUserDefaultLCID% Lib "kernel32" () Private Const LOCALE_SCURRENCY = &H14 Sub Main() Dim iRet1 As Long Dim iRet2 As Long Dim lpLCDataVar As String Dim Pos As Integer Dim Locale As Long

williamdsilva@aol.com.br

145

Locale = GetUserDefaultLCID() iRet1 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, lpLCDataVar, 0) gstrCurrencySymbol = String$(iRet1, 0) iRet2 = GetLocaleInfo(Locale, LOCALE_SCURRENCY, gstrCurrencySymbol, iRet1) Pos = InStr(gstrCurrencySymbol, Chr$(0)) If Pos > 0 Then gstrCurrencySymbol = Left$(gstrCurrencySymbol, Pos - 1) End If MsgBox "O simbolo da moeda " & gstrCurrencySymbol, vbInformation End Sub

318 - Pontos de Insero (Caret) Personalizveis Enviado por: Antonio Aristides Mochi Jr.

'Esta programa demostra como personalizar os 'pontos de insero de um text-box modificando o 'seu formato e o tempo de piscada 'Crie um novo formulrio com dois TextBox e copie 'o cdigo abaixo para fazer o teste. ' '----------------------------------------Option Explicit Private Declare Function CreateCaret Lib "user32" (ByVal hWnd As Long, ByVal hBitmap As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long Private Declare Function SetCaretBlinkTime Lib "user32" (ByVal wMSeconds As Long) As Long Private Declare Function ShowCaret Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function GetCaretBlinkTime Lib "user32" () As Long 'VARIAVEIS PRIVADAS Private lDuracaoBlink_Text2 As Long 'CONSTANTES Private Const CARET_EM_PRETO As Long = 0 Private Const CARET_EM_CINZA As Long = 1 Private Sub Text2_GotFocus() 'SALVAR A DURAO DE PISCADA (BLINK) DO PONTO DE INSERO (CARET) lDuracaoBlink_Text2 = GetCaretBlinkTime() 'CRIAR E MOSTRAR O NOVO FORMATO PARA O PONTO DE INSERO CreateCaret Text2.hWnd, CARET_EM_CINZA, 5, 15 ShowCaret Text2.hWnd 'DEFINIR NOVA DURAO DE PISCADA SetCaretBlinkTime 200 End Sub Private Sub Text2_LostFocus() 'RETORNAR O VALOR DA DURAO DE PISCADA (BLINK) SetCaretBlinkTime lDuracaoBlink_Text2 End Sub '--------------------------------------------

319 - Descobrindo se o SO Windows 95 ou Windows NT Enviado por: Antonio Aristides Mochi Jr. 'DEMONSTRAO DE IDENTIFICAO DO SISTEMA 'OPERACIONAL CORRENTE. ' ' 'FUNES Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long 'CONSTANTES Public Const VER_PLATFORM_WIN32_NT As Long = 2 Public Const VER_PLATFORM_WIN32_WINDOWS As Long = 1 Public Const VER_PLATFORM_WIN32s As Long = 0 'TIPOS Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long

williamdsilva@aol.com.br

146

dwPlatformId As Long szCSDVersion As String * 128 End Type ' Public Function VerificarSistemaOperacional() As String Dim osvSistema As OSVERSIONINFO Dim sRetorno As String On Error GoTo ERRO osvSistema.dwOSVersionInfoSize = Len(osvSistema) If GetVersionEx(osvSistema) = 0 Then sRetorno = "SISTEMA OPERACIONAL NO IDENTIFICADO" Else If osvSistema.dwPlatformId = VER_PLATFORM_WIN32_NT Then sRetorno = "WINDOWS NT" ElseIf osvSistema.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then sRetorno = "WINDOWS 95" ElseIf osvSistema.dwPlatformId = VER_PLATFORM_WIN32s Then sRetorno = "WINDOWS 32s" End If End If VerificarSistemaOperacional = sRetorno Exit Function ERRO: VerificarSistemaOperacional = "ERRO AO IDENTIFICAR O SISTEMA OPERACIONAL" End Function

320 - Espiral Enviado por: Armando Miani Neto Private Sub Form_Load() Timer1.Interval = 25 End Sub Private Sub Timer1_Timer() Dim CX, CY, Radius, Limit ScaleMode = 3 CX = ScaleWidth / 2 CY = ScaleHeight / 2 If CX > CY Then Limit = CY Else Limit = CX For Radius = 0 To Limit Circle (CX, CY), Radius, RGB(Rnd * 255, Rnd * 255, Rnd * 255) Next Radius End Sub

321 - mapear unidade de rede Enviado por: bruno Mapear uma unidade de rede; Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal _ lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName _ As String) As Long Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" _ (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName _ As Long) As Long Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _ (ByVal lpszName As String, ByVal bForce As Long) As Long Dim Caminho As String, Unidade as String Caminho = "\\Computador\Caminho" Unidade = "I:" 'Realiza conexo WNetAddConnection Caminho , "Se tiver senha, digite aqui", unidade 'Consulta caminho de uma determinada conexo, _ 'neste caso, na varivel caminho ser armazenado o local do caminho _ 'atual ref. a unidade WNetGetConnection Unidade, Caminho, 255) 'Desconecta WNetCancelConnection Unidade, True

williamdsilva@aol.com.br
322 - Enviando registro para o Excel Enviado por: Carlos Gentini e Carlos Gama

147

Uma Maniera facil de Gera Registro de uma tabela em excel. Dim RS As Recordset Dim DBanco As DataBase Dim XL As Object Dim Num As Long Dim Alfabeto As Variant Dim Campos() As String Dim Letras As String sub CommandButton_Click() Set XL = CreateObject("excel.Application") XL.Workbooks.Add Set XL = XL.Application.Worksheets Call GeraRecordset If RS.RecordCount <> 0 Then RS.Close DBanco.Close Set XL = nothing End Sub Private Sub GeraRecordset() Alfabeto = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", _ "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", _ "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", _ "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", _ "DA", "DB", "DC", "DD", "DE", "DF", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DO", "DP", "DQ", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "DZ") Set DBanco = OpenDatabase(caminho) Set RS = DBanco.OpenRecordset(Tabela, dbOpenDynaset) ReDim Campos(RS.Fields.Count) For Num = 0 To RS.Fields.Count - 1 Campos(Num) = RS.Fields(Num).Name Next For Num = 0 To RS.Fields.Count - 1 Letras = Alfabeto(Num) & "1" XL("Plan1").Range(Letras).Value = Campos(Num) Next 'Copia o todos o recordeset aberto para o Excel XL("Plan1").Range("A2").CopyFromRecordset RS End Sub

323 - Imprimir um Relatrio em Crystal em rede Enviado por: CArlos Gentini e Carlos Gama Se vc tem um aplicativo em VB, e seu relatrios so em crystal, vai um dica de como roda-los em rede Crystal.DataFiles(0) = "\\Teste\Relatorio\Banco de dados" Crystal.ReportFileName = "\\Teste\Relatorio\ report.rpt" Imprimir.Destination = crptToPrinter Imprimir.Action = 0

324 - Letreiro com LABEL Enviado por: Carlos Peixoto Private Sub Form1_Load() Timer1.Interval = 150 Timer1.Enabled = True Label1.Caption = "Letreiro com LABEL" End Sub Private Sub Timer1_Timer() Label1.Left = Label1.Left - 100 If Label1.Left < -Label1.Width + 10 Then Label1.Left = Me.Width + 100 End Sub

williamdsilva@aol.com.br

148

325 - Qual o ltimo dia do ms X e ano Y?? Enviado por: Carlos Peixoto Option Explicit Dim data As Date Function Ultimo_Dia(mes As String) As Integer For Ultimo_Dia = 31 To 28 Step -1 If IsDate(Ultimo_Dia & "/" & mes & "/" & Year(Date)) Then Exit For End If Next Me.Caption = Ultimo_Dia & "/" & Format$(data, "mm/yyyy") End Function Private Sub Form_Click() data = Text1.Text Ultimo_Dia (Format$(data, "mm")) End Sub

326 - Pegar WinDir em uma linha!! Enviado por: Carlos Peixoto Bem, muito simples: Msgbox Environ("windir") Pronto!!! 327 - Atualizar Tabelas do DBase para o Access via VB Enviado por: Cesar Villela - Curitiba/PR Dim dbAccess As New ADODB.Connection Dim dbDbase As New ADODB.Connection Dim TabelaAccess As New ADODB.Recordset Dim TabelaDBase As New ADODB.Recordset dbAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;Persist Security Info=false" dbDBase.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Arquivos do dBASE;Initial Catalog=" dbAccess.CursorLocation = adUseServer dbDBase.CursorLocation = adUseClient Screen.MousePointer = vbHourglass TabelaAccess.Open "", dbAccess, adOpenKeyset, adLockOptimistic TabelaDBase.Open "", dbBase, adOpenKeyset, adLockOptimistic While Not TabelaAccess.EOF TabelaAccess.AddNew 'Repetir para cada campo a atualizar... TabelaAccess.Fields("").Value = TabelaDBase.Fields("").Value TabelaDBase.MoveNext Wend Screen.MousePointer = vbDefault MsgBox "Atualizao da tabela FATURA1.DBF, foi concluda com xito!", vbInformation, "Concluso" Observao: As tabelas tem q ter a mesma estrutura de dados. 328 - Correo em "Correo dos tens "Validando CPF" " Enviado por: Charles Dayan Quando o nmero 11111111111 colocado para ser testado na funo de validao de CPF esta diz que este um nmero vlido. Coloque um teste antes de envia-lo: Sub Command1_Click() If Not (Text1.Text = "11111111111") Then resp = Calc_CPF(Text1.Text) Else Label1.Caption = "Valor no aceito!" GoTo 200 End If If resp Then Label1.Caption = "Vlido" Else

williamdsilva@aol.com.br

149

Label1.Caption = "Invlido" End If End Sub

329 - Inconsistencia no caminho da AJUDA Enviado por: Christian Chagas Se sua ajuda for colocada na configurao do progeto, "Menu project", ela no ser achada depois da instalao, para evitar isso use o seguinte: App.HelpFile = App.Path & "Ajuda\Ajuda.hlp" Onde Ajuda um diretrio dentro do diretrio do seu projeto, e Ajuda.hlp o nome da sua ajuda. 330 - Substituindo o IF Enviado por: Claudio Ao invs de voce usar: Private Sub Command1_Click() Dim humano As String humano = Text1.Text If humano = "masculino" Then MsgBox ("Sexo Masculino") Else If humano = "feminino" Then MsgBox ("Sexo Feminino") Else If humano = "menino" Or humano = "menina" Then MsgBox ("Crianas") Else MsgBox ("Humano Invalido") End If End If End If End Sub Use: Private Sub Command1_Click() Dim humano As String humano = Text1.Text Select Case humano Case "masculino" MsgBox ("Sexo Masculino") Case "Feminino" MsgBox ("Sexo Feminino") Case "menino" MsgBox ("Criancas") Case "menina" MsgBox ("Criancas") Case Else MsgBox ("Humano Invlido") End Select End Sub

331 - Acesso ao Oracle Enviado por: Edi Carlos L. Ortega Em um mdulo declare as seguintes variveis globais: Global strCn As String Global strUser As String Global strPass As String Global strDSN As String Global strCrystal As String strCn = "ODBC;DSN=ORACLE;UID=" & txtUser.Text & ";PWD=" & txtPassword.Text & ";ConnectString=" & txtDatabase.Text strUser = txtUser.Text strDSN = txtDatabase.Text strPass = txtPassword.Text strCrystal = "DSN=" & strDSN & ";UID=" & strPass & ";PWD=" & strPass & ";DSQ=" Crie um formulrio com os campos:

williamdsilva@aol.com.br

150

txtUser: para Nome de Usurio txtDatabase para Nome do Banco txtPassword para Senha do Usurio Pronto o VB ir conectar-se ao banco digitado pelo usurio. 332 - Identificao das mensagens do Oracle Enviado por: Edi Carlos L. Ortega Coloque em um mdulo a seguinte funo: Dim cX As String, nX As Integer For nX = Errors.Count - 1 To 0 Step -1 cX = cX & CStr(Errors(nX).Number) & " " & Errors(nX).Description & vbNewLine Next nX MsgBox cX, vbCritical + vbOKOnly, "Sistema CB" Em seus formulrios adicione rotinas de depurao de errors que chamem esta funo e pronto o VB utilizar esta mensagem para identificar as mensagens do Oracle e tambm as mensagens do prprio VB. Qualquer dvida mandeme um email. 333 - SEEK Enviado por: FCCD Para construir um consulta rpida por campos nmericos faa o seguinte: Carrege sua base dados com Table e depois no load do formulrio carrege seu index e faa os comandos abaixos... Private sub Form_Load() Data1.Recordest.Index = "PrimaryKey" end Sub Private Sub Command1_Click() Dim Cod as Long Cod = InputBox("Digite o Cdigo") data1.Recordset.Seek "=", Cod if data1.recordest.NoMatch then msgbox "Cdigo no encontrado" end if end Sub

334 - Formulario de Senha Enviado por: Felipe Durante 'Vou precisar de 2 textbox e um commandButon no text2 altere a opo de PassowordChar para * command1_Click() 'Indica a condio para a senha ser aceita if text1.text="Visual" and text2.text="Basic" then MsgBox "Senha Aceita" form2.show else 'se a senha no for aceita msgBox"Senha Incorreta" end if end sub

335 - Varivel Null ou Vazio Enviado por: Gydian No VB uma varivel pode ser null ou "" (vazia). Para simplificar podesmos usar: if variavel & "" = "" then... em vez de if variavel = "" or variavel = null then... isto no altera o valor da varivel, apenas na comparao, "transforma" uma variavel null em "" (vazia) para fazer a comparao. 336 - Validao de datas ultra simples. Enviado por: Gydian

williamdsilva@aol.com.br

151

Variavel = IsDate(minha_data) Devolve True se uma data possivel. Devolve False se uma data impossivel. 337 - Trocar Botoes do Mouse Enviado por: Heliomar Pereira Marques dos Santos 'Declare esta API no Mdulo Declare Function SwapMouseButton& Lib _ "user32" (ByVal bSwap As Boolean) 'Dentro do Form voc apenas seta o valor FALSE ou TRUE para bSwap 'Exemplo Private Sub Command1_Click() SwapMouseButton& (True) End Sub Private Sub Command2_Click() SwapMouseButton& (False) End Sub

338 - Limpar todos os MaskEditBox do formulrio corrente Enviado por: Hugo Stobienia Wannmacher 'Limpa todos os MskEdBox do formulrio Public Sub pClearMaskEdBox() On Error Resume Next Dim intX As Integer For intX = 0 To Screen.ActiveForm.Count If TypeOf Screen.ActiveForm.Controls(intX) Is MaskEdBox Then Screen.ActiveForm.Controls(intX).Text = fStrConv(UCase(Screen.ActiveForm.Controls(intX).Mask), intX) End If Next End Sub Public Function fStrConv(MyNewMask As String, MyIndex As Integer) As String On Error Resume Next Dim intY As Integer Dim strChar As String For intY = 1 To Len(MyNewMask) If UCase(Mid(MyNewMask, intY, 1)) = "A" Or Mid(MyNewMask, intY, 1) = "9" Or Mid(MyNewMask, intY, 1) = "?" Or Mid(MyNewMask, intY, 1) = "#" Or UCase(Mid(MyNewMask, intY, 1)) = "C" Or Mid(MyNewMask, intY, 1) = "&" Then strChar = Screen.ActiveForm.Controls(MyIndex).PromptChar Else strChar = Mid(MyNewMask, intY, 1) End If fStrConv = fStrConv & strChar Next End Function

339 - Criar cone no Desktop da mquina, em tempo de SETUP... Enviado por: Joerbeth Visando uma maneira adequada, para criar esse cone, descobr uma muito fcil, em tempo de Setup do aplicativo... segue os passos: 1. Abrir o Setup.Vbp do \VB\SetupKit\Setup1, depois de aberto, selecionar o Form (frmBegin), nesse Form, na seo General, colocar a seguinte linha: Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String) As Long 2. No mesmo Form, tem um boto de comando chamado (cmdInstall), as seguintes linhas de cdigo j se encontram: Private Sub cmdInstall_Click() If IsValidDestDir(gstrDestDir) = True Then Unload Me DoEvents End If Voc ter que acrescentar, logo aps o End If, ms est pequena linha de

williamdsilva@aol.com.br

152

cdigo: fCreateShellLink "..\..\desktop", "NomeDoAtalho", "c:\Diretrio\ArquivoExecutvel.Exe", "" OBS.: Aps incluir as linhas no Setup1.Vbp, compilar o mesmo.... NOTA: em NomeDoAtalho, vc ter que colocar o nome que deseja que o atalho criado tenha. Em \Diretrio\ArquivoExecutvel.Exe, significa o caminho e o nome do arquivo .EXE.... exemplo: \Windows\Calc.Exe API: Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String) As Long Depois para criar um atalho no desktop use: fCreateShellLink "..\..\desktop", "texto do atalho", "c:\dir\programa.exe", "" OBS.: Esse s ter efeito, com o arquivo: STKIT432.dll Valeu ?!. Joerbeth S. Costa Copyright (c) 1996-2001 Visual Basic Brasi 340 - Coneco com o SQL Server 7.0 Enviado por: JOSE ROBERTO ARAUJO TEIXEIRA Para abrir uma coneco com o SQL Server x. 1) Adicionar no Projeto a referncia MICROSOFT REMOTE DATA OBJECT 2.0 OU POSTEIOR 2) Crie uma variavel global para a coneco 3) Adicione esta linha no seu FORM Set conLog = rdoEnvironments(0).OpenConnection(dsName:="", _ Prompt:=rdDriverNoPrompt, _ Connect:="uid=USUARIO;pwd=SENHA;driver={SQL Server};" _ & "server=Nome do seu Servidor ;database=Nome do banco;") Veja que a variavel criada global a conLog. Depois so criar as demais variveis para abertura de tabelas, inserts,updates,etc... ROBERTO TEIXEIRA. SAO LUIS-MA 341 - Como simular um texto sendo digitado em tempo de execuo em um label Enviado por: Leandro Gonalves (MoKe) Crie um Form..e nele ponha um label, um boto, e um timer...(valor default do Interval do Timer 100) Mude o nome do Boto para "MostrarMsg" Option Explicit Public Contar As Integer Public Mensagem As String Public TamanhoMsg As Integer Private Sub Form_Load() Timer1.Enabled = False End Sub Public Sub MostrarMsg_Click() Contar = 0 Timer1.Enabled = True Mensagem = "Mensagem que voc quiser" TamanhoMsg = Len(Mensagem) Call Timer1_Timer End Sub Private Sub Timer1_Timer() If Contar < TamanhoMsg Then Contar = Contar + 1 Label1.Caption = Mid(Mensagem, 1, Contar) End If End Sub

342 - Maneira facil de Criptografar senhas em seu Programa Enviado por: Leandro Navega de Faria Marcando a caixinha TxtBox1, ou seja, onde devera ser digitado a senha e mudar a propriedade PasswordChar para * ou outra letra/sinal que devera aparecer no lugar da senha. 343 - Arquivos somente leitura ... Enviado por: Marcelo

williamdsilva@aol.com.br

153

Antes de acessar um arquivo para alteraes ou para remov-lo, utilize o comando: SetAttr App.Path & "\BANCO.MDB", vbNormal ' retorna o atributo de arquivo Pois se acidentalmente o usurio leigo alterar a propriedade do arquivo, por exemplo para ARQUIVO SOMENTE LEITURA, ocasionar um erro de execuo no programa. 344 - Gravar um BMP em um campo Image do SQL usando RDO Enviado por: Marcelo Nagy Aqui vai a rotina: Dim cn As New rdoConnection Dim qy As rdoResultset Private Sub Command1_Click() ChunkSize = 16384 login = "usuario" pass = "senha" Timeout = 15 cn.CursorDriver = rdUseOdbc banco = "BANCO" Conexao = "uid=" & login & ";pwd=" & pass & ";DSN=" & banco & ";driver={SQL Server}" cn.Connect = Conexao cn.QueryTimeout = Timeout cn.LoginTimeout = Timeout ' On Error GoTo erro cn.Close cn.EstablishConnection rdDriverNoPrompt, False Sus = True sconectou = True Set qy = cn.OpenResultset("Select tabela_cod,tabela_img from BANCO..tabela ", rdOpenKeyset, 4, rdExecDirect) qy.AddNew qy(0) = 2 ' rotina de gravao de imagem no campo tabela_img DataFile = 2 Dim Chunk() As Byte Open "c:\imagem\teste.BMP" For Binary Access Read As DataFile Fl = LOF(DataFile) If Fl = 0 Then Close DataFile Screen.MousePointer = vbDefault Exit Sub End If Chunks = Fl \ ChunkSize Fragment = Fl Mod ChunkSize qy(1).AppendChunk Null ReDim Chunk(Fragment) Get DataFile, , Chunk() qy(1).AppendChunk Chunk() ReDim Chunk(ChunkSize) For i = 1 To Chunks Get DataFile, , Chunk() qy(1).AppendChunk Chunk() Next i Close DataFile qy.Update End Sub BACANA !!! 345 - Filtrando Datas no Crystal Enviado por: Marcelo Nagy Para imprimir registros que satisfaam uma determinada condio, usamos a seguinte codificao: relatorio.SelectionFormula = "{tabela.nome} = Marcelo Nagy'" relatorio.Action = 1 O problema, que este esquema s funciona para dados do tipo string e na hora de tentar fazer isto com uma data, erro de frmula com certeza. Ento use da seguinte maneira, por exemplo para mostrar registros a partir de 13/12/1975: relatorio.SelectionFormula = "{tabela.data} >= Date(1975,12,13)" relatorio.Action = 1 isso a !!!!!

williamdsilva@aol.com.br
346 - Enviando um email pelo Outlook. Enviado por: Marcelo Nagy

154

Primeiro, selecione o componente MICROSOFT MAPI CONTROLS. Depois acrecente no seu form o objeto MAPISESSION e MAPIMESSAGES que apareceram na sua toolbox. Ento use a seguinte codificao para enviar uma mensagem: mapisession.Action = 1 mapimessages1.SessionID = mapisession.SessionID mapimessages1.Compose mapimessages1.RecipAddress = "fulano@provedor.com.br" mapimessages1.AddressResolveUI = True mapimessages1.ResolveName mapimessages1.MsgSubject = "Titulo da minha mensagem" mapimessages1.MsgNoteText = "contedo da minha mensagem, blablablablabla... " mapimessages1.Send False BACANA !!!! 347 - API para LOGOFF, REBOOT, DESLIGAR o Computador Enviado por: Marcelo Zeri 'API para LOGOFF, REBOOT, DESLIGAR o Computador 'Abra 1 novo projeto, adicione 1 label1, 1 text1, 1 command1 e 1 mdulo .bas 'Cdigo para o mdulo .bas Option Explicit Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Public Const EWX_SHUTDOWN = 1 Public Const EWX_REBOOT = 2 Public Const EWX_LOGOFF = 0 'Cdigo para o form Option Explicit Private Sub Command1_Click() Dim Variav Select Case Text1 Case "0" If MsgBox("Deseja fazer Logoff agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes Then Variav = ExitWindowsEx(EWX_LOGOFF, 0) End If Case "1" If MsgBox("Deseja desligar o Computador agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes Then Variav = ExitWindowsEx(EWX_SHUTDOWN, 1) End If Case "2" If MsgBox("Deseja reiniciar o Windows agora?", vbExclamation + vbSystemModal + vbYesNo) = vbYes Then Variav = ExitWindowsEx(EWX_REBOOT, 2) End If Case Else MsgBox Label1 Exit Sub End Select End Sub Private Sub Form_Load() Text1 = "" Label1.Left = Me.Width * 0.1 Label1.Width = Me.Width * 0.8 Label1.Height = 400 Label1 = "Digite na caixa texto: 0 para logoff, 1 para desligar o Computador, 2 para reiniciar o Windows" End Sub

348 - Delimitar o tamanho mmino e mximo de um form Enviado por: Marcelo Zeri 'CDIGO PARA DELIMITAR O TAMANHO MXIMO E MNIMO DE UM FORMULRIO 'cdigo para o mdulo .bas Option Explicit Public OldWindowProc As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As

williamdsilva@aol.com.br

155

Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const WM_GETMINMAXINFO = &H24 Type POINTAPI x As Long y As Long End Type Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long If Msg = WM_GETMINMAXINFO Then Dim MinMax As MINMAXINFO CopyMemory MinMax, ByVal lp, Len(MinMax) ' Altere estes valores para aumentar ou diminuir o tamanho mnimo MinMax.ptMinTrackSize.x = 4800 \ Screen.TwipsPerPixelX MinMax.ptMinTrackSize.y = 3000 \ Screen.TwipsPerPixelY 'se quiser delimitar um tamanho mximo remova os 'apostrofes destas duas linhas abaixo: e altere a propriedade 'do formulrio: MaxButton = False ' MinMax.ptMaxTrackSize.x = Screen.Width \ Screen.TwipsPerPixelX \ 2 ' MinMax.ptMaxTrackSize.y = 3480 \ Screen.TwipsPerPixelY CopyMemory ByVal lp, MinMax, Len(MinMax) SubClass1_WndMessage = 1 Exit Function End If SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp) End Function 'cdigo para o form 'O formulrio deve ter a propriedade 'BorderStyle = 2- Sizable Option Explicit Private Const GWL_WNDPROC = (-4) Private Sub Form_Load() OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage) Me.Width = 7000 Me.Height = 4000 Me.Caption = "Posicione o mouse num canto e resize o form!" 'para aumentar o limite do tamanho do form 'altere os valores do mdulo bas End Sub Private Sub Form_Unload(Cancel As Integer) 'importante: comando para remover o cdigo da memria Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc) End Sub

349 - Abrir automaticamente um Combo-box quando ele receber o foco: Enviado por: Marcelo Zeri Abra um novo projeto, insira um combo-box e cole o cdigo abaixo no form: Option Explicit Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Long) As Long Private Const CB_SHOWDROPDOWN = &H14F Private Sub Combo1_GotFocus() Dim lRet As Long lRet = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&) End Sub Private Sub Form_Load() Combo1.Clear Combo1.AddItem "111111" Combo1.AddItem "222222" Combo1.AddItem "333333" Combo1.AddItem "444444" Combo1.AddItem "555555"

williamdsilva@aol.com.br

156

Combo1.AddItem "666666" End Sub

350 - Alterando as Configuraes Regionais VIA VB Enviado por: Marcelo Zeri 'Abra um novo Projeto, adicione 1 mdulo bas, 2 botes de Comando, 1 text-box e 1 Label: 'Nomes padro: (Command1 e Command2, Text1, Label1) '============================== 'Declaraes para o mdulo .bas Option Explicit Declare Function GetLocaleInfo Lib "kernel32" Alias _ "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, _ ByVal lpLCData As String, ByVal cchData As Long) As Long Declare Function SetLocaleInfo Lib "kernel32" Alias _ "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, _ ByVal lpLCData As String) As Boolean Declare Function GetUserDefaultLCID% Lib "kernel32" () 'Constantes das Configuraes Regionais Public Const LOCALE_ICENTURY = &H24 Public Const LOCALE_ICOUNTRY = &H5 Public Const LOCALE_ICURRDIGITS = &H19 Public Const LOCALE_ICURRENCY = &H1B Public Const LOCALE_IDATE = &H21 Public Const LOCALE_IDAYLZERO = &H26 Public Const LOCALE_IDEFAULTCODEPAGE = &HB Public Const LOCALE_IDEFAULTCOUNTRY = &HA Public Const LOCALE_IDEFAULTLANGUAGE = &H9 Public Const LOCALE_IDIGITS = &H11 Public Const LOCALE_IINTLCURRDIGITS = &H1A Public Const LOCALE_ILANGUAGE = &H1 Public Const LOCALE_ILDATE = &H22 Public Const LOCALE_ILZERO = &H12 Public Const LOCALE_IMEASURE = &HD Public Const LOCALE_IMONLZERO = &H27 Public Const LOCALE_INEGCURR = &H1C Public Const LOCALE_INEGSEPBYSPACE = &H57 Public Const LOCALE_INEGSIGNPOSN = &H53 Public Const LOCALE_INEGSYMPRECEDES = &H56 Public Const LOCALE_IPOSSEPBYSPACE = &H55 Public Const LOCALE_IPOSSIGNPOSN = &H52 Public Const LOCALE_IPOSSYMPRECEDES = &H54 Public Const LOCALE_ITIME = &H23 Public Const LOCALE_ITLZERO = &H25 Public Const LOCALE_NOUSEROVERRIDE = &H80000000 Public Const LOCALE_S1159 = &H28 Public Const LOCALE_S2359 = &H29 Public Const LOCALE_SABBREVCTRYNAME = &H7 Public Const LOCALE_SABBREVDAYNAME1 = &H31 Public Const LOCALE_SABBREVDAYNAME2 = &H32 Public Const LOCALE_SABBREVDAYNAME3 = &H33 Public Const LOCALE_SABBREVDAYNAME4 = &H34 Public Const LOCALE_SABBREVDAYNAME5 = &H35 Public Const LOCALE_SABBREVDAYNAME6 = &H36 Public Const LOCALE_SABBREVDAYNAME7 = &H37 Public Const LOCALE_SABBREVLANGNAME = &H3 Public Const LOCALE_SABBREVMONTHNAME1 = &H44 Public Const LOCALE_SCOUNTRY = &H6 Public Const LOCALE_SCURRENCY = &H14 Public Const LOCALE_SDATE = &H1D Public Const LOCALE_SDAYNAME1 = &H2A Public Const LOCALE_SDAYNAME2 = &H2B Public Const LOCALE_SDAYNAME3 = &H2C Public Const LOCALE_SDAYNAME4 = &H2D Public Const LOCALE_SDAYNAME5 = &H2E Public Const LOCALE_SDAYNAME6 = &H2F Public Const LOCALE_SDAYNAME7 = &H30 Public Const LOCALE_SDECIMAL = &HE Public Const LOCALE_SENGCOUNTRY = &H1002 Public Const LOCALE_SENGLANGUAGE = &H1001 Public Const LOCALE_SGROUPING = &H10

williamdsilva@aol.com.br

157

Public Const LOCALE_SINTLSYMBOL = &H15 Public Const LOCALE_SLANGUAGE = &H2 Public Const LOCALE_SLIST = &HC Public Const LOCALE_SLONGDATE = &H20 Public Const LOCALE_SMONDECIMALSEP = &H16 Public Const LOCALE_SMONGROUPING = &H18 Public Const LOCALE_SMONTHNAME1 = &H38 Public Const LOCALE_SMONTHNAME10 = &H41 Public Const LOCALE_SMONTHNAME11 = &H42 Public Const LOCALE_SMONTHNAME12 = &H43 Public Const LOCALE_SMONTHNAME2 = &H39 Public Const LOCALE_SMONTHNAME3 = &H3A Public Const LOCALE_SMONTHNAME4 = &H3B Public Const LOCALE_SMONTHNAME5 = &H3C Public Const LOCALE_SMONTHNAME6 = &H3D Public Const LOCALE_SMONTHNAME7 = &H3E Public Const LOCALE_SMONTHNAME8 = &H3F Public Const LOCALE_SMONTHNAME9 = &H40 Public Const LOCALE_SMONTHOUSANDSEP = &H17 Public Const LOCALE_SNATIVECTRYNAME = &H8 Public Const LOCALE_SNATIVEDIGITS = &H13 Public Const LOCALE_SNATIVELANGNAME = &H4 Public Const LOCALE_SNEGATIVESIGN = &H51 Public Const LOCALE_SPOSITIVESIGN = &H50 Public Const LOCALE_SSHORTDATE = &H1F Public Const LOCALE_STHOUSAND = &HF Public Const LOCALE_STIME = &H1E Public Const LOCALE_STIMEFORMAT = &H1003 '==================== 'Cdigo para o form Option Explicit ' Este um exemplo para o separador de Data ' MAS VOC PODER ALTERAR todas as outras Configuraes Regionais ' contantes no mdulo BAS, como Formato da Data, Hora etc Public Sub Get_locale() ' Buscando a configurao regional Dim Symbol As String Dim iRet1 As Long Dim iRet2 As Long Dim lpLCDataVar As String Dim Pos As Integer Dim Locale As Long Locale = GetUserDefaultLCID() 'LOCALE_SDATE a constante para separador de data 'para outro locale setting apenas troque a constante 'Funo para alterar o separador atual de data iRet1 = GetLocaleInfo(Locale, LOCALE_SDATE, _ lpLCDataVar, 0) Symbol = String$(iRet1, 0) iRet2 = GetLocaleInfo(Locale, LOCALE_SDATE, Symbol, iRet1) Pos = InStr(Symbol, Chr$(0)) If Pos > 0 Then Symbol = Left$(Symbol, Pos - 1) MsgBox "Separador atual = " + Symbol End If End Sub Public Sub Set_locale() 'Altera configuraes Regionais Dim Symbol As String Dim iRet As Long Dim Locale As Long On Error GoTo ErroTexto If Trim(Text1) = "" Then GoTo ErroTexto 'LOCALE_SDATE a constante para separador de data 'para outro locale setting apenas troque a constante 'Funo para alterar o separador de data Locale = GetUserDefaultLCID() 'Get user Locale ID Symbol = Text1 'Novo caracter para a configurao Regional 'digite um novo separador na caixa-texto iRet = SetLocaleInfo(Locale, LOCALE_SDATE, Symbol) Exit Sub ErroTexto: MsgBox "Digite um separador vlido" End Sub Private Sub Command1_Click() 'exibe a configurao Regional Atual Call Get_locale

williamdsilva@aol.com.br

158

End Sub Private Sub Command2_Click() 'altera configuraes Regionais Call Set_locale End Sub Private Sub Form_Load() ' Este um exemplo para o separador de Data ' MAS VOC PODER ALTERAR todas as outras Configuraes Regionais ' contantes no mdulo BAS, como Formato da Data, Hora etc Me.Caption = "Alterando as Configuraes Regionais ..." Command1.Caption = "Separador Atual" Command2.Caption = "Alterar Separador" Text1 = "" Label1 = "Digite o novo padro na Caixa Texto" End Sub

351 - Desabilitar X do form Enviado por: Marcelo Zeri Cdigo para desabilitar X no form 'Abra um novo Projeto e adicione um boto Command1. Altere a propriedade do form: Clip Controls para False 'Cdigo para o form: Private Sub Command1_Click() Unload Me End Sub Private Sub Form_Load() Call DisableClose(form1) End Sub 'Cdigo para o mdulo .bas Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd _ As Long, ByVal bRevert As Boolean) As Long Private Declare Function GetMenuItemCount Lib "user32" (ByVal _ hMenu As Long) As Long Private Declare Function RemoveMenu Lib "user32" (ByVal _ hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) _ As Long Private Declare Function DrawMenuBar Lib "user32" _ (ByVal hwnd As Long) As Long Private Const MF_BYPOSITION = &H400& Private Const MF_REMOVE = &H1000& Public Sub DisableClose(frm As Form, Optional _ Disable As Boolean = True) 'Setting Disable to False disables the 'X', 'otherwise, it's reset Dim hMenu As Long Dim nCount As Long If Disable Then hMenu = GetSystemMenu(frm.hwnd, False) nCount = GetMenuItemCount(hMenu) Call RemoveMenu(hMenu, nCount - 1, MF_REMOVE Or _ MF_BYPOSITION) Call RemoveMenu(hMenu, nCount - 2, MF_REMOVE Or _ MF_BYPOSITION) DrawMenuBar frm.hwnd Else GetSystemMenu frm.hwnd, True DrawMenuBar frm.hwnd End If End Sub

352 - Fazer uma caixa de texto ler somente nmeros Enviado por: Osmilto X. Rebouas Private Sub Text2_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 48 To 57 Case 8 Case 13 Case Else KeyAscii = 0

williamdsilva@aol.com.br

159

Beep End Select If KeyAscii = 46 Then KeyAscii = 8 KeyAscii = 44 End If End Sub

353 - Funo para retornar o Nmero de dias do Mes de uma data (Simples e precisa) Enviado por: Paulo Cesar Ferreira Function nDiaMes(dData) As Integer nDiaMes = 32 - Day(CDate("01/" & Month(dData) _ & "/" & Year(dData)) + 31) End Function

354 - Gerar relatrios por intervalo de datas no Crystal usando VB Enviado por: Roberto Lus Ghisleni Para gerar um relatrio por intervalo de datas coloque o seguinte cdigo: Private Sub cmdImprimir_Click() Dim lFormula As String 'Captura data inicial lFormula = "({tabela.campo_data_Inicial} >= DATE(" & Mid$(mkeDT_Inicial, 7, 4) & _ "," & Mid$(mkeDT_Inicial, 4, 2) & _ "," & Mid$(mkeDT_Inicial, 1, 2) & "))" 'Captura data final lFormula = lFormula & " AND ({tabela.campo_data_Final} <= DATE(" & Mid$(mkeDT_Final, 7, 4) & _ "," & Mid$(mkeDT_Final, 4, 2) & _ "," & Mid$(mkeDT_Final, 1, 2) & "))" 'para visualizar a formula msgbox lformula CrystalReport1.ReportFileName = App.Path & "\Nome.rpt" CrystalReport1.SelectionFormula = lformula CrystalReport1.DiscardSavedData = True CrystalReport1.Action = 1 End Sub 'Ex.: 'tabela.campo_data_inicia = Clientes.DataCadastro 'tabela.campo_data_final = Clientes.DataExclusao Para que o relatrio funcione basta cria-lo no crystal e inserir este cdigo, e o crystal vai listar s o que estiver entre este intervalo de datas. Espero que Ajude!!!! 355 - Como mover um valor numrico de uma TextBox para um reltorio Crystal Reports, formatando casas decimais Enviado por: Roberto Lus Ghisleni Para mover um valor digitado em uma textbox com a formatao correta de casas decimais(ex.: 1.103,45) para um relatorio do crystal, insira o seguinte cdigo: Private Sub cmdImprimir_Click() Dim lpos As Integer 'Formula de Valor lpos = InStr(txtValor.Text, ",") If lpos > 0 Then CrystalReports1.Formulas(0) = "Valor = " & Left$(txtvalor.Text, lpos - 1) & "." & Mid$(txtValor.Text, lpos + 1) Else CrystalReports1.Formulas(0) = "Valor = " & txtValor.Text End If End Sub

obs.: Para que este cdigo funcione vc dever inserir em seu relatrio Cristal uma formula com o mesmo nome que estiver definida no VB(ex.: Formula "Valor"), para ai sim mover valores para ela. Espero ter ajudado!! 356 - Como concatenar informaes pelo VB em um relatrio no Crystal Enviado por: Roberto Lus Ghisleni

williamdsilva@aol.com.br

160

Para concatenar campos de tabelas(Arquivo) ou valores de uma TextBox pelo VB em um relatorio do crystal insira o seguinte cdigo: 'Usando campos de uma determinada Tabela Private Sub cmdImprimir_Click() 'Formula para Descricao concatenada CrystalReports1.Formulas(0) = "Descricao = {Tabela.Campo} + {Tabela2.Campo2}" CrystalReports1.DiscardSavedData = True CrystalReports1.Action = 1 End Sub 'Tabela.Campo = Clientes.Codigo 'Tabela2.Campo2 = Fornecedor.Codigo 'Usando valores de TextBox Private Sub cmdImprimir_Click() 'Formula para Descricao concatenada CrystalReports1.Formulas(0) = "Descricao = " & textbox1.text & "+" & textbox2.text CrystalReports1.DiscardSavedData = True CrystalReports1.Action = 1 End Sub 'Nome 'textbox1.text = Roberto 'Sobrenome 'textbox2.text = Lus Ghisleni obs.: Para que este codigo funcione vc dever inserir em seu relatrio Cristal uma formula com o mesmo nome que estiver definida no VB(ex.: Formula "Descricao"), para ai sim mover algo para ela. 357 - Como mover uma data informada em um MaskEdit para um relatrio no Crystal usando cdigo VB Enviado por: Roberto Lus Ghisleni Para mover uma data digitada em um MaskEdit para um relatorio do crystal insira o seguinte cdigo: Private Sub cmdImprimir_Click() 'Formula Data Inicial CrystalReports1.Formulas(0) = "Data = Date ( " & Mid$(MaskEdit1, 7, 4) & _ "," & Mid$(MaskEdit1, 4, 2) & "," & Mid$(MaskEdit1, 1, 2) & ")" CrystalReports1.DiscardSavedData = True CrystalReports1.Action = 1 End Sub obs.: Para que este codigo funcione vc dever inserir em seu relatrio Cristal uma formula com o mesmo nome que estiver definida no VB(ex.: Formula "Data"), para ai sim mover algo para ela. 358 - Formulrios Enviado por: Rogrio Adriano de Morais - Clark Quando se trabalha com formulrios no Visual Basic, em projetos MDI principalmente, deve-se tomar cuidado para no deix-lo na memria aps us-lo. O sintoma deste erro de programao o programa no finalizar aps ter clicado no boto FECHAR, e ser necessrio clicar no boto END para concluir sua finalizao. Para avitar isso, use sempre o mtodo UNLOAD aps usar qualquer utilizao de um formulrio, mesmo que ele no seja exibido no video. Veja: Private Sub Command1_Click() Dim vTexto as String vTexto = Form1.Text1.Text End Sub No cdigo acima, mesmo que no foi usado o mtodo LOAD, o formulrio FORM1 foi carregado para que o objeto TEXT1 possa ser usado. Repare que no foi usado o mtodo UNLOAD, de forma que, o formulrio continuar na memria mesmo que o procedimento (SUB) seja finalizado (END SUB). Veja o cdigo correto abaixo: Private Sub Command1_Click() Dim vTexto as String vTexto = Form1.Text1.Text Unload Form1 End Sub lgico que isso somente um exemplo, a momentos em que vantajoso o formulrio continuar na memria porque poder ser usado posteriormente. Abraos, Clark 359 - Convertendo n para binrio Enviado por: Ronie Rodrigues Dias Para converter um n inteiro para Binrio coloque o seguinte cdigo em um command Button: Dim resp, bin, n, dec As Double 'Declara variveis

williamdsilva@aol.com.br

161

dec = Text1 resp = Int(Text1) Text1 = "" While resp <> 0 resp = Int(dec / 2) If resp * 2 = dec Then bin = 0 Else bin = 1 End If Text1 = Text1 & bin dec = resp Wend For n = Len(Text1) To 1 Step -1 Text1.Text = Text1 & Mid(Text1, n, 1) Next n

360 - ACESSO SQL-SERVER ATRAVES DO OLEDB Enviado por: SAMUEL BADY HELOU FILHO 1-FAZ REFERENCIA AO MICROSSOFT ADO 2.0 LIBRARY E AO DATA BINDING COLLECTION 2-DECLARE DB AS NEW ADODB.CONECTION E RS AS NEW ADODB.RECONDSET 3-DB.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=SA;Initial Catalog=" & NOME DO BANCO & ";Data Source=" & SERVIDOR DB.ConnectionTimeout = 10 DB.Open ABRE O BANCO 361 - Senha Enviado por: Thiago MuNhz Crie um Text e um commandbutton, no commandbutton digite: if text1.text = "Senha desejada" then form2.show else msg box "Senha Incorreta digite novamente" end if qualquer duvida envie e-mail para T_Munhoz@zipmail.com.br 362 - Formulrio OnTop com apenas 1 linha de cdigo Enviado por: Thomas Gonzalez Miranda Voc muitas vezes j viu exemplos de formulrios OnTop, mas... Eles puxam mdulas e mais mdulos. Para isso fiz esta funo. Sigam os passos: Crie duas formulrios. Ex: Form 1 e Form2, agora insira um boto no formulrio. clique duas vezes no boto e insira este cdigo Form2.Show , Me Pronto. O form2 sempre ficar sobre o form1. ATENO: Esta funo no cria um formulrio Ontop para todas as janelas e sim s para o programa aberto. Qualquer dvida me enviem um e-mail. ;-D 363 - Impossibilitando o clique no formulrio de trs Enviado por: Thomas Gonzalez Miranda Voc, muitas vezes j deve ter tentado fazer com que o formulrio que se abre sem ficasse sobre o formulrio abaixo. Pronto! Conseguiu, mas e agora eu clico no Form1, e o Form2, some. :-( Descobri a soluo para isso. Crie dois formulrios. Ex: Form1 e Form2, depois insira um boto no form1. Clique duas vezes no boto e insira este cdigo.

williamdsilva@aol.com.br

162

form1.enabled = false pronto!

364 - Abrir URL no Navegador padro apenas com 3 linhas de cdigo Enviado por: Thomas Gonzalez Miranda
Muitas pessoas querem um jeito simples de fazer abrir o cdigo de uma caixa de texto ou url em um browser padro do usurio. Quer saber como? Simples. Siga os passoas abaixo: Na guia General declare estas funes:
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 Const SW_SHOW = 5

Depois disso insira 2 caixas de texto em seu formulrio. Na 1: Coloque na propriedade TEXT. O caminho onde est o arquivo abrir. Ex: C:\Pagina.html Na 2: Deixei em branco para o usurio digitar cdigos HTML ou simplesmente um endereo abrir Agora que fez isso. Insira um boto e clique nele duas vezes e insira este cdigo
ShellExecute hwnd, "open", Nome_da_1Caixa.Text, vbNullString, vbNullString, SW_SHOW

PRONTO, s isso qualquer dvida me envie um e-mail. Okz? ;-D


365 - Como dar uma pausa no programa sem utilizar Timer Enviado por: Wagner Lasdowsky 'codigo para dar pausa no programa utilizando API GettickCount 'declarando API Public Declare Function GetTickCount Lib "kernel32" () As Long Public Sub Pausa(ByVal Segundos As Integer) 'igual a inkey() do clipper - wagner Dim xtempo As Long Dim xInicio As Long Dim xfinal As Long xtempo = 1000 * Segundos xfinal = 0 xInicio = GetTickCount() 'retorna valor em milesimos While (xfinal - xInicio < xtempo) xfinal = GetTickCount() Wend End Sub

366 - Soma horas mais facilmente Enviado por: Washington Coutinho Corra Junior 'Guarda os dados do Primeiro Horrio hora1 = 14 minuto1 = 34 segundo1 = 25 'Guarda os dados do Segundo Horrio hora2 = 2 minuto2 = 23 segundo2 = 34 'Coloca os dados do Primeiro horrio em horario_1 horario_1 = TimeSerial(hora1, minuto1, segundo1) 'Coloca os dados do Primeiro horrio em horario_2 horario_2 = TimeSerial(hora2, minuto2, segundo2) 'Mostra a soma deles MsgBox horario_1 + horario_2

367 - Mscara de data no TextBox

williamdsilva@aol.com.br
Enviado por: Beraldo Lopes Figueiredo

163

Evita todo o problema causado pelo famigerado MASKEDBOX Private Sub Text1_Change() If Len(Text1) = 2 Then Text1 = Text1 + "/" Text1.SelStart = 4 End If If Len(Text1) = 5 Then Text1 = Text1 + "/" Text1.SelStart = 7 End If End Sub Espero que tenha utilidade 368 - Verificando se o Campo Alfanumrico Enviado por: Cicero Public Function IsAlfaNumeric(VALOR) dim cont as variant dim verificacao as variant dim soma as variant cont = "soma" For i = 1 To Len(VALOR) verificacao = Mid$(VALOR, i, 1) If IsNumeric(verificacao) Then cont = soma & verificacao soma = cont Else End If Next i If IsNumeric(cont) Then VALOR = True Else VALOR = False End If IsAlfaNumeric = VALOR End Function

369 - Utilizao de caracteres do Idioma Japons no Visual Basic 6 Enviado por: Cleuber Ricardo Orsi So poucos os programadores que passam pela situao de ter que desenvolver aplicativos que "entendam " em suas caixas de texto os caracteres peculiares da lingua japonesa ou mesmo de outras linguas, como o Chins ou o Turco. Porm quando um desenvolvedor tem um problema como esse muito mais difcil ainda encontrar solues para essa condio. Por isso estou enviando essa dica de trabalho, pois passei por vrias dificuldades e espero conseguir ajudar os colegas. - Primeiro ponto importante, saber como o Windows faz a leitura dos caracteres em japons. Isso possvel graas a um dispositivo chamado IME, que converte para caracteres em japons grupos de consoantes e vogais digitados, atravs de um teclado comum, como nosso ocidental. Esse dispositivo instalado automaticamente com o Windows em Japons ou em outro idioma que use caracteres prprios. Esse tipo de recurso ser mais conhecido com a difuso do Windows 2000. - O Segundo ponto consiste na instalao do Visual Basic, que deve ser feita numa mquina com o Windows no idioma que se deseja trabalhar. Isso se faz necessrio uma vez que o Programa de Instalao do VB verificar se o Windows instalado na mquina usa o IME ele automaticamente atribuir uma propriedade chamada IMEMODE a suas caixas de texto, oque possibilitar a insero e leitura desses caracteres pelo controle TEXTBOX. (Essa propriedade somente disponibilizada neste tipo de situao.) Depois desses cuidados o programador dever observar o valor da propriedade IMEMODE que por padro 0 ( No Operation) e deve ser alterada para 1 (ON) assim o IME poder agir sobre o controle TEXTBOX. Outra alterao deve

williamdsilva@aol.com.br

164

ser feita na fonte da caixa de texto. Alguns tipos de fontes aceitam caracteres em japons, outras no. Uma boa fonte a MS UI Gothic, isso vale tambm para fontes de relatrio, como o Crystall por exemplo. Agora se voc usa Banco de Dados em seus aplicativos pode ter problemas, mas no caso do ACCESS eu aconselho criar a Base de Dados atravs do seu aplicativo, e utilizar a declarao dbLangGeneral na criao do Banco de Dados, para que esse aceite os caracteres em japons e os caracteres ocidentais. Obs. Esse procedimento valido para a Verso 6 do Visual Basic. 370 - Piscar um objeto Enviado por: Djair Junior Para piscar um objeto crie um timer com Interval de 500. Digite o comando abaixo dentro do timer: Me!Command1.Visible = True = Not Me!Command1.Visible = True 'Onde o objeto a piscar um boto com o name Command1.

371 - Como abrir um Banco de dados Enviado por: Mrcio Pulcinelli Dim DBNewOne as DataBase Dim rs as RecordSet Set DBNewOne = DBEngine.Workspaces(0).OpenDataBase(app.path + "\banco_de_dados.mdb") Set rs = db.openRecordSet("Tabela")

372 - Abrir e Fechar o CD-ROM Enviado por: Rafael Konrath 'Declarar em um Modulo Declare Function mciSendString Lib "winmm.dll" Alias _ "mciSendStringA" (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As String, ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) As Long Private Sub Command1_Click() dim res as long, returnstring as string*127 res = mcisendstring("set CDAudio door open", returnstring, 127, 0) End Sub Private Sub Command2_Click() dim res as long, returnstring as string*127 res = mcisendstring("set CDAudio door closed", returnstring, 127, 0) End Sub

373 - Saber se existe placa de Som Enviado por: Rafael Konrath Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long Dim res As Integer res = waveOutGetNumDevs() If res > 0 Then msgbox "Existe tarjeta de sonido" Else msgbox "No existe tarjeta de sonido" End If

374 - Sabe quanto tempo o Windows esta funcionando Enviado por: Rafael Konrath

williamdsilva@aol.com.br
Rafael Konrath

165

'declare no modulo Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long 'Por exemplo : Private Sub Form_Load() Dim l As Long, horas As Integer, min As Integer l = GetTickCount() / 1000 horas = Int(l / 3600) l = l - (3600 * horas) min = Int(l / 60) l = l - (min * 60) MsgBox "Windows inicio ja faz " & horas & " horas, " & min & " minutos e " & l & " segundos" End Sub

375 - Crystal Reports: imprimindo em outra impressora que no seja a Padro. Enviado por: Adriano Faria Alves Para mandar o relatrio para outra impressora no Crystal Reports: With CrystalReport1 .ReportFileName = "C:\caminho\relatorio.rpt" .PrinterDriver = "Epson24" .PrinterPort = "LPT1" .PrinterName = "Epson - Matricial" .Action = 1 End With 376 - Funo que limpa todos os campos com propriedade TEXT e LIST BOX do form. Enviado por: Adriano Faria Alves Crie essa funo em mdulo BAS Public Function LimparCampos(frmForm As Form) Dim ctlControl As Object On Error Resume Next For Each ctlControl In frmForm.Controls ctlControl.Text = "" ctlControl.ListIndex = -1 ctlControl.Value = 0 DoEvents Next ctlControl End Function Para cham-la no seu form: ... tabela.update Call LimparCampos(Me) 377 - Verificando se CPF digitado vlido. Enviado por: Adriano Faria Alves Crie essa funo em Mdulo BAS Public Function CheckCPF(CPF As String) As Boolean Dim EVAR1 As Integer Dim evar2 As Integer Dim F As Integer If Len(Trim(CPF)) <> 11 Then CheckCPF = False Exit Function End If EVAR1 = 0 For F = 1 To 9 EVAR1 = EVAR1 + Val(Mid(CPF, F, 1)) * (11 - F) Next F evar2 = 11 - (EVAR1 - (Int(EVAR1 / 11) * 11)) If evar2 = 10 Or evar2 = 11 Then evar2 = 0

williamdsilva@aol.com.br
If evar2 <> Val(Mid(CPF, 10, 1)) Then CheckCPF = False Exit Function End If EVAR1 = 0 For F = 1 To 10 EVAR1 = EVAR1 + Val(Mid(CPF, F, 1)) * (12 - F) Next F evar2 = 11 - (EVAR1 - (Int(EVAR1 / 11) * 11)) If evar2 = 10 Or evar2 = 11 Then evar2 = 0 If evar2 <> Val(Mid(CPF, 11, 1)) Then CheckCPF = False Exit Function End If CheckCPF = True Para cham-la no form: Sub CPF_LostFocus() If CheckCPF(CPF.Text) = False Then MsgBox "CPF Invlido." CPF.SetFocus End IF

166

378 - Combo Box com data (primeiro ao ltimo dia do ms atual) Enviado por: Adriano Faria Alves Crie essa funo em um Mdulo BAS Public Function Preenche_ComboData(ComboDatas As Control) Dim i, DiaCorrente, MesCorrente, AnoCorrente, UltimoDia As Integer DiaCorrente = "01" MesCorrente = Month(Now) AnoCorrente = Year(Now) UltimoDia = Day(DateValue("01/" & Str(MesCorrente + 1) & "/" & Str(AnoCorrente)) - 1) If MesCorrente = 12 Then UltimoDia = Day(DateValue("31/" & "12/" & Str(AnoCorrente))) End If For i = DiaCorrente To UltimoDia ComboDatas.AddItem Format(i, "0#") & "/" & Format(Now, "mm") & "/" & Format(Now, "yyyy") Next End Function Para cham-la no form (LOAD): Call Preenche_ComboData(Combo1) 379 - Inicias Maisculas, com exceo de DE, DA, DOS, DAS, DI... Enviado por: Adriano Faria Alves Crie essa funo em um Mdulo BAS Public Function Maiuscula(Texto) Dim Palavra, Posicaoinicial, Posicaofinal Dim Resultado As String Posicaoinicial = 1 Texto = Texto & " " Do Until InStr(Posicaoinicial, Texto, " ") = 0 Posicaofinal = InStr(Posicaoinicial, Texto, " ") Palavra = Mid(Texto, Posicaoinicial, Posicaofinal - Posicaoinicial) Posicaoinicial = Posicaofinal + 1 If Palavra <> "de" And Palavra <> "di" And Palavra <> "e" And Palavra <> "da" And Palavra <> "das" And Palavra <> "do" And Palavra <> "dos" Then Palavra = UCase(Left(Palavra, 1)) & LCase(Mid(Palavra, 2)) End If

williamdsilva@aol.com.br

167

Resultado = Resultado & " " & Palavra Loop Maiuscula = Trim(Resultado) End Function Para cham-la em um form (LostFocus da Caixa de Texto) If Trim(Text1 <> "") Then Text1 = Maiuscula(Text1) End If 380 - Funo para validar datas digitadas. Enviado por: Adriano Faria Alves Crie essa funo em um Mdulo BAS Public Function ValidaData(DataInformada As String) As Boolean ValidaData = False If Not IsDate(DataInformada) Then Exit Function End If If Left(DataInformada, 2) < "01" Or Left(DataInformada, 2) > "31" Then Exit Function End If If Mid(DataInformada, 4, 2) < "01" Or Mid(DataInformada, 4, 2) > "12" Then Exit Function End If ValidaData = True End Function Para cham-la no seu form (lostfocus da caixa DATA1) If ValidaData(Data1) = False Then MsgBox "Data invlida.", vbCritical Data1.SetFocus End If 381 - Crystal Reports: imprimir perodo de datas (data inicial e data final) Enviado por: Adriano Faria Alves Esse cdigo utiliza 2 MaskEdBox e a funo VALIDADATA, tambm disponvel nas dicas desse Site. Sub Imprimir_Click() If mskDT1 <> "__/__/____" Then If Not ValidaData(mskDT1) Then MsgBox "Primeira data do perodo invlida", vbCritical, "Erro no Relatrio" Exit Sub End If If mskDT2 <> "__/__/____" Then If Not ValidaData(mskDT2) Then MsgBox "Segunda data do perodo invlida", vbCritical, "Erro no Relatrio" Exit Sub End If stringsql = stringsql & " and {tabela1.data}in date(" & Right(mskDT1, 4) & "," & Mid(mskDT1, 4, 2) & "," & Left(mskDT1, 2) & ") to date(" & Right(mskDT2, 4) & "," & Mid(mskDT2, 4, 2) & "," & Left(mskDT2, 2) & ")" Else stringsql = stringsql & " and {tabela1.data}=date(" & Right(mskDT1, 4) & "," & Mid(mskDT1, 4, 2) & "," & Left(mskDT1, 2) & ")" End If End If stringsql = Mid(stringsql, 5) CrystalReport1.ReportFileName = App.Path + "\Relatorio.rpt" CrystalReport1.SelectionFormula = stringsql

williamdsilva@aol.com.br
CrystalReport1.Destination = crptToWindow CrystalReport1.Action = 1 382 - Funo que verifica a existncia de um arquivo Enviado por: Adriano Faria Alves Crie essa funo em Mdulo BAS Public Function FileExist(FileName As String) As Boolean Dim TempAttr As Integer On Error GoTo ErrorFileExist TempAttr = GetAttr(FileName) FileExist = True GoTo ExitFileExist ErrorFileExist: FileExist = False Resume ExitFileExist ExitFileExist: On Error GoTo 0 End Function E no seu form, chame-a da seguinte forma:

168

If FileExist("C:\Caminho\Arquivo.mdb") = False Then MsgBox "Banco de Dados no encontrado.", vbCritical, App.Title & " - Erro Geral" End End If 383 - Abrir a listagem da Combo ao receber foco. Enviado por: Adriano Faria Alves Insira esse cdigo em um mdulo BAS Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Long) As Long Private Sub Combo1_GotFocus() Const CB_SHOWDROPDOWN As Long = &H14F Dim Tmp As Long Tmp = SendMessage(Combo1.hwnd,CB_SHOWDROPDOWN,1,ByVal 0&) End Sub 384 - Funo que abre um arquivo texto e retorna seu contedo Enviado por: Adriano Faria Alves Function AbreArquivo(sArquivo As String) As String Dim iARQ As Integer Dim sLinha As String Dim sResult As String iARQ = FreeFile Open sArquivo For Input As iARQ Do While Not EOF(iARQ) *Pega o contedo da linha Line Input #iARQ, sLinha *Quebra a linha e concatena (soma) o resultado sResult = sResult + Chr(13) & Chr(10) + sLinha Loop AbreArquivo = sResult Fecha o arquivo Close iARQ End Function Para usar: Text1.Text = AbreArquivo("C:\Texto.TXT")

williamdsilva@aol.com.br

169

385 - Verificando a Data/Hora da ltima Alterao de um Arquivo Enviado por: Adriano Faria Alves Crie essa funo em um Mdulo Bas Public Function DataArq(ByVal sArq As _ String) As String If Dir$(sArq) <> "" Then DataArq = FileDateTime(sArq) Else DataArq = "ERRO" End If End Function Para chamar no Form: Dim sVar As String sVar = DataArq("C:\SQL.log") If sVar <> "ERRO" Then Text1.Text = sVar End If 386 - Dias teis entre 2 datas. Enviado por: Adriano Faria Alves Function DiasUteis(dtInicio As Variant, dtFinal As Variant) As Integer Dim intSemanas As Integer Dim varDataCont As Variant Dim intFimDias As Integer dtInicio = DateValue(dtInicio) dtFinal = DateValue(dtFinal) intSemanas = DateDiff("w",dtInicio,dtFinal) varDataCont = DateAdd("ww",intSemanas,dtInicio) intFimDias = 0 Do While varDataCont < dtFinal If Format(varDataCont,"ddd") <> "Sun" And _ Format(varDataCont,"ddd") <> "Sat" Then intFimDias = intFimDias + 1 End If varDataCont = DateAdd("d", 1, varDataCont) Loop DiasUteis = intSemanas * 5 + intFimDias End Function 387 - Abrir e fechar a gaveta do CDROM Enviado por: Adriano Faria Alves Private Declare Function mciSendString Lib "winmm.dll" _ Alias "mciSendStringA" (ByVal lpstrCommand As _ String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback _ As Long) As Long PARA ABRIR Call mciSendString("Set CDAudio Door Open Wait", 0&, 0&, 0&) PARA FECHAR Call mciSendString("Set CDAudio Door Closed Wait", 0&, 0&, 0&) 388 - Removendo os Botes MIN-MAX de Forms MDI Enviado por: Adriano Faria Alves Coloque o seguinte cdigo num mdulo: Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As _

williamdsilva@aol.com.br
Long) As Long Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long) As Long Private Const WS_MINIMIZEBOX As Long = &H20000 Private Const WS_MAXIMIZEBOX As Long = &H10000 Private Const GWL_STYLE As Long = (-16) No evento MDIForm_Load do MDIForm: Sub MDIForm_Load() Dim lWnd as Long lWnd = GetWindowLong(Me.hWnd, GWL_STYLE) *Tira o boto de minimizar lWnd = lWnd And Not (WS_MINIMIZEBOX) *Tira o boto de maximizar lWnd = lWnd And Not (WS_MAXIMIZEBOX) lWnd = SetWindowLong(Me.hWnd, GWL_STYLE, lWnd) End Sub 389 - Animao com cones Enviado por: Adriano Faria Alves

170

Crie um novo projeto, coloque no Form uma ImageList, um PictureBox (ou ImageBox, pois esta no recebe foco), um Timer (com Interval = 100, pelo menos) e coloque as figuras da animao na ImageList. Ento, coloque o seguinte cdigo no Form: Dim iAnim As Integer Private Sub Form_Load() iAnim = 1 Call Timer1_Timer End Sub Private Sub Timer1_Timer() *Img1 a ImageBox e ImgLst1 a ImageList. Set Img1.Picture = ImgLst1.ListImages(iAnim).Picture iAnim = iAnim + 1 If iAnim > ImageList1.ListImages.Count Then iAnim = 1 End If End Sub 390 - Copiando Textos de Documentos do Word Enviado por: Adriano Faria Alves No evento desejado: Dim Word As Object Set Word = CreateObject("Word.Application") Abre o documento Word.Documents.Open "C:\Meus Documentos\" & "NomeDoDocumento.DOC" Seleciona o documento inteiro Word.Documents("NomeDoDocumento.DOC").Select Joga o contedo da seleo numa caixa de Texto. Text1.Text = Word.Selection.Text Pesquise o VBA, pois utilizando-o possvel selecionar palavras, pargrafos, tabelas, etc. Ou seja, qualquer parte do documento. 391 - Impedir que o programa aparea nos processos do windows Enviado por: Adriano Faria Alves 1 - Coloque para false a propriedade ShowInTaskbar do Form 2 - Em um mdulo declare: Public Declare Function ShowWindow Lib "user32" _ Alias "ShowWindow" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long

williamdsilva@aol.com.br
Public Const SW_HIDE As Long = 0 3 - No Form_Load adicione: Dim RetValue as Long RetValue = ShowWindow(Me.hWnd, SW_HIDE)

171

392 - Impedir que o programa seja encerrado com Ctrl Alt Del Enviado por: Adriano Faria Alves Declara o seguinte em um Mdulo: Public Declare Function GetCurrentProcessId Lib _ "kernel32" () As Long Public Declare Function GetCurrentProcess Lib _ "kernel32" () As Long Public Declare Function RegisterServiceProcess _ Lib "kernel32" (ByVal dwProcessID As Long, _ ByVal dwType As Long) As Long Public Const RSP_SIMPLE_SERVICE As Long = 1 Public Const RSP_UNREGISTER_SERVICE As Long = 0 Crie a seguinte Sub: Public Sub MakeMeService() Dim pid As Long Dim reserv As Long pid = GetCurrentProcessId() reserv = RegisterServiceProcess(pid,RSP_SIMPLE_SERVICE) End Sub Depois coloque o seguinte no FORM_LOAD: Private Form_Load() MakeMeService End Sub 393 - Rolando texto em uma Picture Box Enviado por: Adriano Faria Alves *Global do Form Public Function ShowMessage() Static MsgPtr As Integer Static MyText As String If Len(MyText) = 0 Then MsgPtr = 1 MyText = "Rolando texto numa Picture Box! " End If Picture1.Cls Picture1.Print Mid$(MyText, MsgPtr); MyText; MsgPtr = MsgPtr + 1 If MsgPtr > Len(MyText) Then MsgPtr = 1 End If End Function *Coloque um objeto Picture Box *Coloque um objeto Timer (Interval=100) Private Sub Timer1_Timer() ShowMessage End Sub 394 - Chamando telas especficas do Painel de Controle Enviado por: Adriano Faria Alves Para chamar qualquer tela do Painel de Controle no se usa necessariamente uma API, mas sim se executa o programa rundll32.exe. De acordo com os parmetros cada tela chamada. Veja as chamadas das principais telas:

williamdsilva@aol.com.br

172

Para chamar a tela principal do Painel de Controle Call Shell("rundll32.exe shell32.dll,Control_RunDLL", vbNormalFocus) Adicionar / Remover Programas Instalar/Desinstalar Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1", vbNormalFocus) Instalao do Windows Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2", vbNormalFocus) Disco de Inicializao Call Shell("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3", vbNormalFocus) Vdeo Segundo Plano Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0", vbNormalFocus) Proteo de Tela Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1", vbNormalFocus) Aparncia Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2", vbNormalFocus) Configurao Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3", vbNormalFocus) Configuraes Regionais Configuraes Regionais Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0", vbNormalFocus) Nmero Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1", vbNormalFocus) Moeda Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2", vbNormalFocus) Hora Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3", vbNormalFocus) Data Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4", vbNormalFocus) Joystick Call Shell("rundll32.exe shell32.dll,Control_RunDLL joy.cpl", vbNormalFocus) Mouse Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @0", vbNormalFocus) Teclado Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @1", vbNormalFocus) Impressoras Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @2", vbNormalFocus) Fontes Call Shell("rundll32.exe shell32.dll,Control_RunDLL main.cpl @3", vbNormalFocus) Mail e Fax Call Shell("rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl", vbNormalFocus) Multimdia Audio Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0", vbNormalFocus) Vdeo Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1", vbNormalFocus) MIDI Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2", vbNormalFocus) CD Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3", vbNormalFocus)

williamdsilva@aol.com.br

173

Avanado Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4", vbNormalFocus) Som Call Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1", vbNormalFocus) Modem Call Shell("rundll32.exe shell32.dll,Control_RunDLL modem.cpl", vbNormalFocus) Rede Call Shell("rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl", vbNormalFocus) Senha Call Shell("rundll32.exe shell32.dll,Control_RunDLL password.cpl", vbNormalFocus) Sistema Geral Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0", vbNormalFocus) Gerenciador de Dispositivos Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1", vbNormalFocus) Perfis de Hardware Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2", vbNormalFocus) Performance Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3", vbNormalFocus) Opes de Acessibilidade Teclado Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1", vbNormalFocus) Som Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2", vbNormalFocus) Exibir Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3", vbNormalFocus) Mouse Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4", vbNormalFocus) Geral Call Shell("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5", vbNormalFocus) Assistente (Adicionar novo Hardware) Call Shell("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1", vbNormalFocus) Data e Hora Call Shell("rundll32.exe shell32.dll,Control_RunDLL timedate.cpl", vbNormalFocus) DiskCopy Call Shell("rundll32 diskcopy.dll,DiskCopyRunDll", vbNormalFocus) 395 - Crystal Reports: imprimindo em outra impressora que no seja a Padro - Correo Enviado por: Adriano Faria Alves Na dica para mandar relatrio para a Impressora que no seja a Padro, faa a seguinte alterao: ... CrystalReport1.PrinterDriver = "Epson24.drv" ...

396 - Informar sobre a alterao de dados Enviado por: Esdras Pavan


Alvo: Verificar se os Text Boxs de um formulrio tiveram o seu contedo alterado Aplicao: Quando um usrio altera os dados de alguns campos e sai sem salvar as alteras foram perdidas, est funo verifica a alterao. Funo :

williamdsilva@aol.com.br
Function Changed(pJanela As Form) As Boolean

174

Dim vIndice As Integer For vIndice = 0 To pJanela.Controls.Count - 1 If TypeOf pJanela.Controls(vIndice) Is TextBox Or _ TypeOf pJanela.Controls(vIndice) Is ComboBox Then If pJanela.Controls(vIndice).DataChanged Then Changed = True Exit Function End If End If Next vIndice End Function Modo de usar: Private Sub Form_Unload(Cancel As Integer) If Changed(Me) Then If MsgBox("Foram feitas ateraes. Deseja sair sem salvar???", 32 + vbYesNo, "Pergunta") = vbNo Then Cancel = -1 End If End If End Sub

397 - Informar sobre a alterao de dados Enviado por: Esdras Pavan


Alvo: Verificar se os Text Boxs de um formulrio tiveram o seu contedo alterado Aplicao: Quando um usrio altera os dados de alguns campos e sai sem salvar as alteras foram perdidas, est funo verifica a alterao. Funo : Function Changed(pJanela As Form) As Boolean Dim vIndice As Integer For vIndice = 0 To pJanela.Controls.Count - 1 If TypeOf pJanela.Controls(vIndice) Is TextBox Or _ TypeOf pJanela.Controls(vIndice) Is ComboBox Then If pJanela.Controls(vIndice).DataChanged Then Changed = True Exit Function End If End If Next vIndice End Function Modo de usar: Private Sub Form_Unload(Cancel As Integer) If Changed(Me) Then If MsgBox("Foram feitas ateraes. Deseja sair sem salvar???", 32 + vbYesNo, "Pergunta") = vbNo Then Cancel = -1 End If End If End Sub PS.: Temos que tomar algumas atenes Criarmos no form uma varivel boleana Publica chamada Changed e a setarmos true ou false no momento correto. Ex:Toda vez que o boto salvar for acionado setar a variavel changed = true. 398 - Tabela de Meses Enviado por: Esdras Pavan Alvo: Retorna o nome do ms de acordo com o nmero passado na funo

williamdsilva@aol.com.br
Funo: Public Function TabMeses(pMes As Integer) As String Dim vetMeses vetMeses = Array("Janeiro", "Fevereiro","Maro", _ "Abril", "Maio","Junho", "Julho", _ "Agosto", "Setembro", "Outubro", _ "Novembro", "Dezembro") TabMeses = vetMeses(pMes - 1) End Function Modo de Usar: a linha - > TabMeses(Month(CDate("10/02/2000"))) retorna - > "Fevereiro"

175

399 - Outra forma de abrir um ComboBox ao receber o foco(mais simples) Enviado por: Joo Paulo Rezende No evento GotFocus do ComboBox coloque o seguinte cdigo: Private Sub Combo1_GotFocus() SendKeys "%{DOWN}" End Sub No evento load do Form coloque este cdigo: Private Sub Form_Load() Combo1.AddItem "Teste1" Combo1.AddItem "Teste2" Combo1.AddItem "Teste3" Combo1.AddItem "Teste4" End Sub 400 - Testar se a UF digitada est correta Enviado por: Luis Roberto Garcia Leandro Public Function TestaUF(UF As String) As Boolean If UF = "" Then Exit Function Dim UFpes As String UFpes = "ACALAMAPBACEDFESFNGOMAMGMSMTPAPBPEPIPRRNRJRSRORRSESCTOSP" Dim I, Q As Integer TestaUF = False: Q = 1 For I = 0 To 27 If UCase(UF) = Mid(UFpes, Q, 2) Then TestaUF = True: Exit For Q=Q+2 Next I End Function Modo de usar Private Sub TBUF_LostFocus() If TBUF = "" Then Exit Sub If TestaUF(TBUF) = False Then MsgBox "Unidade de federao incorreta !", 48, "Ateno !" TBUF = "" TBUF.SetFocus End If End Sub 401 - Testar se a UF digitada est correta 2 Enviado por: Carlos Peixoto Private Sub txtUF_LostFocus() Dim lEstados As String If txtUF > "" Then txtUF = UCase$(txtUF) lEstados = "AC-AL-AM-AP-BA-CE-DF-ES-GO-MA-MG-MS-MT-PA-PB-PE-" lEstados = lEstados & "PI-PR-RJ-RN-RO-RR-RS-SC-SE-SP-TO" If InStr(1, lEstados, txtUF) = 0 Then MsgBox "Estado invlido", vbExclamation, UCase(txtUF) txtUF.SetFocus End If End If End Sub 402 - Tornar maisculas as letras de TODOS os controles de um form

williamdsilva@aol.com.br
Enviado por: Roberto Alexandre Levy

176

Essa serve para aqueles que s querem adicionar em uma base de dados, informaes com apenas letras maisculas. Veja com fcil converter todos os controles com poucas linhas 403 - Tornar maisculas as letras de TODOS os controles de um form Enviado por: Roberto Alexandre Levy Essa serve para aqueles que s querem adicionar em uma base de dados, informaes com apenas letras maisculas. Veja com fcil converter todos os controles com poucas linhas. Coloque o seguinte cdigo em um mdulo: Sub Caixa_Alta(oForm As Form) Screen.MousePointer = vbHourglass Dim A As Integer For A = 1 To oForm.Controls.Count - 1 If TypeOf oForm.Controls(A) Is TextBox Then oForm.Controls(A).Text = UCase(oForm.Controls(A).Text) ElseIf TypeOf oForm.Controls(A) Is ComboBox Then oForm.Controls(A).Text = UCase(oForm.Controls(A).Text) End If Next A Screen.MousePointer = vbArrow End Sub Para cham-lo, digite: Caixa_Alta frmInsert Onde frmInsert o nome do form onde voc quer converter para maisculas. Um abrao! 404 - Funo genrica para alimentar uma Combo Box com dados de uma tabela Enviado por: Roberto Alexandre Levy Fato comum entre os sistemas corporativos a famosa combo box com dados de uma determinada tabela. Criei ess funo genrica para facilitar esse tramite. Veja como simples... Coloque o seguinte cdigo em um mdulo: Sub Gera_Combo(oCombo As Control, nTable As String) Screen.MousePointer = vbHourglass Dim SN As Recordset SQL = "SELECT * FROM " & nTable Set SN = DB.OpenRecordset(SQL, dbOpenSnapshot) SN.MoveFirst Do While Not SN.EOF oCombo.AddItem SN!Descr SN.MoveNext Loop Screen.MousePointer = vbArrow End Sub Perceba que a rotina recebe dois parmetros. O primeiro (oCombo) o nome do objeto (comboBox) e o segundo o nome da tabela de origem na base de dados. Um abrao! 405 - Parmetros Mltiplos para consultas em SQL Enviado por: Roberto Alexandre Levy AAA

williamdsilva@aol.com.br

177

406 - Verifique se sua aplicao j em uso na hora que inicia sua aplicao Enviado por: Alexandre Liondas Neto Para verificar se sua aplicao j est aberta na hora de iniciar seu programa faa o seguinte : No evento LOAD ou de seu formulrio principal digite : If App.PrevInstance Then MsgBox "A aplicao iniciada j est em uso.", vbCritical, "Negado" End End If 407 - Icones Enviado por: Henrique Rios Witzel Gostaria de saber sobre icones para uso nos programas de Visual Basic,Preciso icones de Advogado para eu colocar no programa. 408 - Verificando a impressora padro e o seu Drive Enviado por: William Costa Rodrigues Private Sub Form_Load() lbImpress.Caption = "Impressora Padro: " & Printer.DeviceName lbDrvImpress.Caption = "Nome do Drive: " & Printer.DriverName End Sub 409 - Clculo entre duas datas (resultado em anos, meses e dias) Enviado por: Adriano Faria Alves Use um boto de comando e 3 caixas de texto (Entrada, Hoje e Resultado) *** Crie a Funo no Form: Function CalculaTempo(Entrada As Date) If IsNull(Entrada) Or Entrada > Date Then MsgBox "Data de Entrada invlida.", vbCritical Exit Function End If Dim Anos, Meses, Dias Dim iAnos, iMeses, Intervalo As Double Intervalo = Date - Entrada ***Um ano tem exatamente 365,25 dias iAnos = Intervalo / 365.25 Anos = Int(iAnos) iMeses = (iAnos - Anos) * 12 Meses = Int(iMeses) Dias = DateDiff("d", DateSerial(DatePart("yyyy", Entrada) + Anos, DatePart("m", Entrada) + Meses, Day(Entrada)), Date) If Dias = 30 Then Dias = 0 Meses = Meses + 1 End If If Meses = 12 Then Meses = 0 Anos = Anos + 1 End If If Anos > 1 Then Anos = Anos & " anos " Else Anos = Anos & " ano " End If If Meses > 1 Then Meses = Meses & " meses " Else Meses = Meses & " ms " End If

williamdsilva@aol.com.br

178

If Dias > 1 Then Dias = Dias & " dias." Else Dias = Dias & " dia." End If CalculaTempo = Anos & Meses & Dias End Function *** Form Load Hoje.Text = Format(Now, "dd/mm/yyyy") *** Boto de Comando: Resultado.Text = CalculaTempo(Entrada) 410 - Parmetros Mltiplos para consultas em SQL - CORRIGIDO Enviado por: Roberto Alexandre Levy Essa funo gera um parametro para usar com a instruo LIKE do SQL, permitindo que o usurio possa escrever palavras compostas como critrio de busca. Function Cria_Parametro_Multiplo(cParam) Screen.MousePointer = vbHourglass Dim cNew As String cParam = Chr(42) & cParam & Chr(42) For A = 1 To Len(cParam) If Mid$(cParam, A, 1) = " " Then cNew = cNew & Chr(42) Else cNew = cNew & Mid(cParam, A, 1) End If Next A Cria_Parametro_Multiplo = cNew Screen.MousePointer = vbDefault End Function OBS: O Caracter 42 e um asterisco. No caso de outras bases, como ORACLE ou SQO Server, use o caracter 37, percentual! Dica: Use uma InputBox para buscar o valor criterio desejado pelo usuario. Qq dvidas, made um email! Um abrao 411 - Como dar uma pausa no programa sem usar um Timer Enviado por: Andr Quites O. Santos Me parece que o meio mais simples utilizando a funo Sleep da API do Windows. Alm de simples, a funo Sleep libera o Windows para atender a outras aplicaes enquanto em espera: Basta colocar no form a seguinte declarao: Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Se a declarao for feita em um mdulo, poder ser pblica. Feito a declarao s utilizar a funo, passando como argumento o tempo da pausa em milisegundos. Por exemplo, para uma pausa de 1,5 segundos, teramos: Sleep(1500) 412 - Como impossibilitar que o form seja fechado, MAS COM APENAS UM COMANDO!!! Enviado por: Roberto Alexandre Levy Nosso amigo Ricardo colocou uma forma de impedir o fechamento de um form. Mas temos uma forma bem mais simples, e com o mesmo efeito! Simplesmente coloque no evento QueryUnload o seguinte cdigo: Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

williamdsilva@aol.com.br
Cancel = 1 End Sub Tente fech-lo de alguma forma.... Um abrao 413 - Enviar E-mail Enviado por: carlos angelo fedrigo junior Dim TxtEmail as String TxtEmail = "caflib@bol.com.br" Shell "start.exe mailto:" & TxtEmail, vbHide

179

Este exemplo executa o seu gerenciador de e-mail padro para enviar e-mail. 414 - Abrir URL padro com cdigo de 1 linha Enviado por: Danilo Faustinoni Cabello shell "start http://www.vbbrasil.com", vbhide 415 - Correo mais descritiva de "Abrir URL padro com cdigo de 1 linha" Enviado por: Danilo Faustinoni Cabello Coloque num commandbutton: Public Sub Command1_Click() shell "start http://www.vbbrasil.com" , vbHide End Sub Voc tambm pode inserir uma textbox e um commandbutton assim Public Sub Command1_Click() shell "start " + text1.Text , vbHide End Sub No se esquea do espao entre (start e o endereo)

416 - Detectar o contedo do CD Enviado por: Adriano Faria Alves *** Mdulo BAS Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Public Const DRIVE_CDROM = 5 *** Private Sub Command1_Click() Dim VolName As String, FSys As String, erg As Long Dim VolNumber As Long, MCM As Long, FSF As Long Dim Drive As String, DriveType As Long VolName = Space(127) FSys = Space(127) Drive = "E:\" *** O drive correspondente ao seu cd-rom. DriveType& = GetDriveType(Drive$) erg& = GetVolumeInformation(Drive$, VolName$, 127&, VolNumber&, MCM&, FSF&, FSys$, 127&) Print "VolumeName:" & vbTab & VolName$ Print "VolumeNumber:" & vbTab & VolNumber&

williamdsilva@aol.com.br
Print "MCM:" & vbTab & vbTab & MCM& Print "FSF:" & vbTab & vbTab & FSF& Print "FileSystem:" & vbTab & FSys$ Print "DriveType:" & vbTab & DriveType&; *** Se o drive for CDROM, checa o CD If DriveType& = DRIVE_CDROM Then Print " (CDROM, "; If erg& = 0 Then Print "no h CD no drive.)" Else Print "h CD no drive)" End If Else Print " (No h CDROM)" End If End Sub

180

417 - Aumentar nmero de linhas na Combo (por padro, o VB s mostra 8 e acrescenta uma scroll). Enviado por: Adriano Faria Alves *** Mdulo BAS Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long *** Funo no Mdulo BAS Public Sub SetComboHeight(oComboBox As ComboBox, lNewHeight As Long) Dim oldscalemode As Integer If TypeOf oComboBox.Parent Is Frame Then Exit Sub oldscalemode = oComboBox.Parent.ScaleMode oComboBox.Parent.ScaleMode = vbPixels MoveWindow oComboBox.hwnd, oComboBox.Left, _ oComboBox.Top, oComboBox.Width, lNewHeight, 1 oComboBox.Parent.ScaleMode = oldscalemode End Sub *** Form_Load () Dim i As Integer For i = 1 To 15 Combo1.AddItem "Item " & i Next Call SetComboHeight(Combo1, 400) *** Onde 400 o nmero que voc aumenta ou diminui conforme o tanto de registro que quer mostrar quando abrir a combo. 418 - Descubra o cdigo ASCII pelo VB Enviado por: Adriano Faria Alves Abra a IMMEDIATE WINDOWS, digite e d enter: ?Asc("p") Ele retornar 112 (o nmero ASCII do p minsculo) ?Asc("P") Ele retornar 80 (o nmero ASCII do p maisculo) E assim por diante, digite a letra ou nmero entre as aspas. 419 - Descobrir senha de proteo de Banco de Dados Access 97 Enviado por: Adriano Faria Alves *Essa dica serve para mostrar a senha esquecida de proteo do banco de dados Access 97.

williamdsilva@aol.com.br

181

*Mdulo BAS Option Compare Binary Option Explicit *Funo no Mdulo BAS Public Function StPasswordOfStDatabase(stDatabase As String) As String Dim hFile As Integer Dim ich As Integer Dim stBuffer As String Dim rgbytRaw() As Byte Dim rgbytPassword() As Byte Dim rgbytNoPassword() As Byte rgbytNoPassword = ChrB(134) & ChrB(251) & ChrB(236) & ChrB(55) & ChrB(93) & ChrB(68) & ChrB(156) & ChrB(250) & ChrB(198) & ChrB(94) & ChrB(40) & ChrB(230) & ChrB(19) & ChrB(182) & ChrB(138) & ChrB(96) & ChrB(84) & ChrB(148) & ChrB(123) & ChrB(54) hFile = FreeFile Open stDatabase For Binary As #hFile Seek #hFile, 66 + 1 rgbytRaw = InputB(20, #hFile) Close #hFile ReDim rgbytPassword(0 To 19) For ich = 0 To 19 rgbytPassword(ich) = rgbytRaw(ich) Xor rgbytNoPassword(ich) Next ich stBuffer = StrConv(rgbytPassword, vbUnicode) & vbNullChar StPasswordOfStDatabase = Left$(stBuffer, InStr(1, stBuffer, vbNullChar, vbBinaryCompare) - 1) End Function *Para chamar a funo Text1.Text = StPasswordOfStDatabase("c:\bd1.mdb")

420 - Saber quantas vezes seu programa foi executado Enviado por: Robson Soares O exemplo mostra quantas vezes o programa foi executado: strRun = GetSetting(App.Title, 0, "Run") strRun = Val(strRun) + 1 SaveSetting App.Title, 0, "Run", strRun MsgBox strRun 421 - Limpar ComboBox com Estilo 2 (Dropdown list) Enviado por: Eduardo de Souza Para deixar o combobox com a propriedade style n. 2 (dropdown list combo no editvel) em branco, basta colocar o cdigo no evento click de um command button qualquer: Private Sub CommandButton_Click combobox.listindex = -1 End Sub Desta forma, declaramos que nenhum tem foi selecionado no combo 422 - Procurando por um dado especfico no banco Enviado por: Alex Ricardo Parolin Vamos procurar por um nome no banco de dados e jogar numa TextBox. O procedimento o seguinte: private sub procurar dim achou as boolean - tabela.MoveFirst Do if(tabela("Nome")="Nome Desejado")then TextBox.text= tabela("Nome") Exit sub else achou=false tabela.Movenext end if

williamdsilva@aol.com.br

182

loop until (tabela.EOF=true) if(achou=false)then aviso=msgbox("No existe o nome procurado!",Vbexclamation+Vbokonly,"Erro") end if end sub Agora se voc pretende joaga essa informao numa ListBox, ou Num ComboBox (para o caso de nomes iguais, mas outros dados diferentes): private sub procurar2 dim achou as boolean dim erro as boolean tabela.MoveFirst do if(tabela("Nome")="Nome Desejado")then ListBox.AddItem(tabela("Nome")) listBox.Refresh achou=true tabela.movenext else achou=false erro=true tabela.MoveNext end if loop until (tabela.EOF=true) if((achou=false)and(erro=true))then aviso=msgbox("No existe o registro procurado!",vbexclamation+vbokonly,"erro") else aviso=msgbox("Verifique na lista os nomes encontrados!",vbinformation+vbokonly,"Nomes") end if end sub Qq notificao: a_parolin@zipmail.com.br

423 - Out of stack space (Package & Depoyment Wizard) Enviado por: Graziele de Bortoli Este erro acontece devido a um problema no arquivo de dependncia do Crystal Report: Crystl32.dep. Para solucionar esse erro edit o Crystl32.dep pelo Notepad ou um editor de texto semelhante e inclua o ; nas seguintes linhas: ;[CRPE32.DLL] ;Dest=$(WinSysPath) ;Uses1=CRPE32.DLL ;Uses2= 424 - Como procurar por uma pasta usando (API) SHBrowseForFolder Enviado por: Daniel Marques Pereira 'Coloque estas declaraes em um mdulo 'Se colocar em um formulrio lembre-se de no usar como 'Public' 'Existem outras flags para parametrizar a pesquisa Public Const BIF_RETURNONLYFSDIRS = 1 Public Const BIF_DONTGOBELOWDOMAIN = 2 Public Const MAX_PATH = 260 Public Declare Function SHBrowseForFolder Lib "shell32" ( _ lpbi As BrowseInfo _ ) As Long Public Declare Function SHGetPathFromIDList Lib "shell32" ( _ ByVal pidList As Long, _ ByVal lpBuffer As String _ ) As Long Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _ ByVal lpString1 As String, _

williamdsilva@aol.com.br
ByVal lpString2 As String _ ) As Long 'Tipo para def Public Type BrowseInfo hWndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As Long ulFlags As Long lpfnCallback As Long lParam As Long iImage As Long End Type 'No evento clic de um boto no formulrio Private Sub Command1_Click() Dim lpIDList As Long Dim sBuffer As String Dim szTitle As String Dim tBrowseInfo As BrowseInfo

183

'Personaliza a procura szTitle = "Titulo da procura" With tBrowseInfo .hWndOwner = Me.hWnd .lpszTitle = lstrcat(szTitle, "") .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_EDITBOX End With 'Abre a janela de procura 'E retorna o caminho da pasta selecionada lpIDList = SHBrowseForFolder(tBrowseInfo) 'Se existir alguma pasta selecionada extrair If (lpIDList) Then sBuffer = Space(MAX_PATH) SHGetPathFromIDList lpIDList, sBuffer sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1) MsgBox "Caminha da Pasta selecionada" + vbCrLf + vbCrLf + sBuffer End If End Sub 425 - Conexo de multiplos clientes em um nico servidor (Winsock) Enviado por: Daniel Lopes de Carvalho Para conectar diversos clientes em um nico servidor necessrio: SERVIDOR No aplicativo de servidor cria a seguinte rotina: ... WskSvr(0).LocalPort = 1050 - > Utilize a porta que desejar. WskSvr(0).Listen ... Private Sub WskSvr_ConnectionRequest(Index As Integer, ByVal requestID As Long) On Error Resume Next If Index = 0 Then CnnSvr = CnnSvr + 1 Load WskSvr(CnnSvr) WskSvr(CnnSvr).Accept requestID End If End Sub Esta rotina far com que toda vez que for solicitada uma nova conexo ele incrementa o contador CNNSVR e pede para carregar um novo controle WINSOCK para receber esta solicitao. CLIENTE No Aplicativo de cliente as funes sero as mesmas. WskCli(0).RemoteHost = "127.0.0.1" -> Utilize o endereo de IP ou o hostname do servidor. WskCli(0).RemotePort = 1050 -> Utilize a mesma porta que foi utilizada no servidor.

williamdsilva@aol.com.br
426 - Formatar Hora com valor superior 23:00 Enviado por: Luiz Carlos Moreira Brazo Lima

184

Quando voc usa varivel no formato Date, as horas s podem aparecer entre os valores 00:00:00 - 23:59:59 Aqui est uma rotina para mostrar valores superiores como 48:00. Public Function hFormat(dHora As Double) As String Dim Horas As String, Minutos As String Horas = Str(Fix(FullTime / 3600)) Minutos = Str((Fix(FullTime / 60) Mod 60)) hFormat = Format(Horas & ":" & Minutos, "hh:nn") End Function No testei com Single nem Integer como parmetro. []'s 427 - Funo que retorna a semana em extenso Enviado por: fabio aparecido da silva Function ExtensoSemana(DATA) SEMANA = Array("Domingo", "Segunda-Feira", "Tera-Feira", "Quarta-Feira", _ "Quinta-Feira", "Sexta-Feira", "Sabado") ExtensoSemana = SEMANA(WeekDay(DATA) - 1) End Function Exemplo: text1.text = ExtensoSemana("16/03/2001") ou text1.text = ExtensoSemana(Date)

428 - Inicio do Ms Enviado por: fabio aparecido da silva Function InicioMes(DATA) Total = "01" & "/" & CStr(Month((CDate(DATA)))) & "/" & CStr(Year(Date)) InicioMes = Format(CDate(Total), "DD/MM/YYYY") End Function mais dicas: www.fasinfo.cjb.net 429 - Funo Segunda-Feira Enviado por: fabio aparecido da silva Function Segunda(DATA) If WeekDay(DATA) = 1 Then Segunda = CDate(DATA) - 6 Else Segunda = CDate(DATA) - (WeekDay(DATA) - 2) End If End Function Mais dicas: www.fainfo.cjb.net 430 - Centraliza textos em textsbox Enviado por: fabio aparecido da silva Function Central(Texto, Tamanho, MeuCaracter) If Len(Texto) = Tamanho Then Central = Texto Else Ajusta = (Tamanho - Len(Texto)) / 2 Central = String(Ajusta, MeuCaracter) + Texto + String(Ajusta, MeuCaracter) End If End Function 431 - Informaes sobre sitema sem o uso de API,s Enviado por: Fabio Silva

williamdsilva@aol.com.br

185

O uso da funo "ENVIRON" para retornar variaveis do sistema. 432 - Achando uma letra na String Enviado por: Carlos Eduardo Rocco Froes Esta funo apenas recebe uma string e procura por uma letra ou numero dentro dela RETORNO:( True se achar e False se no achar ) Private Function Busca_String(obj_str, in_letra) As Boolean Dim a For a = 1 To Len(obj_str) If Mid(obj_str, a, 1) = in_letra Then Busca_String = True Exit Function End If Next Busca_String = False End Function 433 - Removendo acentos para impresso de relatrios em impressoras matriciais Enviado por: Luiz Fernando C. Capacio No mdulo (.BAS) insira esta variavel como global Global vtexconv As Variant Insira esta parte do fonte onde deseja obter o resultado da converso Open "LPT1" for output as #1 vtexto="Teste de acentuao no VB" vtexconv = "": removeacentos (vtexto) print #1, vtexconv 'Variavel tera o valor convertido. close #1 No mdulo (.BAS) insira esta funo para efetuar a converso Function removeacentos(texto As String) variavel = Text1 vpar = "" vcod = "AAAAAACEEEEIIIIOOOOOUUUUaaaaaaceeeeiiiiooooouuuu" For c = 1 To Len(variavel) vpos = InStr(1, vpar, Mid(variavel, c, 1)) If vpos <> 0 Then vtexconv = vtexconv + Mid(vcod, Val(vpos), 1) Else vtexconv = vtexconv + Mid(variavel, c, 1) End If Next End Function 434 - Alternando NumLock e CapsLock por cdigo Enviado por: Fbio Perkowitsch Mulero Voc pode inserir esse fragmento de cdigo em seu programa e fazer com que seja acionado ou desacionado as teclas NUM e CAPS Lock por botes ou eventos de seu programa, para isso s chamar a sub rotina AlternaCAPS() para o Caps Lock e AlternaNUM() para o NUM Lock. Public Const VK_CAPITAL = &H14 Public Const VK_NUMLOCK = &H90 Public Type KeyboardBytes kbByte(0 To 255) As Byte End Type Public kbArray As KeyboardBytes Public Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Long Public Declare Function GetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long Public Declare Function SetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long Public Sub AlternaCAPS() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1) SetKeyboardState kbArray End Sub Public Sub AlternaNUM() GetKeyboardState kbArray

williamdsilva@aol.com.br

186

kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1) SetKeyboardState kbArray End Sub 434 - Alternando NumLock e CapsLock por cdigo Enviado por: Fbio Perkowitsch Mulero Voc pode inserir esse fragmento de cdigo em seu programa e fazer com que seja acionado ou desacionado as teclas NUM e CAPS Lock por botes ou eventos de seu programa, para isso s chamar a sub rotina AlternaCAPS() para o Caps Lock e AlternaNUM() para o NUM Lock. Public Const VK_CAPITAL = &H14 Public Const VK_NUMLOCK = &H90 Public Type KeyboardBytes kbByte(0 To 255) As Byte End Type Public kbArray As KeyboardBytes Public Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Long Public Declare Function GetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long Public Declare Function SetKeyboardState Lib "User32" (kbArray As KeyboardBytes) As Long Public Sub AlternaCAPS() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1) SetKeyboardState kbArray End Sub Public Sub AlternaNUM() GetKeyboardState kbArray kbArray.kbByte(VK_NUMLOCK) = IIf(kbArray.kbByte(VK_NUMLOCK) = 1, 0, 1) SetKeyboardState kbArray End Sub 435 - Digitao em maiusculo mesmo com o Caps Look desligado Enviado por: Jlio Cesar Moraes Com esses comandos posvel fazer a digitao sair sempre com caracteres em maisculo, independente de o Caps Look estar ligado ou desligado Private Sub Campotxt_Change() Campotxt.Text = UCase(Campotxt.Text) Campotxt.SelStart = Len(Campotxt.Text) End Sub 436 - Usando o AutoCompletar do Internet Explorer 5 Enviado por: Fbio Perkowitsch Mulero Inserindo esse fragmento de cdigo vc pode usar a ferramenta autocompletar do IE5, bastando para isso chamar a sub rotina MakeAutoComplete() no evento form_load e passando qual textbox ira usar essa ferramenta. Public Declare Function SHAutoComplete Lib "Shlwapi.dll" (ByVal hwndEdit As Long, ByVal dwFlags As Long) As Long Public Const SHACF_DEFAULT As Long = &H0 Public Sub MakeAutoComplete(ByRef TextB As TextBox) Call SHAutoComplete(TextB.hWnd, SHACF_DEFAULT) End Sub 437 - Email - Ler o contedo com CDO Enviado por: Ricardo Garrido Schwach Antes de Comear: Ir no Menu Project, opo Referncias e Ativar a referncia Microsoft Active Messaging. Obs.: Necessrio ter a seguinte DLL registrada: OLEMSG32.DLL Private Sub Command1_Click() Dim objSession As Object Set objSession = CreateObject("MAPI.Session") objSession.Logon "Configuraes do MS Exchange", , False, False For Each objMessage In objSession.Inbox.Messages

williamdsilva@aol.com.br

187

If objMessage.Unread = True Then If InStr(objMessage.Subject, "Assunto do Email") Then Var = objMessage.Text End If End If Next objMessage End Sub 438 - Imagem como fundo de Formulrio MDI Enviado por: Moacir Ribeiro do Carmo Crie um formulrio MDI e defina a sua propriedade Enable como False e BorderStyle como 0 - None. Inclua nele uma imagem chamada imgBackgroud e insira o seguinte cdigo de evento: Private Sub Form_Load() With imgBackgroud .Stretch = False .Top = 0 .Left = 0 Me.Height = .Height Me.Width = .Width End With Me.Top = (FormMDI.ScaleHeight - Me.Height) * 0.45 Me.Left = (FormMDI.ScaleWidth - Me.Width) \ 2 End Sub 'Obs: FormMDI o nome do formulrio MDI. Este formulrio deve 'ser carregado no evento MDIForm_Load: Private Sub MDIForm_Load() With Screen 'Ocupa toda a tela Me.Move 0, 0, .Width, .Height - 27 * 15 End With frmBackground.Show End Sub 439 - Criando animao no Caption do Form sem API. Enviado por: Arthur Lopes Voc deve criar 5 timer : ( Timer, Timer1, Timer2, Timer3 e Timer4 ) ==> General Declarations <== Dim vform As String ==> No LOAD do FORM <== 'Private Sub Form_Load() vform = "T" Form1.Caption = vform Timer1.Enabled = True Timer2.Enabled = False Timer3.Enabled = False Timer4.Enabled = False 'End Sub ==> No Timer do Timer1 <== 'Private Sub Timer1_Timer() If vform = "T" Then vform = vform + "e" Form1.Caption = vform Timer2.Enabled = True End If 'End Sub ==> No Timer do Timer2 <== 'Private Sub Timer2_Timer() If vform = "Te" Then vform = vform + "s"

williamdsilva@aol.com.br
Form1.Caption = vform Timer3.Enabled = True End If 'End Sub ==> No Timer do Timer1 <== 'Private Sub Timer3_Timer() If vform = "Tes" Then vform = vform + "t" Form1.Caption = vform Timer4.Enabled = True End If End Sub 440 - Centralizando o Form em Runtime Enviado por: William Rodrigues

188

'Para colcocar um Form no centro da tela em tempo de execuo escreva os seguintes cdigos: Private Sub Form_Resize() On Error Resume Next 'Evita erro caso o usurio minimize o Form With Me .Left = (Screen.Width - .Width) / 2 'Alinha o form no horizontalmente no centro .Top = (Screen.Height - .Height) / 2 'Alinha o form no verticalmente no centro End With End Sub 441 - Preenchendo um ComboBox ou ListBox com dados de um Arquivo Enviado por: William Rodrigues 'Para esta dica inicie um novo projeto e insira um ComboBox e um ListBox e crie uma arquivo de texto qualquer (Ex.: C:\Lista de Alunos.txt"). Renomei-e o ComboBox para CboFile e o ListBox para LstFile. Em seguida no evento Load do Form1, insira as seguintes linhas de comando: Private Sub Form_Load () 'Declarao das variveis Dim fnum As Integer Dim lines As Integer Dim a_line As String If Dir("C:\Lista de Alunos.txt", vbArchive) = Empty Then 'Verifica se o arquivo se o arquivo existe MsgBox "O arquivo no foi encontrado!", vbCritical, App.Title 'Caso o arquivo no seja encontrado exibe a caixa de mensagem Exit Sub 'Envia o comando para o fim da rotina End If fnum = FreeFile 'Devolve a varivel fnum a crarterstica de FreeFile Open "C:\Lista de Alunos.txt" For Input As fnum 'Abre o arquivo Do While Not EOF(fnum) 'Vai para fim de arquivo Input #fnum, a_line 'Ler a linha de dados do arquivo lines = lines + 1'Pula para a linha seguinte do arquivo cada vez que o lao e repitido, at chegar a ltima linha CboFile.AddItem a_line 'Preenche o ComboBox com os dados do adicionando cada linha at a ltima linha do arquivo LstFile.Additem a_line 'Preenche o ListBox com os dados do adicionando cada linha at a ltima linha do arquivo Loop 'Finaliza o Lao Close fnum 'Fechar o arquivo End Sub 442 - Carregando seu programa ao iniciar o windows automaticamente Enviado por: Gilson Cezar Rodrigues Bernal 'EXE Location Public Const MAX_PATH = 206 Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Public Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long Sub CreateIniLoad() a = Environ("windir") 'Get Current Location Dim lngFileHandle As Long Dim lngReturn As Long Dim strFilePath As String strFilePath = Space$(MAX_PATH) lngFileHandle = GetModuleHandle(App.EXEName) lngReturn = GetModuleFileName(lngFileHandle, strFilePath, MAX_PATH) Text1.Text = strFilePath

williamdsilva@aol.com.br

189

'Copy Server File to Windows System Directory If Text1.Text = a & "\SYSTEM\yourfile" Then GoTo jumpcopy FileCopy strFilePath, a & "\SYSTEM\yourfile" 'Modify WIN.INI jumpcopy: Open a & "\WIN.INI" For Input As #1 Open a & "\WIN.ANA" For Output As #2 While Not EOF(1) Input #1, b Print #2, Spc(0); b If b = "load=" & a & "\SYSTEM\yourfile" Then Close #1 Close #2 Kill a & "\WIN.ANA" GoTo end ElseIf b = "[windows]" Then Print #2, Spc(0); "load=" & a & "\SYSTEM\yourfile" Input #1, b End If Wend Close #1 Close #2 Kill a & "\WIN.INI" Name a & "\WIN.ANA" As a & "\WIN.INI" End Sub 443 - Abra a janela Mapear Unidade de Rede Enviado por: Gilson Cezar Rodrigues Bernal Private Declare Function WNetConnectionDialog Lib "mpr.dll" _ (ByVal hwnd As Long, ByVal dwType As Long) As Long x% = WNetConnectionDialog(Me.hwnd, 1) 444 - Listar as msicas de um CD Audio Enviado por: Gilson Cezar Rodrigues Bernal Option Explicit Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" _ (ByVal AppName As String, ByVal KeyName As String, ByVal keydefault As String, ByVal Filename As String) As Long Global CDMin As Integer Global CDSec As Integer Global TMin As Integer Global TSec As Integer Global RMin As Integer Global RSec As Integer Global TimeTrack As String Global TimeElapsed As String Global TimeRemaining As String Global Artist1 As String Global Title1 As String Global Artist2 As String Global Title2 As String Sub CDAudioProperties() Dim T As Double On Error Resume Next T = Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3", 5) End Sub Function GetRawRemainingTime(MMCOntrol1 As Object) As String Dim Z As String, Min As String, Sec As String, _ Temp As String Z = GetRunningTime(MMCOntrol1) Z = GetTrackTime(MMCOntrol1)

williamdsilva@aol.com.br

190

Min = LTrim$(Str$(CDMin - TMin)) Sec = LTrim$(Str$(CDSec - TSec)) RMin = Val(Min) RSec = Val(Sec) If RSec < 0 Then RSec = 60 + Val(Sec) RMin = RMin - 1 End If Min = LTrim$(Str$(RMin)) Temp = Trim$(Str$(RSec)) If Len(Temp) = 1 Then Sec = "0" + Temp Else Sec = Temp End If GetRawRemainingTime = Min + Sec End Function Function GetRemainingTime(MMCOntrol1 As Object) As String Dim Z As String, Min As String, Sec As String, _ Temp As String Z = GetRunningTime(MMCOntrol1) Z = GetTrackTime(MMCOntrol1) Min = LTrim$(Str$(CDMin - TMin)) Sec = LTrim$(Str$(CDSec - TSec)) RMin = Val(Min) RSec = Val(Sec) If RSec < 0 Then RSec = 60 + Val(Sec) RMin = RMin - 1 End If Min = LTrim$(Str$(RMin)) Temp = Trim$(Str$(RSec)) If Len(Temp) = 1 Then Sec = "0" + Temp Else Sec = Temp End If GetRemainingTime = Min + ":" + Sec End Function Sub GetTime(MMCOntrol1 As Object) Dim Z$ Z$ = GetRemainingTime(MMCOntrol1) End Sub Function GetTrackTime(MMCOntrol1 As Object) As String Dim Length&, Entry2$, Min$, Sec$, D$, Entry$ MMCOntrol1.TimeFormat = 2 Length& = MMCOntrol1.TrackLength Min$ = Str$(Length& And &HFF) Sec$ = LTrim$(Str$((Length& And 65280) / 256)) Entry2$ = Min$ & ":" & Sec$ If Len(Sec$) = 1 Then Entry2$ = Min$ + ":0" + Sec$ Entry$ = Min$ + ":" + Sec$ If Len(Entry2$) = 4 Then D$ = "0" + Entry2$ Else D$ = Entry2$ End If If Len(Entry2$) = 3 Then D$ = "00" + Entry2$ Else D$ = Entry2$ End If D$ = Entry2$

williamdsilva@aol.com.br
GetTrackTime = Trim$(D$) MMCOntrol1.TimeFormat = 10 CDMin = Val(Min$) CDSec = Val(Sec$) End Function

191

Function GetRunningTime(MMCOntrol1 As Object) As String Dim E As Long, M As String, S As String, Length&, Min$, Sec$, D As Long, Entry2$ MMCOntrol1.TimeFormat = 2 Length& = MMCOntrol1.Position - MMCOntrol1.TrackPosition Min$ = Str$(Length& And &HFF) Sec$ = LTrim$(Str$((Length& And 65280) / 256)) If Len(Sec$) = 3 Then D = Val(Min$) - 1 Min$ = LTrim$(Str$(D)) E = Val(Right$(Sec$, 2)) + 4 Sec$ = LTrim$(Str$(E)) End If M = Min$ 'If Len(Min$) = 1 Then M = "0" + Min$ Else M = Min$ 'If Val(M) = 0 Then M = "00" 'If Val(M) = 1 Then M = "01" 'If Val(M) = 2 Then M = "02" 'If Val(M) = 3 Then M = "03" 'If Val(M) = 4 Then M = "04" 'If Val(M) = 5 Then M = "05" 'If Val(M) = 6 Then M = "06" 'If Val(M) = 7 Then M = "07" 'If Val(M) = 8 Then M = "08" 'If Val(M) = 9 Then M = "09" If Len(Sec$) = 1 Then S = "0" + Sec$ Else If Len(Sec$) = 3 Then S = Mid$(Sec$, 2) Else S = Sec$ End If End If TMin = Val(M) TSec = Val(S) Entry2$ = LTrim$(M) + ":" + LTrim$(S) MMCOntrol1.TimeFormat = 10 GetRunningTime = Entry2$ End Function

Function GetRawRunningTime(MMCOntrol1 As Object) As String Dim E As Long, M As String, S As String, Length&, Min$, Sec$, D As Long, Entry2$ MMCOntrol1.TimeFormat = 2 Length& = MMCOntrol1.Position - MMCOntrol1.TrackPosition Min$ = Str$(Length& And &HFF) Sec$ = LTrim$(Str$((Length& And 65280) / 256)) If Len(Sec$) = 3 Then D = Val(Min$) - 1 Min$ = LTrim$(Str$(D)) E = Val(Right$(Sec$, 2)) + 4 Sec$ = LTrim$(Str$(E)) End If M = Min$ 'If Len(Min$) = 1 Then M = "0" + Min$ Else M = Min$ 'If Val(M) = 0 Then M = "0" 'If Val(M) = 1 Then M = "1" 'If Val(M) = 2 Then M = "2" 'If Val(M) = 3 Then M = "3" 'If Val(M) = 4 Then M = "4" 'If Val(M) = 5 Then M = "5"

williamdsilva@aol.com.br
'If Val(M) = 6 Then M = "6" 'If Val(M) = 7 Then M = "7" 'If Val(M) = 8 Then M = "8" 'If Val(M) = 9 Then M = "9" If Len(Sec$) = 1 Then S = "0" + Sec$ Else If Len(Sec$) = 3 Then S = Mid$(Sec$, 2) Else S = Sec$ End If End If Entry2$ = M + S MMCOntrol1.TimeFormat = 10 GetRawRunningTime = Entry2$ End Function

192

Function GetRawTrackTime(MMCOntrol1 As Object) As String Dim Length&, Entry2$, Min$, Sec$, D$ MMCOntrol1.TimeFormat = 2 Length& = MMCOntrol1.TrackLength Min$ = Str$(Length& And &HFF) Sec$ = LTrim$(Str$((Length& And 65280) / 256)) Entry2$ = Min$ + Sec$ If Len(Sec$) = 1 Then Entry2$ = Min$ + "0" + Sec$ GetRawTrackTime = Entry2$ MMCOntrol1.TimeFormat = 10 End Function Public Function myReadINI(inifile, inisection, inikey, iniDefault) 'Fail fracefully if no file / wrong file is specified. 'If no section (appname), default is first appname 'if no key, default is first key Dim lpApplicationName As String Dim lpKeyName As String Dim lpDefault As String Dim lpReturnedString As String Dim nSize As Long Dim lpFileName As String Dim retval As Long Dim Filename As String lpDefault = Space$(254) lpDefault = iniDefault lpReturnedString = Space$(254) nSize = 254 lpFileName = inifile lpApplicationName = inisection lpKeyName = inikey Filename = lpFileName retval = GetPrivateProfileString _ (lpApplicationName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName) myReadINI = lpReturnedString End Function Public Function myWriteINI(inifile As String, inisection As String, inikey As String, Info As String) As String Dim retval As Long retval = WritePrivateProfileString(inisection, inikey, Info, inifile) myWriteINI = LTrim$(Str$(retval)) End Function Public Function GenCDSerial(MMCOntrol1 As Object) As Long Const MCI_FORMAT_MILLISECONDS = 0 Const MCI_FORMAT_MSF = 2 Const MCI_FORMAT_TMSF = 10 'MCI_Format :0,2,10 are the only supported formats for CD Dim Compat As Integer

williamdsilva@aol.com.br

193

Dim i As Integer Dim dwtotal&, dwtemp& Dim byte0%, byte1%, byte2%, byte3% 'compat = 0 for EXISTING code 'Compat = 1 for use with CDPLAYER.EXE Compat = 1 MMCOntrol1.Notify = False MMCOntrol1.Wait = True MMCOntrol1.Shareable = True If MMCOntrol1.Error <> 0 Then MsgBox MMCOntrol1.ErrorMessage Exit Function End If MMCOntrol1.TimeFormat = MCI_FORMAT_MSF dwtotal& = 0 For i = 1 To MMCOntrol1.Tracks DoEvents MMCOntrol1.Track = i dwtemp& = MMCOntrol1.TrackPosition byte0% = dwtemp& And &HFF& byte1% = (dwtemp& And &HFF00&) \ &H100 byte2% = (dwtemp& And &HFF0000) \ &H10000 byte3% = (dwtemp& And &H7F000000) \ &H1000000 If (dwtemp& And &H80000000) <> 0 Then ' put sign bit back into byte4 byte3 = byte3 + &H80 End If dwtemp& = byte0% * &H10000 + byte1% * &H100 + byte2% dwtotal& = dwtotal& + dwtemp& Next i If MMCOntrol1.Tracks < 3 Then dwtotal& = dwtotal& + msf2frames(MMCOntrol1.Length) + Compat End If GenCDSerial = dwtotal& End Function Function msf2frames(msf As Long) As Long Rem From the KnowledgeBase Rem byte1 = MMControl1.Position And &HFF& Rem byte2 = (MMControl1.Position And &HFF00&) \ &H100 Rem byte3 = (MMControl1.Position And &HFF0000) \ &H10000 Rem byte4 = (MMControl1.Position And &H7F000000) \ &H1000000 Rem If (MMControl1.Position And &H80000000) <> 0 Then Rem ' put sign bit back into byte4 Rem byte4 = byte4 + &H80 Rem End If Dim byte0, byte1, byte2, byte3 As Integer Dim Min, Sec, fra As Integer byte0 = msf And &HFF& byte1 = (msf And &HFF00&) \ &H100 byte2 = (msf And &HFF0000) \ &H10000 byte3 = (msf And &H7F000000) \ &H1000000 If (msf And &H80000000) <> 0 Then ' put sign bit back into byte4 byte3 = byte3 + &H80 End If Min = byte0 Sec = byte1 fra = byte2 msf2frames = (Min * 60 + Sec) * 75 + fra End Function Function Z_Trim(String1 As String) As String Dim A As Integer For A = 1 To Len(String1) If Mid$(String1, A, 1) = Chr$(0) Then Exit For Next A Z_Trim = RTrim$(Left$(String1, A - 1)) End Function 445 - Exibindo/Ocultando o ponteiro do mouse Enviado por: Gilson Cezar Rodrigues Bernal

williamdsilva@aol.com.br

194

Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long) Private Sub Command1_Click() ShowCursor (bShow = True) End Sub Private Sub Command2_Click() ShowCursor (bShow = False) End Sub 446 - Criando novos efeitos de bordas em controles Enviado por: Gilson Cezar Rodrigues Bernal Private Declare Function GetWindowLong Lib "user32" Alias _ "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _ ByVal CX As Long, ByVal CY As Long, ByVal wFlags As Long) As Long Private Const GWL_EXSTYLE = (-20) Private Const WS_EX_CLIENTEDGE = &H200 Private Const WS_EX_STATICEDGE = &H20000 Private Const SWP_FRAMECHANGED = &H20 ' Frame Changed Private Const SWP_NOMOVE = &H2 Private Const SWP_NOOWNERZORDER = &H200 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOZORDER = &H4 Public Function ThinBorder(ByVal lhWnd As Long, ByVal bState As Boolean) Dim rtnVal As Long ' Get current border style rtnVal = GetWindowLong(lhWnd, GWL_EXSTYLE) ' Set new border style according to bState If Not (bState) Then ' Remove Office 2000 look rtnVal = rtnVal Or WS_EX_CLIENTEDGE And Not WS_EX_STATICEDGE Else ' Create Office 2000 like border on the control rtnVal = rtnVal Or WS_EX_STATICEDGE And Not WS_EX_CLIENTEDGE End If ' Apply the change SetWindowLong lhWnd, GWL_EXSTYLE, rtnVal SetWindowPos lhWnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or _ SWP_NOOWNERZORDER Or SWP_NOZORDER Or SWP_FRAMECHANGED End Function 447 - Animao no titulo, demais !!!! Enviado por: Danilo Faustinoni Cabello Ol vi e revi muitos cdigos para animao no titulo, mas sem querer desprestigiar os que enviaram o cdigo ele era ruim ou chato de fazer como: crie 5 timer cada um com intervela de ... ou faa um comando if para cada letra que vc for... eu estava "brincando" com o cdigo MID e crie uma animao com apenas um timer. Vamos fazer !? 'Crio as variaveis Dim title, x Private Sub Form_Load() 'mensagem do form title = "digite aqui a mensagem" Me.Caption = "" x=1 End Sub

williamdsilva@aol.com.br
Private Sub Timer1_Timer() 'se o valor de x for igual ao numero de caracteres da 'mensagem mais 1 If x = Len(title) + 1 Then x=1 Me.Caption = "" Exit Sub End If

195

'caption do form igual ao caption mais letras da mensagem Me.Caption = Me.Caption + Mid(title, x, 1) x=x+1 End Sub s isso, escolha quanto de intervalo vc quer e nunca mais faa milhes de ifs para fazer uma mensagenzinha 448 - Como Executar Um Som De Fundo No Cdigo Enviado por: mario gardenias neto Basta Declarar a Funo Playsound Aps Executar: Call (Variavel) = playsounda("path + Som") 449 - Aspas (tratando aspas) Enviado por: Flvio Luiz Teixeira Dominges Function TrocaAspas(cValor As String) As String Dim i As Integer, cValorAux As String cValorAux = cValor i = InStr(cValorAux, Chr(34)) Do Until i = 0 cValorAux = Left(cValorAux, i - 1) & Chr(96) & Mid(cValorAux, i + 1) i = InStr(i, cValorAux, Chr(34)) Loop i = InStr(cValorAux, Chr(39)) Do Until i = 0 cValorAux = Left(cValorAux, i - 1) & Chr(96) & Mid(cValorAux, i + 1) i = InStr(i, cValorAux, Chr(39)) Loop TrocaAspas = cValorAux End Function 450 - TROCANDO PONTO POR VIRGULA(2) Enviado por: Lucas Mesquita Vieira Uma boa dica para fazer a troca: Replace(Campo,".",",") ou Virgula por Ponto Replace(Campo,",",".") 452 - conectar Vb com MySql Enviado por: georgenes s oliveira Voce precisa fazer referencia do ADO 2.1 e depois fazer os seguinte comandos par aconectar Dim Ssql As String Dim cnn As ADODB.Connection Dim Rs As Recordset '**** crianto conexao

williamdsilva@aol.com.br

196

Set cnn = CreateObject("ADODB.Connection") '**** abrindo conexao cnn.Open "driver=MySQL};server=localhost;uid=usuario;pwd=senha;database=NomeDoDatabase" '**** criando recordset Set Rs = CreateObject("ADODB.RecordSet") '**** efetuando conexao do recordset Set Rs.ActiveConnection = cnn Rs.Open "select * from clientes" '*** efetuando isert na tabela clientes no NomeDoDatabase Ssql = "insert into clientes (Nome,endereco) values ('Georgenes','Rua Do Endereco, 99')" cnn.Execute Ssql no CRYSTAL basta escolher opcao de criar com SQL/ODBC, Escolher o MySql e criar os RPT 453 - NumeroBox Enviado por: Frank de Alcantara Nogueira Soares Para fazer usar uma caixa de texto que s aceita valores numricos crie a seguinte funo: Em um mdulo bas Public Function NumeroBox(Numero As String, Campo As TextBox) If Campo.Text = "" Then Exit Function If Not IsNumeric(Numero) Then MsgBox "Digite apenas Nmeros" Campo.Text = "" 'Limpa a caixa de Texto End If End Function Para chamar a funo coloque as seguintes linhas no evento change da Caixa de Texto NumeroBox Text1, Text1 By Fox Sistemas 454 - Reiniciar seu computador com apenas uma linha Enviado por: Bruno Sandivilli Antunes Portis Coloque este comando em um boto shell "rundll.dll",vbnormal 455 - TAB automtico para o prximo campo(bem mais fcil) Enviado por: Pablo Till No evento Form_KeyDown, basta adicionar as linhas: If KeyCode = vbKeyReturn Then SendKeys "{Tab}" Ex: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then SendKeys "{Tab}" End Sub Falow Galera !!!! Pablo 456 - Correo do item " Reiniciar seu computador com apenas uma linha " Enviado por: Bruno Sandivilli Antunes Portis Coloque este comando em um boto desejado ( Neste exemplo o boto escolhido foi o command1 ) Private Sub Command1_Click() Shell "c:\windows\rundll.exe user.exe,exitwindows", vbNormalFocus End Sub

Anda mungkin juga menyukai