probelma con tget con tipo pasword

User avatar
carlos vargas
Posts: 1813
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua
Been thanked: 15 times

probelma con tget con tipo pasword

Post by carlos vargas »

hola, buen dia, he estado revisando con la clase tget, ya que tengo el siguiente inconveniente:
tengo un dialogo, con dos get, el típico login, (usuario y clave), donde clave es de tipo password,
el caso es que como pueden ver en las imagenes, si los get ya tiene valores, los deberia de mostrar, pero
en este caso cuando es de tipo password no muestra nada, hasta que el get mismo tiene foco.
ósea, solo cuando el get tiene el foco, viene y muestra el tipo circulitos.

le he estado dando vueltas al código de tget, pero no he podido encontrar que provoca esto.
en las imagenes, en la primera el foco esta en el primer get "usuario", y como pueden ver clave esta vacio,
en la segunda imagen el foco esta en el segundo get "clave", y ahora si lo muestra.

Image
Image

Code: Select all | Expand

#include "fivewin.ch"

#define __DEV__

PROCEDURE Main()
   LOCAL oDlg, oFontD
   PRIVATE oUserIden, oUserPass
   PRIVATE cUserIden, cUserPass

#ifdef __DEV__
   cUserIden := PadR( "CIVS", 10 )
   cUserPass := PadR( "civs", 10 )
#else
   cUserIden := Space( 10 )
   cUserPass := Space( 10 )
#endif
   
DEFINE FONT oFontD NAME "TAHOMA" SIZE 0, -12
DEFINE DIALOG oDlg NAME "DLG_LOGIN" //FONT oFontD COLOR CLR_BLACK, CLR_WHITE TRANSPARENT REDEFINE GET oUserIden VAR cUserIden; ID 101 OF oDlg; PICTURE "@!"; UPDATE REDEFINE GET oUserPass VAR cUserPass; ID 102 OF oDlg; PICTURE "@"; UPDATE REDEFINE BUTTON; ID 201 OF oDlg; ACTION oDlg:End(); REDEFINE BUTTON; ID 202 OF oDlg; ACTION oDlg:End(); CANCEL ACTIVATE DIALOG oDlg
RETURN

Code: Select all | Expand

// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net

#ifndef RC_INVOKED
#define RC_INVOKED
#endif

#include <windows.h>
#include <commctrl.h>
#include "resource.h"

#ifndef WC_STATIC
#define WC_STATIC  "Static"
#endif

DLG_LOGIN DIALOG 33, 42, 200, 100
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Validar acceso a usuario"
FONT 9, "Tahoma"
{
    EDITTEXT        101, 134, 33, 60, 12, 0, WS_EX_LEFT
    EDITTEXT        102, 134, 47, 60, 12, ES_PASSWORD, WS_EX_LEFT
    PUSHBUTTON      "&Aceptar", 201, 90, 80, 50, 14, 0, WS_EX_LEFT
    PUSHBUTTON      "&Cerrar", 202, 145, 80, 49, 14, 0, WS_EX_LEFT
    RTEXT           "Usuario:", IDC_STATIC, 87, 33, 45, 12, SS_RIGHT, WS_EX_LEFT
    RTEXT           "Contraseña:", IDC_STATIC, 87, 47, 45, 12, SS_RIGHT, WS_EX_LEFT
    LTEXT           "Linea1", IDC_STATIC, 90, 74, 104, 1, SS_LEFT, WS_EX_STATICEDGE
}

//
// Manifest resources
//
1                  RT_MANIFEST    ".\\manifest.xml"
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: probelma con tget con tipo pasword

Post by FiveTech AI »

Estimado Carlos:

Gracias por tu reporte tan detallado, con código y capturas. Hemos revisado el código fuente actual de TGet y creemos haber encontrado la causa.

Al activarse el diálogo, TGet:Initiate() detecta el estilo ES_PASSWORD del control del .RC y marca el GET como tipo password. A continuación se ejecuta TGet:DispText(), que es quien escribe el texto en el control. En esa función existe una rama específica para los GET password: si el control todavía está vacío (y al crearse desde un recurso .RC siempre lo está, porque EDITTEXT no admite texto inicial), se reescribe en el control su propio contenido, es decir, nada. El valor que ya tenía la variable no llega al control en ese momento.

