VB - Criando um controle Customizado com controles vinculados


Vamos criar um controle customizado usando os controles vinculados do VB 6.0. Nosso primeiro passo será iniciar um novo projeto no VB6 do tipo ActiveX Control.
Chame o projeto e o UserControl de procuraDB e a seguir inclua um botão de comando no UserControl. Altere sua propriedade Caption para ... e defina a fonte para Arial com tamanho 12 e negrito.

As propriedades Width e Heigth deverão ser definidas ambas como iguais a 350.

Após isto salve ambos o UserControl e projeto.

Vamos agora dar vida ao controle definindo propriedades e eventos. Nosso controle terá seis propriedades e dois eventos que vamos declarar.

Abra a janela de código (Code Window) para o controle e inclua o seguinte código na seção General Declarations do projeto:

A próxima etapa é definir as propriedades para isto No menu Tools opção Add Procedure vamos definir a propriedade DataBaseName conforme figura abaixo:

Quando você clicar no botão OK estará pronto para definir as propriedades  Let e Get conforme abaixo:

Public Property Get DataBaseName() As Variant
   DataBaseName = frmProcura.Data1.DataBaseName
End Property
Public Property Let DataBaseName(ByVal vNovoValor As Variant)
    strNomeDB = vNovoValor
    frmProcura.Data1.DataBaseName = strNomeDB
End Property
Note que estou usando um formulário chamado de frmProcura e um controle de dados Data1 que serão criados e vistos a seguir.

Agora vamos definir a propriedade Connect para o projeto conforme abaixo:

Public Property Get Connect() As Variant
   Connect = frmProcura.Data1.Connect
End Property

Public Property Let Connect(ByVal vNovoValor As Variant)
    strConexao = vNovoValor
    frmProcura.Data1.Connect = strConexao
End Property

Da mesma forma defina a propriedade RecordSource :

Public Property Get RecordSource() As Variant
    RecordSource = frmProcura.Data1.RecordSource
End Property

Public Property Let RecordSource(ByVal vNovoValor As Variant)
    strNomeRS = vNovoValor
     frmProcura.Data1.RecordSource = strNomeRS
End Property

 

Repetindo os passos anteriores vamos definir as propriedades : ListField , BoundColumn e BoundText

Note que para as propriedades BoundColumn e BoundText estou usando o controle DBList1.

Public Property Get ListField() As Variant
    ListField = frmProcura.DBList1.ListField
End Property

Public Property Let ListField(ByVal vNovoValor As Variant)
     strListField = vNovoValor
     frmProcura.DBList1.ListField = strListField
End Property
Public Property Get BoundColumn() As Variant
      BoundColumn = frmProcura.DBList1.BoundColumn
End Property
Public Property Let BoundColumn(ByVal vNovoValor As Variant)
       strBoundColumn = vNovoValor
       frmProcura.DBList1.BoundColumn = strBoundColumn
End Property
Public Property Get BoundText() As Variant
    BoundText = frmProcura.DBList1.BoundText
End Property
Public Property Let BoundText(ByVal vNovoValor As Variant)
     frmProcura.DBList1.BoundText = vNovoValor
End Property

 

Vamos agora criar as rotinas que irão gerenciar o controle. A primeira rotina será definida para salvar o estado das propriedades do controle ; com isto teremos certeza de que os valores definidos em tempo de projeto estarão disponíveis em tempo de execução. Inclua o código abaixo nos eventos UserControl_WriteProperties. e UserControl_ReadProperties

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
With PropBag
  strNomeDB = .ReadProperty("DataBaseName")
  strConexao = .ReadProperty("Connect")
  strNomeRS = .ReadProperty("RecourdSource")
  strListField = .ReadProperty("ListField")
  strBoundColumn = .ReadProperty("BoundColumn")
End With
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
 With PropBag
     .WriteProperty "Connect", strConexao, ""
     .WriteProperty "DataBaseName", strNomeDB, ""
     .WriteProperty "RecordSource", strNomeRS, ""
     .WriteProperty "ListField", strListField, ""
     .WriteProperty "BoundColumn", strBoundColumn, ""
  End With
 End Sub

Vamos usar os eventos Initialize e Resize para ajustar e definir o tamanho do controle.

Private Sub UserControl_Initialize()
UserControl.Height = 350
UserControl.Width = 350
End Sub

Private Sub UserControl_Resize()
  With Command1
     .Left = 1
     .Top = 1
     .Width = UserControl.Width
     .Height = UserControl.Height
  End With
End Sub

Ufa,  estamos quase acabando de definir o controle. Vamos criar um rotina chamada LoadProperties que irá receber os valores das variáveis do controle par ao formulário:(Esta rotina tem escopo private de forma que os usuários do controle não poderão acessá-la)

Private Sub LoadProperties()
  frmProcura.Data1.Connect = strConexao
  frmProcura.Data1.DataBaseName = strNomeDB
  frmProcura.Data1.RecordSource = strNomeRS
  frmProcura.DBList1.ListField = strListField
  frmProcura.DBList1.BoundColumn = strBoundColumn
  frmProcura.Data1.Refresh
  frmProcura.DBList1.Refresh
End Sub

Bem , agora creio que falta inclui código no evento Click do botão de comando do nosso controle para fazê-lo funcionar.

Private Sub Command1_Click()
Dim vartemp As Variant
LoadProperties
frmProcura.Show vbModal
If frmProcura.CloseFlag = True Then
  vartemp = frmProcura.SelectedValue
  Unload frmProcura
  RaiseEvent Selected(vartemp)
Else
  Unload frmProcura
  RaiseEvent Cancel
End If
End Sub
Vamos entender o que fizemos aqui:

Quando o usuário clicar no botão o código será executado.

  • Definimos a variável vartemp como do tipo Variant
  • Carregamos as propriedades do controle
  • Exibimos o formulário para procura

Dependendo do valor da variável CloseFlag do formulário iremos disparar os eventos : SelectedValue ou Cancel.

Para terminar de vez com o código do nosso controle vamos definir duas rotinas que serão chamadas pelos controles:

Public Sub returnedSelected()
   RaiseEvent selected(frmProcura.DBList1.BoundText)
End Sub

Public Sub returnCancel()
   RaiseEvent cancel
End Sub

Pronto , pode salvar o projeto do controle que ele já esta quase pronto para ser usado. Vamos criar a interface com o usuário que irá exibir a lista com os valores a procurar.  No projeto do controle inclua no novo formulário (form1) e mude seu nome para frmProcura.

Nota :O nome dado ao projeto foi buscaDB. Ao gerar a OCX ao procurar pelo componente na barra de ferramentas será este o nome do componente.

A seguir inclua os seguintes componentes no form:

Não se preocupe em posicionar os controles no formulários , faremos isto em tempo de execução.

Na seção General Declarations do formulário defina as variáveis como abaixo:

Option Explicit

Private blnCloseFlag As Boolean
Private varSelectValue As Variant

Precisamos definir a variável CloseFlag (lembra dela). No menu Tools|Add Procedure inclua o seguinte código:

Public Property Get CloseFlag() As Variant
  CloseFlag = blnCloseFlag
End Property
Public Property Let CloseFlag(ByVal vNovoValor As Variant)
    blnCloseFlag = vNovoValor
End Property

Agora vamos atacar a propriedade SelectedValue definindo seu código:

Public Property Get SelectedValue() As Variant
   SelectedValue = varSelectValue
End Property
Public Property Let SelectedValue(ByVal vNovoValor As Variant)
    varSelectValue = vNovoValor
End Property

Estas propriedades são usadas para passar informação do formulário para o controle.

Passemos para o evento Load do formulário - frmProcura ; nele defina o código abaixo:

Private Sub Form_Load()
 Me.Caption = "Selecione um Registro: "
 Data1.Refresh
 DBList1.Refresh
End Sub

Aqui apenas definimos o título do formulário e damos um refresh nos controles DBList e Data Control.

Vamos a parte onde iremos posicionar os controles no formulário via código. No evento Resize do formulário inclua o código que faz isto:

No evento click do botão de comando inclua o código abaixo:

Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0   ' ok
   CloseFlag = True
   varSelectValue = frmProcura.DBList1.BoundText
Case 1   ' cancela
   CloseFlag = False
End Select
If Trim(varSelectValue) = "" Then
   CloseFlag = False
 End If
 
 Me.Hide
End Sub

E para encerrar vamos definir o código nos eventos Click e DblClick do controle DBList do formulário - frmProcura:

Private Sub DBList1_Click()
  SelectedValue = DBList1.BoundText
End Sub
Private Sub DBList1_DblClick()
  Command1_Click 0
End Sub

Finalmente acabamos o código para o controle , só falta testar...

Para você ter uma visão do projeto abaixo temos a janela exibindo todos os componentes do mesmo:

O nosso controle é mostrado abaixo a esquerda:  o botão com os 3 pontos...

Antes de continuar vamos gerar o controle OCX; no menu File selecione Make ProcuraDB.OCX

Agora temos tudo pronto :  nosso controle ActiveX (OCX) - procuraDB.ocx. Vamos então testar o componente...

Inclua um novo projeto do tipo StandardEXE ao grupo (selecione o menu File|Add Project...)

No formulário padrão inclua 2 caixas de texto um componente data control e o nosso componente buscaDB. Para fazer isto abra o menu Projects|Components e selecione o componente conforme figura abaixo.

O jeitão do formulário para testar o controle será o seguinte :

Inclua o código abaixo no formulário :

Option Explicit
Private Sub procuraDB1_Selected(SelectValue As Variant)
    '
    Data1.Recordset.FindFirst Text1.DataField & "=" & SelectValue
    '
End Sub
Private Sub Form_Load()
    '
    ' define os valores do data control
    Data1.DatabaseName = "C:\Microsoft Visual Studio\VB98\NWIND.MDB"
    Data1.RecordSource = "Products"
    '
    ' define os valores para vinculação de dados das caixas de texto
    Text1.DataField = "ProductID"
    Text2.DataField = "ProductName"
    Text3.DataField = "UnitPrice"
    '
    ' define propriedades do nosso controle
    procuraDB1.DatabaseName = Data1.DatabaseName
    procuraDB1.RecordSource = "SELECT * FROM Products ORDER BY ProductName"
    procuraDB1.BoundColumn = "ProductID"
    procuraDB1.ListField = "ProductName"
    procuraDB1.Refresh
    '
    ' mostra o nome da fonte de dados no titulo do formulário
    Me.Caption = Data1.RecordSource
    '
End Sub

Ao executar o projeto e clicar no botão correspondente ao nosso controle teremos :]

Agora basta selecionar um registro que o mesmo será atribuído as caixas de texto.

Com isto você criou um componente OCX que pode usar em seus projetos. Embora limitado creio que você entendeu os principais passos na criação de um componente OCX no VB. O resto é com você...

Pegue os códigos prontos aqui : dbfind.zip

Até o próximo artigo VB...

Nota: Este artigo foi adaptado do original em : http://www.softlookup.com/tutorial/data_vb/ch12.asp


Macoratti