customiser le save panel d'une application

serty2

Nouveau membre
28 Août 2003
9
0
bonjour,
je decouvre cocoa depuis 3 semaines et je suis confronte a un probleme qui vient de me prendre la journee (newbie oblige ;-) )

je cherche a fr aparaitre dans le save panel de mon application un textfield editable.
j ai essaye avec la methode setAccessoryView de la classe NSSavePanel mais je c pas pkoi, ca marche pas....
le code que j'essaye de fr fonctionner est le suivant :

<font class="small">Code:</font><hr /><pre> -(IBAction)compress:(id)sender;
{

NSSavePanel *savePanel = [NSSavePanel savePanel];
NSView *testView = [[NSView alloc]init];
NSTextField *textField = [[NSTextField alloc]init];
[textField setStringValue:mad:"toto"];
NSLog(@"valeur : %@",[textField stringValue]);
[testView addSubview:textField];
[testView setNeedsDisplay:YES];
[textField setNeedsDisplay:YES];
[savePanel setAccessoryView:textField];
[savePanel setRequiredFileType:mad:"cod"];

[savePanel beginSheetForDirectory:nil
file:nil
modalForWindow:[self window]
modalDelegate:self
didEndSelector:mad:selector(didEnd:returnCode:contextInfo:)
contextInfo:nil];

}
</pre><hr />

si qqun a une piste sur laquelle je pourrais me lancer, pasque je suis un peu bloque la....

Merci d'avance ;-)
 

molgow

Vétéran
Club MacG
4 Janvier 2002
5 493
612
37
Suisse
www.monts-chevreuils.ch
Essaie comme ceci :

<font class="small">Code:</font><hr /><pre> -(IBAction)compress:(id)sender;
{

NSSavePanel *savePanel = [NSSavePanel savePanel];
NSView *testView = [[NSView alloc] initWithFrame:NSMakeRect(0.0, 0.0, 228.0, 65.0)]; // &lt;- modif ici
NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(20.0, 23.0, 188.0, 22.0)]; // &lt;- modif ici
[textField setStringValue:mad:"toto"];
NSLog(@"valeur : %@",[textField stringValue]);
[testView addSubview:textField];
[testView setNeedsDisplay:YES];
[textField setNeedsDisplay:YES];
[savePanel setAccessoryView:textField];
[savePanel setRequiredFileType:mad:"cod"];

[savePanel beginSheetForDirectory:nil
file:nil
modalForWindow:[self window]
modalDelegate:self
didEndSelector:mad:selector(didEnd:returnCode:contextInfo:)
contextInfo:nil];

}
</pre><hr />

Les NSView ont besoin d'être initialisé via la méthode initWithRect:(NSRect *). Je pense qu'avec le code que je t'ai donné, ça devrait à présent fonctionner chez toi. Si ce n'est pas le cas, dis moi, je t'envoie un petit exemple (projet PB).

Encore une chose, tu ferais bien mieux d'utiliser InterfaceBuilder pour construire ton interface et donc tes NSView. Tu peux créer facilement un NSView en glissant dans InterfaceBuilder l'élément "CustomView" sur ta fenêtre principale. Ensuite, il te suffit juste de créer un Outlet dans ta classe qui reliera cette vue. J'espère que c'est clair, sinon n'hésites pas à nous demander de l'aide.
 

serty2

Nouveau membre
28 Août 2003
9
0
un grand merci pour ce debloquage ;-)))
ca marche nickel, je v meme en alleger une partie maintenant que j ai mieux compris comment ca marche ;-)

par contre, si je cree un textField dans IB, et que j en fais un outlet dans mon code, il va s afficher sur ma main window, ou du moins il va gener mon *joli* design non ?

encore merci d'aider un petit debutant en passe de switch (pc -&gt; MAC ) a decouvrir ce superbe framework malheuresement couple a un language barbare a ses yeux ;-)

ps : ou a tu trouve les chiffres de Width et Height pour la vue et le textField ?
 

molgow

Vétéran
Club MacG
4 Janvier 2002
5 493
612
37
Suisse
www.monts-chevreuils.ch
C'est rien. N'hésites pas à demander de l'aide si tu as des problèmes.
Et bienvenue dans la monde merveilleux de la programmation Mac


Le principe avec Cocoa, c'est que tu crées (presque?) toujours l'interface avec Interface Builder. C'est plus simple et plus rapide. Donc là tu dois créer un NSView qui contiendra un NSTextField. Voici la marche à suivre :

1) Tu ouvres dans Interface Builder (IB) ton fichier MainMenu.nib. Tu vas dans la palette Cocoa-Containers (cf image). Tu sélectionnes l'élément CustomView, tu le glisses sur la fenêtre principale (celle qui contient les instances de tes classes et tes fenêtres par exemple). Voici une image c'est plus parlant :



2) Tu insères ton NSTextField dans ce nouveau NSView (ou tu y mets tout ce que tu veux comme élément d'interface)



3) Tu as probablement une classe Controller quelque part. Tu dois lui rajouter un outlet (un outlet est simplement un pointeur dans une classe qui pointera sur un élément d'interface), et le relier au NSView que tu viens de créé.



Voilà, donc contrairement à ce que tu avais l'air de me dire, ton NSTextField ne se trouvera absolument pas dans ta fenêtre, mais dans un NSView à part.

Je t'ai également concocté un petit exemple que tu peux télécharger ici.

Quant à ce langage barbare.. je suis un petit peu de ton avis, c'est pourquoi je fais actuellement du Cocoa-Java (même chose mais utilisation du Java plutôt qu'Obj-C, et contrairement à certains appriori, c'est tout à fait rapide). Un site sur Cocoa-Java au cas où ça t'intéresse.
Encore une chose, pour les width et les height, je l'ai simplement trouvé avec Interface Builder (j'ai créé un NSView avec un NSTextField avec IB puis j'ai relevé les NSRect correspondants
)
 

serty2

Nouveau membre
28 Août 2003
9
0
effectivement, vu comme ca, c bcp plus simple ;-)
merci encore...
concernant obj-C , je n'ai pas eu tout a fait le choix :-(
dc j'ai du m adapter.....
enfin tout du moins essayer de m adapter....
maintenant que j'ai un save panel a peu pres fonctionnel, je v essayer d'avancer un peu plus dans mon application...

merci pour tes reponses bien plus reactives et costructives que la ML cocoa-dev .....
 

molgow

Vétéran
Club MacG
4 Janvier 2002
5 493
612
37
Suisse
www.monts-chevreuils.ch
Ah j'avais pas vu ton message sur cocoa-dev


Qqn t'y a répondu en moins de 30 min, que :
Views are inited with initWithFrame.
Peut-être un peu succint mais correct
 

serty2

Nouveau membre
28 Août 2003
9
0
vivi effectivement, correct, mais ta reponse est bien plus precise ;-)
c plus qu'apreciable d'avoir des reponses du type de celle que tu m a donne ;-)