Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-04-2005
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 22
johncook Va por buen camino
Peluca: Insisto de que incluyas al menos unas líneas de código......
Creo que con el código del comando bastaría... Por el tipo de error que mencionas, me imagino que puede ser a causa de que estas referenciando objetos sin haberlos creado previamente. Es por eso que me gustaría ver el código que incluyes cuando se ejecuta el comando...
Espero tu respuesta....
Saludos.
John Cook.
Responder Con Cita
  #2  
Antiguo 27-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Post Aqui va - un poco largo

Este es un extracto del codigo

type
TFServidor = class(TForm)
impresora : TImpresoraFiscal;
procedure serverConnect(AThread: TIdPeerThread);
procedure serverExecute(AThread: TIdPeerThread);
procedure serverDisconnect(AThread: TIdPeerThread);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure serverComandoImpresionCommand(ASender: TIdCommand);
procedure serverNoCommandHandler(ASender: TIdTCPServer;
const AData: String; AThread: TIdPeerThread);
procedure serverComandoCierreXCommand(ASender: TIdCommand);
private
{ Private declarations }
ipCount : integer;
ipLocal : string;
puerto : integer;
cantart : integer;
function verificarCantArticulos(param : TStringList) : boolean;
function verificarIndicadores(param : TStringList) : boolean;
public
{ Public declarations }
Clients : TThreadList;
secCrit : TCriticalSection;
vec : TObjectList;
function verficarEstadoConexionesImpFiscales() : boolean ;
function inicilizarInterfaceGrafica() : boolean ;
function cargarConfiguraciones() : boolean ;
function inicializarConexionesClientes() : boolean ;
function verificarParametros(param : TStringList) : boolean;

end;

var
FServidor: TFServidor;


implementation

{$R *.dfm}


function TFServidor.verficarEstadoConexionesImpFiscales() : boolean ;
var
res : boolean;
begin
res:=false;
try
impresora:= TEpsonTM2000AF.Create;
memo1.Lines.Add('Iniciado objeto EPSON');
res:=true;
except
on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext);
end;
result := res;
end;

function TFServidor.inicilizarInterfaceGrafica() : boolean ;
var
res : boolean;
begin
res:=false;
try
trayicon1.Show;
result := True;
except
on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext);
end;
result := res;
end;

function TFServidor.cargarConfiguraciones() : boolean ;
begin
try
ipLocal := getIPs.Strings[0];
puerto := 5000;
EIP.Text := ipLocal;
EPuerto.Text := IntToStr(puerto);
except
on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext);
end;
end;

function TFServidor.inicializarConexionesClientes() : boolean ;
begin
Clients := TThreadList.Create;

Server.Active := true;
secCrit := TCriticalSection.Create;
end;


procedure TFServidor.FormCreate(Sender: TObject);
begin
// verficar estado de la conexion con las Impresoras Fiscales.
verficarEstadoConexionesImpFiscales();
// cargo archivos de configuracion
cargarConfiguraciones();
// Inicializamos los socket con todos los clientes
inicializarConexionesClientes();
// inicializar IGU
inicilizarInterfaceGrafica();

end;

procedure TFServidor.serverConnect(AThread: TIdPeerThread);
var
NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));

NewClient.DNS := AThread.Connection.LocalName;
NewClient.Connected := Now;
NewClient.LastAction := NewClient.Connected;
NewClient.Thread := AThread;

with grillaConexiones do
begin
addRow(1);
cell[0,0].AsString := AThread.Connection.Socket.Binding.PeerIP;
cell[1,0].AsString := IPAddrToName(AThread.Connection.Socket.Binding.PeerIP);
end;
AThread.Data:=TObject(NewClient);
memo1.Lines.Add('Conectado');
try
Clients.LockList.Add(NewClient);
finally
Clients.UnlockList;
end;

end;


procedure TFServidor.serverExecute(AThread: TIdPeerThread);
var
ActClient, RecClient: PClient;
CommBlock, NewCommBlock: String;
RecThread: TIdPeerThread;
i: Integer;
j: byte;

begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
CommBlock:=AThread.Connection.ReadLn;
ActClient := PClient(AThread.Data);
ActClient.LastAction := Now;

with Clients.LockList do
try
for i := 0 to Count-1 do
begin
RecClient:=Items[i];
// if RecClient.DNS=CommBlock.Text then
// begin
RecThread:=RecClient.Thread;
RecThread.Connection.WriteLn(NewCommBlock);
memo1.Lines.Add('Recibido : '+CommBlock+' - Renviando');
// impresora.cierreX;
end;
finally
Clients.UnlockList;
end;
end;
end;



