Esse artigo faz parte da revista Clube Delphi edição 12. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.

Evento OnNeedData

 

Um dos grandes pecados do QuickReport é a falta de documentação. Muita coisa interessante da ferramenta acaba sendo perdida, devido ao conhecimento  parcial de suas capacidades. Um bom exemplo é o evento OnNeedData. Pergunte a um programador: para que serve? Alguns irão responder: “para criar um relatório sem link com o banco de dados”. Ok! E como se usa? Poucos sabem. Mas não se assuste, o evento OnNeedData não é um bicho papão. O que acontece é a simples falta de manual. Chame o help do Delphi sobre o evento. A elegante mensagem abaixo será exibida:

 

“Description

 

For details on this element, see the QuSoft Web site at http://www.qusoft.com.”

 

E não se deixe enganar pela mensagem, o endereço indicado é do fabricante, e não ensina como utilizar o referido evento.

 

O evento OnNeedData, como já dito, permite à aplicação gerar um preview de relatório no quickreport sem a necessidade de conectar este objeto à um banco de dados. Vamos criar um pequeno exemplo. Imagine um formulário para exibir as tabelas de um banco. Poderíamos incluir um botão para imprimir este conteúdo, fazendo uso do QR para esta tarefa. Este é apenas um caso, existem inúmeras hipóteses onde este evento poderia ser útil. Veja abaixo o form exibindo as tabelas de DBDEMOS:

 

[figura]

 

Para este exemplo iremos precisar apenas de um objeto Tsession, um objeto TlistBox e um objeto TcomboBox. O código da Unit está listado abaixo:

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, Buttons, DBTables, Db, Grids;

 

type

  TForm1 = class(TForm)

    BitBtn1: TBitBtn;

    ComboBox1: TComboBox;

    ListBox1: TListBox;

    Session1: TSession;

    procedure BitBtn1Click(Sender: TObject);

    procedure FormShow(Sender: TObject);

    procedure ComboBox1Change(Sender: TObject);

 

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

 

implementation

 

uses Unit2;

 

{$R *.DFM}

 

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

  QuickReport2.Preview;

end;

 

procedure TForm1.FormShow(Sender: TObject);

begin

  Session1.GetAliasNames(ComboBox1.Items);

end;

 

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

  Session.GetTableNames(ComboBox1.Text, '',False, False, ListBox1.Items);

end;

 

 

end.

 

Em seguida, crie um novo objeto QuickReport através do Object Repository.  Insira dois objetos Tband, cada um com um objeto TqrLabel. Configure a propriedade BandType da segunda banda para Detail. A primeira banda e sua label serão o título do relatório.

 

Em seguida, crie uma variável de escopo global, conforme mostrado abaixo:

 

type

    ...

  private

  public

  end;

 

var

  QuickReport2: TQuickReport2;

  cont:Integer;

 

 

E configure os eventos OnNeedData e OnBeforePrint de acordo com a listagem abaixo:

 

procedure TQuickReport2.QuickReport2NeedData(Sender: TObject;

  var MoreData: Boolean);

begin

  if cont > Form1.ListBox1.Items.count-1 then

    MoreData:=False

  Else begin

    A.Caption:=Form1.ListBox1.Items[cont];

    MoreData:=True;

  End;

 

  Inc(Cont);

end;

 

procedure TQuickReport2.QuickReport2BeforePrint(Sender: TCustomQuickRep;

  var PrintReport: Boolean);

begin

  cont:=0;

end;

 

 

O resultado é exibido na figura abaixo:

 

 

 

Já vi muito programadores optarem por utilizar o objeto Tprinter no lugar do QuickReport no momento em que se depararam com uma situação parecida, ou seja, um relatório que não vinha necessariamente de um banco de dados. Se você faz parte do meu time e odeia digitação de código desnecessária, este evento vem bem a calhar.