Impressao como do supermercado

Delphi

28/04/2005

Pessoal eu sempre fico curioso quando vejo os sistemas de supermercado quando imprimem naqueles rolinhos... Como que eles fazem para visualizar daquele jeito??? sera que usam um Tmemo ou um richedit??? E que eu queria colocar no meu sistema....

Obrigado pela atençao


Japa

Japa

Curtidas 0

Respostas

Edilcimar

Edilcimar

28/04/2005

o rolinho ao qual vc se refere não é feito pela impressora fiscal?


GOSTEI 0
Japa

Japa

28/04/2005

Olha e aqueles rolinho finos... aquelas impressoras matriciais pequenas..
matricial epson lx300


GOSTEI 0
Edilcimar

Edilcimar

28/04/2005

a lx300 imprime em 80 colunas, a Bematech, a Daruma, etc possuem impressoras que parecem fiscais, mas não são, que imprimem em 40 colunas


GOSTEI 0
Japa

Japa

28/04/2005

Como eu vejo esse total de colunas amizade??? no quickreport???


GOSTEI 0
Flaviocont

Flaviocont

28/04/2005

vc pode definir a largura da pagina no quickreport. vc mede a largura do papel e define essa largura la


GOSTEI 0
Sanses

Sanses

28/04/2005

olha pra fazer aquele tipo de impressão, inclusive item a item, utilize a unit charprinter, que pelo que me parece foi desenvolvida por um colega do fórum. Voce pode imprimir até em bobinas de 80milimetros.

segue abaixo a unit:

unit CharPrinter;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Printers, WinSpool;

type
 { Stream para enviar caracteres à impressora atual }
 TPrinterStream = class (TStream)
 private
   fPrinter : TPrinter;
   fHandle  : THandle;
   fTitle   : String;
   procedure  CreateHandle;
   procedure  FreeHandle;
 public
   constructor Create (aPrinter: TPrinter; aTitle : String);
   destructor  Destroy; override;
   function    Write (const Buffer; Count : Longint): Longint; override;
   property    Handle : THandle read fHandle;
 end;

 TCharPrinter = class(TObject)
 private
   { Private declarations }
   fStream   : TStream;
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
   constructor Create; virtual;
   destructor  Destroy; override;
   procedure   OpenDoc (aTitle : String); virtual;
   procedure   SendData (aData : String);
   procedure   CloseDoc; virtual;
   property    PrintStream : TStream read fStream;
 end;

 // Definições para TAdvancedPrinter //

 TprtLang = (lngEPFX,lngESCP2,lngHPPCL);
 TprtFontSize = (pfs5cpi,pfs10cpi,pfs12cpi,pfs17cpi,pfs20cpi);
 TprtTextStyle = (psBold,psItalic,psUnderline);
 TprtTextStyles = set of TprtTextStyle;

 TAdvancedPrinter = class (TCharPrinter)
 private
   fLang : TprtLang;
   fFontSize : TprtFontSize;
   fTextStyle : TprtTextStyles;
   procedure SetLang (lang : TprtLang);
   function  GetLang : TprtLang;
   procedure SetFontSize (size : TprtFontSize);
   function  GetFontSize : TprtFontSize;
   procedure SetTextStyle (styles : TprtTextStyles);
   function  GetTextStyle : TprtTextStyles;
   procedure UpdateStyle;
   procedure Initialize;
   function  Convert (s : string) : string;
 published
   constructor Create; override;
   procedure   OpenDoc (aTitle : String); override;
   property Language : TprtLang read GetLang write SetLang;
   property FontSize : TprtFontSize read GetFontSize write SetFontSize;
   property TextStyle : TprtTextStyles read GetTextStyle write SetTextStyle;
 public
   procedure CR;
   procedure LF; overload;
   procedure LF (Lines : integer); overload;
   procedure CRLF;
   procedure FF;
   procedure Write (txt : string);
   procedure WriteLeft  (txt, fill : string; size : integer);
   procedure WriteRight (txt, fill : string; size : integer);
   procedure WriteCenter(txt, fill : string; size : integer);
   procedure WriteRepeat(txt : string; quant : integer);
 end;