procedure TFServidor.serverDisconnect(AThread: TIdPeerThread);
var
ActClient: PClient;

begin
ActClient := PClient(AThread.Data);
try
Clients.LockList.Remove(ActClient);
memo1.Lines.Add('Desconectado');
grillaConexiones.SearchNext(1,AThread.Connection.LocalName);
grillaConexiones.DeleteRow(grillaConexiones.SelectedRow);

finally
Clients.UnlockList;
end;
FreeMem(ActClient);
AThread.Data := nil;
end;

procedure TFServidor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Server.Active := False;
Clients.Free;
impresora.Destroy;
end;

procedure TFServidor.serverComandoImpresionCommand(ASender: TIdCommand);
var
resp,th: TStringList;
i : integer;

begin
// Comando que va dar inicio a la impresion
memo1.Lines.Add('recibiendo impresion');
resp := TStringList.Create;
resp.Sorted := False;
for i:=0 to ASender.Params.Count-1 do
begin
resp.add(ASender.Params.Strings[i]);

end;
if verificarParametros(resp) then
begin
memo1.Lines.Add('seteado parametros');
if impresora.setearParametros(resp) then
begin
memo1.Lines.Add('mandando a imprimir');
th := TStringList.Create;
th.Add(impresora.imprimir());
ASender.SetResponse(th);
end;
end
else
memo1.Lines.Add('error en el seteo de parametros');

end;


function TFServidor.verificarParametros(param : TStringList) : boolean;
var
res : boolean;
begin
res:=false;
if param.Strings[1]='FISCAL' then
begin
if verificarCantArticulos(param) then
begin
if verificarIndicadores(param) then
res:=true;
end
end
else
begin
if param.Strings[1]='NO FISCAL' then
res:=true;
end;
result:=res;
end;

function TFServidor.verificarCantArticulos(param : TStringList) : boolean;
var
i :integer;
res : boolean;
begin
//verificamos cantidad de parametros
// por defecto tiene 15 + ( 7 * Cantidad de Items de Articulos)
res:=false;
cantArt := 0;
for i := 0 to param.Count-1 do
begin

if param.Strings[i]='ITEM' then
cantArt:=cantArt+1;
end;

// Verificamos que la Cantidad de articulos OK
if param.Count = (15 + ( 7 * cantArt)) then
res:=true;


result:=res;

end;

function TFServidor.verificarIndicadores(param : TStringList) : boolean;
var
res : boolean;
index,i : integer;
ParamSort : TStringList;
begin
res:=false;
ParamSort := TStringList.Create();
for i := 0 to param.Count-1 do
begin
ParamSort.Add(param.Strings[i]);
end;
ParamSort.Sort;
if ParamSort.Find('TIPO',index) then
if ParamSort.Find('PUERTO',index) then
if ParamSort.Find('CABEZERA',index) then
if ParamSort.Find('ITEM',index) then
if ParamSort.Find('CIERRE',index) then
res:=true;
result:=res;
end;


procedure TFServidor.serverComandoCierreXCommand(ASender: TIdCommand);
var
resp : TStringList;
begin
resp := TStringList.Create;
try
secCrit.Enter;
if impresora.cierreX then <------------ aca da la Excepcion
begin
resp.Add('Cierre X');
ASender.SetResponse(resp);
end;
finally
secCrit.Leave;
end;

end;

*******************************************************************+
unit EpsonFiscal;

interface

uses
EPSON_Impresora_Fiscal_TLB, comobj, ImpresoraFiscal, classes,utiles,SysUtils,Math;

type
TItem = record
descripcion,cantidad,prUnitario,tasaIva,noGravado,descExtra : widestring;
end;

type
TEpsonTM2000AF = class(TImpresoraFiscal) <--esta clase es base se implementan los metodos
private

port : integer;
baud : widestring;


items : array of TItem;
itemsNF : TStringList;

cantArt : integer;

public
PrnFisc : _PrinterFiscalDisp;
constructor Create();
procedure setPuerto( puerto : integer );override;
function getPuerto() : integer;override;
procedure setBaudRate( baudRate : widestring );override;
function getBaudRate() : widestring;override;

function abrirTicketFiscal( letraDoc, ivaEmisor, ivaComprador, nombreCliente, docCliente,
nroDocCliente, domicilio1, domicilio2 : widestring ) : boolean; overload;override;

function abrirTicketFiscal() : boolean;overload;override;

function enviarItemFiscal( descripcion, cantidad, prUnitario, tasaIVA, impNoGravado,
desc1 : Widestring) : boolean; overload;override;

function enviarItemFiscal() : boolean; overload;override;

