desde archivo de recursos

User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Manuel,

Super bien! :-)

El tag lo podemos usar como el equivalente del nId de los controles de FiveWin :-)

Ando pensando ahora como hacer todo esto genérico, e implementar el REDEFINE de FiveWin
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: desde archivo de recursos

Post by mastintin »

en dos funciones:

Code: Select all

HB_FUNC( WINDOWCONTROLCREATE ) // hWnd
{
    WindowController * mynibWindow = [[WindowController alloc] 
                                        initWithWindowNibName:@"MainMenu"];   
    
    
    [mynibWindow showWindow: nil];  
    
    NSWindow * ventana = [mynibWindow window] ; 
    
     hb_retnl( ( LONG ) ventana );      
     
}  


HB_FUNC( LLAMABOTON ) // hWnd
{
    
    NSWindow * ventana = ( NSWindow * ) hb_parnl( 1 );
    NSView * myview = [ventana contentView ] ;
    
    NSButton * boton = ( NSButton * ) [myview viewWithTag : hb_parnl( 2 ) ];    
    
    [boton setTitle : @"LA monda" ];    
            
    
}  


 
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Manuel,

Vamos acercándonos :-)

Mira este código que ya está funcionando. Ahora creamos un objeto TWindow real! :-)
Aún faltan cosas, pero poquito a poco. Voy a subir este build para que podamos trabajar sobre lo mismo.

samples/testnib.prg

Code: Select all

#include "FiveMac.ch"

function Main()

   local oWnd

   DEFINE WINDOW oWnd
   
   @ 20, 20 BUTTON "Another" ACTION Another()

   ACTIVATE WINDOW oWnd

return nil

function Another()

   local oWnd
   
   DEFINE WINDOW oWnd RESOURCE "HudWindow"
   
   ACTIVATE WINDOW oWnd
   
return nil   
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Manuel,

Voy a salir ahora con la familia, pero te cuento la que estoy liando :-)

He cogido el prototipo de la Clase View en windows.m y lo he copiado a nibs.m y ahora le asigno un View de los "nuestros" a la ventana del recurso.

Esta funcionando bien, lo único es que ahora pierdo lo controles al cambiar el View. Deberiamos ver si hay una forma de portar los controles de un NSView a otro como hacemos en Windows con SetParent() :-)

Luego seguimos...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Esto funciona ya, pero como te digo hay que buscar la forma de pasar los controles de un view a otro:

Fijate que uso automaticamente el evento ON CLICK y accedo al titulo con oWnd:SetText(). Es un objeto TWindow real :-)

Code: Select all

#include "FiveMac.ch"

function Main()

   local oWnd

   DEFINE WINDOW oWnd
   
   @ 20, 20 BUTTON "Another" ACTION Another()

   ACTIVATE WINDOW oWnd

return nil

function Another()

   local oWnd
   
   DEFINE WINDOW oWnd RESOURCE "HudWindow"
   
   ACTIVATE WINDOW oWnd ;
      ON CLICK oWnd:SetText( Time() ) // MsgInfo( "click" )
   
return nil   
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Copio aqui el código y me voy ya :-)

nibs.m

Code: Select all

#import <Cocoa/Cocoa.h>
#define HB_DONT_DEFINE_BOOL
#include <hbapi.h>

// NSView * GetView( NSWindow * window );

@interface View : NSView
{
   @public NSWindow * hWnd; 
}
- (BOOL) windowShouldClose : ( NSNotification * ) notification;
- (void) windowWillClose: ( NSNotification * ) notification;
- (void) mouseDown : ( NSEvent *  ) theEvent;
- (void) mouseMoved : ( NSEvent *  ) theEvent;
- (void) keyDown : ( NSEvent *  ) theEvent;
- (void) MenuItem : ( id ) sender;
- (void) BtnClick : ( id ) sender;
- (void) CbxChange : ( id ) sender;
- (void) ChkClick : ( id ) sender;
- (void) RadClick : ( id ) sender;
- (void) TbrClick : ( id ) sender;
- (void) OnTimerEvent : ( NSTimer * ) timer;
- (void) SliderChanged : (id) sender;
@end

@interface WindowController : NSWindowController
{
}
- ( void ) BtnClick : ( id ) sender;
@end

@implementation WindowController

- ( void ) BtnClick : ( id ) sender;
{
   NSRunAlertPanel( @"click", @"", @"OK", NULL, NULL );    
}

@end


HB_FUNC( WNDFROMNIB )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   WindowController * wndController = [ [ WindowController alloc ] initWithWindowNibName : string ]; 
   NSWindow * window = [ wndController window ];
   NSArray * controls = [ [ window contentView ] subviews ];
   int i;
   View * view = [ [ View alloc ] init ];

   view->hWnd = window;
   [ window setContentView : view ];
   [ window setDelegate : view ];
      
   for( i = 0; i < [ controls count ]; i++ )
   {
      NSControl * control = [ controls objectAtIndex : i ];
      NSString * className = [ control className ];
      
      if( [ className isEqual : @"NSButton" ] )
      {
         NSButton * button = ( NSButton * ) control;
         
         [ button setAction : @selector( BtnClick: ) ];
      }             
   }                
    
   hb_retnl( ( LONG ) window ); 
}
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

A lo mejor es tan facil como pasar de un View a otro:

Code: Select all

HB_FUNC( WNDFROMNIB )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   NSWindowController * wndController = [ [ NSWindowController alloc ] initWithWindowNibName : string ]; 
   NSWindow * window = [ wndController window ];
   NSArray * controls = [ [ window contentView ] subviews ];
   int i;
   View * view = [ [ View alloc ] init ];

   view->hWnd = window;
     
   for( i = 0; i < [ controls count ]; i++ )
   {
      NSControl * control = [ controls objectAtIndex : i ];
      NSString * className = [ control className ];
      
      if( [ className isEqual : @"NSButton" ] )
      {
         NSButton * button = ( NSButton * ) control;
         
         [ button setAction : @selector( BtnClick: ) ];
      }   
      
      [ control retain ];
      [ view addSubview : control ];
      [ control removeFromSuperview ];          
   }                
    
     [ window setContentView : view ];
     [ window setDelegate : view ]; 
    
   hb_retnl( ( LONG ) window ); 
}
 
Segun esta documentación, se podría hacer:
http://developer.apple.com/mac/library/ ... mSuperview
pero algo debo estar haciendo mal, y tengo que volver a irme otra vez :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: desde archivo de recursos

Post by mastintin »

Si no entiendo mal el codigo lo que intentas es quedarte con la ventana y una vez la tienes crear nuestro propio view de codigo y ir insertandole los controles copiados del view del nib . ¿No ?
¿ Puede ser que al remover los objetos si estas procesando el nsview "primario" se carge los demas objetos ? .
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Manuel,

Si, esa es la idea. La cuestion es comprobar si falla por eso y ver una forma de solucionarlo.

Tal vez exista un método para clonar un objeto...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Tras un montón de pruebas, asi si deja hacerlo :-)

Code: Select all

HB_FUNC( WNDFROMNIB )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   NSWindowController * wndController = [ [ NSWindowController alloc ] initWithWindowNibName : string ]; 
   NSWindow * window = [ wndController window ];
   NSArray * controls = [ [ window contentView ] subviews ];
   View * view = [ [ View alloc ] init ];

   [ window setContentView : view ];
   [ window setDelegate : view ];
   view->hWnd = window;
     
   while( [ controls count ] > 0 )
   {
      NSControl * control = [ controls objectAtIndex : 0 ];
      NSString * className = [ control className ];
      
      [ view addSubview : control ];
      
      if( [ className isEqual : @"NSButton" ] )
      {
         NSButton * button = ( NSButton * ) control;
         
         [ button setAction : @selector( BtnClick: ) ];
      }   
   }            
    
   hb_retnl( ( LONG ) window ); 
}
 
Ahora hay que comprobar que el mensaje llegue bien...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Los mensajes llegan bien :-) Ahora hay que implementar los REDEFINEs...

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: desde archivo de recursos

Post by mastintin »

Otra opcion que me funcionaba era :

Code: Select all

HB_FUNC( WNDFROMNIB )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   NSWindowController * wndController = [ [ NSWindowController alloc ] initWithWindowNibName : string ];
   NSWindow * window = [ wndController window ];
   NSView  * myview = [ window contentView ] ;
   NSArray * controls = [ [ window contentView ] subviews ];
   View * view = [ [ View alloc ] init ];
    
   [ window setContentView : view ];
   [ window setDelegate : view ];
   view->hWnd = window;
     
   [ view addSubview : myview ];

   while( [ controls count ] > 0 )
   {
      NSControl * control = [ controls objectAtIndex : 0 ];
      NSString * className = [ control className ];
            
      if( [ className isEqual : @"NSButton" ] )
      {
         NSButton * button = ( NSButton * ) control;
         
         [ button setAction : @selector( BtnClick: ) ];
      }  
   }            
   
   hb_retnl( ( LONG ) window ); 
}
 
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

Ya está funcionando el REDEFINE BUTTON ... y ya está publicado el nuevo build :-)

Este código ya funciona:

Code: Select all

   REDEFINE BUTTON oBtn ID 20 OF oWnd ACTION MsgInfo( "Button click!" )
 
Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
ramirezosvaldo2
Posts: 49
Joined: Mon Jan 19, 2009 4:40 pm

Re: desde archivo de recursos

Post by ramirezosvaldo2 »

Hombre, dificil seguirlos

Aun asi me da gusto que se este avanzando pronto.

Saludos
Osvaldo Ramirez
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: desde archivo de recursos

Post by Antonio Linares »

REDEFINE GET ... ya está funcionando. Nuevo build disponible. El ejemplo TestNib.prg lo usa :-)

La única observación es que una vez puesto un NSTextField en la ventana del NIB, hay que cambiarle el nombre de su Clase a Get para que use la de FiveMac que intercepta los eventos que necesitamos (modificación y perdida foco).

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply