Como Calcular Ancho en Pixeles de una Variable "FrancicoA"

remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Como Calcular Ancho en Pixeles de una Variable "FrancicoA"

Post 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

@ 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)
 
Last edited by remtec on Sun Jun 14, 2020 1:21 am, edited 1 time in total.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Como Calcular Ancho en Pixeles de una Variable

Post by cnavarro »

Usa oFont6:hFont
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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

     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)  

 
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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

  @ 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post by FranciscoA »

Probando tu ejemplo, con las modificaciones sugeridas.

Code: Select all

//---------------------------------------------------------//
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 _ 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post by FranciscoA »

Este ejemplo, mejorado, muestra con mas claridad los resultados:

Code: Select all

//---------------------------------------------------------//
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 _ 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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 _, por lo que desisti y lo deje solo con el color como tu lo desarrollaste.

Mil Gracias Amigo.

Muchos Saludos

Antonio
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post by FranciscoA »

Quise habilitar BORDER, pero me afecta la visión de los _, por lo que desisti y lo deje solo con el color como tu lo desarrollaste.
Antonio, prueba asi:

Code: Select all

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 _ 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Calcular Ancho en Pixeles de una Variable

Post by remtec »

Hola Francisco

Muchas gracias por responder.

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

Hay _ 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.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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

  @ 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post by FranciscoA »

Antonio.
Me alegra mucho que hayas resuelto. Salud para ti y tu familia.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Como Calcular Ancho en Pixeles de una Variable

Post 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

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

Post by remtec »

Hola Francisco

Te dejo el codigo.

Mi DBF esta abierta desde donde lo envio.

Saludos y muchas gracias
Antonio

Code: Select all

 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 _ 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


 
Post Reply