PDA

Ver la Versión Completa : Impresion de logotipo ticket


luiguiray
24-08-2004, 22:43:24
Que tal...
Aquí les va un tirito, haber quien de casualidad por ahí se ha topado con el mismo problema...
Resulta que estoy imprimiento un ticket, el cliente quiere la impresión del logotipo en la cabecera del ticket (ese es uno de los problemas) o mínimo su razón social con letras grandes...
El principal detalle es que logro imprimir la razon social con letras grandes 'Go4Value' PERO...cuando se imprime el resto del ticket se salta como 5 o 6 renglones, como si fuera un newpage, digamos q estoy hablando de dos partes,CABECERA 'Go4Value' y RESTO del ticket.
Para la cabecera utilizo el CANVAS.TEXTOUT y para el resto del ticket uso otra funcion...
lo importante es que NO SALTE RENGLONES despues de que hago el ENDDOC., y como dijera mi abuelita, lo demas es lo de menos...

FRAGMENTO DE CODIGO

procedure TfrmPuntoVentaSQL.ImprimeAlFinal();
var i:integer;
begin
try
if OrdenSeccionesTicket[2,2] = 'S' then
begin
//aqui imprimo Go4Value en letras grandes
printslogan := Printer; //impresora
printslogan.BeginDoc; //inicializacion para impresion
printslogan.Canvas.Font.Size:= 20; //tamaño de letra
printslogan.Canvas.TextOut(20,0,'Go4Value'); //texto a imprimir con tamaño 20
printslogan.EndDoc; //finalizacion de la impresion de la cabecera
//aqui se salta algunos renglones despues de imprimir go4value con letras grandes
//quiero que lo de arriba y el resto me queden juntos
StartPrint(iImpresora, PuntoVentadm.cdsVentafactura.AsString, '', 1); //inicializacion de impresion del resto del ticket
ToPrnFrmC(TrimChar(Slogan,'%'), []); //letra grande
if OrdenSeccionesTicket[2,1] = 'S' then ToPrnFrmC(TrimChar(vatEncabezado,'%'), []); //datos de la empresa
ToPrnFrmC(TrimChar(ArmaSeccionTicket(2),'%'), []);
ToPrnFrmC(TrimChar(ArmaSeccionTicket(8),'%'), []);
//if OrdenSeccionesTicket[2,4] = 'S' then ToPrnFrmC('DESCRIPCION ',[]);
toprnfrmc('----------------------------------------',[]);
EndPrint(); //finalizacion de impresion de la cabecera del ticket
end;
try
PuntoVentadm.cdsVede.DisableControls;
PuntoVentadm.cdsVede.First;
for i:=1 to PuntoVentadm.cdsVede.RecordCount do
begin
StartPrint(iImpresora, PuntoVentadm.cdsVentafactura.AsString, '', 1);
if OrdenSeccionesTicket[2,3] = 'S' then ToPrnFrmC(TrimChar(ArmaSeccionTicket(3),'%'), []);
if OrdenSeccionesTicket[2,4] = 'S' then ToPrnFrmC(TrimChar(ArmaSeccionTicket(4),'%'), []);
EndPrint;
PuntoVentadm.cdsVede.Next;
end;
finally
PuntoVentadm.cdsVede.EnableControls;
end;
ImprimePiedelTicket;
except
on E:Exception do
TErrorManager.Create(true,E,'Se presento un error al imprir el ticket vent:' + PuntoVentadm.cdsVentaventa.AsString, 'TfrmPuntoVentaSQL.ImprimeAlFinal','',caja);
end;

si alguien sabe como lograr esto, le estaria muy agradecido... de igual manera me pongo a su disposicion en cualquier cosa q les pueda ayudar. Flash, Dreamweaver, BD...etc...
Gracias de antemano...

delphi.com.ar
24-08-2004, 23:50:28
Se salta "unos renglones" porque has terminado el documento en la línea "printslogan.EndDoc; //finalizacion de la impresion de la cabecera"...

¿Que tienes en las "otras funciones"?... ¿Utilizan el objeto Printer?... ¿Oíste hablar de la etiqueta [delphi] :D? (es para poner el código un poco mas bonito en el foro ;))

