Derniers détails => Plein de questions
respawn
Membre
Ben voilà , j'arrive à la fin de la création de mon application, ce qui fut relativement rapide étant donné que je ne connaissait rien à Cocoa/Obj-C il y a 5 jours ! Tout ceci grâce à vous ! Merci beaucoup à tous ceux qui m'ont aidés !
Mais comme vous le savez, la mise en place des derniers détails est ce qui prend le plus de temps et ce qui est le plus difficile. Voici donc quelques questions en vrac :
1) J'ai besoin de transformer une chaine de type NSString en char *, je sais, c'est pas bien, mais je dois le faire :-) ... Comment ? Au passage, où trouver toutes ces fonctions de transformation comme intValue etc ?
2) Est-il possible d'associer une bouton à plusieurs actions ? Apparemment non ... Je vous explique ce qu eje veux faire. Sur ma fenêtre principale, j'ai un bouton "Settings" qui permet d'ouvrir la fenêtre ... des Settings bien sûr Et je souhaiterai que quand j'ouvre cette fenêtre, une fonction s'exécute (comparaison d'une variable global pour afficher un texte en fonction de cette variable).
3) Au lancement de mon application j'ai bien le bouton "Start" qui est bleu et qui réagi quand j'appuie sur "Enter" ... classique. Maintenant, comment faire pour qu'une fois le serveur lancé, ce soit "Stop" qui soit bleu ...
4) Si je quitte mon application pomme-Q quand ma fenêtre de Settings est ouverte ... ça plante ! Pourquoi ?
5) Comment activer la fermeture d'une fenêtre par pomme-W ?
Mais comme vous le savez, la mise en place des derniers détails est ce qui prend le plus de temps et ce qui est le plus difficile. Voici donc quelques questions en vrac :
1) J'ai besoin de transformer une chaine de type NSString en char *, je sais, c'est pas bien, mais je dois le faire :-) ... Comment ? Au passage, où trouver toutes ces fonctions de transformation comme intValue etc ?
2) Est-il possible d'associer une bouton à plusieurs actions ? Apparemment non ... Je vous explique ce qu eje veux faire. Sur ma fenêtre principale, j'ai un bouton "Settings" qui permet d'ouvrir la fenêtre ... des Settings bien sûr Et je souhaiterai que quand j'ouvre cette fenêtre, une fonction s'exécute (comparaison d'une variable global pour afficher un texte en fonction de cette variable).
3) Au lancement de mon application j'ai bien le bouton "Start" qui est bleu et qui réagi quand j'appuie sur "Enter" ... classique. Maintenant, comment faire pour qu'une fois le serveur lancé, ce soit "Stop" qui soit bleu ...
4) Si je quitte mon application pomme-Q quand ma fenêtre de Settings est ouverte ... ça plante ! Pourquoi ?
5) Comment activer la fermeture d'une fenêtre par pomme-W ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu prend l'option Help >Documentation
tu utilises search
Au point de vue de l'interface graphique, non.
Mais rien n'empêche que la méthode appelée en appelle d'autres :
-(IBAction) buttonAction:(id) sender {
[self faitCeci];
[self faitCelaAvec:machin];
etc...
}
Lire la doc de NSButton, ce doit être la méthode highlight: ou setState: (ou autre chose, j'ai pas relu .. )
On peut même le rendre invisible si on veut.
Il faut que ton contrôleur ait un IBOutlet sur chacun des boutons concernés.
Ben t'as un bug dans ton programme.
Peut-être une mauvaise gestion des retain-release
C'est automatiquement la key-window (fenêtre active) qui se ferme.
Si tu veux intervenir dans cet automatisme :
• Créer une IBAction dans le contrôleur de l'appli
• Connecter dans IB l'option du menu à cette IBAction par control-drag
• Ton contrôleur ayant à priori des outlets sur les fenêtres ferme ce qu'il veut dans le code de l'IBAction
1)
Il faut apparemment utiliser l'enchainement
Mais ca ne marche pas pour moi, 3 erreurs de type
2) Le problème c'est que soit j'associe mon bouton à l'ouverture de fenêtre et ensuite ... je ne sais pas comment ajouter à la fonction d'ouverture de fenêtre l'appel à ma fonction désirée
Soit (je pense que c'est cette version la bonne) je lie le bouton à ma fonction qui fait ce que je veux, mais comment appeler l'ouverture de ma fenêtre "Settings" ensuite ?
3) OK, je vais me pencher la dessus, je pense pouvoir trouver
4) Problème réglé, ma fenêtre n'était pas "delegate File's Owner"
5) Pas trop compris, j'ai une IBAction dans mon fichier qui ferme une fenêtre (je l'appelle quand j'appuie sur Valider dans ma fenêtre Settings), mais je n'arrive pas à la lier à autre chose ... c'est pas naturel de fermer avec pomme-w, je pensais ce ça se ferait tout seul comme pomme-Q
6) 5) Comment créer un fichier et y enregistrer des données ? Je veux pouvoir enregistrer l'ensemble de ce qui est affiché dans mon NSTextView dans un fichier (PDF, RTF, TXT ou autre peu importe).
[size=12pt]Un essai :[/size]
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
NSString * string=[NSString stringWithFormat:@Molière ≠Moli%Cre %C,'è',0xFFFD ];
NSLog(string);
const char * cString=[string UTF8String]; // pointeur associé à un objet en autorelease
printf("La chaà®ne cString = \" %s \" occupe %d octets\n",cString,strlen(cString));
char * persistentCString=strdup(cString); // pour conserver la chaà®ne éventuellement
puts(persistentCString);
printf("Sur %d octets\n",strlen(persistentCString));
free(persistentCString);
[pool drain];
return 0;
}
% gcc pgm.m -o pgm -framework Foundation -std=c99
pgm.m:8:75: warning: multi-character character constant
% pgm
2008-08-15 11:59:30.170 pgm[944:10b] Molière ≠Moli쎨re �
La chaà®ne cString = " Molière ≠Moli쎨re � " occupe 26 octets
Molière ≠Moli쎨re �
Sur 26 octets
%
Ce post peut t'aider à faire une installation propre de ta fenêtre préférence.
Ton IBAction est dans ton code. Ton bouton ne peut appeler qu'une seule action, mais le code fait tout ce qu'il veut, lui.
-(IBAction) actionDéclenchéeParLeBouton:(id) sender {
[self faireLaVaisselle];
[self faireUnGrosCalin];
...
[fenetreController close];
}
-(void) faireLaVaisselle {
...
}
-(void) faireUnGrosCalin {
...
}
??? je ne vois en quoi cela peut provoquer un bug .
A moins que tu n'utilises un second nib, auquel cas la classe du File's Owner doit être un NSWindowController
pomme-Q ferme tout, il n'est pas question d'avoir à fermer les fenêtres lorsqu'on quitte l'application.
De manière rudimentaire, on peut faire ainsi, mais il y a des procédures plus propres à suivre (voir ch 10 de Hillegass par exemple)
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
NSString * string=[NSString stringWithFormat:@Molière ≠Moli%Cre %C,'è',0xFFFD ];
NSError * error;
NSString * path=[NSHomeDirectory() stringByAppendingPathComponent:@/Desktop/Machin.txt];
if( ![string writeToFile:path atomically:YES encoding:NSUnicodeStringEncoding error:&error]){
NSLog(@Error : %@",error);
}
[pool drain];
return 0;
}
[Edit] Ah non mince, y en a un de respawn dans le tas :-\\
(12++)
(++ N ++)
J'en connais un qui est pressé d'avoir son dernier carré de chocolat :P
je regarde pour l'encodage...
Il fait doux en Anjou, et le côteau de l'Aubance a coulé ...
N+=3
C'est à partir du moment où il y a des caractères plus spéciaux que ça se complique. À savoir que certains encodages pourront les coder (UTF-*), et d'autres non (LATIN, MAC, WINDOWS). Ensuite, selon l'UTF-* choisi, ça ne sera pas codé sur la même taille (il n'y a qu'en UTF-32 que tous les caractères sont codés sur 32 bits ; en UTF-16, ça peut être sur 1 ou 2 fois 16 bits et en UTF-8, sur 1 à 4 fois 8 bits).
Là où ça se complique encore plus, c'est quand les diacritiques entre en jeu. Les caractères peuvent être suivis d'un ou plusieurs caractères diacritiques, donc on peut avoir lu un caractère complet dans un encodage, il n'est pas forcément "Â fini " (notion de glyphe).
En plus, ça dépend si c'est en représentation composée ou décomposée (en UTF-8, "é" peut être représenté par "é" ou par "e" suivi du diacritique "´").
En Anjou, il fait peut être bon vivre, mais faut arrêter le petit rosé avent de répondre aux messages.
L'état "bleu clignotant" d'un bouton se règle en modifiant le keyEquivalent :
Petit récapitulatif :
1) Pour la transformation de chaine de caractères ... ca me parait bien compliqué ... je possède une chaine récupérée d'un NSTextField, donc un NSString et j'ai besoin de la passer en paramètre de la fonction C gethostbyname qui attend un char *. Je fais donc et passe card_server à la fonction mais ... lorsque mon programme l'appelle, ça beug et me renvoie dans le code ...
2) Pour la fermeture de question, ce n'est pas aussi compliqué que ce que vous avez compris lol ... je me demandais juste pourquoi, une fois mon appli lancée, si je fais pomme-Q, elle quitte, ce qui est tout à fait normal et naturel pour une appli mac, mais si je fais pomme-W, ça ne fait rien ... je pensais que c'était tout aussi naturel ...
3) Existe-t-il une variable permettant d'obtenir la date et l'heure précise ?
Pour le reste on verra plus tard ;-)
Merci bien
[size=12pt]const [/size]char * card_server = [card_address UTF8String]
Sinon le seul bug peut venir du fait que tu changes de méthode pour utiliser card_server.
Alors la zone mémoire où se trouve [card_address UTF8String] a pu être réutilisée pour autre chose.
Voir la classe NSDate,[NSDate dateWithTimeIntervalSinceNow:0]
C'est le comportement normal sur Mac, mais on peut le changer avec une méthode du delegate de l'application. (doc : NSApplication)
Encore plus simple : [NSDate date];
j'ai déclaré en variable globale : const char *totoserver;
Ensuite dans une méthode lancée quand on appuie sur un bouton, j'ai
totoserver = [card_address UTF8String]
sachant que card_address est un NSString * bien sûr
et maintenant, quand je fais
serverfd = connect_card(*totoserver, card_port);
avec la méthode connect_card qui a pour prototype
int connect_card(char *serverhost, unsigned int port)
j'ai un warning
"warning: passing argument 1 of 'connect_card' discards qualifiers from pointer target type"
et bien sûr, à l'exécution, ca plante et me renvoie dans le code
so ...
C'est clair
ta fonction doit être de prototype :
int connect_card(const char *serverhost, unsigned int port)
et l'appel sans * devant totoserver :
serverfd = connect_card(totoserver, card_port);
Tu n'as pas besoin de variable globale.
Lors de l'initialisation tu fais comme l'indique le post d'essai
const char * cString=[string UTF8String];
const char * totoserver=strdup(cString);
La chaà®ne est alors de la durée de vie illimiée jusqu'à ce que tu en décides autrement
Dans ta fonction connect_card(), si tu n'as plus besoin de cette chaà®ne, tu fais
free(serverhost);
pour libérer la mémoire.