FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Justificar un texto con impresion grafica
Posts: 418
Joined: Wed Nov 26, 2008 06:33 PM
Justificar un texto con impresion grafica
Posted: Tue Nov 10, 2009 12:15 AM

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

Noé Aburto Sánchez
Tec. Prog. de Sistemas. -Morelia, Mich. México.
fwh 20.06, Harbour 3.2.0, bcc 7.4
TsBrowse 9.0, TsButton 7.0, xEdit 6.1
naburtos@gmail.com, noeaburto67@hotmail.com
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: Justificar un texto con impresion grafica
Posted: Tue Nov 10, 2009 12:29 PM
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 (fw): Select all Collapse
***************************************************************************************
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..

:-)
Saludos



Angel, Valencia, Venezuela



xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Posts: 330
Joined: Fri May 25, 2007 09:06 PM
Re: Justificar un texto con impresion grafica
Posted: Thu Nov 12, 2009 02:07 AM

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

Continue the discussion