segunda-feira, 9 de junho de 2025

Integração Simples Entre Delphi e a Impressora Fiscal

Fazer uma integração simples entre Delphi e uma impressora fiscal depende do modelo e do protocolo da impressora fiscal (Ex: Elgin, Daruma, Epson, Bematech, etc.), mas de forma geral, as impressoras fiscais antigas utilizam comunicação via porta serial (COM) e comandos baseados no Protocolo Fiscal (ECF).

Abaixo está um guia passo a passo para uma integração simples, com exemplo usando comandos diretos via porta serial:

✅ 1. Verifique o modelo e instale o driver da impressora

Antes de tudo, instale o driver oficial da impressora fiscal e anote a porta COM que ela está utilizando (pode ver isso no Gerenciador de Dispositivos).

✅ 2. Comunique-se via porta serial (COM) com Delphi

Delphi pode usar a unit SerialPort ou componentes de terceiros como AsyncPro, mas vamos mostrar um exemplo simples com componente THandle para acesso direto à porta COM.

🧩 Exemplo simples usando CreateFile:

uses

Windows;

function EnviarComandoECF(const Porta, Comando: string): Boolean;

var

  hSerial: THandle;

  BytesWritten: DWORD;

begin

  Result := False;

  hSerial := CreateFile(PChar(Porta),

                        GENERIC_WRITE,

                        0,

                        nil,

                        OPEN_EXISTING,

                        0,

                        0);


  if hSerial = INVALID_HANDLE_VALUE then

  begin

    ShowMessage('Erro ao abrir a porta ' + Porta);

    Exit;

  end;

  if WriteFile(hSerial, PChar(Comando)^, Length(Comando), BytesWritten, nil) then

    Result := True;

  CloseHandle(hSerial);

end;

➕ Como usar:

procedure TForm1.btnImprimirClick(Sender: TObject);

begin

  // Exemplo de comando fiscal (ver manual da impressora para os corretos)

  if EnviarComandoECF('COM1', #27 + 'C') then

    ShowMessage('Comando enviado com sucesso.')

  else

    ShowMessage('Erro ao enviar comando.');

end;

✅ 3. Usando DLL oficial do fabricante (recomendado)

Fabricantes como Daruma, Bematech, Elgin fornecem DLLs com funções prontas como Bematech_FI_AbreCupom, Daruma_FI_AbreCupom, etc.

Exemplo com DLL da Bematech:

function Bematech_FI_AbreCupom(CPF_CNPJ: PChar): Integer; stdcall; external 'BemaFI32.dll';

procedure TForm1.btnCupomClick(Sender: TObject);

begin

  if Bematech_FI_AbreCupom('12345678901') = 1 then

    ShowMessage('Cupom aberto com sucesso.')

  else

    ShowMessage('Erro ao abrir cupom.');

end;

✅ 4. Leia o manual da impressora fiscal

Cada fabricante possui comandos diferentes e exigências fiscais específicas. É essencial obter o manual do desenvolvedor (ECF/ACBr/DLL) da impressora que será utilizada.

✅ 5. Alternativa:
Usar o ACBr (componente gratuito e robusto)

O ACBr é um projeto open source que facilita a integração com equipamentos fiscais.

// Usando ACBrECF

procedure TForm1.btnCupomClick(Sender: TObject);

begin

  ACBrECF1.Modelo := ecfBematech; // ou ecfDaruma, etc.

  ACBrECF1.Porta := 'COM1';

  ACBrECF1.Ativar;

  ACBrECF1.AbreCupom;

  ACBrECF1.VendeItem('123', 'Produto Teste', 'UN', 1, 10, 0, 'T');

  ACBrECF1.SubtotalizaCupom;

  ACBrECF1.EfetuaPagamento('Dinheiro', 10);

  ACBrECF1.FechaCupom('Obrigado!');

end;

✅ Conclusão

Você pode escolher três caminhos:

Comunicação direta via porta COM (mais complexa e arriscada).

Usar a DLL do fabricante (mais seguro e comum).

Usar o ACBr (mais flexível, fácil e atualizado para exigências fiscais do Brasil).

segunda-feira, 24 de fevereiro de 2025

Retorna o IP da Máquina

function GetIP:string;//--> Declare a Winsock na clausula uses da unit

var

  WSAData: TWSAData;

  HostEnt: PHostEnt;

  Name:string;

begin

  WSAStartup(2, WSAData);

  SetLength(Name, 255);

  Gethostname(PChar(Name), 255);

  SetLength(Name, StrLen(PChar(Name)));

  HostEnt := gethostbyname(PChar(Name));

  with HostEnt^ do

    Result:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),

              Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);

  WSACleanup;

end;

Desconectar uma unidade de rede mapeada

 function DesconectaRede(Unidade:Pchar;ForcaCancel:boolean):String;

begin

  WNetCancelConnection2(Unidade,0,ForcaCancel);

  Case GetLastError() of

    1205: Result := 'Não foi possível abrir o perfil';

    1206: Result := 'Perfil do usuário não encontrado ou inválido';

    1208: Result := 'Ocorreu um Erro específico na rede';

    2138: Result := 'Rede não encontrada ou fora do ar';

    2250: Result := 'Mapeamento inválido ou não encontrado';

    2401: Result := 'Existem muitos arquivos abertos';

    else Result := 'Unidade disconectada com sucesso';

  end;

end;

Travar as teclas: Alt+Tab, Ctrl+Esc, Ctrl+Alt+Del

var OldValue : LongBool;

begin

  SystemParametersInfo(97, Word(True), @OldValue, 0);

end;


Destravar as teclas: Alt+Tab, Ctrl+Esc, Ctrl+Alt+Del


var OldValue : LongBool;

begin

  SystemParametersInfo(97, Word(False), @OldValue, 0);

end;

Esconder a aplicação da barra de tarefas

var H : HWnd;

begin

  H := FindWindow(Nil,'Project1');

  if H <> 0 then

    ShowWindow(H,SW_HIDE);

end; 

Executar Pack em Tabelas Paradox

procedure ParadoxPack(Table : TTable);

var

  TBDesc : CRTblDesc;

  hDb: hDbiDb;

  TablePath: array[0..dbiMaxPathLen] of char;

begin

  FillChar(TBDesc,Sizeof(TBDesc),0);

  with TBDesc do

  begin

    StrPCopy(szTblName,Table.TableName);

    StrPCopy(szTblType,szParadox);

    bPack := True;

  end;

  hDb := nil;

  Check(DbiGetDirectory(Table.DBHandle, True, TablePath));

  Table.Close;

  Check(DbiOpenDatabase(nil,'STANDARD',dbiReadWrite,dbiOpenExcl,nil,0,nil,nil,hDb));

  Check(DbiSetDirectory(hDb, TablePath));

  Check(DBIDoRestructure(hDb,1,@TBDesc,nil,nil,nil,False));

  Table.Open;

end;

Trocar a resolução de vídeo

function TrocaResolucao(X, Y: word): Boolean;

var lpDevMode: TDeviceMode;

begin

  if EnumDisplaySettings(nil, 0, lpDevMode) then

  begin

    lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;

    lpDevMode.dmPelsWidth := X;

    lpDevMode.dmPelsHeight:= Y;

    Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;

  end;

end;

Curso de Delphi: 7.Consultas SQL