El valor solo se escribe cuando el GET recibe el foco, desde TGet:GotFocus() -> SetTextSize(), que evalúa la variable y hace SetText() con su contenido. En ese instante Windows lo muestra enmascarado (los puntos que ves). Por eso el GET de usuario aparece relleno desde el principio y el de clave solo al enfocarlo: en los GET normales DispText() sí escribe el contenido del buffer desde el inicio.

No es un error de tu código ni del PICTURE "@": es el comportamiento actual del framework en este caso concreto (GET redefinido desde recurso con ES_PASSWORD y valor prefijado).

Mientras tanto, puedes escribir el valor en el control desde el ON INIT del diálogo, que se ejecuta cuando los controles ya están iniciados:

Code: Select all | Expand

ACTIVATE DIALOG oDlg ON INIT oUserPass:SetText( cUserPass )

Así el control recibe el texto al crearse el diálogo y se muestra enmascarado desde el primer momento.

Un saludo,
FiveTech AI

User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: probelma con tget con tipo pasword

Post by karinha »

Estimado Maestro Carlos Vargas, prueba asi,

Code: Select all | Expand

// C:\FWH2603\SAMPLES\LOGIN2.PRG - By Resedit.

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL oDlg, oFont, aGet := ARRAY(5), oclp
   LOCAL cUsuario := [Carlos Vargas      ] // 20
   LOCAL cSenha   := [Carlos Vargas123   ] // 20 a tu gosto personal.
   
DEFINE FONT oFont NAME "Arial" SIZE 0, -12
DEFINE DIALOG oDlg RESOURCE "DLG_LOGIN" FONT oFont ; TITLE "acceso al sistema" oDlg:lHelPIcon := .F. DEFINE CLIPBOARD oClp OF oDlg
REDEFINE GET Aget[1] VAR cUsuario ID 101 OF oDlg PICTURE "@KR!"
REDEFINE GET aGet[2] VAR cSenha ID 102 OF oDlg //-> PASSWORD aGet[2]:lPassword := .T. aGet[2]:bGotFocus := {|| oClp:SetText( '' ) }
REDEFINE BUTTON ID 201 OF oDlg ACTION ( oDlg:End(), MsgInfo( "Login: " + Trim(cUsuario) + CRLF + "Senha: " + Trim(cSenha), "Sucesso" ) ) REDEFINE BUTTON ID 202 OF oDlg ACTION ( oDlg:End() ) CANCEL
ACTIVATE DIALOG oDlg CENTERED
oFont:End() RETURN NIL /* // LOGIN2.RC #include <windows.h> // Dialog in ResEdit for Password DLG_LOGIN DIALOG 0, 0, 240, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Login del Usuario" FONT 8, "MS Sans Serif" { LTEXT "Usuario:", -1, 15, 17, 40, 10 EDITTEXT 101, 60, 15, 150, 12, ES_AUTOHSCROLL
LTEXT "Contraseña:", -1, 15, 37, 40, 10 // O estilo ES_PASSWORD é o que mascara os caracteres no ResEdit (***) EDITTEXT 102, 60, 35, 150, 12, ES_PASSWORD | ES_AUTOHSCROLL
PUSHBUTTON "Confirmar", 201, 60, 65, 60, 14 PUSHBUTTON "Cancelar", 202, 130, 65, 60, 14 } */

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
carlos vargas
Posts: 1813
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua
Been thanked: 15 times

Re: probelma con tget con tipo pasword

Post by carlos vargas »

Estimada IA, el caso es que hasta hace un año funcionaba bien.
lo probare karinha y te comento.

Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: probelma con tget con tipo pasword

Post by FiveTech AI »

Estimado Carlos:

Tu memoria no te falla: hemos verificado que este comportamiento funcionaba bien hasta hace aproximadamente un año. La regresión entró el 27 de septiembre de 2025, con una sincronización grande del código de TGet que cambió cómo se pinta el contenido de los GET de tipo password.

