Page 1 of 1

Justificar un texto con impresion grafica

Posted: Tue Nov 10, 2009 12:15 am
by noe aburto
Saludos.

Tengo la necesidad de justificar textos al estilo de Office Word.

Con impresiones de DOS no tego ningun problema, de hecho diseñe mis funciones y funcionan perfecto, pero con impresiones de CmSay o Say no se como resolverlo ya que se manejan en puntos.

Alquien que me pueda hechar una manita con esto.

Gracias.

Fwh 8.11, xH 9.1, bcc 5.1

Re: Justificar un texto con impresion grafica

Posted: Tue Nov 10, 2009 12:29 pm
by ADBLANCO
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


 
espero te ayude..

:roll:

Re: Justificar un texto con impresion grafica

Posted: Thu Nov 12, 2009 2:07 am
by mantonio_08
USA LA CLASE TIMPRIME DE FULLL..... ES LO UNICO Q HE ENCONTRADO QUE SOLUCIONA EL PROBLEMA DE JUSTIFICAR LOS TEXTO, NUMEROS,,, ES SUPER SIMPLE DE APLICAR::
ADEMAS HEREDA TODO DE LA CLASE NATIVA DE FWH...


SI TIENES PROBLEMAS PARA USARLA ME HECHAS UN GRITITO...


ATTE. UN COLEGA