Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB6: Verificação do “Idle Time” da Aplicação

O idle time é o tempo que uma aplicação não está a ser utilizada, estando no entanto ligada, quer seja um programa simples ou um sistema operativo. O idle time é utilizado, por exemplo, para iniciar o screensaver do sistema operativo mas pode ser utilizado para outros fins. Por exemplo se necessitarmos de fazer o logout automático de um utilizador caso este não esteja a utilizar a aplicação durante x segundos, temos de calcular o idle time. Mas existem com certeza mais aplicações.

   

Para calcular o idle time temos de utilizar uma API (Application Programming Interface) que nos irá verificar o tipo de mensagens encontradas num processo, como o movimento do rato ou o pressionar de uma tecla. Esse API é o GetQueueStatus() e para mais informações podem visitar o seguinte link MSDN GetQueueStatus()

   


' Declaração do API

Private Declare Function GetQueueStatus Lib "user32" (ByVal fuFlags As Long) As Long

   

' Definição das constantes de sistema

Private Const QS_KEY = &H1

Private Const QS_MOUSEMOVE = &H2

Private Const QS_MOUSEBUTTON = &H4

Private Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)

Private Const QS_INPUT = (QS_MOUSE Or QS_KEY)

   

Public blnCancel As Boolean

   

   

Esta função irá verificar o tempo em que não existem mensagens de um tipo seleccionado, permitindo  executar uma acção ou mostrar uma informação caso esse tempo tenha sido atingido. Neste exemplo irá ser usada uma mensagem de informação.

   

   

Public Sub CheckInputIdle(ByVal TimeOut_InSeconds As Long)

  Dim t As Long

 

  ' Atribui à variável t o valor do Time. O Timer representa

  ' o número de segundos que passou desde a meia-noite

  t = Timer

 

  ' Inicia o ciclo enquanto a variável blnCancel ser falsa

  Do While blnCancel = False

     

    ' Caso não exista actividade actualiza a variável t

    If GetQueueStatus(QS_INPUT) Then

        t = Timer

        DoEvents

    End If

   

    ' Caso tenha sido detectado que o tempo ultrapassou sai do ciclo

    If Timer - t >= TimeOut_InSeconds Then Exit Do

   

  Loop

 

  ' Notificação de que o tempo chegou ao fim

  If blnCancel = False Then

   

    MsgBox "A aplicação está sem actividade à " & Timer - t & " segundos.", vbInformation

   

    ' Para voltar a chamar esta verificação

    ' Call CheckInputIdle(10)                                                

  End If

 

End Sub

   

   

Finalmente a chamada da função no evento load do form e que neste caso irá mostrar uma mensagem passados 10 segundos

   

   

Private Sub Form_Load()

    Me.Show

    Call CheckInputIdle(10)

End Sub

   

   

Um exemplo simples que poderá ser adaptado às necessidades de cada aplicação para os mais diversos fins.

   

   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

ASP.NET: Gridview com Controlos nas Colunas

O controlo GridView é bastante usado em ASP.NET pois é muito versátil e simples de utilizar. Existem inúmeras propriedades que permitem com duas ou três alterações tornar esteticamente muito agradável e funcionalmente muito robusto. Possui ainda alguns poderosos wizards que permitem executar diversas tarefas, como por exemplo, associar a fontes de dados ou formatar a visualização.

     

No entanto algumas operações têm de ser efectuadas através do código para permitir uma manipulação de informação correcta.

     

Neste exemplo pretende-se mostrar como adicionar DropDownLists a colunas, adicionar-lhes informação e verificar os dados seleccionados.

     

Para começar adiciona-se uma GridView a uma nova página e no canto superior direito temos um wizard que nos permite realizar algumas tarefas “GridView Tasks”. Vamos seleccionar “Edit Columns”.

     

Nesta janela podemos adicionar novas colunas e modificar as existentes. Para o exemplo vamos adicionar duas colunas BoundField (associadas a um campo) e duas colunas TemplateField (onde iremos colocar as DropDownLists). Nas colunas BoundField colocamos a seguinte informação (figura 1):

     

Coluna1

HeaderText = "ID"

DataField = "id"

     

Coluna2

HeaderText = "Nome"

DataField = "nome"

     

     

(figura 1)

     

Para terminar removemos a selecção “Auto-generate fields” para que a GridView não crie as colunas automaticamente.

     

De seguida, e ainda no GridView Tasks seleccionamos “Edit Template”. No menu de Templates seleccionamos o ItemTemplate de cada coluna (2 e 3) e adicionamos uma DropDownList da Toolbox (figura 2). Para terminar seleccionamos “End Template Editing".

     


(figura 2)

     

