Aunque esto es parte de algo más complejo, te puede servir para que desarrolles tu propia función para imprimir justificado una cadena de texto;
Code: Select all
***************************************************************************************
FUNCTION pSay3(nline,ncol,cTexto,nFont,nJust)
* pSay3(Linea,Col,"texto",nroFont,nroJustificacion)
* Linea: Coordenadas del Punto (en caracteres)
* Col: Coordenadas del Punto (en ctm)
* nroJustificacion: 1=>texto a la Izquierda del punto,2=>Centrada al punto,3=>Derecha del punto
* NroFont 1 => Arial 10 bold
* NroFont 2 => Arial 10
* NroFont 3 => Arial 8 bold
* NroFont 4 => Arial 8
* NroFont 5 => Arial 6 bold
* NroFont 6 => Arial 6
// Solo para usar con salida()
***************************************************************************************
LOCAL nVert,nHorz,cFont:="oFont"+str(iif(nFont<7 .and. nFont>0,nFont,1),1)
oPrn:setfont(&cFont )
IF nFont<3
nVert:=0.3939 //0.4
nHorz:=0.26 //0.45
ELSE
nVert:=0.3939
nHorz:=0.13
ENDIF
IF PCOUNT()=5
oPrn:CmSay(nVert*nline+1,nCol,cTexto,&cFont ,,,,iif(nJust<4 .and. nJust>0,nJust,1))
ELSE
oPrn:CmSay(nVert*nline+1,nCol,cTexto,&cFont )
ENDIF
RETURN nil
******************************************************************************************
FUNCTION Imp_MemoW(cTxt,nline,nLpos,nWid,nFont,nSkp,lJust) // IMPRIME CAMPO MEMO
******************************************************************************************
// cTxt - dato tipo memo, en relidad basta con que sea texto
// nLpos - posicion en cm del inicio del texto en la linea
// oPrn - objeto TPrinter
// nWid - ancho mAximo de texTo (en cmt)
// oFont - fuente (Numero Salida)
// nSkp - salto o espaciado por renglon
// lJust - (Opcional) si no va a justificar => .f.
// Nota solo para usar con salida()
LOCAL cLin, lCont:=.T., nP:=0, lNext, cC, nW,cFont,cPatron,nIp,nlcT,nCol := 1,nRow := 1
DEFAULT nSkp := 01.0
DEFAULT nWid := 19.0
DEFAULT nFont:= 01.0
DEFAULT nLpos:= 01.6
DEFAULT lJust:= .T.
oPrn:Cmtr2Pix(0,@nWid)
cTxt := Alltrim(cTxt)
nW := nWid-0.2
cFont := "oFont"+STR(IIF(nFont<7 .and. nFont>0,nFont,1),1)
line := nline
DO WHILE lCont // un desmadre para separar
cLin := cC := "" // y justificar los memos!!
lNext := .T.
DO WHILE oPrn:GetTextWidth(cLin,&cFont)<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
CPATRON := CLIN
cC := Substr(cTxt,nP+1,1)
IF " "$cLin .AND. cC<>" "
ELSE
// palabra cortada, retrocede
nIp := 1
nlct := len(clin)
DO WHILE Substr(cLin,nlct-nIp,1)<>" " .and. nIP<nlct
nIp++
ENDDO
IF nIp>0
cLin := SubStr(cLin,1,nlct-nIp-1)
nP -=nIp
ENDIF
ENDIF
DO WHILE cC<>" " .AND. Len(cLin)>0
cLin := Substr(cLin,1,Len(cLin)-1)
cC := Right(cLin,1)
nP--
ENDDO
nlct := len(clin)
IF lJust
IF AT(" ",CLIN)>0 .AND. AT(" ",CLIN)<NLCT .AND. AT(" ",CLIN)<>1 // SOLO SI TIENE MAS DE UNA PALABRA
DO WHILE oPrn:GetTextWidth(cLin,&cFont)<nWid // JUSTIFICADO
nIp := 1
DO WHILE oPrn:GetTextWidth(cLin,&cFont)<nWid .and. nIP<nlct
nIP++
DO WHILE Substr(cLin,nlct-nIp,1)<>" " .and. nIP<nlct
nIp++
ENDDO
IF Substr(cLin,nlct-nIp,1)=" "
cLin := Substr(cLin,1,nlct-nIp-1)+" "+SubStr(cLin,nlct-nIp,len(clin))
nIp++
ENDIF
ENDDO
ENDDO // FIN DEL JUSTIFICADO
ENDIF
ENDIF
pagina(1)
nline:=line
PSAY3(line,nLpos,cLin,nFont)
nline += nSkp
line := nline
ELSE
pagina(1)
nline:=line
PSAY3(line,nLpos,cLin,nFont)
nline += nSkp
line := nline
ENDIF
IF nP >= Len(cTxt)
lCont := .F.
ENDIF
ENDDO
RETURN nline