Voltei, pessoal!
Até o momento, já aprendemos como registrar um wizard na IDE do Delphi e avaliar uma expressão (Evaluate) automaticamente utilizando as Interfaces do Open Tools API. Em continuidade, a terceira parte do artigo visa a codificação do formulário que exibirá os dados do DataSet. Estamos quase finalizando a série!
Criando o formulário para exibição dos dados
Neste artigo, em especial, não abordaremos outras Interfaces do Open Tools API. Hoje, o objetivo é utilizar a orientação a objetos para desenhar um formulário dinamicamente com apenas quatro componentes: TForm
, TDBGrid
, TClientDataSet
e TDataSource
. Faremos a ligação entre esses componentes para exibir o formulário com os dados do arquivo gerado pelo método Evaluate
, apresentado na segunda parte da série. Os desenvolvedores que já estão familiarizados com a criação de objetos em tempo de execução não terão dificuldades.
Primeiro, precisamos declarar o método AbrirVisualizador
que será chamado pelo Execute
ao acionar o menu:
1 2 3 4 5 6 |
type TVisualizadorDataSets = class(TInterfacedObject, IOTAWizard, IOTAMenuWizard) private procedure AbrirVisualizador; { ... } |
Partiremos, então, para a implementação deste método, iniciando pela criação de um formulário maximizado que será o “dono” dos outros componentes:
1 2 3 4 5 6 7 8 9 10 |
uses  Vcl.Forms;  { ... } var Formulario: TForm; begin Formulario := TForm.Create(nil); Formulario.Caption := 'Visualizador de DataSets'; Formulario.WindowState := wsMaximized; |
O próximo passo é criar o TClientDataSet
:
1 2 3 4 5 6 7 8 9 10 |
uses  DataSnap.DBClient;  { ... } var { ... } DataSet: TClientDataSet; begin { ... } DataSet := TClientDataSet.Create(Formulario); |
Assim como o artigo anterior, utilizaremos o namespace System.IOUtils
para buscar o arquivo gerado e carregá-lo no DataSet com o método LoadFromFile
:
1 2 3 4 5 6 7 |
var { ... } ArquivoDados: string; begin { ... } ArquivoDados := System.IOUtils.TPath.GetTempPath + 'Dados.xml'; DataSet.LoadFromFile(ArquivoDados); |
Em seguida, associaremos o DataSet a um componente TDataSource
:
1 2 3 4 5 6 7 8 9 10 11 |
uses  Data.DB;  { ... } var { ... } DataSource: TDataSource; begin { ... } DataSource := TDataSource.Create(Formulario); DataSource.DataSet := DataSet; |
Por último, criaremos um componente TDBGrid
que será conectado ao objeto DataSource
. Além disso, para melhorar a visualização, julgo importante configurar a Grid para ocupar toda a área do formulário.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
uses  Vcl.DBGrids, Vcl.Controls;  { ... } var { ... } DBGrid: TDBGrid; begin { ... } DBGrid := TDBGrid.Create(Formulario); DBGrid.Parent := Formulario; DBGrid.Align := alClient; DBGrid.DataSource := DataSource; |
Para concluir, basta exibir o formulário:
1 |
Formulario.ShowModal; |
Hora de juntar tudo!
Com as codificações apresentadas no artigo, teremos a rotina a seguir. Adicionei alguns comentários para melhorar a compreensão e também envolvi o código em uma estrutura try/finally para garantir que o formulário seja liberado da memória após fechado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
procedure TVisualizadorDataSets.AbrirVisualizador; var ArquivoDados: string; Formulario: TForm; DBGrid: TDBGrid; DataSet: TClientDataSet; DataSource: TDataSource; begin // Cria um formulário Formulario := TForm.Create(nil); try // Configura o formulário para janela maximizada Formulario.WindowState := wsMaximized; // Cria um ClientDataSet DataSet := TClientDataSet.Create(Formulario); // Carrega o arquivo temporário de dados gerado no método "Execute" ArquivoDados := System.IOUtils.TPath.GetTempPath + 'Dados.xml'; DataSet.LoadFromFile(ArquivoDados); // Cria um DataSource e o aponta para o ClientDataSet DataSource := TDataSource.Create(Formulario); DataSource.DataSet := DataSet; // Cria um DBGrid e o aponta para o DataSource DBGrid := TDBGrid.Create(Formulario); DBGrid.Parent := Formulario; DBGrid.Align := alClient; DBGrid.DataSource := DataSource; // Exibe o formulário Formulario.ShowModal; finally // Libera o formúlário da memória Formulario.Free; end; end; |
Ao compilar o pacote, a mensagem abaixo provavelmente será exibida, informando que alguns pacotes adicionais serão importados por questões de compatibilidade. Estes pacotes estão relacionados com as units que referenciamos na seção uses. Apenas confirme a importação para prosseguir.
Hora de testar!
Já que codificamos o método AbrirVisualizador
, podemos remover o comentário da linha que o chama no método Execute
:
1 2 |
if not (Retorno in [erError, erBusy]) then AbrirVisualizador; |
Para testar, segui o mesmo procedimento do artigo anterior, criando um novo projeto e adicionando um TClientDataSet
no formulário. Porém, dessa vez, carreguei um arquivo de dados da pasta de exemplos do RAD Studio, chamado “customer.xml”, para simular uma massa de dados real.
Primeiro, selecionei o DataSet em runtime no editor de código:
Em seguida, acessei o menu Help > Help Wizards > Visualizar DataSet para executar a ação do wizard. Confiram o resultado:
Impressionante, não?
Garanto que este recurso irá ajudá-los em várias ocasiões! 🙂
Missão cumprida?
Ainda não, pessoal.
Eventualmente, ao acionar a funcionalidade repetidas vezes, talvez você receba a seguinte mensagem de erro:
Este evento pode ocorrer em função do tempo dispendido pelo depurador para a avaliação da expressão. Alguns fatores influenciam nessa operação, como a quantidade de registros do DataSet, a memória consumida pelo depurador na parada do breakpoint e até mesmo os recursos disponÃveis do sistema operacional, portanto, o tempo é bem relativo.
Por consequência, é possÃvel que, ao abrir o formulário para visualização dos dados, o arquivo ainda esteja sendo gerado na avaliação da expressão. Em termos mais técnicos, no evento em que o nosso wizard carrega o arquivo através do LoadFromFile
(no formulário de visualização de dados), o SaveToFile
ainda está em processamento (no método Execute
).
Resolveremos este problema na quarta e última parte deste artigo!
Até breve!
[Delphi] Visualizador de DataSets com Open Tools API – Pacote
[Delphi] Visualizador de DataSets com Open Tools API – Evaluate
[Delphi] Visualizador de DataSets com Open Tools API – Formulário
[Delphi] Visualizador de DataSets com Open Tools API – Notificador