Page 1 of 3

desde archivo de recursos

Posted: Thu Jul 15, 2010 8:56 pm
by mastintin
Es un primer acercamiento que no tiene utilidad alguna pero seguro que podemos ir avanzando entre todos ...
Saludos.
Image

Re: desde archivo de recursos

Posted: Sat Jul 17, 2010 9:56 am
by Antonio Linares
Manuel,

Lo has creado desde un NIB ? Eso es formidable! :-)

Quedamos ansiosos por que nos muestres algo de código :-)

Aclaración para quienes lean esto:
Los ficheros NIB (Next Interface Builder) son equivalentes a los ficheros RC pero almacenan muchísima más información. Se contruyen con el programa "Interface Builder" que proporciona Apple.

La palabra "Next" y NS ("Next Step") provienen de los ordenadores que creó Steve Jobs cuando le "echaron" de Apple. Posteriormente Apple le compró su tecnología y se mantuvieron las siglas "NS" de "Next Step". Todo el API del Mac usa el prefijo "NS" de dichos ordenadores "Next Step" (siguiente paso).

Re: desde archivo de recursos

Posted: Sat Jul 17, 2010 7:02 pm
by mastintin
Efectivamente el panel esta construido con Interface builder y llamado desde codigo para mostrarse . El problema es que no consiguo cambiar las propiedades despues desde codigo ni llamar a los botones y sus acciones ( por lo menos de momento ) . Aunque si consiguo mostrarlo me parece que por donde he ido no es el camino .... Seguiré con ello .
La manera de hacerlo es crear un nib con una ventana yllamarla MainMenu .Colocarlo dentro de Contens-> resources->English.lproj.
Para llamarlo con esta simple funcion vale :


HB_FUNC( WINDOWCONTROLCREATE ) // hWnd
{
NSWindowController * mynibWindow = [[NSWindowController alloc]
initWithWindowNibName:@"MainMenu"];

// hb_retnl( ( LONG ) mynibwindow);

[mynibWindow showWindow: nil];

}

Re: desde archivo de recursos

Posted: Sat Jul 17, 2010 7:16 pm
by Antonio Linares
Manuel,

Eso está super bien!!! :-)

El que no reaccione es normal porque hay que construir una clase controladora derivada que haremos que rute a FiveMac :-)

Tambien podemos hacer que el nombre del nib se reciba como parámetro.

Voy a probarlo! :-)

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 12:58 am
by Antonio Linares
Manuel,

De momento las pruebas van muy bien, aunque aun no he conseguido acceder a los controles (y deberia haber podido).

Te muestro el codigo que estoy probando:
nibs.m

Code: Select all

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

@interface WindowController : NSWindowController
{
}
- ( void ) windowDidLoad;
@end

@implementation WindowController

- ( void ) windowDidLoad
{
   NSArray * controls = [ [ [ self window ] contentView ] subviews ];
   int i;
   
   NSRunAlertPanel( @"windowDidLoad", @"", @"OK", NULL, NULL );
   
   if( [ controls count ] == 0 )
      NSRunAlertPanel( @"no hay controles", @"", @"OK", NULL, NULL );   
    
   for( i = 0; i < [ controls count ]; i++ )
      NSRunAlertPanel( @"control", @"", @"OK", NULL, NULL );   
      
}

@end

HB_FUNC( WINDOWCONTROLLERCREATE )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   WindowController * wndController = [ [ WindowController alloc ] initWithWindowNibName : string ]; 

   [ wndController showWindow : nil ];
    
   hb_retnl( ( LONG ) wndController );  
}
 
En principio, deberiamos poder acceder a los controles con [ [ [ self window ] contentView ] subviews ], pero ese array esta vacio...

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 2:21 am
by Antonio Linares
El problema es que el dato window es nil...

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 8:58 am
by Antonio Linares
Este post soluciona el problema :-)

http://osdir.com/ml/cocoa-dev/2010-07/msg00252.html
Did you remember to hook up the window in the nib to File's Owner's
window outlet? Did you remember to change the class identity of File's
Owner to your NSWindowController subclass?
Explico aqui los pasos a hacer desde el Interface Builder:

1. Hacemos click en "File's owner":
Image

2. Le cambiamos su clase a "WindowController", que es la clase que tenemos definida en FiveMac:
Image

3. Pulsamos sobre el circulo gris con la flechita a la derecha del nombre de la clase y nos lleva al inspector de classes. Desde alli establecemos su clase padre como NSWindowController:
Image

4. Como el "File's Owner" es ahora un objeto WindowController, derivado de NSWindowController, ya tiene el "outlet" window y es asignable! :-)

5. Pulsamos "control" en el teclado y con el boton izquierdo del ratón sacamos una línea de conexión desde el "File's Owner" a nuestra ventana:
Image
Image
Eso hará que el dato window de nuestro WindowController se asigne! :-)

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 9:26 am
by mastintin
------ editado ----------
Llego tarde .... olvidar lo de abajo .




Antonio me he encotrado esto en cocoabuilders :


Cocoabuilder

cocoa xcode

NSWindowController window always nil?

*
Luc Vandal NSWindowController window always nil? Apr 25 2005, 16:41
Hi,

I can't figure out why [self window] always return nil, even if the
window has already been displayed. Am I missing something?

Thanks!

Luc
*
j o a r Re: NSWindowController window always nil? Apr 25 2005, 16:52
On 2005-04-25, at 16.41, Luc Vandal wrote:

> I can't figure out why [self window] always return nil, even if the
> window has already been displayed. Am I missing something?

Have you dragged the connection from the window controller (files
owner) and the window in the nib file?

j o a r
*
Luc Vandal Re: NSWindowController window always nil? SOLVED Apr 25 2005, 17:30
Yeah that was the problem... thanks! :)

On 25-Apr-05, at 10:52 AM, j o a r wrote:

>
> On 2005-04-25, at 16.41, Luc Vandal wrote:
>
>> I can't figure out why [self window] always return nil, even if the
>> window has already been displayed. Am I missing something?
>
> Have you dragged the connection from the window controller (files
> owner) and the window in the nib file?
>
> j o a r
>
> show quoted text

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 9:33 am
by Antonio Linares
Manuel,

Si, es eso. Lo que pasa es que saber hacerlo paso a paso desde el Interface Builder tiene su truco, y lo más importante hay que cambiar la clase de "File's Owner" para que sea un NSWindowController y asi poder acceder al dato window desde Interface Builder :-)

Y aún podemos hacerlo mas simple! No necesitamos usar windowDidLoad pues la ventana se hace visible tan pronto como se accede al dato window de NSWindowController.

Asi que eliminamos nuestra clase derivada y usamos la estandard sin derivar! :-)

Code: Select all

HB_FUNC( WINDOWCONTROLLERCREATE )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   NSWindowController * wndController = [ [ NSWindowController alloc ] initWithWindowNibName : string ]; 
    
   if( [ wndController window ] != nil )
      NSRunAlertPanel( @"ventana accesible", @"", @"OK", NULL, NULL );
    
   hb_retnl( ( LONG ) wndController );  
}
 
El siguiente paso es ver la forma de conectar los controles :-)

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 9:44 am
by Antonio Linares
Esta version ya muestra los nombres de las clases de los controles hijos :-)

Code: Select all

HB_FUNC( WINDOWCONTROLLERCREATE )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   NSWindowController * wndController = [ [ NSWindowController alloc ] initWithWindowNibName : string ]; 
   NSArray * controls = [ [ [ wndController window ] contentView ] subviews ];
   int i;
      
   for( i = 0; i < [ controls count ]; i++ )
      NSRunAlertPanel( [ [ controls objectAtIndex : i ] className ], @"", @"OK", NULL, NULL );      
    
   hb_retnl( ( LONG ) wndController );  
}
 
Image

Image

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 10:06 am
by Antonio Linares
Image

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 10:30 am
by mastintin
Esto funciona sin problemas, ya cambia el titulo de la ventana :

Code: Select all

NSWindowController * mynibWindow = [[NSWindowController alloc]  initWithWindowNibName:@"MainMenu"];   
    [mynibWindow showWindow: nil];
    NSWindow * ventana = [mynibWindow window] ; 
    [ ventana setTitle: @"Hola" ]  ;    

 

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 10:31 am
by Antonio Linares
Bueno, a falta de que replanteemos como se van a rutar los eventos, aqui tenemos una primera versión que ya procesa el "click" del botón :-)

Code: Select all

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

// NSView * GetView( NSWindow * window );

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

@implementation WindowController

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

@end


HB_FUNC( WINDOWCONTROLLERCREATE )
{
   NSString * string = [ [ [ NSString alloc ] initWithCString: ISCHAR( 1 ) ? hb_parc( 1 ) : "" ] autorelease ];
   WindowController * wndController = [ [ WindowController alloc ] initWithWindowNibName : string ]; 
   NSArray * controls = [ [ [ wndController window ] contentView ] subviews ];
   int i;
      
   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 ) wndController );  
}
 
Image

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 11:06 am
by mastintin
La manera de distinguir los distintos objetos del view es mediante sus tags :

Code: Select all

    
    NSView * myview = [ventana contentView ] ;
    
    [[myview viewWithTag :255 ] setTitle: @"Hola" ]  ;  

 
Al boton le he puesto el tag 255 y le he cambiado el titulo . FUNCIONA .Ya tenemos como acceder al estilo RC.

Re: desde archivo de recursos

Posted: Sun Jul 18, 2010 11:13 am
by mastintin
FUNCIONA :

Code: Select all

    
    NSView * myview = [ventana contentView ] ;
    
    [[myview viewWithTag :255 ] setTitle: @"Hola" ]  ;  
    
    NSButton * boton = ( NSButton * ) [myview viewWithTag :255 ];
    
    [ boton setAction : @selector( BtnClick: ) ];   
 
Image