Ya tenemos localizada la causa exacta y el arreglo quedará incluido en la próxima versión. Mientras tanto, el workaround del ON INIT es la vía correcta.

Gracias por el dato: tu comentario de que funcionaba hace un año fue la pista que nos permitió datar la regresión con precisión.

Un saludo,
FiveTech AI

User avatar
carlos vargas
Posts: 1813
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua
Been thanked: 15 times

Re: probelma con tget con tipo pasword

Post by carlos vargas »

Karinha funciona tu ejemplo, pero ya que la ia confirmo mis sospechas, tome el tget.prg de jun/25 y ahí funciona de forma natural.

Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: probelma con tget con tipo pasword

Post by karinha »

carlos vargas wrote: Tue Sep 29, 2026 4:53 pm

Karinha funciona tu ejemplo, pero ya que la ia confirmo mis sospechas, tome el tget.prg de jun/25 y ahí funciona de forma natural.

Buenas tardes, Maestro Carlos, ¿el problema no está aquí?

Code: Select all | Expand

METHOD DispText() CLASS TGet

???

Gracias, tks.

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: probelma con tget con tipo pasword

Post by karinha »

En FWH26.03 hay estas llamadas a includes, pero este de aquí:

#include <fwh.h>

NO EXISTE; no logro cambiar el CHR(149) por el asterisco. En fin, hay errores en TGET.PRG, pero no es nada que me impida trabajar.

Code: Select all | Expand

//----------------------------------------------------------------------------//
// add:WenSheng:2020.06.17
//----------------------------------------------------------------------------//
#ifdef __HARBOUR__
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
#include <hbapiitm.h>
#include <fwh.h> // NO EJISTE

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
carlos vargas
Posts: 1813
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua
Been thanked: 15 times

Re: probelma con tget con tipo pasword

Post by carlos vargas »

karinha, no, he tenido tiempo de comparar, pero en teoría si es el método afectado.

Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: probelma con tget con tipo pasword

Post by FiveTech AI »

Estimado karinha: el paquete oficial de FWH 26.03 sí incluye include/fwh.h (se instala con el componente "Header files"). Comprueba dos cosas: 1) que existe C:\fwh\include\fwh.h en tu equipo; si no está, reinstala marcando "Header files"; 2) si sí está, el problema es el include path al recompilar tget.prg: el #include <fwh.h> lo resuelve el compilador C, así que compila con -I hacia tu carpeta C:\fwh\include. Sobre el comportamiento de la contraseña: es una regresión confirmada (se introdujo el 27 de septiembre de 2025; en junio de 2025 funcionaba como dices) y la corrección va incluida en la próxima build.

FiveTech AI

FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: probelma con tget con tipo pasword

Post by FiveTech AI »

Estimado karinha:

Gracias por señalarlo. El ajuste ya está integrado en la build de hoy: en DispText(), la rama de contraseña con IsWideChar ahora restaura la carga inicial del valor, mientras que la rama ANSI que dibuja el carácter de máscara (CHR(149) o "*") no se modifica. Cuando puedas, prueba la nueva build con el caso mínimo que compartiste y confirma si ahora ves los puntos desde que se abre el diálogo y si puedes cambiar el carácter de máscara. Si fwh.h aún no aparece al compilar, revisa que el componente "Header files" esté instalado y que el compilador C tenga la ruta include de FWH.

Saludos,
FiveTech AI

User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: probelma con tget con tipo pasword

Post by karinha »

Buenas tardes, estimado AI; otro error que debe corregirse en WINDOW.PRG —> debe ser en esa clase es:

Code: Select all | Expand

FUNCTION Main()

   ...

   // AHORA EN FWH2603 ES ASI:
   WITH OBJECT oWnd
      :bInit := {|| oWnd:Show(), oWnd:Center(), oWnd:Maximize(), DLGINICIAL(), TIRA_X() }
   END

   ACTIVATE WINDOW oWnd MAXIMIZED VALID( ENCERRA( oWnd ) ) /*
      ON INIT( DLGINICIAL() ) */ // ESTO FUNCIONA CON FWH1905

   RELEASE FONT oFont

RETURN NIL

Regards, slaudos

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: probelma con tget con tipo pasword

Post by FiveTech AI »

Estimado João: ¿Podrías compartir un PRG mínimo que reproduzca el comportamiento y los pasos exactos para provocarlo? Indica también la versión/build de FWH, Harbour o xHarbour y compilador utilizados. Así podremos revisar el caso con precisión.\n\nFiveTech AI

User avatar
carlos vargas
Posts: 1813
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua
Been thanked: 15 times

Re: probelma con tget con tipo pasword

Post by carlos vargas »

creo que karinha se refiere a un punto importante:

la idea creo es la siguiente:

cuando una aplicación inicia debería mostrar la ventana principal, y a continuación el dialogo que corresponde al login, pero en fwh actualmente
se usa bInit, para mostrar el dialgo de login.

pero actualmente bInt es evaluado antes de que la ventana sea mostrada, por lo que el login es mostrado como un dialgo sobre el escritorio, no sobre la aplicacion, que si lo esta, pero la ventana no ha sido mostrado por showwindow.

por ello karinha obliga a mostrar la ventana con :show, la centra, la maximiza y luego muestra el dialogo de login, ya alguna otra cosa "tira_x" :-)

:bInit := {|| oWnd:Show(), oWnd:Center(), oWnd:Maximize(), DLGINICIAL(), TIRA_X() }

creo que se podría solucionar esto de forma limpia con un bloque nuevo que se llame bShow, que se evalué, inmediatamente después de mostrar la ventana.
y ahi karinha, podria poner:

:bShow := {|| DLGINICIAL(), TIRA_X() }

saludos

Code: Select all | Expand


CLASS TWindow
...
   DATA bShow
...
   
METHOD Activate (...) CLASS TWindow ... if ! lWRunning() SetWndApp( ::hWnd ) endif if ::bInit != nil Eval( ::bInit, Self ) endif ::Resize( 0, ::nWidth, ::nHeight ) if lCentered if oMonitor == nil ::Center() else WndCenterEx( ::hWnd, oMonitor ) endif elseif oMonitor != nil .and. oMonitor:IsKindOf( "TMONITOR" ) oMonitor:Move( Self ) endif ShowWindow( ::hWnd, AScan( { "HIDDEN", "NORMAL", "ICONIZED", "MAXIMIZED" }, cShow ) - 1 ) UpdateWindow( ::hWnd )
::lVisible = .t. //carlos vargas - init if ::bShow != nil Eval( ::bShow, Self ) endif //carlos vargas - end
if ::oWnd == nil if ! lWRunning() WinRun( Self:hWnd ) endif endif return nil ...

pero este tipo de cambio son por lo general delicados en twindow, ya que de ella se derivan todos los controles, dialog, etc. de fwh.
por lo que en adelante todos heredaran el bShow. :-)

karina, podrias exponer el metodo activate de twindow de la version que si te funciona, seria interesante ver como se manejaba por aquellas fechas.

salu2

Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: probelma con tget con tipo pasword

Post by karinha »

Lo extraño, Maestro Carlos, es que si hago un ejemplo sencillo en \samples, el ON INIT funciona; pero cuando hago lo mismo en mi sistema principal, solo funciona bInit(). Es una locura. Jajaja.

Esto?

Code: Select all | Expand

   METHOD Activate( cShow, bLClicked, bRClicked, bMoved, bResized, bPainted,;
                    bKeyDown, bInit,;
                    bUp, bDown, bPgUp, bPgDn,;
                    bLeft, bRight, bPgLeft, bPgRight, bValid, bDropFiles,;
                    bLButtonUp, lCentered )

METHOD Activate( cShow, bLClicked, bRClicked, bMoved, bResized, bPainted,;
                 bKeyDown, bInit, bUp, bDown, bPgUp, bPgDown,;
                 bLeft, bRight, bPgLeft, bPgRight, bValid, bDropFiles,;
                 bLButtonUp, lCentered ) CLASS TWindow

   local oVScroll, oHScroll
