Delphi Sempre
Blog dedicado a pequenas dicas para programadores em Delphi.
terça-feira, 22 de julho de 2025
segunda-feira, 9 de junho de 2025
Usando API Rest com Delphi 7 de forma simples
Vamos criar uma API REST simples em Delphi. Para isso, usaremos o Delphi 7 com Indy components (se for o que você tem disponível) ou, se estiver usando uma versão mais recente do Delphi (como Delphi XE6+), o ideal é usar o RAD Server (EMS) ou criar via WebBroker.
Como você mencionou anteriormente que trabalha com Delphi 7, vou te mostrar um exemplo simples usando Indy (IdHTTPServer) para criar uma API REST rudimentar. Se estiver usando uma versão mais nova, posso adaptar para WebBroker ou RAD Server, é só avisar.
✅ Exemplo: API REST simples com Delphi 7 e Indy (IdHTTPServer)
Essa API vai responder um JSON simples em uma rota /hello.
1. Coloque os componentes no formulário
TIdHTTPServer (ex: IdHTTPServer1)
TMemo (opcional, para log)
Ative IdHTTPServer1.Active := True;
2. Código de exemplo
uses
IdHTTPServer, IdCustomHTTPServer, SysUtils, Classes, IdContext;
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
if ARequestInfo.Document = '/hello' then
begin
AResponseInfo.ContentType := 'application/json';
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentText := '{"message": "Olá, mundo!"}';
end
else
begin
AResponseInfo.ResponseNo := 404;
AResponseInfo.ContentText := '{"error": "Rota não encontrada"}';
end;
end;
📌 Resultado esperado
Requisição para http://localhost:port/hello retorna:
{"message": "Olá, mundo!"}
✅ Dicas extras
Porta: configure a propriedade DefaultPort do IdHTTPServer1 (ex: 8080).
Métodos GET/POST: você pode usar ARequestInfo.Command para distinguir entre métodos HTTP.
JSON mais complexo: use TStringList ou TMemoryStream para respostas maiores ou arquivos.
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;
-
function GetIP:string;//--> Declare a Winsock na clausula uses da unit var WSAData: TWSAData; HostEnt: PHostEnt; Name:string; begin...
-
Vamos criar uma API REST simples em Delphi. Para isso, usaremos o Delphi 7 com Indy components (se for o que você tem disponível) ou, se est...