Usuário com melhor resposta
MF ADC em impressoras Bematech (Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional)

Pergunta
-
Como o help orienta, lá diz pra usar o comando Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional
com os parâmetros DataUsuario, DataSWBasico e LetraAdicional, TODOS como String.
Os dois primeiros parâmetros são retornados normalmente pela dll, porém o terceiro (LetraAdicional) é "eliminado" pela dll, nao possibilitando o acesso para verificação, exemplo em DELPHI:
function ECF_InfoSB(var MFADC: String; var VersaoSB: String; var DataSB: TDate; var HoraSB: TTime; var NSeq: Integer; ECF: TModelosECF): Integer;
var
vDHUsuario: String;
vDHSoftB: String;
begin
case ECF of
MP2100TH : begin
SetLength(MFADC, 2);
MFADC := ' ';
SetLength(VersaoSB, 6);
SetLength(vDHUsuario, 20);
SetLength(vDHSoftB, 20);
//retorna as 2 primeiras OK e a variavel "MFADC" aparentemente é eliminada pela dll, impossibilitando o acesso para comparação
if (Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional(vDHUsuario, vDHSoftB, MFADC) = 1) then
begin
if Trim(MFADC) = EmptyStr then //Aqui dá access violation
begin
{GRAVO ALGUMA COISA NO BANCO DE DADOS}
end;
end;
end;
end;
end;
Qualquer outra tentativa de atribuição do tipo var1 := MFADC; também da acesss violation.
Qualquer tentativa de ler a variavel da access violation: var2 := Length(MFADC);
Em resumo qualquer tipo de USO, dá access violation!!
A declaração da função vinda da dll é feita de acordo com o help da bematech:
function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario: string; dataSoftwareBasico: string; var letraAdicional: string ): integer; stdcall; external 'BEMAFI32.DLL';
No ExemploFiscalDelphi.exe da bematech e seus fontes NÃO tem implementado o comando Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional, não dispondo de um exemplo para utilização, o que piorou as coisas.
Segundo o suporte da Bematech, somente caso a impressora TENHA MF-ADC, será retornado alguma coisa na váriavel de retorno, mas
e quando a impressora não tem? Segundo o suporte um parceiro deles (bematech) conseguiu retorno declarando como GLOBAL, mas também fiz o teste e houve os mesmos problemas...
Alguem implementou essa função e pode ajudar no assunto??
Obrigado.
Respostas
-
Olá Ricardo,
Vc está usando a BemaFI32.dll versão 5.10.6.5 ?
Se sim, experimente declarar a função desta forma:
function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';
E usa-la assim, exemplo:
procedure TfrmPrincipal.Button5Click(Sender: TObject);
var
iRetorno, iConta: integer;
dataUsuario, dataSWBasico, texto: string;
MFAdicional : char;
begin
for iConta := 1 to 20 do
begin
dataUsuario := dataUsuario + ' ';
dataSWBasico := dataSWBasico + ' ';
end;
MFAdicional := ' ';iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );
texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
'MF Adicional: ' + MFAdicional;Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );
end;
Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.
Qualquer coisa, me avise.
Ats,
André Munhoz
andre.munhoz@bematech.com.br- Marcado como Resposta Ricardo Wojcik sexta-feira, 26 de fevereiro de 2010 13:18
Todas as Respostas
-
Olá Ricardo,
Vc está usando a BemaFI32.dll versão 5.10.6.5 ?
Se sim, experimente declarar a função desta forma:
function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';
E usa-la assim, exemplo:
procedure TfrmPrincipal.Button5Click(Sender: TObject);
var
iRetorno, iConta: integer;
dataUsuario, dataSWBasico, texto: string;
MFAdicional : char;
begin
for iConta := 1 to 20 do
begin
dataUsuario := dataUsuario + ' ';
dataSWBasico := dataSWBasico + ' ';
end;
MFAdicional := ' ';iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );
texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
'MF Adicional: ' + MFAdicional;Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );
end;
Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.
Qualquer coisa, me avise.
Ats,
André Munhoz
andre.munhoz@bematech.com.br- Marcado como Resposta Ricardo Wojcik sexta-feira, 26 de fevereiro de 2010 13:18
-
Olá Ricardo,
Vc está usando a BemaFI32.dll versão 5.10.6.5 ?
Se sim, experimente declarar a função desta forma:
function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';
E usa-la assim, exemplo:
procedure TfrmPrincipal.Button5Click(Sender: TObject);
var
iRetorno, iConta: integer;
dataUsuario, dataSWBasico, texto: string;
MFAdicional : char;
begin
for iConta := 1 to 20 do
begin
dataUsuario := dataUsuario + ' ';
dataSWBasico := dataSWBasico + ' ';
end;
MFAdicional := ' ';iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );
texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
'MF Adicional: ' + MFAdicional;Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );
end;
Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.
Qualquer coisa, me avise.
Ats,
André Munhoz
andre.munhoz@bematech.com.br
A dll aceitou normalmente passando como "char", e pelo menos me retornou um " ". Só não pude testar com uma ecf com MF-ADC, pois não tenho uma para testar, a nossa pra desenvolvimento não tem MF-ADC.
Se puderem, coloquem no help da bematech, pois seguindo ele nao tem como implementar corretamente o uso da função. -
Olá Ricardo,
Sim, já atualizamos o help da dll, e quando desejar consulte o help on-line que fica sempre atualizado.
http://www.bematech.com.br/suporte/bemafi32/index.html
Ats,
André Munhoz
andre.munhoz@bematech.com.br