Page 1 of 1

Get para password

Posted: Sun Jul 04, 2010 8:14 pm
by mastintin
Seguro que se puede implementar mucho mejor pero he conseguido hacerlo funcionar asi :
He duplicado la clase get y le he renombrado a Sget luego le he cambiado las llamadas a las funciones de abajo.

Code: Select all

#import <Cocoa/Cocoa.h>

#define HB_DONT_DEFINE_BOOL
#include <hbapi.h>
#include <hbvm.h>
#include <fmsgs.h> // FiveMac messages

NSView * GetView( NSWindow * window );

static PHB_SYMB symFMH = NULL;

@interface SGet : NSSecureTextField 
{
   @public NSWindow * hWnd; 
}
- (BOOL) textShouldEndEditing : ( NSText * ) text;
@end

@implementation SGet
- (BOOL) textShouldEndEditing : ( NSText * ) text
{
   if( symFMH == NULL )
      symFMH = hb_dynsymSymbol( hb_dynsymFindName( "_FMH" ) );
   
   hb_vmPushSymbol( symFMH );
   hb_vmPushNil();
   hb_vmPushLong( ( LONG ) hWnd );
   hb_vmPushLong( WM_GETVALID );
   hb_vmPushLong( ( LONG ) self );
   hb_vmDo( 3 );

   return hb_parl( -1 );    
}
@end

HB_FUNC( SGETCREATE ) 
{
   SGet * edit = [ [ SGet alloc ] 
              initWithFrame : NSMakeRect( hb_parnl( 2 ), hb_parnl( 1 ), hb_parnl( 3 ), hb_parnl( 4 ) ) ];
   NSWindow * window = ( NSWindow * ) hb_parnl( 5 );

   [ GetView( window ) addSubview : edit ];
   edit->hWnd = window;
   
   hb_retnl( ( LONG ) edit );
}   

HB_FUNC( SGETSETTEXT )
{
   NSSecureTextField  * get = ( NSSecureTextField  * ) hb_parnl( 1 );
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 2 ) ? hb_parc( 2 ) : "" ] autorelease ];
   
   [ get setStringValue : string ];
}   

HB_FUNC( SGETGETTEXT ) // hGet --> cText
{
   NSSecureTextField  * get = ( NSSecureTextField  * ) hb_parnl( 1 );
   NSString * string = [ get stringValue ];
   
   hb_retc( [ string cStringUsingEncoding : NSASCIIStringEncoding ] );
}  
 

Re: Get para password

Posted: Sun Jul 04, 2010 9:20 pm
by Antonio Linares
Manuel,

Tu implementación es correcta, lo único es que como la clase NSSecureTextField hereda de la Clase NSTextField, en realidad solo necesitamos la función SGetCreate() y es apropiado el crear sgets.m para separar la Clase SGet de la Get.

Para mantener la máxima compatibilidad con FWH, lo que hacemos es añadir una nueva claúsula PASSWORD para el GET y desde el constructor de TGet se decide si llamar a GetCreate() ó a SGetCreate().

Asi queda el comando GET ahora:

Code: Select all

 #xcommand @ <nRow>, <nCol> GET [ <oGet> VAR ] <uVar> ;
               [ OF <oWnd> ] ;
               [ SIZE <nWidth>, <nHeight> ] ;
               [ VALID <uValid> ] ;
               [ <update: UPDATE> ] ;
               [ <password: PASSWORD> ] ;  
          => ;
               [ <oGet> := ] TGet():New( <nRow>, <nCol>, <nWidth>, <nHeight>,;
                                         <oWnd>, bSETGET(<uVar>), [\{||(<uValid>)\}],;
                                         <.update.>, <.password.> )
 
En unos minutos publicamos un nuevo build de FiveMac con todos _. Gracias! :-)

Re: Get para password

Posted: Sun Jul 04, 2010 9:28 pm
by Antonio Linares
Hay una pega que solucionar con los GETs y es que hasta que no pierden el foco, no asignan a su variable relacionada su texto.

Esto se puede comprobar en el ejemplo login.prg. Hasta que no se cambia el foco del GET con PASSWORD al primer GET, la variable cPassw no se actualiza. Hay que localizar un evento que se genere cada vez que se pulsa una tecla en el GET.