Newsgroup: it.comp.macintosh
Titolo: Esempio Cocoa e creazione controlli da codice

Salve!
Sto cercando un esempio in Obj-C e Cocoa che crei finestre e controlli da 
codice invece di usare Interface Builder. Qualcuno mi può aiutare?
Grazie

 Grazie
Fra gli esempi instalati con xcode trovi un po' di materiale.
-- 
Outside of a dog a book is a man's best friend.
Inside of a dog is too dark to read  (Groucho Marx)

 Fra gli esempi instalati con xcode trovi un po' di materiale.
Ho già cercato negli esempi di xcode, ma non ho trovato nulla. Quelli che 
non fanno uso dei NIB sono a command line tools. Potresti dirmene almeno uno?
Grazie

 wrote:

Che vuoi fare di preciso?



NSButton* bottone = [[NSButton alloc] init...];
[bottone setFrame:...];
// e tutti gli altri set... per impostare titolo, stile, ecc. ecc.
// vedi la documentazione di NSButton o del controllo che vuoi aggiungere.
// view è una NSView*
[view addSubview:bottone];
[bottone release]; // bilancia il nostro init, view fa retain del bottone.
-- 
 - ∞
http://infinite-labs.net

 
Grazie, siamo sulla strada giusta! Una volta creati i controlli come si 
avvia il tutto? C'è da qualche parte un esempio piu' completo?
Mi servirebbe uno scheletro di applicazione funzionate.
Ciao

 
Creare controlli a runtime, senza usare file NIB e interface builder, cioè 
tutto ma proprio tutto da codice (in po' come si fa in Java o C#).
Qualcosa che mi faccia vedere come:
- creare una finestra (una view)
- metterci controlli (bottoni, campi testo...)
- delegare metodi alla ricezione degli eventi
- iniziare il tutto (cioè visualizzare la view ed iniziare con l'ascolto 
degli eventi)
Il tutto in un unico file ".m" e utilizzando il framework Cocoa (non 
Carbon): quest'ultima cosa è molto importante!
Vi ringrazio molto!

 Mi servirebbe uno scheletro di applicazione funzionate.
Be', se non hai una finestra la puoi creare con alloc-init... (vedi la 
documentazione, il costruttore ha un nome lunghissimo) e mettere 
onscreen con -orderFront:.
Ovviamente è necessario che tu stia eseguendo 'sta roba nel thread 
principale, e per far funzionare la finestra dovrai dire a 
NSApplication di funzionare (cioé fare il lavoro che normalmente è 
fatto da NSApplicationMain nel main.m che ti crea Xcode). Dovresti 
dunque fare:
int main(int argc, const char* argv[]) {
	[NSApplication sharedApplication]; // crea l'oggetto NSApp.
	NSWindow* finestra = [[NSWindow alloc] init...];
	NSButton* blabla = /* blabla */ // eccetera eccetera
	[[finestra contentView] addSubview:blabla];
 
	[NSApp run]; // esegue il loop degli eventi
	return 0; // -run ritorna quando viene eseguito -terminate:, che
	// nei nib è agganciato a menu applicazione > Esci da xyz, o
	// via apple events quando si sceglie Esci dal menu nel dock.
	// dovrai agganciarlo a mano a quell'elemento di menu se non usi i nib!
}
-- 
 - ∞
http://infinite-labs.net

 tutto ma proprio tutto da codice (in po' come si fa in Java o C#).
questo si era capito, la domanda, se non indiscreta, e` "perche`?"

 }
attenzione che all'esterno di -sharedApplication e -run non esiste un
autorelease pool, quindi (se non si vuol vedere lentamente morire il
computer) prima di creare classi Cocoa al di fuori di quei due metodi,
meglio aggiungerlo:
int main(int argc, const char* argv[]) {
  [NSApplication sharedApplication]; // crea l'oggetto NSApp.
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSWindow* finestra = [[NSWindow alloc] init...];
  NSButton* blabla = /* blabla */ // eccetera eccetera
  [NSApp run]; // esegue il loop degli eventi
  [pool release];
  return 0;
}
-- 
http://www.emeraldion.it
La bellezza dell'amore salvera' il mondo

 non fanno uso dei NIB sono a command line tools. Potresti dirmene almeno uno?
MenuMadness.


 MenuMadness.
Fa uso di MenuMadness.nib, quindi usa Interface Builder.

 
Per il semplice gusto di conoscere. Ho sempre trattato l'informatica più 
come Passione che come lavoro, e alla passione non si comanda. Capisco che 
la strada più ovvia per disegnare interfacce è un'altra, ma mi piace vedere 
le cose da altri punti di vista...

   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];....
Bene, ho fatto questo e visualizza una finestra ed un bottone. Però non ho 
capito bene a quale oggetto vada aggiunto il bottone. Perchè c'è bisogno di 
un NSView per contenere il bottone. E poi non mi sembra il modo corretto 
(addSubView) per aggiungere il bottone. Suggerimenti?
#import <Cocoa/Cocoa.h>
int main (int argc, const char * argv[]) {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	[NSApplication sharedApplication];
 
     NSWindow *myWindow = [[NSWindow alloc]
             initWithContentRect:NSMakeRect(100, 100, 400, 400)
             styleMask:NSTitledWindowMask | NSClosableWindowMask | 
NSMiniaturizableWindowMask | NSResizableWindowMask
             backing:NSBackingStoreBuffered
             defer:NO];
     [myWindow setTitle:@"Test Window"];
     [myWindow setShowsResizeIndicator:YES];
     [myWindow useOptimizedDrawing:YES];
     [myWindow setCanHide:YES];
     [myWindow center];
     [myWindow makeKeyWindow];
     [myWindow makeKeyAndOrderFront:nil];
 
	NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(10,10,80,30)];
	[myButton setTitle:@"Prova"];
	[myButton setBezelStyle: 17];
 
	NSView *myView = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 400, 
400)];
	[myWindow setContentView:myView];
	[myView addSubview:myButton];
 
     [NSApp run];
     [pool release];
     return 0;
}

 wrote:

Non avevo capito fino a che punto volevi programmare l'interfaccia.


       [myView addSubview:myButton];
perche' dici questo, non ti funziona forse?


 wrote:

Sacrosanto, ci mancherebbe.
Ti consiglio comunque di studiare un po' il funzionamento della cosa: il
modo in cui funzionano è a dir poco elegante (e fa capire anche il
perché ti viene tanto sconsigliato l'approcio "manuale").
Se hai la pazienza, ci sono un paio di bravi sviluppatori Cocoa qui in
giro che potranno fornirti riferimenti o aiuto diretto :)

 wrote:

ok

 perche' dici questo, non ti funziona forse?
Approfitto per citare un codice dai sorgenti di Growl. ROTFL! :)
#import "GrowlController.h"
int main(void) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  [NSApplication sharedApplication];
  // Tolkien fa male (NdC)
  GrowlController *theOneRingToRuleThemAll;
  theOneRingToRuleThemAll = [[GrowlController alloc] init];
  [NSApp setDelegate:theOneRingToRuleThemAll];
  [NSApp run];
  [theOneRingToRuleThemAll release];
  [NSApp release];
  [pool release];
  return EXIT_SUCCESS;
}
-- 
http://www.emeraldion.it
"Ho fatto qualcosa che non va? Non direi. Io valgo". Zero.