Asi estimados, me urge su asistencia en esto, el tipico caso de imprimir una factura, con encabezado y detalle.
pero aca la particularidad es que una de las columnas es un campo texto con tamaño variable. y es muy importante.
Cantidad Descripcion Precio Unit. Precio Total.
======= ============================================ =========== ===========
1 Este campo es una descripcion con un tamaño vari- 1,200.00 1,200.00
able, a como puede tener una fila de alto, puede te-
ner cuatro, cinco, seis. :-(
1 Este es otro campo es un tamaño variable 200.00 200.00
he aquí mi dilema, como hacer esto?, lo he intentado de varias formas, campos cortados en piezas. etc.
tomando en cuenta que la fuentes es ancho variable, he usado para mis prueba la clase tprinter ya que es la que me permite
ubicar _ en posiciones en cm especificas.
creo que a tprinter le falta un metodo para imprimir en un area definida y haga un corte automático de palabra.
Que tal, ojala te sirva, yo lo uso para imprimir textos justificados, tipo DOS.
cDesc:='***('+upper(DescNum(abs(tot_car)))+')***, CANTIDAD ABONADA A NUESTRA'+;
' CUENTA NO. '+alltrim(ban->num_cta)+' DE '+alltrim(ban->nom_ban)+;
' SEGUN COPIA DE FICHA DE DEPOSITO DEL DIA '+ceros(day(dFecPag),2)+' DE '+MesLetra(dFecPag)+' DEL '+str(year(dFecPag),4)+;
' Y QUE APLICAMOS A LO SIGUIENTE:'
inicia impresion con fuente tipo texto
aTexto:=ParteMemo(cDesc,55) // ABAJO LA FUNCION
for i:=1 to len(aTexto)
if substr(aTexto,len(aTexto),1)==chr(20)
@ nSup+i,nIzq+05 dato substr(aTexto,1,len(aTexto)-1) en oReci
else
@ nSup+i,nIzq+05 dato Justifica(aTexto,55,i%3) en oReci // ABAJO LA FUNCION
endif
next
termina pagina
termina impresion
// --- Parte memo
function ParteMemo(mTex,nLong)
local aTex:={},cTex,i,nPrinc,nUltEsp
cTex:=memotran(mTex,chr(20),chr(29))
nPrinc:=nUltEsp:=1
for i:=1 to len(cTex)
while substr(cTex,i,1)==chr(29)
cTex:=stuff(cTex,i,1,'')
if i>len(cTex)
exit
endif
end
if i>len(cTex)
exit
endif
if substr(cTex,i,1)==chr(20)
aadd(aTex,substr(cTex,nPrinc,i-nPrinc+1))
nPrinc:=nUltEsp:=i+1
loop
endif
if substr(cTex,i,1)==' '
nUltEsp:=i
endif
if i-nPrinc+1>nLong
do case
case nUltEsp==nPrinc
aadd(aTex,substr(cTex,nPrinc,nLong))
nPrinc:=nUltEsp:=i
case nUltEsp==i
aadd(aTex,substr(cTex,nPrinc,nLong))
nPrinc:=nUltEsp:=i+1
otherwise
aadd(aTex,substr(cTex,nPrinc,nUltEsp-nPrinc))
nPrinc:=nUltEsp:=nUltEsp+1
endcase
endif
next
if len(trim(substr(cTex,nPrinc)))<>0
aadd(aTex,substr(cTex,nPrinc))
endif
if substr(aTex[len(aTex)],len(aTex[len(aTex)]),1)<>chr(20)
aTex[len(aTex)]+=chr(20)
endif
return aTex
// --- Justifica un texto
function Justifica(cTex,nLong,nDonde)
local aEspacio:={},i,j,nFaltante,lEspacio
default nDonde:=1
cTex:=trim(cTex)
if len(cTex)>=nLong
return substr(cTex,1,nLong)
endif
nFaltante:=nLong-len(cTex)
lEspacio:=.f.
for i:=1 to len(cTex)
if substr(cTex,i,1)==' '
if lEspacio;aadd(aEspacio,i);endif
lEspacio:=.f.
else
lEspacio:=.t.
endif
next
if len(aEspacio)==0
return padr(cTex,nLong,'-')
endif
do case
case nDonde==0;j:=len(aEspacio)
case nDonde==1;j:=min(len(aEspacio),nFaltante)
otherwise; j:=min(int((len(aEspacio)+nFaltante)/2),len(aEspacio))
endcase
for i:=1 to min(len(aEspacio),nFaltante)
cTex:=substr(cTex,1,aEspacio[j])+substr(cTex,aEspacio[j])
j--
next
cTex:=Justifica(cTex,nLong)
return cTex
Antonio:
¿Como se usaría desde fivewin?.
veo esta función muy interesante,mas cuando he tenido que imprimir observaciones de un tratamiento en un box del objeto printer, y veo que con esto quedaría perfectamente justificado.
Un saludo y mil gracias
Muchas gracias, Antonio, en cuanto me incorpore de las vacacionesme pongo con ella, pues el ema me ha creado mas de un dolor de cabeza.
Un saludo y mil gracias
José Luis
Si le pongo ancho,se puede ver solo la primera linea del memo oPrn:CmSay ( nFilReg+0.5, 4.5, mcomer->NOTAS, oFon3, 2500, ROJO )
Logicamente debería usar DrawText.
He probado con nAltoTexto := DrawText( hdc, mcomer->NOTAS, { nFilReg + 0.5, 4.5, nFilReg + 10, 2500 }, DT_WORDBREAK ) y compruebo que me devuelve siempre un valor superior a cero, con el número de lineas del DRAWTEXT con la cual la función es correcta. Pero no aparece nada en el documento.
Manuel Valdenebro wrote:Tengo un documento con Tprinter, don he sustituido un campo caracter por otro Memo (mas grande) y logicamente no funciona con el siguiente código:
Si le pongo ancho,se puede ver solo la primera linea del memo oPrn:CmSay ( nFilReg+0.5, 4.5, mcomer->NOTAS, oFon3, 2500, ROJO )
Logicamente debería usar DrawText.
He probado con nAltoTexto := DrawText( hdc, mcomer->NOTAS, { nFilReg + 0.5, 4.5, nFilReg + 10, 2500 }, DT_WORDBREAK ) y compruebo que me devuelve siempre un valor superior a cero, con el número de lineas del DRAWTEXT con la cual la función es correcta. Pero no aparece nada en el documento.
Para imprimir yo utilizo la estupenda clase UtilPrn de Rafa Thefull. Esa clase lleva impresion de campos memo. La clase lleva los fuentes, por lo que debe ser facil coger "lo que se necesite" para adaptarlo a tu situacion.
Function PintaMemo( oPrn, nRow, nCol, nWidth, cMemo, oFont )
Local cLine := ""
Local nLineas := 0
Local x
Local nAvanza := 0
//nWidth ancho de columna
nLineas := MlCount( cMemo, nWidth )
nAvanza := nRow
for x := 1 to nLineas
cLine := MemoLine( cMemo, nWidth, x )
oPrn:cmSay( nAvanza, nCol, cLine, oFont )
nAvanza += oFont:nHeight + 0.2 // Esto será lo más dificil aunque con oFont:nHeight podrás calcular algo
next
Return nLineas
No lo he probado, pero espero te de por lo menos alguna luz
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.