Derniers détails => Plein de questions

respawnrespawn Membre
00:28 modifié dans API AppKit #1
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 ?
«1

Réponses

  • Philippe49Philippe49 Membre
    00:28 modifié #2
    dans 1218787668:

    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  ?

    Tu prend l'option Help >Documentation

    tu utilises search
  • Philippe49Philippe49 Membre
    00:28 modifié #3
    dans 1218787668:

    2) Est-il possible d'associer une bouton à  plusieurs actions ? Apparemment non ...

    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...
    }
  • Philippe49Philippe49 Membre
    00:28 modifié #4
    dans 1218787668:

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


    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.
  • Philippe49Philippe49 Membre
    00:28 modifié #5
    dans 1218787668:

    4) Si je quitte mon application pomme-Q quand ma fenêtre de Settings est ouverte ... ça plante ! Pourquoi ?

    Ben t'as un bug dans ton programme.
    Peut-être une mauvaise gestion des retain-release
  • Philippe49Philippe49 Membre
    août 2008 modifié #6
    dans 1218787668:

    5) Comment activer la fermeture d'une fenêtre par pomme-W ?

    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
  • respawnrespawn Membre
    00:28 modifié #7
    Merci beaucoup, je vais essayer tout ça. Comme d'habitude j'avais trouvé une solution 5min après avoir posté, pour le NSString -> char *

    1)
    Il faut apparemment utiliser l'enchainement
    <br />NSString *card_address;<br />char *card_server = [card_address UTF8String];<br />
    


    Mais ca ne marche pas pour moi, 3 erreurs de type
    error: syntax error before string constant<br />error: assignment of read-only location<br />/error: incompatible types in assignment<br />
    


    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).
  • Philippe49Philippe49 Membre
    00:28 modifié #8
    dans 1218787668:

    1) J'ai besoin de transformer une chaine de type NSString en char *,


    [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
    %



  • Philippe49Philippe49 Membre
    août 2008 modifié #9
    dans 1218794641:

    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 ?

    Ce post peut t'aider à  faire une installation propre de ta fenêtre préférence.
  • Philippe49Philippe49 Membre
    août 2008 modifié #10
    dans 1218794641:

    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

    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 {
      ...
    }
  • Philippe49Philippe49 Membre
    00:28 modifié #11
    dans 1218794641:

    4) Problème réglé, ma fenêtre n'était pas "delegate File's Owner"

    ??? 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
  • Philippe49Philippe49 Membre
    00:28 modifié #12
    dans 1218794641:

    c'est pas naturel de fermer avec pomme-w, je pensais ce ça se ferait tout seul comme pomme-Q

    pomme-Q ferme tout, il n'est pas question d'avoir à  fermer les fenêtres lorsqu'on quitte l'application.

  • Philippe49Philippe49 Membre
    00:28 modifié #13
    dans 1218794641:

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


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

  • schlumschlum Membre
    00:28 modifié #14
    12 d'affilée, ça y est, t'as fait péter ton record  :)

    [Edit] Ah non mince, y en a un de respawn dans le tas  :-\\
  • Philippe49Philippe49 Membre
    00:28 modifié #15
    plein de  questions ==> plein de réponses
    (12++) :)
  • Philippe49Philippe49 Membre
    00:28 modifié #16
    Eh Schlum, vérifie quand même sur les questions d'encodage, je n'y connais pas grand chose
    (++ N ++)
  • schlumschlum Membre
    00:28 modifié #17
    dans 1218806622:

    plein de  questions ==> plein de réponses
    (12++) :)


    J'en connais un qui est pressé d'avoir son dernier carré de chocolat  :P

    je regarde pour l'encodage...
  • Philippe49Philippe49 Membre
    août 2008 modifié #18
    Bon ceci dit, je continue ma sieste , il fait doux en Anjou :
    Il fait doux en Anjou, et le côteau de l'Aubance a coulé ...


    N+=3
  • schlumschlum Membre
    00:28 modifié #19
    En fait, tant que la NSString ne contient aucun caractère spécial (table ASCII), il n'y a pas trop de problèmes ; on peut choisir n'importe quel encodage ASCII compatible (l'UTF-8 est très bien, mais on peut aussi prendre n'importe quel encodage ISO-LATIN ou MAC ou WINDOWS ; pour tous ceux là , les caractères latins ont les mêmes correspondants sur 1 byte).
    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 "´").
  • NoNo Membre
    00:28 modifié #20
    dans 1218791125:

    dans 1218787668:

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

    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.


    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 :
    <br />// service démarré : désatctivation du bouton start et suppression du &quot;bleu clignotant&quot;<br />[boutonStart setEnabled:NO];<br />[boutonStart setKeyEquivalent:@&quot;&quot;];<br /><br />// activation du bouton stop et mise en &quot;bleu clignotant&quot;<br />[boutonStart setEnabled:YES];<br />[boutonStop setKeyEquivalent:@&quot;&#092;r&quot;];<br />
    
  • schlumschlum Membre
    00:28 modifié #21
    Il y a plusieurs techniques... Moi je préfère "- (void)setDefaultButtonCell:(NSButtonCell *)defaultButtonCell" de NSWindow personnellement...
  • respawnrespawn Membre
    00:28 modifié #22
    Bonjour à  tous. J'espère que vous avez passé un bon WE. C'est reparti ...

    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
    char *card_server = [card_address UTF8String];
    
    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
  • Philippe49Philippe49 Membre
    00:28 modifié #23
    dans 1219050975:
    :

    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
    char *card_server&nbsp; = [card_address UTF8String];
    
    et passe card_server à  la fonction mais ... lorsque mon programme l'appelle, ça beug et me renvoie dans le code ...

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

  • Philippe49Philippe49 Membre
    00:28 modifié #24
    dans 1219050975:

    3) Existe-t-il une variable permettant d'obtenir la date et l'heure précise ?


    Voir la classe NSDate,[NSDate dateWithTimeIntervalSinceNow:0]
  • Philippe49Philippe49 Membre
    00:28 modifié #25
    dans 1219050975:


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

    C'est le comportement normal sur Mac, mais on peut le changer avec une méthode du delegate de l'application. (doc : NSApplication)
  • fouffouf Membre
    00:28 modifié #26
    dans 1219051504:

    dans 1219050975:

    3) Existe-t-il une variable permettant d'obtenir la date et l'heure précise ?


    Voir la classe NSDate,[NSDate dateWithTimeIntervalSinceNow:0]


    Encore plus simple : [NSDate date];
  • respawnrespawn Membre
    août 2008 modifié #27
    Bon ben pour la conversion NSString -> char * c'est toujours pas ça, et ça m'embête ...

    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 ...
  • Philippe49Philippe49 Membre
    00:28 modifié #28
    dans 1219226259:

    totoserver = [card_address UTF8String]

    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"


    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);
  • Philippe49Philippe49 Membre
    00:28 modifié #29
    dans 1219226259:

    j'ai déclaré en variable globale : const char *totoserver;


    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.

  • AliGatorAliGator Membre, Modérateur
    00:28 modifié #30
    Et surtout quand tu appelles ta méthode connect_cart il faut lui passer un "char*", donc il ne faut pas déréférencer le pointeur totoserveur en utilisant le "*" devant ! *totoserveur va déréférencer le pointeur totoserveur (pointant sur un tableau de caractères) et va donc te retourner le premier caractère (type "char" tout court) de ta chaà®ne totoserveur. Alors que ta fonction attend un "char*" et pas un "char".
  • respawnrespawn Membre
    00:28 modifié #31
    Ca semble marcher :-) Merci encore une fois :p
Connectez-vous ou Inscrivez-vous pour répondre.