Imagine o seguinte cenário, você possui uma aplicação que deve consumir um WebService, porém você não sabe qual será a quantidade de dados que serão retornados por este WebService.
Pensando nesta situação desenvolvi uma rotina que recebe um arquivo XML do WebService e cria em tempo de execução um formulário de acordo com as informações recebidas do mesmo.
Este algoritmo é apenas uma idéia de como pode ser realizada tal tarefa, vocês perceberão que nela não estão contempladas nenhuma informação de validação de tipo de dados e nem de valores mas isto pode ser facilmente implementado utilizando a mesma regra.
Para mudar um pouco a estrutura de programação, neste post estou utilizando o modelo de objetos do Word, para quem quiser usar outras Ferramentas altere ActiveDocument.Path por ThisWorkbook.Path ou ActiveWorkbook.Path (Excel) ou ActivePresentation.Path (PowerPoint)
O Primeiro passo é a criação do arquivo XML para leitura de nossa rotina (que será o retorno do WebService), para teste usei este arquivo.
<?xml version='1.0' ?> <form> <control type='Forms.Label.1' caption='Grupo' left='5' top='5' width='100'/> <control type='Forms.ComboBox.1' left='60' top='5' width='100'> <item text='Ativo'/> <item text='Passivo'/> <item text='Estrutura'/> <item text='Indicadores'/> <item text='Resultado'/> </control> <control type='Forms.Label.1' caption='Descricao' left='5' top='30' width='100'/> <control type='Forms.TextBox.1' left='60' top='30' width='150'/> <control type='Forms.Label.1' caption='TAG' left='5' top='55' width='100'/> <control type='Forms.TextBox.1' left='60' top='55' width='150' text='<#descricao#>'/> <control type='Forms.Label.1' caption='VALOR' left='5' top='80' width='100'/> <control type='Forms.TextBox.1' left='60' top='80' width='150'/> </form>
Para gerar este arquivo utilize a seguinte Rotina
Sub CriaXML()
'Desenvolvido por Bruno.Leite
'bruno_silva_leite@yahoo.com.br
Dim StrXml As String
'Criando arquivo XML
StrXml = StrXml & "<?xml version='1.0' ?>" & vbNewLine
StrXml = StrXml & "<form>" & vbNewLine
StrXml = StrXml & "<control type='Forms.Label.1' caption='Grupo' left='5' top='5' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.ComboBox.1' left='60' top='5' width='100'>" & vbNewLine
StrXml = StrXml & "<item text='Ativo'/>" & vbNewLine
StrXml = StrXml & "<item text='Passivo'/>" & vbNewLine
StrXml = StrXml & "<item text='Estrutura'/>" & vbNewLine
StrXml = StrXml & "<item text='Indicadores'/>" & vbNewLine
StrXml = StrXml & "<item text='Resultado'/>" & vbNewLine
StrXml = StrXml & "</control>" & vbNewLine
StrXml = StrXml & "<control type='Forms.Label.1' caption='Descricao' left='5' top='30' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1' left='60' top='30' width='150'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.Label.1' caption='TAG' left='5' top='55' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1' left='60' top='55' width='150'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.Label.1' caption='VALOR' left='5' top='80' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1' left='60' top='80' width='150'/>" & vbNewLine
StrXml = StrXml & "</form>" & vbNewLine
'Apagando o Arquivo se existir
If Dir(ActiveDocument.Path & "\TempForm.xml") <> vbNullString Then
Kill ActiveDocument.Path & "\TempForm.xml"
End If
'Criando o Arquivo com o nome de TempForm.xml na pasta do Documento
Open ActiveDocument.Path & "\TempForm.xml" For Output As #1
Print #1, StrXml
Close #1
End Sub
Após gerar o arquivo (ele será gerado na mesma pasta do documento com o nome de TempForm..xml) utilizaremos o arquivo XML recebido e criaremos o formulário através das informações recebidas.
Antes, porém de criar a rotina, crie dois formulários no Projeto, deixe com os nomes padrões UserForm1 e UserForm2.
No UserForm1 crie um botão e adicione o seguinte código.
Private Sub CommandButton1_Click() 'Chama a rotina para criação do Formulário, passando o arquivo XMl e o Segundo UserForm Criado LeXML ActiveDocument.Path &"\TempForm.xml", UserForm2 End Sub
Agora num Módulo qualquer, coloque a seguinte rotina.
Sub LeXML(ArqXml As String, Frm As UserForm2)
'Desenvolvido Por Bruno Leite
'bruno_silva_leite@yahoo.com.br
Dim Doc As Object, ctl As Control
Dim nd As Object, nd1 As Object, Dados As Object
'Criando o ObjetoXML e lendo o Arquivo
Set Doc = CreateObject("MSXML.DOMDocument")
Doc.Load ArqXml
'Buscando os nós
For Each nd In Doc.SelectNodes("//control")
'Buscando os Atributos do nó selecionado
For Each Dados In nd.Attributes
'Verificando as opções
Select Case Dados.Name
Case "type"
'Caso seja a definição de Tipo do Controle
Set ctl = Frm.Controls.Add(Dados.Value)
'E Seja um ComboBox
If Dados.Value = "Forms.ComboBox.1" Then
'Busque os Items e adicione
Set nd1 = nd.SelectNodes("//item")
For i = 0 To nd1.Length - 1
ctl.AddItem nd1(i).Attributes(0).Text
Next i
End If
Case "caption"
'definindo o texto do controle
ctl.Caption = Dados.Value
Case "left"
'definindo o posicionamento
ctl.Left = Dados.Value
Case "top"
'definindo o posicionamento
ctl.Top = Dados.Value
Case "width"
'definindo o tamanho
ctl.Width = Dados.Value
End Select
Next Dados
Next nd
Frm.Show
End Sub
Clicando no botão criado no UserForm1 será apresentado o UserForm2.
Agora temos um formulário criado em tempo de execução construído a partir de um arquivo XML.
Isto abre diversas possibilidades de implementações. Crie a sua, mas mantenha os créditos!
Até a próxima
11:48
Bruno Leite

0 comentários:
Postar um comentário