Posts Tagged ‘vdo’

11th dezembro
2008
written by oTTo Mostaert

Colegas, neste artigos irei mostrar como usar as classes do VDOPrint, desenvolvido pelo colega Vinicius de Oliveira (Vina2k). Neste artigo veremos como é simples, fácil e rápido montar um projeto que imprima dados em uma impressora matricial usando as classes do componente VDO (Vinicius de Oliveira), que é freeware e Opensource. O componente VDO tanto imprime em impressoras matriciais como em impressoras de Jato.

Em nosso exemplo iremos mostrar como iremos imprimir em uma impressora matricial usando a classe VDODmPrinter, para impressoras Jato basta usar a classe VDOCaPrinter. Como o VDO não envia os dados direto à porta, envia para o Spool do Windows, não teremos problemas com impressoras USB ou em Rede.

Criando um projeto e usando as classes

Primeiro temos que baixar o componente no site indicado no final do artigo, poderemos instalar o componente ou adicionar os fontes dele ao projeto e instanciar as classes na mão, faremos pela segunda alternativa. Descompacte o arquivo baixado, crie um novo projeto em Delphi, copie todos os arquivos da pasta “src” do arquivo baixado e adicione-os ao projeto.

Alguns formulários automaticamente ficarão no “Auto-create” do projeto, transfira-os colocando no “Available forms”, são eles: frmVDOPreview, frmVDOPrinterTypeDlg e frmVDOPrintProgress. O único form que ficará na criação automática é o formulário principal, como mostra a Figura 1.

Imagem 1

Imagem 1

Figura 1. Criação de formulários automática.

Entendendo as Propriedades, Eventos e Métodos do VDO

Propriedades :

Read-Only :

CurrentLine : Integer
Leitura do número da linha atual de impressão dentro da página.

CurrentPage : Integer
Leitura do número da página atual de impressão.

IsPrinting : Boolean
Leitura do estado da impressora. Retorna True se a impressora estiver imprimindo ou False se não estiver imprimindo.

PrintersList : TStrings
Leitura das impressoras instaladas do Windows.

• Read / Write :

CharMode : TVDODmCharMode = (cmClear, cmNormal)
Determina se será removida a acentuação do texto a ser impresso.

Font : TVDODmFont
Determina o fonte a ser utilizado para impressão.

LineSpacing : TVDODmLineSpacing = (ls6lpp, ls8lpp)
Determina o espaçamento vertical (entre linhas) da impressora. Se 6 ou 8 linhas por polegada.

Paper : TVDODmPaper
Determina as configurações de papel e página utilizados pela impressora.

PrinterName : String
Fixa o nome da impressora a ser utilizada.
Nota: Se o nome da impressora não for válido, o diálogo de impressão para seleção de uma impressora válida será exibido.

ShowPreview : Boolean
Determina se o texto a ser impresso será renderizado na tela para pré-visualização da impressão.

ShowDialog : Boolean
Determina se será exibido o diálogo de impressão, permitindo a seleção da impressora, número de cópias, etc.
Nota: Se ShowDialog for True, a fixação do nome em PrinterName é desconsiderada e será sobreposta pela impressora selecionada no diálogo de impressão, porém se PrinterName for uma impressora válida, ela estará pré-selecionada no diálogo de impressão.

ShowProgress : Boolean
Determina se será exibido o diálogo de progresso durante a impressão.

Title : String
Título do trabalho de impressão a ser utilizado pelo Spool do Windows.

Eventos :

OnAbort : TNotifyEvent (VCL)
Disparado no ao abortar a impressão.

OnError : TNotifyEvent (VCL)
Disparado no quando ocorrer um erro na inicialização ou finalização da impressora ou durante a impressão.

OnNewLine : TNotifyEvent (VCL)
Disparado a cada nova linha.

OnNewPage : TNotifyEvent (VCL)
Disparado a cada nova página.

OnPrint : TNotifyEvent (VCL)
Disparado a cada vez que algo é impresso.

OnStart : TNotifyEvent (VCL)
Disparado ao iniciar a impressão.

OnTerminate : TNotifyEvent (VCL)
Disparado ao finalizar a impressão.

Métodos :

Abort : Procedure
Sua função é abortar o trabalho de impressão.

BeginDoc : Procedure
Sua função é iniciar o trabalho de impressão.

EndDoc (AEjectPage: Boolean = True) : Procedure
Sua função é finalizar o trabalho de impressão. O parâmetro EjectPage indica se a página deve ser ejetada após a finalização. Se AEjectPage for True, a impressora será orientada a realizar um Eject antes de finalizar o trabalho de impressão. O valor default do parâmetro AEjectPage é True.
Nota: O resultado esperado de AEjectPage:= True depende diretamente do ajuste correto da propriedade Lines de TVDODmPaper.

