Page 1 of 2

Como Calcular Ancho en Pixeles de una Variable "FrancicoA"

PostPosted: Fri Jun 12, 2020 1:26 am
by remtec
Hola Amigos

Necesito obtener el ancho real de una variable en PIXELES, para colorear el fondo de un SAY en un DEFINE DIALOG.

Estou usando : GetTextWidth(0,Profe->Nom_Pro, oFont6).

El problema es que el calculo, me corta el contenido de la variable, aun cuando no le ponga en oFont6, el contenido impreso es el mismo.

Muchos Saludos

Antonio.

Codigo:
Code: Select all  Expand view

@ 200,160 SAY Profe->Nom_Pro       SIZE GetTextWidth(0,Profe->Nom_Pro,oFont6),20 PIXEL OF oDlg2   PICTURE "@!"  COLOR RGB(0,0,128), RGB(159,233,255)
 

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Fri Jun 12, 2020 2:22 am
by cnavarro
Usa oFont6:hFont

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Fri Jun 12, 2020 2:06 pm
by remtec
Hola Cristobal

Deseo que te encuentres muy bien.

Aplique lo que me indicas y lamentablemente no surge ningun cambio, sigue cortandome el contenido de la variable.

Muchos Saludos.
Antonio.

Code: Select all  Expand view

     DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14  BOLD
....
....
     @ 200,160 SAY oSay1 Var Profe->Nom_Pro       SIZE GetTextWidth(0,Profe->Nom_Pro,oFont6:hFont),20 PIXEL OF oDlg2   PICTURE "@!"  COLOR RGB(0,0,128), RGB(159,233,255)  

 

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Fri Jun 12, 2020 8:37 pm
by FranciscoA
DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14 BOLD
@ 200,160 SAY oSay1 Var Profe->Nom_Pro SIZE GetTextWidth(0,Profe->Nom_Pro,oFont6:hFont),20 PIXEL OF oDlg2 PICTURE "@!" COLOR RGB(0,0,128), RGB(159,233,255)