function cerrarTicketFiscal( letraDoc, saludo: widestring) : boolean;overload;override;

function cerrarTicketFiscal() : boolean;overload;override;

function abrirTicketN0Fiscal() : boolean; override;
function enviarItemNoFiscal(item : widestring) : boolean;overload;override;
function enviarItemNoFiscal() : boolean;overload;override;
function cerrarTicketNoFiscal() : boolean;override;
function verificarParamentros(param : TStringList) : boolean;override;
function setearParametros(param : TStringList) : boolean;override;
function imprimir() : string;override;

function cierreX() : boolean;override;


end;



implementation

uses Servidor;

constructor TEpsonTM2000AF.Create;
begin
inherited;
setMarca('Epson');
setModelo('TM2000AF');
PrnFisc := CreateComObject(CLASS_PrinterFiscal) as _PrinterFiscalDisp;
prnfisc.PortNumber:=1;
prnfisc.BaudRate:='9600';


itemsNF := TStringList.Create();
itemsNF.Sorted:=False;
end;


function TEpsonTM2000AF.cierreX() : boolean;
var Aux1,Aux2:WideString;
resp: boolean;
begin
Aux1:='X';
Aux2:='P';
resp:=prnFisc.CloseJournal(Aux1,Aux2);
ActualizarMemo('CIERRE X');
result :=resp;
end;



function TEpsonTM2000AF.imprimir() : string;
var
resp : string;
i : integer;
aux : widestring;
begin
resp:='';
fservidor.memo1.Lines.Add('comenzando impresion');
if tipo_impresion = 'FISCAL' then
begin
if abrirTicketFiscal() then
begin
if enviarItemFiscal() then
begin
if cerrarTicketFiscal() then
resp:=PrnFisc.AnswerField_3;
end;
end ;
end
else
begin
if tipo_impresion = 'NO FISCAL' then
begin
resp:='Imp NF ';
if abrirTicketN0Fiscal() then
begin
resp:=resp+'Abrir NF ';
if enviarItemNoFiscal() then
begin
resp:=resp+'Item NF ';
if cerrarTicketNoFiscal() then
begin
resp:=resp+'Cerrar NF'
end;
end;
end;
end;

end;


result:=resp;
end;

Última edición por PeLuCa fecha: 27-04-2005 a las 04:13:20.
Responder Con Cita
  #3  
Antiguo 27-04-2005
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 22
johncook Va por buen camino
Peluca:
Estuve pegando una mirada, muy por arriba a tu código y me parece que el problema se podría solucionar poniendo
impresora : TImpresoraFiscal; en la parte pública de la clase..
En estos momentos no tengo el delphi, pero cuando llegue a mi casa lo verifico.
De paso te comento que me gustaría si podés que me pases la clase para el acceso a la impresora fiscal.. Me gustaría saber acerca de su manejo...
Mas tarde posteo de nuevo...
Saludos
Responder Con Cita
  #4  
Antiguo 27-04-2005
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 22
johncook Va por buen camino
Otra sugerencia que te podría hacer, es que crees el objeto impresora cada vez que un cliente necesite imprimir.
A grandes rasgos sería algo asi:

Cuando recibes el mensaje imprimir, Creas un hilo, dentro de ese hilo creas un objeto impresión, utilizas sus métodos para realizar la impresión propiamente dicha, liberas el objeto, finalizas el hilo.
Responder Con Cita
  #5  
Antiguo 27-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Question Ya lo he probado

johncook :
Ya habia probado de ponerlo en la parte publica y da el mismo error, visitando los newsgroup de Borland, el de winsock, encontre algo parecido y como respuesta mencionaban el ambito de las variables, pero vuelvo a lo mismo la variable impresora es publica a toda la aplicacion no se si para los hilos cuenta esto, la verdad escapa a mi entendimiento.????
Responder Con Cita
  #6  
Antiguo 27-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Cool

El objeto printer es público... pero no creo que soporte de alguna manera concurrencia multihilos, por lo que eso, te toca a vos proveerlo.

Una forma muy simple es con algún tipo de semáforo controlar cuando la impresora está en uso por algún hilo... y quizas usar el método Synchronize del hilo para garantizar que todo corra sin problemas.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 28-04-2005
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 23
Enan0 Va por buen camino
Una Cosa peluca, TE cuento que yo estube trabajando un tiempo con impresores fiscales de HASSAR, y estos si la impresora estaba imprimiendo, y les mandabas otro evento de imprimir se rebentaba el OCX entregado por ellos, desconosco el tema de EPSON, pero ahora...
Te imprime aunque sea la primera peticion=??? o absolutamente nada?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:31:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi