desde archivo de recursos
desde archivo de recursos
Es un primer acercamiento que no tiene utilidad alguna pero seguro que podemos ir avanzando entre todos ...
Saludos.
Saludos.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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).
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
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];
}
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];
}
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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!
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!
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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
En principio, deberiamos poder acceder a los controles con [ [ [ self window ] contentView ] subviews ], pero ese array esta vacio...
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 );
}
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
El problema es que el dato window es nil...
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
Este post soluciona el problema
http://osdir.com/ml/cocoa-dev/2010-07/msg00252.html
1. Hacemos click en "File's owner":
2. Le cambiamos su clase a "WindowController", que es la clase que tenemos definida en FiveMac:
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:
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:
Eso hará que el dato window de nuestro WindowController se asigne!
http://osdir.com/ml/cocoa-dev/2010-07/msg00252.html
Explico aqui los pasos a hacer desde el Interface Builder: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?
1. Hacemos click en "File's owner":
2. Le cambiamos su clase a "WindowController", que es la clase que tenemos definida en FiveMac:
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:
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:
Eso hará que el dato window de nuestro WindowController se asigne!
Re: desde archivo de recursos
------ 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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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!
El siguiente paso es ver la forma de conectar los controles
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 );
}
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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 );
}
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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" ] ;
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: desde archivo de recursos
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 );
}
Re: desde archivo de recursos
La manera de distinguir los distintos objetos del view es mediante sus tags :
Al boton le he puesto el tag 255 y le he cambiado el titulo . FUNCIONA .Ya tenemos como acceder al estilo RC.
Code: Select all
NSView * myview = [ventana contentView ] ;
[[myview viewWithTag :255 ] setTitle: @"Hola" ] ;
Re: desde archivo de recursos
FUNCIONA :
Code: Select all
NSView * myview = [ventana contentView ] ;
[[myview viewWithTag :255 ] setTitle: @"Hola" ] ;
NSButton * boton = ( NSButton * ) [myview viewWithTag :255 ];
[ boton setAction : @selector( BtnClick: ) ];