Posts Tagged ‘vdo’
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
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
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
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
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