Adicionamos um Botão (asp:button) e podemos ainda escolher a opção “Auto Format” e escolher um formato aleatoriamente a nosso gosto. No final o código ficará semelhante ao seguinte:

     

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

   

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<div>

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4"

        Font-Names="Arial" Font-Size="10pt" ForeColor="#333333" GridLines="None" Width="352px">

        <Columns>

            <asp:BoundField DataField="id" HeaderText="ID" />

            <asp:BoundField DataField="nome" HeaderText="Nome" />

            <asp:TemplateField>

                <ItemTemplate>

                    <asp:DropDownList ID="DropDownList2" runat="server">

                    </asp:DropDownList>

                </ItemTemplate>

            </asp:TemplateField>

            <asp:TemplateField>

                <ItemTemplate>

                    <asp:DropDownList ID="DropDownList1" runat="server">

                    </asp:DropDownList>

                </ItemTemplate>

            </asp:TemplateField>

        </Columns>

        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />

        <EditRowStyle BackColor="#999999" />

        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />

        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />

        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />

    </asp:GridView>

    <br />

    <asp:Button ID="Button1" runat="server" Text="Verificar" Height="32px" Width="104px" />

    <br />

</div>

</form>

</body>

</html>

     

No código VB associado a esta página vamos colocar informação dinamicamente, podendo ser alterada para uma base de dados. Para este exemplo vamos utilizar um DataTable

     

     

Imports System.Data

     

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

     

    ' Verifica se é a primeira vez que a página é actualizada

    ' (para não repetir sempre que se actualize)

    If Not Page.IsPostBack Then

     

      Dim strNomes() As String = {"Jorge Miguel", "João Alexandre", _

                      "Paulo Jorge", "Rui Sousa", "Carlos Andrade"}

     

      ' Cria uma nova DataTable e adiciona duas colunas

      Dim dt As New DataTable

      dt.Columns.Add(New DataColumn("id", GetType(Integer)))

      dt.Columns.Add(New DataColumn("nome", GetType(String)))

     

      ' Adiciona as DataRows (linhas)

      Dim dr As DataRow

      For x As Byte = 0 To strNomes.Length - 1

        dr = dt.NewRow()

        dr.Item("id") = x.ToString

        dr.Item("nome") = strNomes(x).ToString

        dt.Rows.Add(dr)

      Next

     

      ' Define a DataTable criada com DataSource (fonte de dados da Gridview)

      Me.GridView1.DataSource = dt

      Me.GridView1.DataBind()

     

    End If

     

  End Sub

     

     

