Impressao lenta pela matricial
Iai Galera,
Tenho impressão de nota fiscal pelo meu sistema.
Numa impressora matricial.
Porém os usuários me alegaram que a impressão está muito devagar.
Estou enviando o código abaixo.
Existe alguma forma de melhorá-lo para que fique mais rápido?
Abraços
with Printer do begin
PrinterIndex := -1; {seleciona impressora default do windows}
AjustaPag_NotaUn();
BeginDoc;
Canvas.Font.Name := ´Draft 12CPI´;
FatorY := 10;
with Canvas do begin
// TextOut(80*FatorY,0*17,´.´);
// TextOut(85*FatorY,1*17,´.´);
//TextOut(830-20,00 ,mNrNota); //Nr da Nota
TextOut( 850 , 16 ,mNrNota); //Nr da Nota
//Canhoto TextOut(930,20 ,RightStr(mNrNota,6)); //Nota Fiscal Série 2
//TextOut(570,2 ,mSaida); //Tipo de Nota
//TextOut(650,2 ,mEntrada); //Tipo de Nota
TextOut(630,16 ,mSaida); //Tipo de Nota
TextOut(680,16 ,mEntrada); //Tipo de Nota
TextOut(30 ,120,mNatOper); //Natureza da Operação
//TextOut(300,120,mCdNatOper); //CFOP
TextOut(190,120,mCdNatOper); //CFOP
{ BLOCO 1 DE DESTINATÁRIO/REMETENTE }
Font.Style := [fsBold];
TextOut(30,170,mNmCli); //Nome / Razão Social
Font.Style := [];
TextOut(610,170,mCGC_CPF); //CNPJ / CPF
{ BLOCO 2 DE DESTINATÁRIO/REMETENTE }
TextOut(370,200,mBairro); //Bairro/Distrito
//TextOut(780,200,mDtEmiss); //Data Saída / Entrada
TextOut(820,200,mDtEmiss); //Data Saída / Entrada
//TextOut(780,240,TimeToStr(Now)); //Hora Saída
TextOut(820,240,TimeToStr(Now)); //Hora Saída
//TextOut(780,170,mDtEmiss); //DATA DE EMISSAO
TextOut(820,170,mDtEmiss); //DATA DE EMISSAO
Font.Name := ´Sans Serif 17CPI´;
TextOut(30 ,200,mEnd); //Endereço
Font.Name := ´Draft 12CPI´;
{ BLOCO 3 DE DESTINATÁRIO/REMETENTE }
// TextOut(590,240,mCep); //Inscrição Estadual
TextOut(30,240,mCidade); //Município
TextOut(350,240,mTel); //Fone/Fax
TextOut(580,240,mEstado); //UF
TextOut(670,240,mInscEst); //EM BRANCO
Font.Name := ´Sans Serif 17CPI´;
FatorY := 315;
for a := 1 to 33 do begin
if mDescPrd[a] = ´´ then Break;
TextOut(30 ,FatorY,mDescPrd[a]); //Descrição do Produto
Font.Style := [fsBold];
TextOut(440 ,FatorY,mClassFisc[a]); //C.L Fisc
Font.Style := [];
TextOut(460 ,FatorY,´000´); //Situação Tributária
TextOut(480 ,FatorY,mUnid[a]); //Unidade
TextOut(520 ,FatorY,mQuant[a]); //Quantidade
TextOut(580 ,FatorY,mVlUnit[a]); //Valor Unitario
TextOut(670 ,FatorY,mVlTot[a]); //Valor Total
TextOut(770 ,FatorY,mAliqICM[a]); //ICMS
FatorY := FatorY + 20;
end;
Font.Name := ´Draft 12CPI´;
if Tag = 1 then { Nota de Devolução }
//TextOut(320 , 720 , mObs );
TextOut( 250 , 960 , mObs );
//TextOut(050,800,mTotProd); //Base de Cálculo do ICMS
TextOut( 50 , 1060 ,mTotProd); //Base de Cálculo do ICMS
TextOut( 200 , 1060 ,FormatFloat( ´#,0.00´ , mSubTot * (qryItDoc.FieldByName(´AliqICMS´).AsFloat / 100)) ); //Valor do ICMS
TextOut( 780, 1060,mTotProd); //Valor Total dos Produtos
Font.Style := [fsBold];
TextOut(780,1100,mTotNota); //Valor Total da Nota
Font.Style := [];
{ for i := 1100 to 1600 do begin
TextOut( 50 , i , IntToStr( i ) );
iAux := iAux + 30;
end;}
{ Dados Adicionais - Informações Complementares }
FatorY := 1300;
FatorX := 30;
iAux := 1;
{ Gera observações referentes a Classificação Fiscal }
qryAgrupamentos.Open;
while not qryAgrupamentos.Eof do begin
TextOut( FatorX , FatorY , qryAgrupamentosCLASSFISC.AsString );
if iAux = 5 then begin { muda de coluna pois já estourou limite de espaço }
FatorX := FatorX + 130;
FatorY := 1300;
iAux := 1;
end
else begin { continua o processo normal }
FatorY := FatorY + 20;
Inc( iAux );
end;
qryAgrupamentos.Next;
end;
qryAgrupamentos.Close;
TextOut( 850 , 1500 , mNrNota);
end;
EndDoc;
end;
Tenho impressão de nota fiscal pelo meu sistema.
Numa impressora matricial.
Porém os usuários me alegaram que a impressão está muito devagar.
Estou enviando o código abaixo.
Existe alguma forma de melhorá-lo para que fique mais rápido?
Abraços
with Printer do begin
PrinterIndex := -1; {seleciona impressora default do windows}
AjustaPag_NotaUn();
BeginDoc;
Canvas.Font.Name := ´Draft 12CPI´;
FatorY := 10;
with Canvas do begin
// TextOut(80*FatorY,0*17,´.´);
// TextOut(85*FatorY,1*17,´.´);
//TextOut(830-20,00 ,mNrNota); //Nr da Nota
TextOut( 850 , 16 ,mNrNota); //Nr da Nota
//Canhoto TextOut(930,20 ,RightStr(mNrNota,6)); //Nota Fiscal Série 2
//TextOut(570,2 ,mSaida); //Tipo de Nota
//TextOut(650,2 ,mEntrada); //Tipo de Nota
TextOut(630,16 ,mSaida); //Tipo de Nota
TextOut(680,16 ,mEntrada); //Tipo de Nota
TextOut(30 ,120,mNatOper); //Natureza da Operação
//TextOut(300,120,mCdNatOper); //CFOP
TextOut(190,120,mCdNatOper); //CFOP
{ BLOCO 1 DE DESTINATÁRIO/REMETENTE }
Font.Style := [fsBold];
TextOut(30,170,mNmCli); //Nome / Razão Social
Font.Style := [];
TextOut(610,170,mCGC_CPF); //CNPJ / CPF
{ BLOCO 2 DE DESTINATÁRIO/REMETENTE }
TextOut(370,200,mBairro); //Bairro/Distrito
//TextOut(780,200,mDtEmiss); //Data Saída / Entrada
TextOut(820,200,mDtEmiss); //Data Saída / Entrada
//TextOut(780,240,TimeToStr(Now)); //Hora Saída
TextOut(820,240,TimeToStr(Now)); //Hora Saída
//TextOut(780,170,mDtEmiss); //DATA DE EMISSAO
TextOut(820,170,mDtEmiss); //DATA DE EMISSAO
Font.Name := ´Sans Serif 17CPI´;
TextOut(30 ,200,mEnd); //Endereço
Font.Name := ´Draft 12CPI´;
{ BLOCO 3 DE DESTINATÁRIO/REMETENTE }
// TextOut(590,240,mCep); //Inscrição Estadual
TextOut(30,240,mCidade); //Município
TextOut(350,240,mTel); //Fone/Fax
TextOut(580,240,mEstado); //UF
TextOut(670,240,mInscEst); //EM BRANCO
Font.Name := ´Sans Serif 17CPI´;
FatorY := 315;
for a := 1 to 33 do begin
if mDescPrd[a] = ´´ then Break;
TextOut(30 ,FatorY,mDescPrd[a]); //Descrição do Produto
Font.Style := [fsBold];
TextOut(440 ,FatorY,mClassFisc[a]); //C.L Fisc
Font.Style := [];
TextOut(460 ,FatorY,´000´); //Situação Tributária
TextOut(480 ,FatorY,mUnid[a]); //Unidade
TextOut(520 ,FatorY,mQuant[a]); //Quantidade
TextOut(580 ,FatorY,mVlUnit[a]); //Valor Unitario
TextOut(670 ,FatorY,mVlTot[a]); //Valor Total
TextOut(770 ,FatorY,mAliqICM[a]); //ICMS
FatorY := FatorY + 20;
end;
Font.Name := ´Draft 12CPI´;
if Tag = 1 then { Nota de Devolução }
//TextOut(320 , 720 , mObs );
TextOut( 250 , 960 , mObs );
//TextOut(050,800,mTotProd); //Base de Cálculo do ICMS
TextOut( 50 , 1060 ,mTotProd); //Base de Cálculo do ICMS
TextOut( 200 , 1060 ,FormatFloat( ´#,0.00´ , mSubTot * (qryItDoc.FieldByName(´AliqICMS´).AsFloat / 100)) ); //Valor do ICMS
TextOut( 780, 1060,mTotProd); //Valor Total dos Produtos
Font.Style := [fsBold];
TextOut(780,1100,mTotNota); //Valor Total da Nota
Font.Style := [];
{ for i := 1100 to 1600 do begin
TextOut( 50 , i , IntToStr( i ) );
iAux := iAux + 30;
end;}
{ Dados Adicionais - Informações Complementares }
FatorY := 1300;
FatorX := 30;
iAux := 1;
{ Gera observações referentes a Classificação Fiscal }
qryAgrupamentos.Open;
while not qryAgrupamentos.Eof do begin
TextOut( FatorX , FatorY , qryAgrupamentosCLASSFISC.AsString );
if iAux = 5 then begin { muda de coluna pois já estourou limite de espaço }
FatorX := FatorX + 130;
FatorY := 1300;
iAux := 1;
end
else begin { continua o processo normal }
FatorY := FatorY + 20;
Inc( iAux );
end;
qryAgrupamentos.Next;
end;
qryAgrupamentos.Close;
TextOut( 850 , 1500 , mNrNota);
end;
EndDoc;
end;
Tremonti
Curtidas 0
Respostas
Paulo
24/04/2008
O Tprinter deixa lenta mesmo a impressão, devido ao driver da impressora. Eu normalmente uso sem driver de impressão. Eu uso assim:
Não usei o Tprinter, mas usei a unit Printers para configurar as fontes e etc... Tem como fazer sem usar a unit Printers.
AssignPrn(prn);//Imprime na impressora padrão
Rewrite(prn);
if IOResult <> 0 then
raise Exception.Create(´Erro ao abrir a Impressora.´);
//Abaixo imprimo meus itens
var
lin: Integer;
begin
lin := 0;
vTotal_Geral := 0;
vTotal_Dia := 0;
cdsVenda.First;
while not cdsVenda.Eof do
begin
inc(lin);
Writeln(prn, AjustaNum(cdsVenda.Fields[0].AsString, 6) + ´ ´ +
AnsiToAscii(AjustaStr(cdsVenda.Fields[1].ASString, 32)) + ´ ´ +
AjustaStr(´´, 5) + ´ ´ +
AjustaNum(FormatFloat(´#,,0.00´,cdsVenda.FieldByName(´DIA´).AsFloat),12) + ´ ´ +
AjustaNum(FormatFloat(´,,0.00´,cdsVenda.FieldByName(´VENDA ACUMULADA´).AsFloat),12)) ;
vTotal_Dia := vTotal_Dia + cdsVenda.FieldByName(´DIA´).AsFloat;
vTotal_Geral := vTotal_Geral + cdsVenda.FieldByName(´VENDA ACUMULADA´).AsFloat;
cdsVenda.Next;
//Reimprime o cabeçalho, caso o papel já está no final
if (lin = 56) and (not cdsVenda.Eof) then
Imprime_Cabecalho;
//Imprime o total geral
if cdsVenda.Eof then
begin
writeln(Prn, RelRepStr(´-´, 80));
Writeln(prn, AjustaNum(´Total Geral:´,40) + ´ ´ +
AjustaNum(FormatFloat(´#,,0.00´,vTotal_Dia),12) + ´ ´ +
AjustaNum(FormatFloat(´,,0.00´,vTotal_Geral),12));
end;
end;
end;
Não usei o Tprinter, mas usei a unit Printers para configurar as fontes e etc... Tem como fazer sem usar a unit Printers.
GOSTEI 0
Ffabiop
24/04/2008
Olha o seu código:
Acontece que o sistema está mandandando um campo de cada vez para a impressora e isso imperra a impressão mesmo. Olhe como se comporta a impressora quando ela está emitindo especialmente essa parte aí dos itens da nota, observe ela imprimendo um campo de cada vez...
Para resolver, mande a linha toda de uma vez para a impressora posicinando os campos por meio de espacamento entre eles... Assim como o Paulo fez. Independente de TPrinter ou Writeln vai resolver a situação.
for a := 1 to 33 do begin if mDescPrd[a] = ´´ then Break; TextOut(30 ,FatorY,mDescPrd[a]); //Descrição do Produto Font.Style := [fsBold]; TextOut(440 ,FatorY,mClassFisc[a]); //C.L Fisc Font.Style := []; TextOut(460 ,FatorY,´000´); //Situação Tributária TextOut(480 ,FatorY,mUnid[a]); //Unidade TextOut(520 ,FatorY,mQuant[a]); //Quantidade TextOut(580 ,FatorY,mVlUnit[a]); //Valor Unitario TextOut(670 ,FatorY,mVlTot[a]); //Valor Total TextOut(770 ,FatorY,mAliqICM[a]); //ICMS FatorY := FatorY + 20; end;
Acontece que o sistema está mandandando um campo de cada vez para a impressora e isso imperra a impressão mesmo. Olhe como se comporta a impressora quando ela está emitindo especialmente essa parte aí dos itens da nota, observe ela imprimendo um campo de cada vez...
Para resolver, mande a linha toda de uma vez para a impressora posicinando os campos por meio de espacamento entre eles... Assim como o Paulo fez. Independente de TPrinter ou Writeln vai resolver a situação.
GOSTEI 0
Tremonti
24/04/2008
Valew Pessoal...
[b:7a349af934]Paulo[/b:7a349af934], você pode me enviar este seu código completo, para ver qual é o processo que você faz?
[b:7a349af934]ffabiop[/b:7a349af934], será que se eu enviar uma linha completa melhora em relação a velocidade?
[color=red:7a349af934]Obrigado Galera![/color:7a349af934]
[b:7a349af934]Paulo[/b:7a349af934], você pode me enviar este seu código completo, para ver qual é o processo que você faz?
[b:7a349af934]ffabiop[/b:7a349af934], será que se eu enviar uma linha completa melhora em relação a velocidade?
[color=red:7a349af934]Obrigado Galera![/color:7a349af934]
GOSTEI 0
Ffabiop
24/04/2008
Melhora sim, pois a cabeça de impressão vai listar a linha toda numa só passada. Nos casos de listagem com matricial o ideal é que a cabeça va e volte imprimindo.
GOSTEI 0