------------------------------------------------------------------ ###@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\#### ####@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\### ### D I C A S D E V I S U A L B A S I C ### ### D I C A S D E V I S U A L B A S I C ### ### D I C A S D E V I S U A L B A S I C ### ### D I C A S D E V I S U A L B A S I C ### ###@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\#### ####@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\### ------------------------------------------------------------------- 1)Internet Podes querer ligar-te, dentro de um programa em Visual Basic, a um determinado URL (Unic Resource Located) da Web e navegar de seguida. Para isso ‚ f cil, quando podemos utilizar uma API do Windows, a fun‡Æo ShellExecute(). Na (General) / (Declaration), de um Form coloca a seguinte linha de c¢digo. 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 Utiliza uma caixa de texto com a propriedade Name = ligacao, e um botÆo com a propriedade Name = cmdligacao. Na caixa de texto escreves o URL pretendido, e quando clicares no botao, que tem o evento click() com o c¢digo que se segue, ver s o que acontece. Private Sub cmdligacao_Click() ShellExecute 0&, vbNullString, ligacao.Text, vbNullString, _ vbNullString, SW_SHOWNORMAL End Sub Nota : Esta dica s¢ funciona, se tiveres o acesso   rede ligado. 2) Erros de compara‡Æo de vari veis em textbox Quando recebes um valor num‚rico de uma Textbox, podes querer compar -lo com outro valor predefinido. Considera o seguinte c¢digo: Select Case Text1.Text Case 1 to 12 MsgBox "Valor Aceite" Case Else MsgBox "Valor Incorrecto" End Select Podes pensar que este c¢digo compara correctamente os valores introduzidos entre 1 e 12, mas nÆo ‚ assim. SerÆo correctos os valores 1, 10, 11, e 12, mas incorrectos por exemplo os valores de 2 a 9, e isto porque o campo retormna uma string e compara-as exactamente dessa forma. Para resolver esta situa‡Æo "inesperada", usaremos a fun‡Æo Val(), para converter os valores texto em numeros. Assim o c¢digo correcto seria: Select Case Val(Text1.Text) Case 1 to 12 MsgBox "Valor Aceite" Case Else MsgBox "Valor Incorrecto" End Select 3) Os ficheiros .INI Os ficheiros .ini, sÆo ficheiros de texto usados para guardar informa‡äes, que devem ser "lembradas" pelo programa da pr¢xima vez que for executado. Alguns exemplos sÆo Preferˆncias do utilizador Posicionamento e comprimento de ecrans Ficheiros usados mais recentemente O caminho / nome das base de dados O caminho dos relat¢rios A estrutura de um ficheiro INI est  dividida em 3 partes: [nome_da_sec‡Æo] Nome_da_chave Valor_da_chave O Nome_da_chave est  separado do Valor_da_chave por um sinal de igual(=). Exemplo : [caminho] bdados=c:\tutoriais\dados mapas=c:\tutoriais\mapas [tabelas] 001=amigos.mdb Para utilizarmos este tipo de ficheiros em programa criamos um Modulo.bas, onde vamos aplicar API's do Windows (falaremos do que sÆo API's mais adiante), como o exemplo que a seguir descrevemos: 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 Global caminho As String Global bdados As String Global strfilename As String Global lngresult As Long Global strresult As String * 50 Global nfirma As String Global percurso As String Global basedados As String Global variavel As String Private Sub MDIForm_Load() Dim digito As Long caminho = "caminho" nfirma = "bdados" strfilename = App.Path & "\amigos.ini" lngresult = GetPrivateProfileString(caminho, nfirma, strfilename, strresult, Len(strresult), strfilename) percurso = Left(strresult, lngresult) caminho = "tabela" nfirma = "001" lngresult = GetPrivateProfileString(caminho, nfirma, strfilename, strresult, Len(strresult), strfilename) basedados = Left(strresult, lngresult) End Sub Para escrever em Runtime basta criar uma fun‡Æo em que em vez de GetPrivateProfileString dever  aparecer WritePrivateProfileString. 4) Aceitar s¢ numeros num campo de texto Muitas vezes ‚ necess rio validar a introdu‡Æo de dados pelo utilizador, neste caso pretendemos somente a introdu‡Æo de caracteres num‚ricos. O evento Change() da textbox, ‚ o melhor local para o fazer. Contudo se usarmos, somente a fun‡Æo IsNumeric(), poderemos comenter um erro. Por exemplo atenta no seguinte c¢digo: Private Sub Text1_Change() If Not IsNumeric(Text1.Text) Then Text1.Text = "" End If Nesta circunstƒncias se o utilizador introduzir um numero negativo (-123), o controlo nÆo o aceita , porque o 1§ caracter nÆo ‚ um numero. Para resolver a situa‡Æo atenta ao seguinte c¢digo: Private Sub Text1_Change() If Not ValidateNumeric(Text1.Text) Then Text1.Text = "" End If End Sub Private Function ValidateNumeric(strText As String) _ As Boolean ValidateNumeric = CBool(strText = "" _ Or strText = "-" _ Or strText = "-." _ Or strText = "." _ Or IsNumeric(strText)) End Function 5) NÆo percas o focus no UserControls Normalmente, para determinar quando um UserControl, recebe ou perde o focus, podes pensar que usando os eventos standard GotFocus e LostFocus, sÆo uma atitude correcta. No entanto h  situa‡äes onde o controlo perde o focus sem "passar" pelo evento LostFocus. Por exemplo, quando se faz (Alt+Tab) para outra aplica‡Æo. Assim a tua melhor aposta para controlar o focus ‚ inserir o c¢digo nos eventos EnterFocus e ExitFocus. 6) Esconder o cursor do rato numa aplica‡Æo VB A fun‡Æo API "ShowCursor" permite uma forma r pida de esconder o cursor do rato. Insere e seguinte declara‡Æo Private Declare Function ShowCursor Lib "user32" _ (ByVal bShow As Long) As Long Quando digitares 0 para o argumento bShow, o cursor do rato desaparece. Com -1, o cursor volta a aparecer. preciso um certo cuidado ao usar esta fun‡Æo, porque apesar do cursor do rato se encontrar escondido, nÆo significa que nÆo esteja activo. Para comprovares o que acab mos de dizer, insere o c¢digo seguinte a um Form. Dim blnShow As Boolean Private Sub Form_Click() blnShow = Not bln ShowShowCursor blnShow End Sub Private Sub Form_Load() blnShow = True End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Not blnShow Then ShowCursor TrueEnd SubNow, run the project. Quando fazes click no Form, o Visual Basic torna o cursor invisivel. Clica novamente no Form e o cursor reaparece. Agora volta novamente a fazer dezaparecer o cursor do rato, e move-o em direc‡Æo   barra de menus. Apesar de invisivel, o cursor quando passa por cima de cada botÆo, fica pronto a ser clicado. 7) Manter a largura das colunas em runtime do DBGrid O DBgrid ‚ a melhor forma de mostrar dados de uma forma "familiar". Contudo se alterares a largura de uma coluna em runtime, o Visual Basic nÆo utiliza esta nova largura da pr¢xima vez que correres a aplica‡Æo. Felizmente o procedimento seguinte manter  a largura das colunas. Sub DBGridLayout(Operation As String) 'save width of columnsDim lWidth As Long Dim clm As Column Dim lDefWidth As Long l DefWidth = DBGrid1.DefColWidth For Each clm In DBGrid1.Columns With clm Select Case LCase(Operation) Case "save" lWidth = .Width SaveSetting App.Title, "Cols", CStr(.ColIndex), _ lWidth Case "load" lWidth = GetSetting(App.Title, "Cols", _ CStr(.ColIndex), lDefWidth) .Width = lWidth End Select End With Next clm End Sub Como podes ver, este procedimento usa as fun‡äes SaveSetting e GetSetting para armazenar os valores da largura corrente. Para usar o procedimento, chama-a do Form Load pai e unload evento. Depois indica que opera‡Æo queres que o procedimento execute. Private Sub Form_Load() DBGridLayout "Load" End Sub Private Sub Form_Unload(Cancel As Integer) DBGridLayout "Save" End Sub 8) Alarme Option Explicit Dim AlarmTime Const conMinimized = 1 Private Sub Form_Click() AlarmTime = InputBox("Digite a hora", "VB Alarme", Hora de Alarme) If AlarmTime = "" Then Exit Sub If Not IsDate(AlarmTime) Then MsgBox "Valor digitado inv lido" Else ' String v lida, AlarmTime = CDate(AlarmTime) ' Guarda o valor da hora em AlarmTime. End If End Sub Private Sub Form_Load() AlarmTime = "" End Sub Private Sub Form_Resize() If WindowState = conMinimized Then ' Se o Form for minimizado mostra a hora em caption. SetCaptionTime Else Caption = "Alarme" End If End Sub Private Sub SetCaptionTime() Caption = Format(Time, "Medium Time") ' Mostra a hora usando o formato medium time. End Sub Private Sub Timer1_Timer() Static AlarmSounded As Integer If lblTime.Caption <> CStr(Time) Then ' ‚ um segundo diferente do que aquele que ‚ mostrado. If Time >= AlarmTime And Not AlarmSounded Then Beep 5000 MsgBox "Alarme  s" & Time AlarmSounded = True ElseIf Time < AlarmTime Then AlarmSounded = False End If If WindowState = conMinimized Then ' Se minimizado, entÆo actualiza o Caption do Form a cada minuto. If Minute(CDate(Caption)) <> Minute(Time) Then SetCaptionTime Else ' SenÆo, actualiza a label Caption do form cada segundo. lblTime.Caption = Time End If End If End Sub 9) Calculadora Option Explicit Dim Op1, Op2 ' Operando previamente introduzido . Dim DecimalFlag As Integer ' Ponto decimal j  presente ? Dim NumOps As Integer ' Numero de operandos. Dim LastInput ' Indicata o tipo da ultimo keypress evento. Dim OpFlag ' Indica a opera‡Æo pendente. Dim TempReadout ' O evento Click para o procedimento C (cancel). ' Limpa o mostrador e inicializa variaveis. Private Sub Cancel_Click() Readout = Format(0, "0.") Op1 = 0 Op2 = 0 Form_Load ' O evento Click para o procedimento CE (cancelar entrada). Private Sub CancelEntry_Click() Readout = Format(0, "0.") DecimalFlag = False LastInput = "CE" End Sub ' O evento Click para o procedimento do ponto decimal. ' Se a ultima tecla for um operador, inicializa ' readout to "0." SenÆo, adiciona um ponto decimal ' ao mostrador. Private Sub Decimal_Click() If LastInput = "NEG" Then Readout = Format(0, "-0.") ElseIf LastInput <> "NUMS" Then Readout = Format(0, "0.") End If DecimalFlag = True LastInput = "NUMS" End Sub ' Rotina de inicializa‡Æo para o Form. ' Inicializa as vari veis. Private Sub Form_Load() DecimalFlag = False NumOps = 0 LastInput = "NONE" OpFlag = " " Readout = Format(0, "0.") 'Decimal.Caption = Format(0, ".") End Sub ' O evento Click para o procedimento de numeros de (0-9). ' Junta um novo numero ao apresentado no mostrador. Private Sub Number_Click(Index As Integer) If LastInput <> "NUMS" Then Readout = Format(0, ".") DecimalFlag = False End If If DecimalFlag Then Readout = Readout + Number(Index).Caption Else Readout = Left(Readout, InStr(Readout, Format(0, ".")) - 1) + Number(Index).Caption + Format(0, ".") End If If LastInput = "NEG" Then Readout = "-" & Readout LastInput = "NUMS" End Sub ' O evento Click para os operadores (+, -, x, /, =). Private Sub Operator_Click(Index As Integer) TempReadout = Readout If LastInput = "NUMS" Then NumOps = NumOps + 1 End If Select Case NumOps Case 0 If Operator(Index).Caption = "-" And LastInput <> "NEG" Then Readout = "-" & Readout LastInput = "NEG" End If Case 1 Op1 = Readout If Operator(Index).Caption = "-" And LastInput <> "NUMS" And OpFlag <> "=" Then Readout = "-" LastInput = "NEG" End If Case 2 Op2 = TempReadout Select Case OpFlag Case "+" Op1 = CDbl(Op1) + CDbl(Op2) Case "-" Op1 = CDbl(Op1) - CDbl(Op2) Case "X" Op1 = CDbl(Op1) * CDbl(Op2) Case "/" If Op2 = 0 Then MsgBox "Can't divide by zero", 48, "Calculator" Else Op1 = CDbl(Op1) / CDbl(Op2) End If Case "=" Op1 = CDbl(Op2) Case "%" Op1 = CDbl(Op1) * CDbl(Op2) End Select Readout = Op1 NumOps = 1 End Select If LastInput <> "NEG" Then LastInput = "OPS" OpFlag = Operator(Index).Caption End If End Sub ' O evento Click para o procedimento percentagem (%). ' Mostra a percentagem do 1§ operando. Private Sub Percent_Click() Readout = Readout / 100 LastInput = "Ops" OpFlag = "%" NumOps = NumOps + 1 DecimalFlag = True End Sub 10) Utiliza‡Æo do DBGrid Option Explicit Private Sub Command1_Click() List1.Clear ' Limpa a listbox End Sub Private Sub Command2_Click() Unload Form1 End ' Finaliza a sec‡Æo End Sub Private Sub Data1_Reposition() ' Liga o t¡tulo   propriedade caption Data1.Caption = Data1.Recordset("Title") End Sub Private Sub DBGrid1_DblClick() ' Adiciona um titulo   lista List1.AddItem Data1.Recordset("Title") End Sub Private Sub Form_Load() End Sub 11) C¢pias de Seguran‡a As c¢pias de seguran‡a dos nossos dados sÆo de uma importƒncia enorme. Infelizmente poucas sÆo as empresas/pessoas que cumprem aquilo que ‚ o m¡nimo exigido. No exemplo que se segue, cri mos um Form onde inserimos um objecto em Project/Components chamado "Microsoft Common Dialog Control 6.0", para ele aparecer na Toolbox. Utiliz mos 3 objectos: DriveListBox DirListBox FileListBox Option Explicit Dim selectedfile As String Dim destino As String Private Sub cmdiniciar_Click() On Error Resume Next Screen.MousePointer = 11 ' o botÆo do rato toma a forma de ampulheta Call fechar ' fechamos a base de dados destino = Drive2.Drive & "\" & File1.filename MsgBox "INSIRA DISQUETE NO DRIVE", , "COPIA DE SEGURAN€A" FileCopy selectedfile, destino Screen.MousePointer = 0 ' o botÆo do rato volta   sua forma normal Call abrir ' voltamos a abrir a base de dados End Sub Private Sub cmdsair_Click() Unload Me End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub File1_Click() selectedfile = File1.Path & "\" & File1.filename End Sub Private Sub Form_Load() ' Posisionamente e dimensäes do Form Me.Height = 4620 Me.Left = 2745 Me.Top = 1740 Me.Width = 7065 End Sub 12) Aspectos do rato Contante Valor Descri‡Æo vbDefault 0 Defeito vbArrow 1 Seta vbCrosshair 2 Cruz vbIbeam 3 Viga vertical vbIconPointer 4 Icon vbSizePointer 5 Cruz com setas na ponta vbSizeNESW 6 Setas direc‡Æo NE / SW vbSizeNS 7 Setas direc‡Æo N / S vbSizeNWSE 8 Setas direc‡Æo NW / SW vbSizeWE 9 Setas direc‡Æo W / E vbUpArrow 10 Seta para cima vbHourglass 11 Ampulheta vbNoDrop 12 Circulo com diagonal vbArrowHourglass 13 Seta + Ampulheta vbArrowQuestion 14 Seta + Ponto Interroga‡Æo vbSizeAll 15 Seta para todos os lados (N / S / W / E) vbCustom 99 Do utilizador 13) Shape Valores assumidos pela propriedade Shape do objecto Shape 0 Rectƒngulo 1 Quandrado 2 Oval 3 C¡rculo 4 Rectangulo c/ cantos redondos 5 Quandrado c/ cantos redondos 14) VScrollBar / HScrollBar As barras de deslocamento Vertical e Horizontal, permitem uma navega‡Æo f cil atraves de uma longa lista de item's ou de informa‡Æo. Pode ser indicado para mostrar a velocidade ou o volume, etc,. Algumas das propriedades importantes que convem referenciar: LargeChange - indica a quantidade de deslocamento quando se clica no meio da barra. SmallChange - indica a quantidade de deslocamento quando se clica nas setas no fim da barra Value - indica o valor do deslocamento e pode variar entre 0 e 32.767 Max - Valor m ximo do controlo Min - Valor minimo do controlo Fun‡Æo RGB() - retorna um valor num‚rico longo e indica a composi‡Æo da cor no formato que se segue: cor=RGB(RED, GREEN, BLUE) No exemplo que se segue, cri mos um Form com 3 objectos VScrollBar e uma Label cuja fun‡Æo ‚ mostrar a cor atrav‚s do deslocamento de qualquer das barras verticais. Private Sub cor_Change(Index As Integer) Const red = 0, green = 1, blue = 2 Dim corfinal As Long corfinal = RGB(cor(red).Value, cor(green).Value, cor(blue).Value) Label1.BackColor = corfinal End Sub Private Sub cor_Scroll(Index As Integer) cor_Change (Index) End Sub Private Sub Form_Load() Dim i As Integer For i = 0 To 2 cor(i).Value = 0 cor(i).Max = 0 cor(i).Min = 255 cor(i).LargeChange = 10 cor(i).SmallChange = 1 Next i End Sub Private Sub cor_Change(Index As Integer) Const red = 0, green = 1, blue = 2 Dim corfinal As Long corfinal = RGB(cor(red).Value, cor(green).Value, cor(blue).Value) Label1.BackColor = corfinal Label5.Caption = corfinal End Sub Private Sub cor_Scroll(Index As Integer) cor_Change (Index) End Sub Private Sub Form_Load() Dim i As Integer For i = 0 To 2 cor(i).Value = 0 cor(i).Max = 0 cor(i).Min = 255 cor(i).LargeChange = 10 cor(i).SmallChange = 1 Next i End Sub 15) Comando With Este comando executa uma s‚rie de comandos para o mesmo objecto sem ter que reescrever o nome do objecto. Sintaxe: With objecto .comando1 .comando2 .comando3 End With Onde o "objecto" ‚ o nome de um objecto definido pelo utilizador, comando1, comando2 e comando3, os comandos a serem executados. Por exemplo dimensionar e colocar um Form no ecran, com a propriedade Name = frmjanela: With frmjanela .Left = 150 .Top = 500 .Height = 1500 .Width = 2300 .Caption = "Esta ‚ a minha janela principal" End With 16) Prevenir problemas com o DataReport do VB 6.0 O Visual Basic 6.0 tem integrado um gerador de relat¢rios "DataReport". Quando usas esta ferramenta podes ter problemas durante a execu‡Æo do projecto compilado. Isto pode ocorrer se fizeres o Unload do Form, sem teres feito o Unload do DataReport, porque o Visual Basic inicializa o objecto DataReport, mas nunca lhe faz o Unload enquando ele est  a ser impresso. Para ultrapassar este problema utilizamos o Evento Unload() do Form como o exemplo que se segue: Private Sub Form_Unload(Cancel As Integer) Unload DataReport1 End Sub 17) Usar VBound() e UBound() quando usas arrays Quando usas o comando For...Next, para navegar num array, podes estar condicionado aos valores dos contadores inicial e final. Por exemplo, supäes que criaste o seguinte array: TipoMusicas = Array("Blues", "Classic Rock", "Country", _ "Dance", "Disco", "Funk", "Grunge", "Hip -Hop", _ "Jazz", "Metal", "New Age", "Oldies", "Other") Podes navegar atrav‚s do array da seguinte forma: For x = 0 To 12 Debug.Print TipoMusicas(x) Next x Contudo, e porque podes querer adicionar mais item's ao array, ‚ melhor utilizar as fun‡äes LBound() e UBound(), para delimitar as "fronteiras" dos contadores, alterando o c¢digo do exemplo anterior no seguinte: For x = LBound(MusicGenres) To UBound(MusicGenres) Debug.Print TipoMusicas(x) Next x 18) Preencher todas as TextBox Imagine um Form com v rios objecto TextBox, e que obrigat¢riamente todas deverÆo ter informa‡Æo. Para completar esta dica, adicionamos ao Form um objecto CommandButton, com a propriedade Caption = "Gravar" e Name = "botao". Na propriedade KeyPreview do Form colocamo-la = True No evento Load() colocamos o botÆo.enabled = False No evento KeyUP do Form digitamos o seguinte c¢digo: Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) ' Coloca o botao enabled somente se todas as TextBox do Form ' forem preenchidas Dim curControl As Control For Each curControl In Controls 'Faz um Loop a todos os controlos do form. If TypeOf curControl Is TextBox Then If curControl.Text = "" Then 'A TextBox corrente est  vazia botao.Enabled = False 'Torna o botao disabled Exit Sub End If End If Next ' Todas as TextBox tˆm informa‡Æo botao.Enabled = True End Sub 19) Debug O Visual Basic permite fazer uma an lise interactiva durante a fase de desenvolvimento de um projecto, para encontrar possiveis erros de run-time ou de l¢gica. Eis algumas instru‡äes e a sua explica‡Æo : Toggle Breakpoint - Provoca a paragem do projecto na linha de c¢digo assinalada. Pode-se fazer isto de trˆs formas: fazer click atr s da linha, no painel esquerdo, com a tecla F9, ou atrav‚s da barra de tarefas em Debud/Toggle Breakpoint Step Into - (F8) Executa uma linha de comando de cada vez. Se o comando for um Call para um Procedimento, o pr¢ximo comando mostrado, ‚ o primeiro comando do procedimento. Step Over - (SHIFT+F8) Semelhante ao Step Into, executa de uma s¢ vez um procedimento Call, e a pr¢xima linha de comando mostrada, ‚ a linha a seguir no procedimento corrente. Step Out - (CTRL+SHIFT+F8) Executa as restantes linhas da fun‡Æo, onde est  inserida a paragem corrente. O pr¢ximo comando mostrado, ‚ o comando seguinte ao procedimento Call. Add Watch - Este comando mostra uma caixa de di logo, na qual podemos inserir uma expressÆo (qualquer expressÆo v lida em Visual Baisc). Quick Watch - (SHIFT+F9) Mostra uma caixa de di logo com o valor corrente da expressÆo seleccionada. Clear All Breakpoints - (CTRL+SHIFT+F9) - Remove todos os Breakpoints. 20) Format Este comando existente no menu ToolBar, ‚ simples e facilita a vida ao programador. Vale a pena uma chamada de aten‡Æo para ele. Para seleccionar v rios comandos de um Form, clicamos neles com a tecla SHIFT premida. ou clicamos e arrastamos o rato por cima deles. Isto provoca o aparecimento de 8 pontos em torno de cada objecto. Divisäes do comando Format: Align : Left - Alinhamento pala esquerda Centers - Ao centro Right - Pala direita Tops - Em cima Middles - Ao centro Bottoms - Em baixo To Grid - Pela grelha Make Same Size : Width - Com o mesmo comprimento Height - Com a mesma altura Both - Com o mesmo comprimento e altura Horizontal / Vertical Spaccing : Make Equal - O mesmo espa‡o Increase - Aumenta Decrease - Diminui Remove - Remove Center in Form : Horizontally - No sentido horizontal Vertically - No sentido vertical Order : Bring to Front - Coloca o objecto   frente Send to Back - Coloca o objecto atr s 21) Apagar todos os registos de uma tabela Algumas linguagens de programa‡Æo tˆm uma instru‡Æo que permite apagar todos os registos de uma tabela. Digamos que pretendemos que a mesma se torne "vazia". (Se nÆo estou errado, a instru‡Æo "Zap" do clipper e do FoxPro) O Visual basic infelizmente nÆo tem uma instru‡Æo assim tÆo linear. Temos duas formas de o fazer. A 1¦ ‚ utilizar um ciclo For....Next e executar uma instru‡Æo de Delete por cada registo lido. A 2¦ que me parece mais f cil e l¢gica ‚ utilizar uma instru‡Æo SQL, como o exemplo a seguir documenta. Utilizamos a nossa Base de Dados "Amigos" dos tutoriais para fazer o teste. No Form "frmpessoal", acrescenta um botÆo com a linha de c¢digo que se segue: Dim strSQL As String strSQL = "DELETE FROM pessoal WHERE codigo <> 0 " DBenc.Execute strSQL Pessoal ‚ o nome da tabela na base de dados. Codigo ‚ a chave principal, £nica sem duplica‡Æo, e por op‡Æo nunca ser  igual a 0 (zero). Por isso nesta instru‡Æo dissemos-lhe para "DELETE" apagar todos os registos cujo codigo fosse diferente de zero. DBenc, ‚ a Base de Dados. 22) Client/Server VS. File Server Client/Server, refere-se a pelo menos duas entidades separadas, um Cliente e o Servidor. O Client, ‚ um computador com o qual o utilizador interage, o Server, ‚ o computador que aceita os pedidos de um ou mais clientes e envia respostas. Tudo isto nÆo ‚ nem mais nem menos que comunica‡Æo. File/Server, refere-se ao conjunto de um ou mais computadores que partilham recusrsos de um computador central chamado File Server. Por exemplo, se abrires um documento residente no disco do servidor, o cliente abre o documento, carrega-o para a sua mem¢ria e mostra-o ao utilizador. Todo o trabalho ocorre no cliente. Operando uma aplica‡Æo de Base de Dados num File/Server O Microsoft Jet abre a Base de Dados de uma forma simples em termos de tempo e recursos O Microsoft Jet DLL corre na tua esta‡Æo de trabalho e recolhe informa‡äes das tabelas da mesma O Microsoft Jet lˆ os detalhes da tabela para a mem¢ria da tua esta‡Æo de trabalho, como numero de campos,tipo, indices disponiveis e informa‡Æo acerca da posi‡Æo da 1¦ p gina de dados Uma c¢pia do Microsoft Jet lˆ para a tua esta‡Æo de trabalho um registo tornando-o acessivel para a tua aplica‡Æo. Operando uma aplica‡Æo de Base de Dados num Client/Server Como nos pontos 1 e 2 o Microsoft Jet abre as Bases de Dados, recolhe alguma informa‡Æo dela e fixa a sua estrutura na mem¢ria da esta‡Æo de trabalho local. Quando o Microsoft lˆ a tabela, vˆ que h  um Link e tenta criar uma conec‡Æo com o servidor. Esta opera‡Æo pose ser demorada. Quando o Servidor recebe o pedido de conec‡Æo, reserva mem¢ria e outros recursos e prepara-se para subsquentes pedidos O Microsoft Jet emite um pedido patra o servidor O Servidor retorna o pedido do Microsoft Jet tornando-o acessivel para a aplica‡Æo do cliente. As vantagens do Client/Server Opera‡äes mais robustas e fidedignas, porque uma £nica Base de Dados servidora interage, em vez de multiplas c¢pias Melhor escalabilidade Melhora de opera‡äes, especialmente se as esta‡äes de trabalho sÆo computadores com pouca mem¢ria e lentos Redu‡Æo do tr fico na rede Redu‡Æo das missäes criticas como backups, recupera‡äes, etc. 23) Centrar um Form no ecran Aproveitando o nosso projecto de amigos, codific mos o evento Load() da seguinte forma: Private Sub Form_Load() Dim iLeft As Integer Dim iTop As Integer iLeft = (Screen.Width / 2) - (frmamigos.Width / 2) iTop = (Screen.Height / 2) - (frmamigos.Height / 2) frmamigos.Move End Sub Desta maneira simples, sempre que o Form ‚ carregado, ele fica sempre centrado no ecran, independentemente da resolu‡Æo. Mas se quizermos que a nossa c¢digo de cima possa ser aplicado a todas as situa‡äes, evitando assim escrever linhas de c¢digo, fazendo somente Copy e Paste para o evento Load() de todos os Form's, utilizamos o c¢digo que se segue. With Me iLeft = (Screen.Width / 2) - (.Width / 2) iTop = (Screen.Height / 2) - (.Height / 2) .Move iLeft, iTop End With 24) Bookmark Se pretendes, no decurso de um determinado projecto, marcar um registo de uma tabela, usas a instru‡Æo seguinte: No (General) (Declarations) do Form, crias uma variavel tipo string da seguinte forma: Dim marca As String marca = tblami.Bookmark Quando pretenderes situares-te no referido registo basta fazeres: tblami.Bookmark = marca Call mostrarBD O registo marcado aparece no Form 25) API's API, significa Application Programming Interface, e tem para cima de 1000 fun‡äes que podem ser usadas pelo Visual Basic ou por qualquer outra linguagem de programa‡Æo que corra em Windows. Apesar de haver muitos fun‡äes que podes utilizar, somente algumas delas sÆo verdadeiramente uteis. Os componentes que afectam o sistema operativo de 32 Bits, sÆo 3 DLL's, que suportam inteiramente todo o sistema operativo. User32.dll - Sistemas de menus, interface com o urilizador e a maioria dos componentes visuais Kernel32.dll - Mem¢ria e gestÆo de recursos GDI32.dll - Painting, gr ficos, desenhos, etc. A primeira coisa a fazer se pretendes utilizar fun‡äes API, ‚ declar -las em Visual Basic. Fazes isto, utilizando o comando Declare. Eis 2 exemplos Declare Function GetWinFlags Lib "Kernel" () As Long Declare Sub UpdateWindow Lib "User" (ByVal hWnd As Integer) As declara‡äes podem ser colocadas em ficheiros .BAS. A fun‡Æo Declare informa o Visual Basic em que DLL particular se encontram as fun‡äes que necessitamos, que tipo de parƒmetros sÆo necess rios. A diferen‡a entre um procedimento Function e Sub, ‚ que o primeiro retorna um valor, ao contr rio do segundo. A seguir ao Declare Function, vem o nome da fun‡Æo, seguido do comando Lib que indica ao Visual Basic em que ficheiro DLL ou EXE se encontra a fun‡Æo. Finalmente o tipo de valores retornados a seguir   palavra AS. Para chamar uma API dentro de um programa Visual Basic, basta fazˆ-lo com se se tratasse de uma fun‡Æo normal. Para usar o API Text Viewer, seleccionas Add-Ins, Api-Viewer. Seleccionas API Text Viewer. Aparece-te uma caixa de texto e clicas em File/Load Text File do menu. Esxolhes WIN32API.TXT. Depois de ser carregado este ficheiro de texto, tens acesso de uma enorme lista de API's do Windows dispon¡veis. Podes seleccionar um ou mais destes Item's e eles serÆo passados para uma janela inferior. Quando terminares fazer Copy (para o Clipboard), e Paste ou simplesmente inserir directamente para um ficheiro .BAS. 26) Procurar uma string numa ListBox Vamos come‡ar um novo projecto "Standard.EXE". No Form, inserimos uma ListBox com a propriedade Name=lstcapitais Criamos um procedimento capitais. No evento Form_Load(), fazemos o Call capitais, para adicionar os respectivos itme's   ListBox. Criamos um Modulo .Bas, ao qual adicionamos uma fun‡Æo API, chamada SendMessage, e uma vari vel constante LB_FINDSTRING com valor inicial em hexadecimal 399. Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const LB_FINDSTRING = &H18F Private Sub capitais() With lstcapitais .AddItem "Lisboa" .AddItem "Porto" .AddItem "Coimbra" .AddItem "Santarem" .AddItem "Guimaraes" .AddItem "Guarda" .AddItem "Faro" .AddItem "Beja" .AddItem "Evora" .AddItem "Braga" .AddItem "Funchal" End With End Sub Adicioamos um objecto CommandButton com a propriedade Name=cmdProcura e Caption=Procurar, ao qual adicion mos o seguinte c¢digo ao evento Click: Private Sub cmdProcura_Click() Dim strSearch As String Dim intPos As Integer strSearch = InputBox$("Digite a String:", "Procurar") With lstStates If strSearch = "" Then .ListIndex = 0 Else intPos = SendMessage(.hwnd, _ LB_FINDSTRING, _ -1, _ ByVal strSearch) If intPos >= 0 Then .ListIndex = intPos End If End If End With End Sub Clicando no botÆo procurar, digitamos a String, que pretendemos e ser  assinalada a string igual ou maior ao que digit mos. 27) Adicionat Tabs a uma ListBox O Objecto ListBox Standard que vem com o Visual Basic, nÆo contempla colunas. Podemos no entanto ultrapassar o problema utilizando a mesma fun‡Æo API do Windows, que utiliz mos na dica anterior "SendMessage()". No modulo .Bas adicionamos outra vari vel constante: Public Const LB_SETTABSTOPS = &H192 No evento Form_Load() digitamos o seguinte c¢digo: Private Sub Form_Load() Dim lngRet As Long LngRet = SendMessage(lstcapitais.hwnd, LB_SETTABSTOPS, 1, 40&) Call Capitais End Sub Private Sub capitais() With lstcapitais .AddItem "Lisboa" & vbTab & "Estremadura" .AddItem "Porto" & vbTab & "Douro" .AddItem "Santarem" & vbTab & "Ribatejo" .AddItem "Faro" & vbTab & "Algarve" End With End Sub 28) Fun‡Æo GetDriveType32 Considero esta fun‡Æo com uma enorme importƒncia, pois chama a aten‡Æo para as seguran‡as dos dados que se devem fazer com regularidade e que poucos utilizadores fazem. Criamos um objecto ComboBox com a propriedade Name=cboDrive, e uma TextBox com a propriedade Name=txtDriveType No evento FormLoad() fazemos o Call ao procedimento cboDriveLoad(). Private Sub cboDriveLoad() Dim intLoop As Integer For intLoop = 65 To 90 ' As letras do alfabeto adicionadas   ComboBox cboDrive.AddItem Chr$(intLoop) Next intLoop End Sub Private Sub cboDrive_Click() Dim lngType As Long lngType = GetDriveType32(cboDrive.Text & ":\") Select Case lngType Case DRIVE_REMOVABLE txtDriveType = "Disco Removivel" Case DRIVE_FIXED txtDriveType = "Disco Duro" Case DRIVE_CD_ROM txtDriveType = "CD-ROM " Case Else txtDriveType = "Desconhecido, ou NÆo Existente " End Select End Sub 29) ActiveX Control A imagem que mostramos em cima e que vamos chamar de "Spinner", ‚ uma "jun‡Æo" de dois objectos, uma caixa de texto e uma barra de deslocamento vertical. O objectivo ‚ incrementar ou decrementar valores num‚ricos que vÆo aparecer na caixa de texto, usando o rato em vez do teclado. Comecemos por criar um novo projecto "Standard.EXE", para nos aparecer um Form vazio. De seguida clicamos em File / Add Project / ActiveX Control. Nesta altura ficamos com dois projectos abertos e umas novas imagens cinzentas que nos aparecem na TollBox. Adicionamos uma TextBox cujo nome por defeito ‚ Text1, e um ScroolBar vertical dentro da TextBox. Fazemos Duplo-Click no ScroolBar vertical para introduzirmos no Evento_Change() a seguinte linha de c¢digo: text1.text = vscroll1.value Fechamos o 2¦ projecto, e passamos a ter acesso  s imagens que estavem "esbatidas" na ToolBox. Se clicarmos no objecto "UserControl1" e o desenharmos no Form do 1§ projecto. obteremos uma imagem semelhante   de cima. Pressiona F5 para correr o projecto e com o rato faz click nas setas inferior e superior do spinner. Acabaste de criar o teu 1§ controlo ActiveX. 30) Instru‡äes SQL SQl significa, Structured Query Language. NÆo ‚ uma linguagem de programa‡Æo, mas antes uma linguagem que pode ser utilizada em diversas linguagens como forma de obter determinado tipo de informa‡Æo de Base de Dados, de uma ou mais tabelas. Iremos basear os nossos exemplos na base de dados BIBLIO.MDB, que acompanha o CD-ROM do Visual Basic 5.0 Para um melhor entendimento iremos usar as palavras reservadas das instru‡äes SQL em letras MAIUSCULAS, nÆo que o Visual Basic o obrigue, mas porque ‚ um bom h bito de programa‡Æo. A instru‡Æo mais comum ‚ SELECT_FROM, e cont‚m duas partes: A sele‡Æo de colunas de uma ou mais tabelas A lista de uma ou mais tabelas que contˆm as colunas pretendidas Eis alguns exemplos de queries. Mas antes de executares estes exemplos, deves acrescentar um campo tipo date   tabela "Publishers", e preencheres esse campo com diferentes datas do ano 2001. Private Sub Command1_Click() Dim str As String Dim dyna As Recordset str = "SELECT * FROM authors WHERE [Year Born] > 1954" str = "SELECT * FROM publishers WHERE dtconst < #01/02/2001#" 'mm/dd/aaaa str = "SELECT * FROM publishers WHERE month(dtconst) < 05" 'mm Set dyna = DBEnc.OpenRecordset(str, dbOpenDynaset) dyna.Filter = "name like '*AMS*'" Set dyna = dyna.OpenRecordset(dbOpenDynaset) dyna.Filter = "name > 'a' And name < 'B'" Set dyna = dyna.OpenRecordset(dbOpenDynaset) dyna.Sort = "name DESC" Set dyna = dyna.OpenRecordset(dbOpenDynaset) dyna.MoveFirst Do Until dyna.EOF Print dyna![Name] dyna.MoveNext Loop End Sub Da tabela de Authors, selecciona todos os registos onde o campo Year Born seja superior ao ano 1954. Repara como deves escrever o nome do campo. Da tabela Publishers, selecciona todos os registo onde o campo dtconst seja menor que: Mes=2, Dia=1 Ano=2001 Da tabela Publishers, selecciona todos os registos onde o Mˆs do campo Dtconst seja menor que 5. Cria uma nova tabela tipo Dynaset a partir da tabela Publishers Coloca um filtro na nova tabela, para seleccionar somente os registos onde conste no campo Name a palavra AMS Cria uma nova tabela tipo Dynaset a partir da tabela dyna Coloca outro filtro na tabela criada de modo que s¢ apare‡am registos cujo campo Name comece por uma letra superior a "a" e inferior a "B". Cria uma nova tabela tipo Dynaset a partir da tabela dyna Ordena os registo por ordem Descendente do campo Name. O inverso seria ASC. Cria uma nova tabela tipo Dynaset a partir da tabela dyna Por fim uma pequena rotina para mostrar os registos finais seleccionados. CRITICA Para que serviu tudo aquilo que acab mos de fazer? Para nada, a menos que quando desenvolveres o teu projecto facilites o mesmo ao teu cliente, para que de cada vez que os valores sejam alterados, ele possa "mexer" no projecto, criar um novo execut vel e voltar a corrˆ-lo. EntÆo h  que transformar os valores fixos em valores vari veis que serÆo introduzidos no decorrer do programa. o que a seguir iremos fazer, atrav‚s de uma vari vel que cri mos e que cham mos: varSQL Dim varSQL As Date, ou As Integer, ou As String, dependendo da situa‡Æo. varSQL = Trim(varSQL) str = "SELECT * FROM authors WHERE [Year Born] >" & varSQL & "" varSQL = CDate(varSQL) str = "SELECT * FROM publishers WHERE dtconst < # " & varSQL & "#" str = "SELECT * FROM publishers WHERE month(dtconst) <" & varSQL & "" varSQL = "*" & varSQL & "*" dyna.Filter = "name like '" & varSQL & "'" Set dyna = dyna.OpenRecordset(dbOpenDynaset) Estes quatro exemplos refletem os de cima, mas de uma forma a que se possa operar segundo as indica‡äes do utilizador. 31) CommitTrans, BeginTrans, RollBack Imagina que o teu chefe, patrÆo, director de pessoal, te manda fazer om projecto em que pretende a altera‡Æo do vencimento de todos os funcion rios em +50% (???). Utilizando este processo, podes executar a tarefa sem problemas, em virtude das mesmas s¢ produzirem efeito ap¢s uma confirma‡Æo final dada pelo utilizador. BeginTrans - D  inicio ao processamento CommitTrans - Conclui a transac‡Æo RollBack - Repäe a situa‡Æo anterior, ou melhor, nÆo executa a transac‡Æo. Sub begintrans() wrk.BeginTrans With tblpes Do Until .EOF .Edit tbltit![VenciBas] = tbltit![VenciBas] * 1.5 .Update .MoveNext Loop If MsgBox("Confirma Altera‡äes ?", vbYesNo) = vbYes Then wrk.CommitTrans Else wrk.Rollback End If End With End Sub 32) Table, Dynaset, Snapshot Table - o tipo de tabela no seu conceito mais "puro", pois permite-te criar indices, para acederes directamente a um determinado registo, atrav‚s do m‚todo SEEK, e num ambiente de trabalho multiposto, sempre que actualizares, apagares ou criares um novo registo, todos os utilizadores tˆm acesso imediato a essas altera‡äes Neste tipo de tabelas nÆo podes usar o comando SELECT, nem podes agrupar tabelas de modo a criar uma unica. NÆo podes usar BOOKMARKs, criar filtros ou mesmo ordenar a tabela. Dynaset - Criada a partir de uma Table, nÆo pode fazer uso de indices, por isso nÆo se pode usar o m‚todo SEEK, para localiza‡Æo imediata de um registo, podes no entanto usar os m‚todos FindFirst, FindLast, FindNext e FindPrevios, para "navegar" . Podes usar o comando SELECT, criar filtros ordenar campos, e isto como resultado do conjunto de uma ou mais tabelas (tables). Snapshot - Semelhante ao Dynaset em termos de comportamento e propriedades, no entanto tem a particularidade de ser utilizada unicamente como forma de leitura (Read Only), nÆo podes actualizar/modificar os registos da mesma, ao contr rio da Dynaset, e isto porque os Snapshots sÆo uma c¢pia da tabela que ‚ criada na mem¢ria da tua esta‡Æo de trabalho. 33) StatusBar Form1.StatusBar1.Panels(1) = "MENSAGEM QUE QUERO TRANSMITIR" 34) Multiacesso Uma base de dados criada em Microsoft Access, ‚ por "defeito" criada em modo de partilha, isto ‚, permite que numa situa‡Æo de rede ser acedida por mais que um computador ao mesmo tempo. Para abertura das tabelas, serÆo usados determinados parƒmentros que iremos de fenir de seguida de modo a permitir esta situa‡Æo: Set db = ws.OpenDatabase(App.Path & "\basedados.mdb") Set tblpart = db.OpenRecordset("Tabela", , dbOptimistic) Na 1¦ linha abrimos a nossa Base de dados, indicando o respectivo caminho, ou localiza‡Æo. Na 2¦ linha, definimos e abrimos a tabela de nome "Tabela", cuja sintaxe ‚ a seguinte, e que iremos explicar de seguida. Set recordset = Objecto(OpenRecordset(Tabela, Tipo, Op‡äes, lockedit) Tipo: dbOpenTable - Abre um objecto tipo Recordset dbOpenDynamic - Abre um objecto tipo dinamico semelhante ao ODBC dynamic cursor dbOpenDynaset - Abre um objecto tipo Dynaset dbOpenSnapShot - Abre um objecto tipo Snapshot dbOpenForwardOnly - Abre um objecto tipo forward Op‡äes: dbAppendOnly - Permite somente adicionar novos registos dbSQLPassPhrough - Passa uma instru‡Æo SQL para o Microsoft Jet-connected ODBA dbSeeChanges - Gera uma rotina de erro se houver uma tentativa de alterar um registo editado por outro utilizador dbDenyWrite - Evita que outros utilizadores modifiquem ou editem registos dbDenyRead - Evita que outros utilizadores leiam registos da tabela dbForwardOnly - Impede consultas a registos anteriores dbReadOnly - Impede os utilizadores de alterar registos dbRunAsync - Corre uma query assincrono dbExecuteDirect - Corre uma query "saltando" o SQLprepare, e chamando directamente o SQLExecDirect dbInconsistent - Permite actualiza‡äes inconsistentes, somente em Dynaset e SnapShot dbConsistent - Permite somente actualiza‡äes consistentes para a mesma situa‡Æo anterior Lockedit: dbPessimistic - Determina um bloqueio ao registo assim que o m‚todo Edit, ocorre dbOptimistic - A p gina que contem o registo s¢ ‚ bloqueda quando ‚ utilizado o m‚todo Update Nas propriedaedes do LockEdit, podemos saber que tipo de bloquieo ‚ utilizado, conforme o valor boleano que retorna: Se for True, ser  um bloqueio Pessimistic Se for False, ser  do tipo Optimistic ------------------------------------------------------------------- ###@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\#### ####@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\### ### Montado em 2004 por Eliel Vieira - elielvieira03@yahoo.com ### ### Montado em 2004 por Eliel Vieira - elielvieira03@yahoo.com ### ### Montado em 2004 por Eliel Vieira - elielvieira03@yahoo.com ### ### Montado em 2004 por Eliel Vieira - elielvieira03@yahoo.com ### ### Montado em 2004 por Eliel Vieira - elielvieira03@yahoo.com ### ###@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\#### ####@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\### ### Fonte: http://www.truquesedicas.com/dicas/visual_basic/ ### ### Fonte: http://www.truquesedicas.com/dicas/visual_basic/ ### ### Fonte: http://www.truquesedicas.com/dicas/visual_basic/ ### ### Fonte: http://www.truquesedicas.com/dicas/visual_basic/ ### ### Fonte: http://www.truquesedicas.com/dicas/visual_basic/ ### ###@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\#### ####@@@$$$&&&***!!!+++???~~~~|||^^^^)))%%%///```(((''']]]---\\\### -------------------------------------------------------------------