FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Impresi贸n de campos memos con clase Tprinter
Posts: 325
Joined: Sun Feb 03, 2008 11:04 PM
Impresi贸n de campos memos con clase Tprinter
Posted: Sun Aug 02, 2009 08:29 AM
Amigos del Foros

Nuevamente con este tema, ya que no puedo encontrar el Problema de porque no me justifica la Impresi贸n...

Esta es la Funcion que Uso.....

Code (fw): Select all Collapse
* cTxt 聽= Texto a Imprimir
* oPrn
* nRow 聽= Linea
* nCol 聽= Columna
* nWid 聽= Tope de Columa a la Derecha
* oFont = Letra
* nSkp 聽= Tama帽o de Salto de Linea
* nClr 聽= 

FUNCTION Imp_MemoW(cTxt,oPrn,nRow,nCol,nWid,oFont,nSkp,nClr)

local cLin 聽 聽 聽 聽,;
聽 聽 聽 lCont:=.T. 聽,;
聽 聽 聽 nP:=0 聽 聽 聽 ,;
聽 聽 聽 lNext 聽 聽 聽 ,;
聽 聽 聽 cC 聽 聽 聽 聽 聽,;
聽 聽 聽 nW

DEFAULT nSkp:=0.4, nClr:=0

cTxt := Alltrim(cTxt)
nW 聽 := nWid-0.2
nRow-=nSkp

oPrn:Cmtr2Pix(0,@nWid)

WHILE lCont 聽 聽 聽 聽 聽 聽 聽// un desmadre para separar
聽 cLin 聽:= cC := "" 聽 聽 聽// y justificar los memos!!
聽 lNext := .T.

聽 WHILE oPrn:GetTextWidth(cLin,oFont)<nWid ;
聽 聽 聽 聽.AND. nP<=Len(cTxt) .AND. lNext
聽 聽 nP++
聽 聽 cC:=Substr(cTxt,nP,1)
聽 聽 IF Asc(cC)<>13
聽 聽 聽 cLin+=cC
聽 聽 ELSE
聽 聽 聽 聽nP++
聽 聽 聽 聽lNext:=.F.
聽 聽 ENDIF
聽 ENDDO

聽 IF Asc(cC)<>13 .AND. Asc(cC)<>0
聽 聽 cC:=Substr(cTxt,nP+1,1)
聽 聽 IF " "$cLin .AND. cC<>" "
聽 聽 聽 WHILE cC<>" " .AND. Len(cLin)>0
聽 聽 聽 聽 cLin:=Substr(cLin,1,Len(cLin)-1)
聽 聽 聽 聽 cC:=Right(cLin,1)
聽 聽 聽 聽 nP--
聽 聽 聽 ENDDO
聽 聽 ELSE
聽 聽 聽 cLin:=Substr(cLin,1,Len(cLin)-2)+"-"
聽 聽 聽 cC:=Right(cLin,1)
聽 聽 聽 nP-=2
聽 聽 ENDIF
聽 聽 oPrn:CmSay(nRow+=nSkp,nCol,Alltrim(cLin),oFont,nW,nClr,,3)
聽 ELSE
聽 聽 oPrn:CmSay(nRow+=nSkp,nCol,Alltrim(cLin),oFont,,nClr)
聽 ENDIF
聽 IF nP>=Len(cTxt)
聽 聽 lCont:=.F.
聽 ENDIF
ENDDO
RETURN (nRow)



y la llamo as铆

Code (fw): Select all Collapse
 聽 聽 聽 聽 line := 聽Imp_MemoW((ECOINTE)->V_TEXT ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oPrn ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 line ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If((ECOINMO)->IMP_IMDE==0 , 5.5 , 2+Espacio) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 19 ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oFont2 ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 0.5)



(ECOINTE)->V_TEXT es la variable o campo MEMO.

Desde Ya muchas gracias...

Saludos

David
Argentina
Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Sun Aug 02, 2009 02:51 PM
Esa funci贸n no trabaja sola, ah铆 solo se hace la separaci贸n de la cadena a imprimir.