procedure Register;

implementation

procedure Register;
begin
{  RegisterComponents(´AeF´, [TCharPrinter]);}
end;

{ =================== }
{ =  TPrinterStream = }
{ =================== }

constructor TPrinterStream.Create (aPrinter : TPrinter; aTitle : String);
begin
 inherited Create;
 fPrinter := aPrinter;
 fTitle   := aTitle;
 CreateHandle;
end;

destructor TPrinterStream.Destroy;
begin
 FreeHandle;
 inherited;
end;

procedure TPrinterStream.FreeHandle;
begin
 if fHandle <> 0 then
 begin
   EndPagePrinter (fHandle);
   EndDocPrinter  (fHandle);
   ClosePrinter   (Handle);
   fHandle := 0;
 end;
end;

procedure TPrinterStream.CreateHandle;
type
 DOC_INFO_1 = packed record
   pDocName    : PChar;
   pOutputFile : PChar;
   pDataType   : PChar;
 end;
var
 aDevice,
 aDriver,
 aPort    : array[0..255] of Char;
 aMode    : Cardinal;
 DocInfo : DOC_INFO_1;
begin
 DocInfo.pDocName := nil;
 DocInfo.pOutputFile := nil;
 DocInfo.pDataType := ´RAW´;

 FreeHandle;
 if fHandle = 0 then
 begin
   fPrinter.GetPrinter (aDevice, aDriver, aPort, aMode);
   if OpenPrinter (aDevice, fHandle, nil)
   then begin
     DocInfo.pDocName := PChar(fTitle);
     if StartDocPrinter (fHandle, 1, @DocInfo) = 0
     then begin
       ClosePrinter (fHandle);
       fHandle := 0;
     end else
     if not StartPagePrinter (fHandle)
     then begin
       EndDocPrinter (fHandle);
       ClosePrinter  (fHandle);
       fHandle := 0;
     end;
   end;
 end;
end;

function TPrinterStream.Write (const Buffer; Count : Longint) : Longint;
var
 Bytes : Cardinal;
begin
 WritePrinter (Handle, @Buffer, Count, Bytes);
 Result := Bytes;
end;

{ ================= }
{ =  TCharPrinter = }
{ ================= }

constructor TCharPrinter.Create;
begin
 inherited Create;
 fStream := nil;
end;

destructor TCharPrinter.Destroy;
begin
 if fStream <> nil
 then fStream.Free;
 inherited;
end;

procedure TCharPrinter.OpenDoc (aTitle : String);
begin
 if fStream = nil
 then fStream := TPrinterStream.Create (Printer, aTitle);
end;

procedure   TCharPrinter.CloseDoc;
begin
 if fStream <> nil
 then begin
   fStream.Free;
   fStream := nil;
 end;
end;

procedure   TCharPrinter.SendData (aData : String);
var
 Data : array[0..255] of char;
 cnt  : integer;
begin
 for cnt := 0 to length(aData) - 1
 do Data[cnt] := aData[cnt+1];

 fStream.Write (Data, length(aData));
end;

{ ===================== }
{ =  TAdvancedPrinter = }
{ ===================== }

procedure TAdvancedPrinter.SetLang (lang : TprtLang);
begin
 fLang := lang;
end;

function  TAdvancedPrinter.GetLang : TprtLang;
begin
 result := fLang;
end;

procedure TAdvancedPrinter.SetFontSize (size : TprtFontSize);
begin
 fFontSize := size;
 UpdateStyle;
end;

function  TAdvancedPrinter.GetFontSize : TprtFontSize;
begin
 result := fFontSize;
 UpdateStyle;
end;

procedure TAdvancedPrinter.SetTextStyle (styles : TprtTextStyles);
begin
 fTextStyle := styles;
 UpdateStyle;
end;

function  TAdvancedPrinter.GetTextStyle : TprtTextStyles;
begin
 result := fTextStyle;
 UpdateStyle;
end;

procedure TAdvancedPrinter.UpdateStyle;
var
 cmd : string;
 i : byte;