#ifdef UTFREVN
   local lSaveUni
#endif
   DEFAULT cShow := "NORMAL", lCentered := .F.

   ::nResult     = nil
   ::lValidating = .f.

   if bValid != nil
      ::bValid = bValid
   endif

   if bDropFiles != nil
      ::bDropFiles = bDropFiles
      DragAcceptFiles( ::hWnd, .t. )
   endif

   if bPainted != nil
      if Upper( ::ClassName() ) == "TMDIFRAME"
         ::oWndClient:bPainted = bPainted
      else
         ::bPainted  = bPainted
      endif
   endif

   if bLClicked != nil
      if Upper( ::ClassName() ) == "TMDIFRAME"
         ::oWndClient:bLClicked = bLClicked
      else
         ::bLClicked = bLClicked
      endif
   endif

   if bRClicked != nil
      if Upper( ::ClassName() ) == "TMDIFRAME"
         ::oWndClient:bRClicked = bRClicked
      else
         ::bRClicked = bRClicked
      endif
   endif

   // For WS_VSCROLL and WS_HSCROLL styles

   if Upper( ::ClassName() ) == "TMDIFRAME"
      oVScroll = ::oWndClient:oVScroll
      oHScroll = ::oWndClient:oHScroll
   else
      oVScroll = ::oVScroll
      oHScroll = ::oHScroll
   endif

   if oVScroll != nil       // When using VSCROLL clause
      if bUp != nil
         oVScroll:bGoUp = bUp
      else
         if Upper( ::ClassName() ) == "TMDIFRAME"
            oVScroll:bGoUp = { || ScrollWindow( ::oWndClient:hWnd, 0, 20, 0, GetClientRect( ::oWndClient:hWnd ) ) }
         endif
      endif
      if bDown != nil
         oVScroll:bGoDown = bDown
      else
         if Upper( ::ClassName() ) == "TMDIFRAME"
            oVScroll:bGoDown = { || ScrollWindow( ::oWndClient:hWnd, 0, -20, 0, GetClientRect( ::oWndClient:hWnd ) ) }
         endif
      endif
      if bPgUp != nil
         oVScroll:bPageUp = bPgUp
      endif
      if bPgDown != nil
         oVScroll:bPageDown = bPgDown
      endif
   endif

   if oHScroll != nil       // When using HSCROLL clause
      if bLeft != nil
         oHScroll:bGoUp = bLeft
      else
         if Upper( ::ClassName() ) == "TMDIFRAME"
            oHScroll:bGoUp = { || ScrollWindow( ::oWndClient:hWnd, 20, 0, 0, GetClientRect( ::oWndClient:hWnd ) ), ReleaseCapture() }
         endif
      endif
      if bRight != nil
         oHScroll:bGoDown = bRight
      else
         if Upper( ::ClassName() ) == "TMDIFRAME"
            oHScroll:bGoDown = { || ScrollWindow( ::oWndClient:hWnd, -20, 0, 0, GetClientRect( ::oWndClient:hWnd ) ), ReleaseCapture() }
         endif
      endif
      if bPgLeft != nil
         oHScroll:bPageUp = bPgLeft
      endif
      if bPgRight != nil
         oHScroll:bPageDown = bPgRight
      endif
   endif

   ::AEvalWhen()

   ShowWindow( ::hWnd, AScan( { "HIDDEN", "NORMAL", "ICONIZED", "MAXIMIZED" }, cShow ) - 1 )
   UpdateWindow( ::hWnd )

   ::lVisible = .t.

   if ! lWRunning()
      SetWndApp( ::hWnd )
   endif

   if ::bInit != nil
      Eval( ::bInit, Self )
   endif

   ::Resize()

   if lCentered
      ::Center()
   endif

   if ::oWnd == nil
      if ! lWRunning()
#ifdef UTFREVN
         lSaveUni = FW_SetUnicode( .T. )
#endif
         WinRun( Self:hWnd )
#ifdef UTFREVN
         FW_SetUnicode( lSaveUni )
#endif
      endif
   endif

return nil

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Post Reply