luiguiray
25-08-2004, 00:44:54
Gracias, no sabia de la etiqueta, soy nuevo en este foro, pero procurare hacerlo...
bueno, la cosa aqui es que efectivamente al hacer el EndDoc se finaliza el documento. En el resto de la impresión no utilizo el objeto Printer, anexo al final del post parte de las funciones para imprimir el detalle del ticket.

Digamos que lo unico que necesito es que una vez finalizado el documento (finalización del documento llamo únicamente a la terminación de la impresión del logo) es que no avance, o no recorra el papel, para el propósito de que quede contínuo el resto del ticket...
Trataré de imaginar que el ticket está de la siguiente manera...
(Oops, en el preview del post me di cuenta q no sale el ticket como lo dibuje.. me borro los espacios en blanco, tralmente no estaba tan feo :p )

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| |
| Go4Value |
| |
| |
| | <--- Este es el espacio que me
| | deja después del EndDoc
| |
| |
| RAZON SOCIAL | <--- Aquí ya empiezo a imprimir
| ... | con la función que anexo
| ... |
| |
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Y digamos que quiero que me quede mas o menos así...

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| |
| Go4Value |
| RAZON SOCIAL |
| ... |
| ... |
| |
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

NOTA : Lo de la negrita es la letra que voy a poner de tamaño GRANDE.
Agrego que no puedo imprimir completamente el ticket con el Canvas por cuestiones ya de mantenimiento del proyecto.

Me gustaría saber si es posible hacerlo de la manera que planteo o si hay otra alternativa...

* Código anexo...


//función para inicialización de impresión
procedure StartPrint(PrtName, DocName, ToFile: string; Copies: integer);
var
pdi: PDocInfo1;
pd: TPrinterDefaults;
begin
DevMode.dmCopies:=Copies;
DevMode.dmFields:=DM_COPIES;
pd.pDatatype:='RAW';
pd.pDevMode:=@DevMode;
pd.DesiredAccess:=PRINTER_ACCESS_USE;
if Win32Check(OpenPrinter(PChar(PrtName),ph,@pd)) then
begin
new(pdi);
with pdi^ do
begin
pDocName:=PChar(DocName);
if ToFile='' then
pOutputFile:=nil
else
pOutputFile:=PChar(ToFile);
pDatatype:='RAW';
end;
PrJob:=StartDocPrinter(ph,1,pdi);
if PrJob=0 then
Win32Check(false);
end;
end;

//Funciones de la misma librería
function ReplaceStr(const S, Srch, Replace: string): string;
var
I: Integer;
Source: string;
begin
Source := S;
Result := '';
repeat
I := Pos(Srch, Source);
if I > 0 then begin
Result := Result + Copy(Source, 1, I - 1) + Replace;
Source := Copy(Source, I + Length(Srch), MaxInt);
end
else Result := Result + Source;
until I <= 0;
end;
function ToDos(const AnsiStr: String):String;
begin
SetLength(Result, Length(AnsiStr));
if Length(Result) > 0 then
AnsiToOem(PChar(AnsiStr), PChar(Result));

Result:=ReplaceStr(Result,chr(253),chr(15));
end;
function ToWin(str: String):String;
begin
if str='' then begin
Result:='';
System.Exit;
end;
OemToAnsi(PChar(str),PChar(str));
Result:=str;
end;

function ToPrnFrm(FrmStr: string; const Args: array of const): boolean;
begin
Result:=ToPrnLn(Format(FrmStr,Args));
end;

function ToPrnFrmC(FrmStr: string; const Args: array of const): boolean;
begin
Result:=ToPrnLn(ToDos(Format(FrmStr,Args)));
end;

function ToPrnLn(S: string): boolean;
begin Result:=ToPrn(S+#13#10); end;

function ToPrn(S: string): boolean;
var cp: dword;
begin
Win32Check(WritePrinter(ph,PChar(S),length(S),cp));
Result:=true;
end;

procedure EndPrint;
begin
Win32Check(EndDocPrinter(ph));
end;



Aunque realmente las funciones listadas arriba no influyen en que se salte los renglones. El problema es después del EndDoc. :( . Obviamente no me cierro a utilizar únicamente las funciones del Canvas. Alguien sabe algo más? o que puedo hacer en este caso?

Dejo mi msn por si algún@ bondados@ desea conversar la situación...
icokybad@hotmail.com (icokybad@hotmail.com)
Muchas Gracias...