begin
 cmd := ´´;
 case fLang of
   lngESCP2, lngEPFX : begin
     i := 0;
     Case fFontSize of
       pfs5cpi  : i := 32;
       pfs10cpi : i := 0;
       pfs12cpi : i := 1;
       pfs17cpi : i := 4;
       pfs20cpi : i := 5;
     end;
     if psBold in fTextStyle then i := i + 8;
     if psItalic in fTextStyle then i := i + 64;
     if psUnderline in fTextStyle then i := i + 128;
     cmd := #27´!´+chr(i);
   end;
   lngHPPCL : begin
     Case fFontSize of
       pfs5cpi  : cmd := 27´(s5H´;
       pfs10cpi : cmd := 27´(s10H´;
       pfs12cpi : cmd := 27´(s12H´;
       pfs17cpi : cmd := 27´(s17H´;
       pfs20cpi : cmd := #27´(s20H´;
     end;
     if psBold in fTextStyle
       then cmd := cmd + 27´(s3B´
       else cmd := cmd + 27´(s0B´;
     if psItalic in fTextStyle
       then cmd := cmd + 27´(s1S´
       else cmd := cmd + 27´(s0S´;
     if psUnderline in fTextStyle
       then cmd := cmd + 27´&d0D´
       else cmd := cmd + 27´&d@´;
   end;
 end;
 SendData(cmd);
end;

procedure TAdvancedPrinter.Initialize;
begin
 case fLang of
   lngEPFX  : SendData (27´@´27´2´27´P´18);
   lngESCP2 : SendData (27´@´27´O´27´2´27´C0´1127´!´0);
   lngHPPCL : SendData (27´E´27´&l2A´27´&l0O´27´&l6D´27´(s4099T´27´(s0P´27´&k0S´27´(s0S´);
 end;
end;

function  TAdvancedPrinter.Convert (s : string) : string;
const
 accent   : string = ´ãàáäâèéëêìíïîõòóöôùúüûçÃÀÁÄÂÈÉËÊÌÍÏÎÕÒÓÖÔÙÚÜÛÇ´;
 noaccent : string = ´aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC´;
var
 i : integer;
begin
 for i := 1 to length(accent) do
   While Pos(accent[i],s) > 0 do s[Pos(accent[i],s)] := noaccent[i];
 result := s;
end;

constructor TAdvancedPrinter.Create;
begin
 inherited Create;
 fLang := lngESCP2;
 fFontSize := pfs10cpi;
 fTextStyle := [];
end;

procedure   TAdvancedPrinter.OpenDoc (aTitle : String);
begin
 inherited OpenDoc (aTitle);
 Initialize;
end;

procedure TAdvancedPrinter.CR;
begin
 SendData (13);
end;

procedure TAdvancedPrinter.LF;
begin
 SendData (10);
end;

procedure TAdvancedPrinter.LF (Lines : integer);
begin
 while lines > 0 do begin
   SendData(10); dec(lines);
 end;
end;

procedure TAdvancedPrinter.CRLF;
begin
 SendData (#1310);
end;

procedure TAdvancedPrinter.FF;
begin
 SendData(12);
end;

procedure TAdvancedPrinter.Write (txt : string);
begin
 txt := Convert (txt);
 SendData (txt);
end;

procedure TAdvancedPrinter.WriteLeft  (txt, fill : string; size : integer);
begin
 txt := Convert(txt);
 while Length(txt) < size do txt := txt + fill;
 SendData (Copy(txt,1,size));
end;

procedure TAdvancedPrinter.WriteRight (txt, fill : string; size : integer);
begin
 txt := Convert(txt);
 while Length(txt) < size do txt := fill + txt;
 SendData (Copy(txt,Length(txt)-size+1,size));
end;

procedure TAdvancedPrinter.WriteCenter(txt, fill : string; size : integer);
begin
 txt := Convert(txt);
 while Length(txt) < size do txt := fill + txt + fill;
 SendData (Copy(txt,(Length(txt)-size) div 2 + 1,size));
end;

procedure TAdvancedPrinter.WriteRepeat(txt : string; quant : integer);
var
 s : string;
begin
 s := ´´;
 txt := Convert(txt);
 while quant > 0 do begin
   s := s + txt;
   dec(quant);
 end;
 SendData (s);
end;


end.


Sanses


GOSTEI 0
Weber

Weber

28/04/2005

Tome cuidado, em supermercados e lojas as impressoras de ´rolinhos´ são ECF (Impressora Fiscal) e nesses você deve cumprimir leis estaduais e imprimir nessas impressões não é tão simples quanto parece, você deverá trabalhar com DLL´S dessas impressoras ou mesmo utilizar componentes de terceiros para isso.
Digo utilizar componentes de terceiros porque é muito trabalhoso criar sua propria rotina de impressão fiscal.


GOSTEI 0
Sanses

Sanses

28/04/2005

Olha e aqueles rolinho finos... aquelas impressoras matriciais pequenas.. matricial epson lx300


O amigo Weber tem razão, mas na lx300 vc pode usar essa unit tranquilamente, pois ela não tem valor fiscal. E se seu cliente tiver uma impressora ECF, as vezes ela também não é fiscal. Pode estar apenas sendo usada sem fins fiscais, o que também é perfeitamente possível de se fazer. E tem gente que prefere, pois quando voce coloca uma bobina de 80 mm numa lx300, é uma adaptação com um suporte, que as vezes leva o papel a intortar e imprimei fora, por isso muita gente prefere usar impressoras fiscais como não fiscal.

Sanses


GOSTEI 0
Weber

Weber

28/04/2005

...prefere usar impressoras fiscais como não fiscal...


Aqui no Estado do Paraná existe uma lei que proibe o uso de impressora não fiscais em estabelecimentos de comércio.
Toda venda emitida em loja e/ou supermercados se o mesmo for computadorizado deve ser emitido por meio de cupom fiscal ou nota fiscal.


GOSTEI 0
Madrick

Madrick

28/04/2005

Só complementando, não existe ECF(Emissor de cupom fiscal) não fiscal, e sim impressoras não fiscal, e se o estabelecimento for usar operação TEF, vc terá que usar uma ECF, dai vc cai na criação de uma rotina para emissão de cupom fiscal, onde vc não tem que se preocupar com a quantidade de colunas e sim com os comandos enviados para a porta serial, tanto a daruma quanto a bematech tem otimas dll para implementação desta tarefa..


GOSTEI 0
Sanses

Sanses

28/04/2005

Weber, desconheço esta lei para o meu estado. E o uso da impressora como fiscal só é feito a partir do momento que a receita registra a mesma. Um exemplo: aqui temos um shopping center e no estacionamento do mesmo tem impressoras bematech para emitir os cupons de entrada com placa e hora, etc. Este cupom NÂO É FISCAL.

Sanses


GOSTEI 0
Gandalf.nho

Gandalf.nho

28/04/2005

Vc pode usar geradores de relatórios como o QuickReport mesmo para trabalhar com essas impressoras não-fiscais. É como eu fiz no sistema que desenvolvi para a Biblioteca Pública aqui do município onde trabalho, que imprime os recibos numa Bematech não fiscal (inclusive usei o driver Genérico/Somente Texto para isso)


GOSTEI 0
Weber

Weber

28/04/2005

Sanses, uma impressora bematech não tem necessáriamente que ser fiscal pode ser apenas uma mini impressora.
Um estacionamento não é uma loja de venda, portando não tem que emitir cupom fiscal.
Em um supermercado ou loja o cupom fiscal é obrigatório pois foi a forma que o governo encontrou de impedir a sonegação fiscal já um estacionamento funciona mais ou menos como uma pestação de serviços e nesse caso o que vale são leis municipais.


GOSTEI 0
Anjinho Loiro

Anjinho Loiro

28/04/2005

Vc pode usar geradores de relatórios como o QuickReport mesmo para trabalhar com essas impressoras não-fiscais. É como eu fiz no sistema que desenvolvi para a Biblioteca Pública aqui do município onde trabalho, que imprime os recibos numa Bematech não fiscal (inclusive usei o driver Genérico/Somente Texto para isso)


***********************************************************

Driver genérico...??? Como é isso... Será que vc pode me ensinar...???

Desde já agradeço...


GOSTEI 0
Gandalf.nho

Gandalf.nho

28/04/2005

[quote:769522c33b=´Anjinho loiro´]Driver genérico...??? Como é isso... Será que vc pode me ensinar...???[/quote:769522c33b]

Se vc olhar a lista de impressoras que já vem com o Windows, irá encontrar uma chamada de Genérica/Somente Texto que tecnicamente é compatível com qualquer impressora, mas só imprime em modo texto (tipo DOS, sem imagens). Para esse tipo de recibo funciona muito bem.


GOSTEI 0
Vitor Rubio

Vitor Rubio

28/04/2005

Estou começando agora nesse universo de impressoras fiscais e tenho algumas dúvidas:

Pelo que eu entendi, uma impressora dessas fiscais, tipo as da daruma ou bematech, também podem ser usadas como impressoras não-fiscais, caso o estabelecimento não precisar ou caso o estabelecimento precise de um relatorio ou nota ´fininha´. Mas a impressora passa a ser oficialmente um impressora fiscal no momento em que ela é homologada, registrada e lacrada pelo governo. Estou certo nessa afirmação ou estou enganado?

Outra dúvida, tenho um sistema na minha empresa desenvolvido com base na impressora Bematech, que faz chamadas à dll da impressora bematech. Só que agora, teremos de reescrever o mesmo programa pra trabalhar com a impressora Daruma. Alguém já fez isso antes? Gostaria de saber se é complicado ou se simplesmente substitui-se as funções, alguem tem um exemplo pra me passar, ou um comparativo entre as funções das duas impressoras?

Grato!


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/04/2005

[quote:8e6242a63b=´vitor^_^´]Estou começando agora nesse universo de impressoras fiscais e tenho algumas dúvidas:

Pelo que eu entendi, uma impressora dessas fiscais, tipo as da daruma ou bematech, também podem ser usadas como impressoras não-fiscais, caso o estabelecimento não precisar ou caso o estabelecimento precise de um relatorio ou nota ´fininha´. Mas a impressora passa a ser oficialmente um impressora fiscal no momento em que ela é homologada, registrada e lacrada pelo governo. Estou certo nessa afirmação ou estou enganado?

Outra dúvida, tenho um sistema na minha empresa desenvolvido com base na impressora Bematech, que faz chamadas à dll da impressora bematech. Só que agora, teremos de reescrever o mesmo programa pra trabalhar com a impressora Daruma. Alguém já fez isso antes? Gostaria de saber se é complicado ou se simplesmente substitui-se as funções, alguem tem um exemplo pra me passar, ou um comparativo entre as funções das duas impressoras?

Grato![/quote:8e6242a63b]
Colega,

Não se pode utilizar uma impressora ´não lacrada´, pois ela fica em modo treinamento e possui algumas limitações, bem como, não seria aceito pelo fisco local.
A migração de Bematech para Daruma é razoavelmente simples, pois até os nomes das funções são semelhantes. Entretanto, considerando o esforço, acho que vale a pena verificar o ACBr (link na assinatura) e o www.forumweb.com.br/foruns (Desenvolvimento -> Automação comercial), pois há uma forte presença dos principais players de automação comercial por lá.


GOSTEI 0
Vitor Rubio

Vitor Rubio

28/04/2005

Então não se pode usar uma impressora fiscal como uma impressora normal?

Quanto a migração da bematech pra daruma, como tudo já funciona normalmente com a impressora da bematech, eu irei apenas fazer uma verificação num arquivo .ini que eu tenho no meu sistema, numa seção que dirá o tipo da impressora, definida por um utilitariozinho de configuração.
se eu verificar que a impressora bematech está instalada, chamo as funções da bematech, caso contrario, chamo os métodos do AcbrEcf.

Achei os componentes muito interessantes, gostaria de contribuir de alguma forma caso tivesse conhecimento técnico suficiente para tanto, por hora, contribuirei com testes.

Dúvida: no componente TacbrCalculadora, como eu faço pra imprimir o ´papelzinho´ da calculadora? pra usar igual aquelas calculadoras de mesa?

Grato!


GOSTEI 0
Weber

Weber

28/04/2005

[quote:c04680de74=´vitor^_^´]Então não se pode usar uma impressora fiscal como uma impressora normal?
[/quote:c04680de74]

Não, não pode.


GOSTEI 0
Dopi

Dopi

28/04/2005

Ola Vitor,

[quote:12d13cd2ad=´vitor^_^´]Então não se pode usar uma impressora fiscal como uma impressora normal?[/quote:12d13cd2ad]

De forma alguma... ECF são parecidos com impressoras comuns, mas internamente são completamente diferentes, pois possuem um Software Básico que obedece a rigidas leis estabelecidas pelo Fisco... Em um ECF não é vc que controla o que será impresso e sim o Software Básico residente no ECF...


Legal que vc gostou do ACBr... Qualquer duvida, sugestão ou contribuição pode entrar em contato... atualmente eu estou atuando como moderador da [url=http://www.forumweb.com.br/foruns/index.php?&showforum=416]Area de Automação Comercial do ForumWeb[/url]

[quote:12d13cd2ad=´vitor^_^´]
Quanto a migração da bematech pra daruma, como tudo já funciona normalmente com a impressora da bematech, eu irei apenas fazer uma verificação num arquivo .ini que eu tenho no meu sistema, numa seção que dirá o tipo da impressora, definida por um utilitariozinho de configuração.
se eu verificar que a impressora bematech está instalada, chamo as funções da bematech, caso contrario, chamo os métodos do AcbrEcf.
[/quote:12d13cd2ad]

Acho que se vc for usar o ACBr para se comunicar com a Daruma vc pode usa-lo para se comunicar também com a Bematech... com a vantagem de já deixar o seu código compativel com todas as impressoras suportadas pelo ACBrECF (Bematech, Daruma, Schalter, Sweda, e todas as MECAFs (oem) )

Ou seja, usando o ACBrECF é só escolher o modelo e chamar o metodo aprópriado que deverá funcionar em todos os ECFs suportados... sem a necessidade de nenhuma DLL pois o ACBrECF usa a comunicação direta...

[quote:12d13cd2ad=´vitor^_^´]
Dúvida: no componente TacbrCalculadora, como eu faço pra imprimir o ´papelzinho´ da calculadora? pra usar igual aquelas calculadoras de mesa? [/quote:12d13cd2ad]

Humm... bem pensado... acho que não previ essa funcionabilidade ao componente Calculadora... poderiamos implementar um propriedade [b:12d13cd2ad]Porta[/b:12d13cd2ad] no componente e um método [b:12d13cd2ad]ImprimirBobina[/b:12d13cd2ad]... Anotado... vou tentar implementar na versão 0.8.2b


GOSTEI 0
Marcosrocha

Marcosrocha

28/04/2005

Eu tenho uma .dll que controla uma impressora não-fiscal certo?
Eu estou deixando ela na pasta do aplicativo!! Mas e se eu quisesse compilar essa .dll juntamente com o meu projeto para não precisar usar??


GOSTEI 0
Dopi

Dopi

28/04/2005

Não dá... a não ser que o fabricante te envie um .OBJ

Voce poderia anexar a DLL ao EXE como se fosse um resource e extrai-lo na pasta do programa quando fosse necessário carrega-lo...

Essa técnica foi descrita pelo Nildo (aqui do Forum)... se não me engano esse artigo dele estava no site da ClubeDelphi


GOSTEI 0
Marcosrocha

Marcosrocha

28/04/2005

Vc sabe o link para o artigo???


GOSTEI 0
Dopi

Dopi

28/04/2005

Andei procurando mas não achei... o link estava na assinatura do Nildo, mas ele mudou a assinatura... :-(


GOSTEI 0
Flacandido

Flacandido

28/04/2005

caro amigo Sanses, nao tem como vc postar ou me enviar um exemplo utilizando a unit que vc citou, meu e-mail é candido@powerline.com.br.


GOSTEI 0
POSTAR