NewLine (ALines: Integer = 1) : Procedure

Sua função é avançar o número de linhas determinado pelo parâmetro ALines. Caso não seja informada a quantidade linhas o valor default é 1.

NewPage (APages: Integer = 1) : Procedure
Sua função é avançar o número de páginas determinado pelo parâmetro APages. Caso não seja informada a quantidade páginas o valor default é 1.
Nota: O resultado esperado do método NewPage depende diretamente do ajuste correto da propriedade Lines de TVDODmPaper.

Print (AColumn: Integer; AText: String; ALine: Boolean = False) : Procedure
Sua função é efetuar a impressão na coluna determinada pelo parâmetro AColumn do texto determinado pelo parâmetro AText.
O parâmetro ALine é opcional e é o indicador de que a linha foi finalizada e que a impressora deve avançar para a próxima.
Nota: Ao informar o parâmetro ALine como True não é necessária à chamada posterior ao método NewLine, a não ser que o salto de linhas adicionais seja desejado.

Colocando a mão na massa

Já temos nosso projeto pronto para montar um relatório para imprimir. O VDO nos dar uma boa facilidade na hora de programar, devido a sua simples codificação e um resultado bastante satisfatório na hora de imprimir. Chega de conversa e vamos ao que interessa.

No formulário principal coloque dois botões, como mostra a Figura 2, e no evento onClick do botão “Gerar relatório sem banco” iremos fazer um exemplo sem acesso a banco com o seguinte código, como mostra a Listagem 1

Imagem 2

Imagem 2

Figura 2. Tela do sistema

Listagem 1. Gerando o relatório via código fonte (sem banco) (Delphi)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables;

Type

tLado = (lEsquerdo, lDireito);

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

uses VDODmPrinter;

// Alt+F11 e selecione o VDODmPrinter e clique em Ok

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

VDOImpressao: TVDODmPrinter;

// Declaração de uma variável da classe TVDODmPrinter,

// que fará nosso relatório

begin

VDOImpressao := TVDODmPrinter.Create(Self);

// Instanciamos o objeto no with

with VDOImpressao do

begin

Title := ‘Impressao matricial DevMedia (ClubeDelphi)’;

// Colocando um título ao relatório

Paper.AutoNewPage := true;

// Informando que haverá quebra de página do papel

ShowPreview := true;

// Informando que desejamos mostrar uma tela de Preview do relatório

ShowProgress := true;

// Informando que desejamos mostrar o progresso de montagem do relatório

BeginDoc;

// Iniciando o relatório

Print(00,’Primeira Linha do relatório na posição zero‘,true);

// o Primeiro parâmetro indica a posição da coluna que iremos imprimir

// o segundo parâmetro é o texto a ser impresso

// o terceiro parâmetro, se for true o relatório vai pra proxima linha,

// caso contrário continua ate chegar ao máximo de colunar informada.

Print(10,’Segunda Linha do relatório na posição dez ‘, true);

Print(20,’Terceira Linha do relatório na posição vinte‘,true);

Print(30,’Quarta Linha do relatório na posição trinta‘, true);

NewLine(5); // Pulo 5 linhas

Print(00,’Linha de número.: ‘+

Format(’%3.3d‘, [VDOImpressao.CurrentLine]), true);

Print(00,’Número da página: ‘+

Format(’%3.3d‘, [VDOImpressao.CurrentPage]), true);

NewPage(1); // vou pra próxima página

Print(00,’Número da página: ‘+

Format(’%3.3d‘, [VDOImpressao.CurrentPage]), true);

NewPage;

Font.Size := fsDefault;

Font.Align := faLeft;

Print(00, ‘Texto com 10cpp e alinhado a esquerda‘, True);

Font.Size := fsCondensed;

Font.Align := faCenter;

Print(00, ‘Texto com 10cpp e alinhado ao centro‘, True);

Font.Size := fsLargeCondensed;

Font.Align := faRight;

Print(00, ‘Texto condensado expandido, c/10cpp e alinhado a direita‘, True);

Font.Size := fsLarge;

Font.Align := faLeft;

Print(00, ‘Texto expandido, c/10cpp e al. esquerda‘, True);

Font.Size := fsDefault;

Font.Align := faLeft;

Font.Style := [fsDmBold];

Print(00, ‘Texto com 10cpp em “negrito”‘, True);

Font.Style := [fsDmItalic];

Print(00, ‘Texto com 10cpp em “italico”‘, True);

Font.Style := [fsDmUnderline];

Print(00, ‘Texto com 10cpp em “sublinhado”‘, True);

Font.Style := [fsDmBold, fsDmItalic];

Print(00, ‘Texto com 10cpp em “negrito” E “italico”‘, True);

EndDoc;

// finalizando o relatório, caso o ShowPreview seja true, abrirá uma tela

// com o preview do relatório

end; // with Create object

FreeAndNil(VDOImpressao);

// liberamos o objeto da memória

end;

end.

A imagem a seguir (Figura 3) é o resultado final do nosso exemplo sem acesso a um banco de dados:

Imagem 3

Imagem 3

Figura 3. Preview do relatório usando o VDO

Como mostra a Figura 2, no evento onClick do botão “Gerar relatório com banco” iremos fazer um exemplo acessando o banco de dados local da BDE (tabela: employee) com o seguinte código, como mostra a Listagem 2

Listagem 2. Gerando o relatório via código fonte (com banco) (Delphi)

procedure TForm1.Button2Click(Sender: TObject);

function CompletaComBranco(AValue:String; AQuantidade:integer; ALado: tLado):string;

var

contador:integer;

begin

result := ”;

for contador := 1 to Abs(AQuantidade - Length(Avalue)) do

begin

result := result + ‘ ‘;

end;

if ALado = lEsquerdo then

result := result + AValue

else

result := AValue + result;

end;

var

Qry: TQuery;

// o Objeto Qry irá nos fornecer os dados do banco

VDOImpressao: TVDODmPrinter;

// Declaração de uma variável da classe TVDODmPrinter,

// que fará nosso relatório

Linha:String;

begin

Qry := TQuery.Create(Self);

// Crio o DataSet

Qry.DatabaseName := ‘DBDemos‘;

// Informo o alias local onde encontra-se o banco

Qry.SQL.Text := ’select empno, firstname, salary from employee’;

// monto a intrução SQL

Qry.Open;

// Abro o Dataset pra que me traga todos os registros da tabela

VDOImpressao := TVDODmPrinter.Create(Self);

VDOImpressao.Title := ‘Impressao matricial DevMedia (ClubeDelphi)‘;

VDOImpressao.Paper.AutoNewPage := true;

VDOImpressao.ShowPreview := true;

VDOImpressao.ShowProgress := true;

with VDOImpressao do

begin

BeginDoc;

Print(0,’Listagem‘,true);

Print(0,’Codigo | Salário | Nome‘,true);

Print(0,StringOfChar(’-‘,80),true);

Qry.First;

// posiciono o Data no primeiro registro

while not Qry.Eof do

// enquanto nao chegar no ultimo registro imprima no relatório

begin

Linha := Format(’%6.6d‘,[Qry.FieldByName('empno').AsInteger])+’ | ‘+

CompletaComBranco(FormatFloat(’#,###,##0.00‘,Qry.FieldByName(’salary‘).AsFloat),11,lEsquerdo)+’ | ‘+

Qry.FieldByName(’firstname‘).AsString;

// na variavel Linha irei fazer a concatenação dos dados

// pra que saiam formatados

Print(0,Linha,true);

Qry.Next;

// proximo registro

end; // with

FreeAndNil(Qry);

EndDoc;

end; // with

FreeAndNil(VDOImpressao);

end;

A imagem a seguir (Figura 4) é o resultado final do nosso exemplo acessando um banco de dados:

Imagem 4

Imagem 4

Figura 4. Preview do relatório usando o VDO

Instalando o componente

Bem, pra finalizar, iremos ver como fazemos a instalação do VDO no Delphi. Ao fazer o download no site indicado no final do artigo, descompacte-o na pasta deseja. Na IDE do Delphi vá em “File -> Open”, vá até a pasta de instalação e localize na sub-pasta “packages”, a sub-pasta correspondente à sua versão do Delphi. Abra o package “VDOPrint.dpk”. Click em “Compile” e depois em “Install”. Feche o package (não há necessidade de salvar). Na IDE do Delphi vá ao menu “Tools -> Enviroment Options” e na guia “Library” click no botão elíptico (…) à frente de “Library Path”, click no botão elíptico (…) à frente da caixa de texto, localize na pasta de VDOtalação dos componentes a sub-pasta “src”, click em “OK”, click em “Add” e click em “OK”. Procure pela paleta “VDO” e as classes de VDOPrint estarão registradas.

Conclusões

O exemplo desenvolvido é bem básico, tendo como objetivo mostrar como é simples, rápido e fácil fazer um relatório para imprimir em impressora matricial em Delphi usando os componentes VDO.

Recomendo o uso destes componentes, pois, é realmente muito rápido a impressão usando as classes do VDO, basta pesquisar as propriedades e eventos a fundo do mesmo e olhar os exemplos em anexo ao componente. Bons estudos e até a próxima ;)

Link: http://vdo.sourceforge.net