Para la distribuci贸n debe agregarse est茅 c贸digo en la clase TPrinter, METOD Say()

Code (fw): Select all Collapse
   
   IF nWidth > 0 .AND. oFont != Nil              // AAL 20/05/2002
        cText:=Alltrim(cText)
        DO WHILE ::GetTextWidth( cText, oFont ) > nWidth
           IF   nPad == PAD_RIGHT
              cText:=Substr(cText,2,Len(cText))
           ELSE
              cText:=Substr(cText,1,Len(cText)-1)
           ENDIF
        ENDDO
        IF nPad=PAD_BOTH .AND. " "$cText  // Justificado a ambos lados -> #define PAD_BOTH          3
           nP:=1
           DO WHILE ::GetTextWidth( cText, oFont ) < nWidth
              FOR nI=nP TO Len(cText)
                 nP++
                 cC:=SubStr(cText,nI,1)
                 IF cC=" "
                    cText:=Substr(cText,1,nI)+Substr(cText,nI,Len(cText))
                    nI:=Len(cText)+1
                    nP++
                 ENDIF
              NEXT nI
              IF nP>=Len(cText)-1
                 nP:=1
              ENDIF
           ENDDO
        ENDIF
   ENDIF
Posts: 325
Joined: Sun Feb 03, 2008 11:04 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Mon Aug 03, 2009 09:20 AM
Estimado Alfredo

Ante todo muchas gracias por turespuesta...

Te comento que esa correccion ya la habia hecho y el problema que me generaba un renglon un blanco cuando tenia que imprimir el renglon justificado.

Testeando ese agregado encontr茅 que cuando entra ac谩:

Code (fw): Select all Collapse
        DO WHILE ::GetTextWidth( cText, oFont ) > nWidth
           IF   nPad == PAD_RIGHT
              cText:=Substr(cText,2,Len(cText))
           ELSE
              cText:=Substr(cText,1,Len(cText)-1)
           ENDIF
        ENDDO



en ese momento me deja la variable cText queda en blanco....

David
Argentina
Posts: 325
Joined: Sun Feb 03, 2008 11:04 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Mon Aug 03, 2009 11:23 PM

Hola de nuevo....

Otro dato que encontr茅

Aparentemente las variables

nWidth = viene en Cent铆metro
::GetTextWidth( cText, oFont ) = trae en pixel

podr谩s ser?

David
argentina

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Tue Aug 04, 2009 02:37 AM

Enviame el texto o la tabla con el dato que pretendes imprimir, ver茅 que puedo hacer.

Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Tue Aug 04, 2009 02:48 AM

dobfivewin,
a ver si te entendi
yo imprimo un campo memo asi con tprinter:

cLeyen := Alltrim(Mi_campo_MEMO)
IF !Empty(cLeyen)
nLines := MLCOUNT(Mi_campo_MEMO,39) // ssco cuantas lineas tiene el campo memo con unalongitud de 39, (esa tu la puedes cambiar)
FOR x := 1 TO nLines
nRow += 0.4
oPrn:CmSay( nRow,0, MEMOLINE(Mi_campo_MEMO,39,x))
NEXT
ENDIF

espero sea lo que buscas
salu2
paco

____________________

Paco
Posts: 325
Joined: Sun Feb 03, 2008 11:04 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Wed Aug 05, 2009 10:03 AM

Estimado Paco

De esa forma que me sugeris, la justificacion del texto sale a la izquierda, y lo que necesito es que dicha justificacion sea en forma total, osea que el texto cubra tanto desde la izquierda como al final, a la derecha...

David

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Wed Aug 05, 2009 08:00 PM
Esta funcion la utilizo para pasar memos a array (me va muy rapido):
Code (fw): Select all Collapse
FUNCTION ContLins(hDc,cTxt,hFnt,nAnch,nCuantos)
聽 聽LOCAL nCnt,nLong,nLins := 0
聽 聽LOCAL cTrozo,cRengl,cLins
聽 聽LOCAL aLins := {}