Antonio, así debería funcionarte:
Code: Select all  Expand view
 @ 105,160 SAY oSay2 PROMPT  Profe->Nom_Pro  SIZE GetTextWidth( 0, Alltrim(Profe->Nom_Pro), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6   ADJUST
 

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Fri Jun 12, 2020 8:50 pm
by FranciscoA
Probando tu ejemplo, con las modificaciones sugeridas.
Code: Select all  Expand view
//---------------------------------------------------------//
Function ClrFondoSay()
local oDlg2, oTitu, oSay1, oSay2, oSay3
local oFont2, oFont5, oFont6

   DBUSEAREA(.T.,,"PLANIL","PLANIL",.T.)
   DBGOTOP()

   DEFINE FONT oFont2 NAME "ARIAL"  SIZE 0,-10
   DEFINE FONT oFont5 NAME "ARIAL"  SIZE 0,-12
   DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14

   DEFINE DIALOG oDlg2 SIZE 600,570 PIXEL TRUEPIXEL FONT oFont2  //STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME )

   @ 10,150 SAY otitu PROMPT " MUESTRA PROFESIONAL "  PIXEL OF oDlg2 COLORS RGB(0,100,0)   FONT oFont5

   @ 055,050 SAY "Código :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 105,050 SAY "Nombre :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 130,050 SAY "Inss   :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6

  // Aqui necesito que estos Say, tengan un fondo en color y solo del largo del texto
  // de la variable no considerando los caracteres en blanco.
  @ 053,160 SAY oSay1 PROMPT  Planil->Numemp  SIZE GetTextWidth( 0, Alltrim(Planil->Numemp), oFont6:hFont ),22  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW  FONT oFont6   BORDER  CENTER ADJUST
  @ 105,160 SAY oSay2 PROMPT  Planil->Nombre  SIZE GetTextWidth( 0, Alltrim(Planil->Nombre), oFont6:hFont ),22  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6   ADJUST
  @ 130,160 SAY oSay3 PROMPT  Planil->Ninssbi SIZE GetTextWidth( 0, Alltrim(Planil->Ninssbi),oFont6:hFont ),22  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW  FONT oFont6   ADJUST

  @ 300,250 BUTTON "Salir" SIZE 100,30 PIXEL OF oDlg2 ACTION oDlg2:End()

  ACTIVATE DIALOG oDlg2 CENTERED

  RELEASE oFont2, oFont5, oFont6
  PLANIL->(DBCLOSEAREA())

Return nil
 

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Fri Jun 12, 2020 10:50 pm
by FranciscoA
Este ejemplo, mejorado, muestra con mas claridad los resultados:
Code: Select all  Expand view
//---------------------------------------------------------//
Function ClrFondoSay()
local oDlg2, oTitu, oSay1, oSay2, oSay3
local oFont2, oFont5, oFont6

   DBUSEAREA(.T.,,"PLANIL","PLANIL",.T.)
   DBGOTOP()

   DEFINE FONT oFont2 NAME "ARIAL"  SIZE 0,-10
   DEFINE FONT oFont5 NAME "ARIAL"  SIZE 0,-12
   DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14

   DEFINE DIALOG oDlg2 SIZE 600,570 PIXEL TRUEPIXEL FONT oFont2  //STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME )

   @ 10,150 SAY otitu PROMPT " MUESTRA PROFESIONAL "  PIXEL OF oDlg2 COLORS RGB(0,100,0)   FONT oFont5

   @ 055,050 SAY "Código :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 105,050 SAY "Nombre :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 130,050 SAY "Inss   :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6

  // Aqui necesito que estos Say, tengan un fondo en color y solo del largo del texto
  // de la variable no considerando los caracteres en blanco.
  @ 053,160 SAY oSay1 PROMPT  Planil->Numemp  SIZE GetTextWidth( 0, Alltrim(Planil->Numemp), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST
  @ 105,160 SAY oSay2 PROMPT  Planil->Nombre  SIZE GetTextWidth( 0, Alltrim(Planil->Nombre), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6  ADJUST
  @ 130,160 SAY oSay3 PROMPT  Planil->Ninssbi SIZE GetTextWidth( 0, Alltrim(Planil->Ninssbi),oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST

  @ 300, 50 BUTTON "Siguiente" SIZE 100,30 PIXEL OF oDlg2 ACTION NextData(oSay1,oSay2,oSay3)
  @ 300,250 BUTTON "Salir" SIZE 100,30 PIXEL OF oDlg2 ACTION oDlg2:End()

  ACTIVATE DIALOG oDlg2 CENTERED

  RELEASE oFont2, oFont5, oFont6
  PLANIL->(DBCLOSEAREA())

Return nil

//---------------------------------------------------------//
Function NextData(oSay1,oSay2,oSay3)

   planil->(dbskip())
   if planil->(eof())
      Planil->(dbgotop())
   endif

   oSay1:Refresh()
   oSay2:Refresh()
   oSay3:Refresh()

   oSay1:nWidth := GetTextWidth( 0, Alltrim(Planil->Numemp), oSay1:oFont:hFont )
   oSay2:nWidth := GetTextWidth( 0, Alltrim(Planil->Nombre), oSay2:oFont:hFont )
   oSay3:nWidth := GetTextWidth( 0, Alltrim(Planil->Ninssbi),oSay3:oFont:hFont )

Return nil

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 1:02 am
by remtec
Francisco, Amigo.

Realmente te pasaste como siempre.

Muchas gracias por toda tu ayuda, tiempo dedicado y codigos funcionales, funciono PERFECTO.

Quise habilitar BORDER, pero me afecta la visión de los últimos caracteres, por lo que desisti y lo deje solo con el color como tu lo desarrollaste.

Mil Gracias Amigo.

Muchos Saludos

Antonio

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 6:38 pm
by FranciscoA
Quise habilitar BORDER, pero me afecta la visión de los últimos caracteres, por lo que desisti y lo deje solo con el color como tu lo desarrollaste.


Antonio, prueba asi:
Code: Select all  Expand view
Function ClrFondoSay()  
local oDlg2, oTitu, oSay1, oSay2, oSay3
local oFont2, oFont5, oFont6

   DBUSEAREA(.T.,,"PLANIL","PLANIL",.T.)
   DBGOTOP()

   DEFINE FONT oFont2 NAME "ARIAL"  SIZE 0,-10
   DEFINE FONT oFont5 NAME "ARIAL"  SIZE 0,-12 BOLD
   DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14

   DEFINE DIALOG oDlg2 SIZE 600,270 PIXEL TRUEPIXEL FONT oFont2  //STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME )

   @ 10,050 SAY otitu PROMPT "COLOR FONDO DE oSAY Y AJUSTAR ANCHO DEL oSAY A ANCHO DEL TEXTO"  PIXEL OF oDlg2 COLORS RGB(0,100,0)   FONT oFont5

   @ 055,050 SAY "Código :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 105,050 SAY "Nombre :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6
   @ 130,050 SAY "Inss   :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6

  // Aqui necesito que estos Say, tengan un fondo en color y solo del largo del texto
  // de la variable no considerando los caracteres en blanco.
  @ 053,160 SAY oSay1 PROMPT  Planil->Numemp  SIZE GetTextWidth( 0, Alltrim(Planil->Numemp), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST BORDER
  @ 105,160 SAY oSay2 PROMPT  Planil->Nombre  SIZE GetTextWidth( 0, Alltrim(Planil->Nombre), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6  ADJUST
  @ 130,160 SAY oSay3 PROMPT  Planil->Ninssbi SIZE GetTextWidth( 0, Alltrim(Planil->Ninssbi),oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST

  @ 230, 50 BUTTON "Siguiente" SIZE 100,30 PIXEL OF oDlg2 ACTION NextData({oSay1,oSay2,oSay3},{.t.,.f.,.f.})
  @ 230,250 BUTTON "Salir" SIZE 100,30 PIXEL OF oDlg2 ACTION oDlg2:End()

  ACTIVATE DIALOG oDlg2 CENTERED ON INIT RefreshData({oSay1,oSay2,oSay3},{.t.,.f.,.f.})

  RELEASE oFont2, oFont5, oFont6
  PLANIL->(DBCLOSEAREA())

Return nil

//-----------------------------------------------// Siguiente registro
Function NextData(aoSay, alBorder)

   planil->(dbskip())
   if planil->(eof())
      Planil->(dbgotop())
   endif

   RefreshData(aoSay, alBorder)

Return nil

//-----------------------------------------------// Refresca dato y ancho de oSay
Function RefreshData(aoSay, alBorder)

   AEval(aoSay,{|o,n| o:Refresh(),;
          o:nWidth := GetTextWidth( 0, Alltrim(o:cCaption), o:oFont:hFont ) + if(alBorder[n],4,0) })

Return nil
 

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 8:19 pm
by remtec
Hola Francisco

Muchas gracias por responder.

Aplique lo que me indicas, pero no surge ningun efecto, realiza la muestra de los campos con el color de fondo, pero no genera el Borde del campo mostrado.

Hay algunos campos que los muestra bien, pero otros con contenido, los muestra asi.

Variable="13.456.643-5"

Muestra en pantalla: 13.456.643- , el ultimo queda debajo del marco del borde.

Quizas podria existir una forma de hacer una rectangulo de linea, para enmarcar en say, lo mismo podria existir para los get, algo mas bonito que un Border hundido como el que se genera. En una de esas existe, pero no lo he encontrado en el foro.

Muy agradecido y saludos.

Antonio.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 10:30 pm
by FranciscoA
Antonio,
Que raro. Me parece que algo se te ha pasado por alto. A mi me funciona bien (FWH1709)
Esta function ha sido cambiada a: NextData(aoSay, alBorder) llamandola asi: NextData({oSay1,oSay2,oSay3},{.T.,.f.,.f.}) // Array con tantos elementos como oSays requeridos. La .t.indica que se usa BORDER, la .f. indica sin borde.
Se agregó la function RefreshData(aoSay, alBorder) llamandola con los mismos parametros.

Code: Select all  Expand view
 @ 053,160 SAY oSay1 PROMPT  Planil->Numemp  SIZE GetTextWidth( 0, Alltrim(Planil->Numemp), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST BORDER        //mira aqui
  @ 105,160 SAY oSay2 PROMPT  Planil->Nombre  SIZE GetTextWidth( 0, Alltrim(Planil->Nombre), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6  ADJUST
  @ 130,160 SAY oSay3 PROMPT  Planil->Ninssbi SIZE GetTextWidth( 0, Alltrim(Planil->Ninssbi),oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST

  @ 230, 50 BUTTON "Siguiente" SIZE 100,30 PIXEL OF oDlg2 ACTION NextData({oSay1,oSay2,oSay3},{.T.,.f.,.f.})     //mira aqui

  ACTIVATE DIALOG oDlg2 CENTERED ON INIT RefreshData({oSay1,oSay2,oSay3},{.T.,.f.,.f.})    //mira aqui
...
...
 

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 10:49 pm
by remtec
Hola Amigo.

Tenias razon, se me habia pasado agregar a tu codigo anterior "BORDER", solo habia cambiado tu nuevas funciones. Ahora funciona muy bien.

Mil gracias por tu ayuda y disponibilidad, deseo que estes muy bien junto a tu familia.

Le hare una mdificacion, ya que cuando el campo esta vacio, muestra una linea paralela.

Muchos Saludos.

Antonio

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sat Jun 13, 2020 11:04 pm
by FranciscoA
Antonio.
Me alegra mucho que hayas resuelto. Salud para ti y tu familia.

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sun Jun 14, 2020 1:20 am
by remtec
Hola Francisco

Disculpa que te moleste.

Me di cuenta de un error, el primer dato oSay1, en algunas ocaciones se imprime en blanco aun cuando el campo en la DBF tiene datos, me he podido dar cuenta, que esto ocurre, cuando el registro anterior el campo de oSay1 no tiene dato, al mostrar el siguiente produce el error.

Muchos saludos.

Antonio.

Re: Como Calcular Ancho en Pixeles de una Variable

PostPosted: Sun Jun 14, 2020 1:41 am
by FranciscoA
remtec wrote:Hola Francisco

Disculpa que te moleste.

Me di cuenta de un error, el primer dato oSay1, en algunas ocaciones se imprime en blanco aun cuando el campo en la DBF tiene datos, me he podido dar cuenta, que esto ocurre, cuando el registro anterior el campo de oSay1 no tiene dato, al mostrar el siguiente produce el error.

Muchos saludos.

Antonio.


Antonio,
No es ninguna molestia.
¿Es posible mostrar el código que te está dando problemas al enviar a impresión?

Saludos.

Re: Como Calcular Ancho en Pixeles de una Variable "FrancicoA"

PostPosted: Sun Jun 14, 2020 2:05 am
by remtec
Hola Francisco

Te dejo el codigo.

Mi DBF esta abierta desde donde lo envio.

Saludos y muchas gracias
Antonio

Code: Select all  Expand view

 Function ClrFondoSay()
        local oDlg2, oTitu, oSay1, oSay2, oSay3
        local oFont2, oFont5, oFont6

  // DBGOTOP()

   DEFINE FONT oFont2 NAME "ARIAL"  SIZE 0,-10  BOLD
   DEFINE FONT oFont5 NAME "ARIAL"  SIZE 0,-12  BOLD
   DEFINE FONT oFont6 NAME "TAHOMA" SIZE 0,-14   BOLD

   DEFINE DIALOG oDlg2 SIZE 600,570 PIXEL TRUEPIXEL FONT oFont2  //STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME )
     oDlg2:lTransparent := .F.
   @ 10,150 SAY otitu PROMPT " MUESTRA PROFESIONAL "  PIXEL OF oDlg2 COLORS RGB(0,100,0)   FONT oFont5

   @ 055,050 SAY "Código :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6   Transparent
   @ 105,050 SAY "Nombre :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6   Transparent
   @ 130,050 SAY "Inss   :"   SIZE 100,20  PIXEL OF oDlg2  RIGHT  FONT oFont6   Transparent

  // Aqui necesito que estos Say, tengan un fondo en color y solo del largo del texto
  // de la variable no considerando los caracteres en blanco.
  @ 053,160 SAY oSay1 PROMPT  Profe->Rut_Pro  SIZE GetTextWidth( 0, Alltrim(Profe->Rut_Pro), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6  ADJUST   border
  @ 105,160 SAY oSay2 PROMPT  Profe->Nom_Pro  SIZE GetTextWidth( 0, Alltrim(Profe->Nom_Pro), oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), RGB(159,233,255) FONT oFont6  ADJUST   border

    @ 130,160 SAY oSay3 PROMPT  Profe->Nom_Doc SIZE GetTextWidth( 0, Alltrim(Profe->Nom_Doc),oFont6:hFont ),20  PIXEL OF oDlg2 COLOR RGB(0,0,128), CLR_YELLOW       FONT oFont6  ADJUST   border

  @ 300, 50 BUTTON "Siguiente" SIZE 100,30 PIXEL OF oDlg2 ACTION  NextData({oSay1,oSay2,oSay3},{.t.,.t.,.t.})
  @ 300,250 BUTTON "Salir" SIZE 100,30 PIXEL OF oDlg2 ACTION oDlg2:End()

  ACTIVATE DIALOG oDlg2 CENTERED   ON INIT RefreshData({oSay1,oSay2,oSay3},{.t.,.t.,.t.})

  RELEASE oFont2, oFont5, oFont6


Return nil

//---------------------------------------------------------//
Function  NextData(aoSay, alBorder)

   Profe->(dbskip())
   if Profe->(eof())
      Profe->(dbgotop())
   endif
     ?nom_pro,rut_pro,Alltrim(rut_Pro),len(rut_pro),len(alltrim(rut_pro))
   RefreshData(aoSay, alBorder)


Return nil

Function RefreshData(aoSay, alBorder)
     /*
   AEval(aoSay,{|o,n| o:Refresh(),;
          o:nWidth := GetTextWidth( 0, Alltrim(o:cCaption), o:oFont:hFont ) + if(alBorder[n].and.(Len(Alltrim(o:cCaption))>0),6,0) })
        */

   AEval(aoSay,{|o,n| o:Refresh(),;
          o:nWidth := GetTextWidth( 0, Alltrim(o:cCaption), o:oFont:hFont ) + if(alBorder[n],6,0) })


Return nil