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
0 comentários:
Postar um comentário