聽 聽DEFAULT nCuantos := 9999
聽 聽*
聽 聽FOR nCnt = 1 TO MLCOUNT(cTxt,254)
聽 聽 聽 聽cLins := ALLTRIM(MEMOLINE(cTxt,254,nCnt))
聽 聽 聽 聽DO WHILE !Empty(cLins) .AND. nCnt < nCuantos
聽 聽 聽 ++nLins
聽 聽 聽 IF GetTextWidth(hDc,cLins,hFnt) <= nAnch
聽 聽 聽 聽 聽cRengl := ALLTRIM(cLins)
聽 聽 聽 聽 聽cLins 聽:= ""
聽 聽 聽 ELSE
聽 聽 聽 聽 聽cRengl := ""
聽 聽 聽 聽 聽cTrozo := StrToken(cLins,1)
聽 聽 聽 聽 聽nLong 聽:= GetTextWidth(hDc,cTrozo,hFnt)
聽 聽 聽 聽 聽DO WHILE nLong <= nAnch .AND. !Empty(cTrozo)
聽 聽 聽 聽 cRengl += cTrozo+" "
聽 聽 聽 聽 cLins := LTRIM(STUFF(cLins,1,LEN(cTrozo),""))
聽 聽 聽 聽 cTrozo:= StrToken(cLins,1)
聽 聽 聽 聽 nLong := GetTextWidth(hDc,cRengl+cTrozo,hFnt)
聽 聽 聽 聽 聽ENDDO
聽 聽 聽 ENDIF
聽 聽 聽 AADD(aLins,ALLTRIM(cRengl))
聽 聽 聽 聽ENDDO
聽 聽NEXT
聽 聽SysRefresh()
RETURN aLins

nAnch es el ancho en pixels del espacio en el que voy a imprmir.
nCuantos es el numero maximo de lineas que deseo imprimir (por si me hiciera falta)
hFnt es el handle del font que voy a utilizar

Como veras utilizo STRTOKEN pero si quieres lo puedes hacer caracter a caracter, en ese caso hago:
Code (fw): Select all Collapse
nLong := GetTextWidth(hDc,"B",hFnt)

Para saber cuanto mide una letra, asi el primer cacho no lo mido con el bucle DO WHILE sino que cojo directamete un trozo equivalente (nAnch/nLong)-1 antes de empezar a medir.

En MLCOUNT y MEMOLINE utilizo 254 porque es lo maximo que admite (creo que son 255, pero por si las moscas), pero tambien detecta los CRLF = CHR(13)+CHR(10). Es decir que separa los trozos de texto en cachos de 254 letras o hasta que encuentra un CRLF.

En cuanto a las alineaciones, yo lo hago asi:

DERECHA:
--------
cText := a la linea que voy a escribir.
Code (fw): Select all Collapse
oPrn:Say( X1,nAncho-oPrn:GetTextWidth( cText , oFont ),cText,oFont )



CENTRO
-------
cText := a la linea que voy a escribir.
Code (fw): Select all Collapse
oPrn:Say( X1,(nAncho-oPrn:GetTextWidth( cText , oFont ))/2,cText,oFont )


Espero que te sirva

Un saludo
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Impresi贸n de campos memos con clase Tprinter
Posted: Thu Aug 06, 2009 03:41 PM
Bueno, he cometido un peque帽o fallo en el apartado justificaci贸n, he supuesto que nAnch toma todo el espacio disponible, cuando en realidad dejaras margenes a los lados.
Code (fw): Select all Collapse
nLMarg := Margen izquierdo
nRMarg := Margen derecho

Con lo cual nAnch := nRMarg - nLMarg + 1

Y por supuesto nAnch ya no sirve para justificar a la derecha, pero si nRMarg.
Las justificaciones quedar铆an as铆:
Code (fw): Select all Collapse
DERECHA:
---------
oPrn:Say( X1,nRMarg-oPrn:GetTextWidth( cText , oFont ),cText,oFont )

CENTRO
--------
oPrn:Say( X1,nLMarg+((nAncho-oPrn:GetTextWidth( cText , oFont ))/2),cText,oFont )

Perdona el error

Un saludo
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55

Continue the discussion