No evento Row Created, ou seja, sempre que cada linha da GridView é criada irá correr este evento. Neste evento adicionasse a informação às DropDownList

     

     

  Protected Sub GridView1_RowCreated(ByVal sender As Object, _

    ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

     

    ' Verifica se o item criado é do tipo DataRow

    ' e não outro como Header ou Footer

    If e.Row.RowType = DataControlRowType.DataRow Then

     

      Dim strMeses() As String = {"", "Janeiro", "Fevereiro", _

      "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", _

      "Setembro", "Outubro", "Novembro", "Dezembro"}

     

      ' Procura pela DropDownList

      Dim ctrl1 As DropDownList = e.Row.FindControl("DropDownList1")

     

      ' Preenche a DropDownList1 com os meses e selecciona um item em branco

      ctrl1.DataSource = strMeses

      ctrl1.DataBind()

      ctrl1.SelectedIndex = 0

     

      ' Preenche a DropDownList2 com os anos

      Dim ctrl2 As DropDownList = e.Row.FindControl("DropDownList2")

      ctrl2.Items.Add("")

      ' Ciclo que irá adicionar os anos em ordem decrescente

      For x As Int16 = 20 To 0 Step -1

        ctrl2.Items.Add(Year(DateTime.Now) - 20 + x)

      Next

      ctrl2.SelectedIndex = 0

     

    End If

     

  End Sub

     

     

Finalmente um ciclo executado através do botão de comando que irá mostrar de uma forma simples as selecções efectuadas

     

     

Protected Sub Button1_Click(ByVal sender As Object, _

          ByVal e As System.EventArgs) Handles Button1.Click

     

    ' Percorre todas as linhas da GridView

    For Each row As GridViewRow In GridView1.Rows

     

      ' Verifica na linha actual qual o mês seleccionado

      Dim ctrl1 As DropDownList = row.FindControl("DropDownList1")

      Dim mes As String = ctrl1.SelectedIndex

     

      ' Verifica na linha actual qual o ano seleccionado

      Dim ctrl2 As DropDownList = row.FindControl("DropDownList2")

      Dim ano As String = ctrl2.SelectedValue

     

      ' Mostra a informação no ecra

      Response.Write(ano.ToString + " " + mes.ToString + "<br>")

    Next

     

  End Sub

     

     

     

(figura 3)

     

O objectivo deste exemplo é mostrar como adicionar controlos a uma GridView e como manipula-los. Neste caso colocamos informação apenas mas poderiamos seleccionar com base em informações da base de dados ou utilizar outros controlos nas colunas.

     

     


PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

VB.NET: Implementar Pesquisa numa Listview

A ListView é um controlo bastante utilizado para mostrar informação de várias fontes de dados, sejam elas bases de dados, ficheiros xml ou mesmo ficheiros de texto. Existem outros controlos que possíbilitam este tipo de visualização, como é o caso da datagridview, listbox, etc, mas por ser simples de utilizar e muito versátil a listview é ainda bastante utilizada.

   

A pesquisa de informação é algo muito prático em qualquer controlo, principalmente quando está disponível muita informação. O método mais aconselhável para fazer, principalmente quando se utiliza bases de dados, é filtrar a informação que se adiciona à lista através de uma select query. No entanto, e por diversos motivos, é por vezes necessário implementar um pesquisa na própria lista.

   

No seguinte exemplo vou mostrar uma implementação simples de uma pesquisa, colocando o item encontrado no topo da lista, preenchendo também a lista com alguns dados aleatórios.

   



Para a execução de uma pesquisa simples pode-se utilizar a função FindItemWithText da listview, mas esta apenas pesquisa no início do texto. Exemplo:

   

   

Me.ListView1.FindItemWithText("Texto A Pesquisar", True, 0)

   

   

Para o exemplo vamos preencher e configurar a lista no evento Form Load e declarar uma variável privada:

   

   

' lastIndex serve para identificar a posição (index) do ultimo item encontrado para

' não encontrar sempre o mesmo. Sem isto iria aparecer sempre o primeiro a encontrar

Private lastIndex As Integer

   

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  Dim str() As String = {"visual", "basic", "exemplo", "dados", "vbtuga", "teste",   "vb.net", _

                                              "pesquisa", "studio", "listview", "microsoft", "2005"}

  Dim item As ListViewItem

  Dim rnd As New Random()

   

   

  ' Define as colunas e propriedades da lista

  With Me.ListView1

    .Columns.Add("ID", 50, HorizontalAlignment.Left)

    .Columns.Add("Item", 100, HorizontalAlignment.Left)

    .Columns.Add("Descrição (dados aleatórios)", 250, HorizontalAlignment.Left)

    .FullRowSelect = True

    .GridLines = True

    .View = View.Details

  End With

   

   

  ' Inicia um ciclo que irá preencher a listview

  For x As Byte = 0 To 100

    item = New ListViewItem

    item.Text = x.ToString

    item.SubItems.Add("Item " + x.ToString)

   

    ' Selecciona aleatóriamente três valores do array

    ' criado para permitar pesquisas diferentes

    Dim arrayLenght As Byte = str.Length - 1

    Dim itemString As String = _

              String.Format("{0} {1} {2} {3}", _

              str(rnd.Next(arrayLenght)), str(rnd.Next(arrayLenght)), _

              str(rnd.Next(arrayLenght)), str(rnd.Next(arrayLenght)))

       item.SubItems.Add(itemString)

   

       ' Adiciona o item à lista

      Me.ListView1.Items.Add(item)

    Next

   

End Sub

   

   

Depois vamos adicionar a seguinte função que irá ser a responsável pelo ciclo nos items/sub-items:

   

   

''' <summary>

''' Pesquisa por um item numa listview e devolve o ListViewItem

''' </summary>

''' <param name="lvName">Nome da ListView</param>

''' <param name="lvSearchString">Texto a procurar</param>

Private Function FindListViewText(ByVal lvName As ListView, ByVal lvSearchString As String) As ListViewItem

   Dim result As ListViewItem = Nothing

   

   ' Ciclo nos items da lista

   For Each item As ListViewItem In lvName.Items

   

     ' Ciclo nos sub items da lista

     For Each subitem As ListViewItem.ListViewSubItem In item.SubItems

   

        ' Verifica se o texto de pesquisa existe e se o index é diferente

        If subitem.Text.ToUpper.Contains(lvSearchString.ToUpper) And lastIndex <>  item.Index Then

           lastIndex = item.Index

           Return item

        End If

     Next

   Next

   

  ' Caso não encontre

  lastIndex = 0

  Return result

End Function

   

   

Finalmente o botão responsável por iníciar a pesquisa:

 

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

   

  ' Pesquisa na listview com base na informação de uma TextBox

  Dim itemSearch As ListViewItem = FindListViewText(Me.ListView1,     Me.TextBox1.Text.ToString)

   

  ' Caso tenha encontrado o item

  If itemSearch IsNot Nothing Then

   

    ' Posiciona a lista indicando a selecção

    Me.ListView1.TopItem = itemSearch

  Else

   

    'Caso não encontre mostra uma mensagem de informação

    Dim str As String = "Não foi encontrado nenhum item na lisview!"

    MessageBox.Show(str, "Pesquisa na ListView", MessageBoxButtons.OK, MessageBoxIcon.Information)

  End If

   

End Sub

   

   

Este é apenas um pequeno exemplo podendo-se depois acrescentar funcionalidades como por exemplo, colorir a linha encontrada, apagar o item, etc, etc.

 



PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico