desde archivo de recursos

User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

desde archivo de recursos

Post by mastintin »

Es un primer acercamiento que no tiene utilidad alguna pero seguro que podemos ir avanzando entre todos ...
Saludos.
Image
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,

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).
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 »

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];

}
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,

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! :-)
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,

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...
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 »

El problema es que el dato window es 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 »

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! :-)
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 »

------ 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
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, 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 :-)
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 »

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
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 »

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 »

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" ]  ;    

 
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 »

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
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 »

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.
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: desde archivo de recursos

Post 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
Post Reply