[Delphi] Criando um visualizador de DataSets com o Open Tools API – Parte 3

[Delphi] Criando um visualizador de DataSets com o Open Tools API - Parte 3

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!

 

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:

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:

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:

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:

var
  { ... }
  ArquivoDados: string;
begin
  { ... }
  ArquivoDados := System.IOUtils.TPath.GetTempPath + 'Dados.xml';
  DataSet.LoadFromFile(ArquivoDados);

 

Em seguida, associaremos o DataSet a um componente TDataSource:

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.

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:

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.

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.

Mensagem de confirmação para importação de pacotes adicionais

 

Hora de testar!
Já que codificamos o método AbrirVisualizador, podemos remover o comentário da linha que o chama no método Execute:

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:

DataSet selecionado no Code Editor do Delphi

Em seguida, acessei o menu Help > Help Wizards > Visualizar DataSet para executar a ação do wizard. Confiram o resultado:

Formulário criado pelo wizard para visualização de dados do DataSet

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:

Mensagem de conflito de acesso ao arquivo

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 no 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] Criando um visualizador de DataSets na IDE com o ToolsAPI – Parte 1
[Delphi] Criando um visualizador de DataSets na IDE com o ToolsAPI – Parte 2
[Delphi] Criando um visualizador de DataSets na IDE com o ToolsAPI – Parte 3
[Delphi] Criando um visualizador de DataSets na IDE com o ToolsAPI – Parte 4


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.