FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour probelma con tget con tipo pasword
Posts: 1813
Joined: Tue Oct 11, 2005 05:01 PM

probelma con tget con tipo pasword

Posted: Sun Sep 27, 2026 07:07 PM

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.


#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
// 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)
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: probelma con tget con tipo pasword

Posted: Sun Sep 27, 2026 07:52 PM

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:

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

Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: probelma con tget con tipo pasword

Posted: Sun Sep 27, 2026 08:21 PM

Estimado Maestro Carlos Vargas, prueba asi,

// 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
Posts: 1813
Joined: Tue Oct 11, 2005 05:01 PM

Re: probelma con tget con tipo pasword

Posted: Sun Sep 27, 2026 08:59 PM

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)
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: probelma con tget con tipo pasword

Posted: Mon Sep 28, 2026 08:13 AM

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

Posts: 1813
Joined: Tue Oct 11, 2005 05:01 PM

Re: probelma con tget con tipo pasword

Posted: Tue Sep 29, 2026 04: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.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: probelma con tget con tipo pasword

Posted: Tue Sep 29, 2026 05:05 PM
carlos vargas wrote:

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í?

METHOD DispText() CLASS TGet

???

Gracias, tks.

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: probelma con tget con tipo pasword

Posted: Tue Sep 29, 2026 05:15 PM

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.

//----------------------------------------------------------------------------//
// 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
Posts: 1813
Joined: Tue Oct 11, 2005 05:01 PM

Re: probelma con tget con tipo pasword

Posted: Tue Sep 29, 2026 07:02 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: probelma con tget con tipo pasword

Posted: Wed Sep 30, 2026 01:19 AM

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

Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: probelma con tget con tipo pasword

Posted: Thu Oct 01, 2026 04:29 AM

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

Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: probelma con tget con tipo pasword

Posted: Thu Oct 01, 2026 03:22 PM

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

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
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: probelma con tget con tipo pasword

Posted: Thu Oct 01, 2026 03:47 PM

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

Posts: 1813
Joined: Tue Oct 11, 2005 05:01 PM

Re: probelma con tget con tipo pasword

Posted: Thu Oct 01, 2026 06:01 PM

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

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)
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: probelma con tget con tipo pasword

Posted: Thu Oct 01, 2026 06:35 PM

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?

   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