PDA

Ver la Versión Completa : Ejemplo en VB para convertir a Delphi


freynoso
12-03-2018, 23:24:14
Hola a todos.

Tengo una situación un poco crítica. Puede alguno ayudarme a reescribir este procedimiento en Delphi?

Private Sub Command1_Click()
Dim sAux As String
Dim lAux As Long
Dim lreturn As Long

Const FLD_XNUMBER = 6

sAux = Chr$(&H4) & Chr$(&H2)
AddField sAux
sAux = Chr$(&H0) & Chr$(&H0)
AddField sAux
Call SendCommand
'Initialize string

sAux = Space(10)

'Debug to check answer
'no time out. just for debugging
lreturn = 1

lreturn = GetMessageField(sAux, lAux, FLD_XNUMBER)
DoEvents

MsgBox (sAux)

End Sub

Funciona perfectamente en VB. He hecho de todo pero en Delphi no me funciona.

Muy agradecido anticipadamente.

Saludos.

Fabio.

Casimiro Notevi
13-03-2018, 08:40:02
He hecho de todo pero en Delphi no me funciona.
A ver qué has hecho en Delphi y por qué no funciona.

PS: Y no olvides poner las etiquetas para el código.

https://www.clubdelphi.com/images/UtilizarTAGs.png

freynoso
13-03-2018, 14:23:08
Antes de seguir, agradezco mucho de antemano la ayuda que me puedan brindar.

Esto es lo que he hecho, probado, cambiado, intentado...

La idea es que al utilizar una librería dll poder conectarme a una impresora fiscal para obtener configuración (para uso de seguridad de la aplicación) y en lo adelante poder generar documentos de venta, no venta, etc. Lo comentado es lo que he ido omitiendo.

procedure TForm1.Button1Click(Sender: TObject);
var OpenSerialPort: function(wCommNumber : Word; dwBaudRate : LongWord) : LongWord; stdCall;
AddMessageField:function(szField : AnsiString; dwFieldLength : LongWord) : LongWord; stdCall;
GetMessageField: function(szField: AnsiString; dwFieldLength : LongWord; lAnsweredField: Long) : LongWord; stdCall;
SendSerialMessage : function: LongWord; stdCall;
PurgeMessage:function: LongWord; stdCall;
CloseSerialPort : function: LongWord; stdCall;
Lib: THandle;
r : LongWord;
szField : AnsiString;
sAux : AnsiString;
lAux : LongWord;
begin
Lib := LoadLibrary('EpsonFiscalProtocol.dll');
@OpenSerialPort := GetProcAddress(Lib, 'OpenSerialPort');
if Assigned(@OpenSerialPort) then
begin
r := OpenSerialPort(3, 9600);
try
if r <> 0 then
ShowMessage('Error al abrir el puerto 3')
else
begin
@AddMessageField := GetProcAddress(Lib, 'AddMessageField');
@SendSerialMessage := GetProcAddress(Lib, 'SendSerialMessage');
@GetMessageField := GetProcAddress(Lib, 'GetMessageField');
if Assigned(@AddMessageField) then
begin
//SetLength(szField, 4);

szField := Concat('$04', '$02');//StrToInt(Format('%s', ['0x04']));
// szField[1] := Chr(2);//StrToInt(Format('%s', ['0x02']));
AddMessageField(PAnsiChar(szField), 2);

szField := Concat('$00', '$00');//StrToInt(Format('%s', ['0x00']));
// szField[1] := Chr(0);//StrToInt(Format('%s', ['0x00']));
AddMessageField(PAnsiChar(szField), 2);

r := SendSerialMessage;

// Sleep(500);

r := GetMessageField(sAux, lAux, 6);

ShowMessage(sAux + IntToStr(lAux));

end;
end;
finally
@CloseSerialPort := GetProcAddress(Lib, 'CloseSerialPort');
if Assigned(@CloseSerialPort) then
r := CloseSerialPort;
FreeLibrary(Lib);
end;
end;

end;

Casimiro Notevi
13-03-2018, 14:36:51
Ummm... pero para usar una impresora epson no necesitas convertir de VB.
Haz una búsqueda por los foros, es un tema que se ha tratado varias veces.

freynoso
13-03-2018, 15:00:58
He buscado en el forum, sin embargo no he encontrado ningún ejemplo con el formato correcto para enviarle los comandos a la impresora fiscal. El ejemplo que colgué al principio viene con la documentación de la impresora y he intentado varias formas de enviarle los comandos en delphi, pero nada aún. El ejemplo en VB funciona, por eso he querido ver si se puede convertir o transcribir.

Por cierto, disculpa que no he dado muchos detalles. Es para trabajar con impresoras fiscales en República Dominicana.

gatosoft
14-03-2018, 15:26:41
La función GetProcAddress devuelve un método, así que bastaría con:


OpenSerialPort := GetProcAddress(Lib, 'OpenSerialPort');
if Assigned(OpenSerialPort) then

(sin la arroba)