Artigo Clube Delphi Edição 12 - Evento OnNeedData
Artigo da Revista Clube Delphi Edição 12.
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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo