HostPinger

Bonjour à  tous,
J'ai crée une petite appli qui m'est fort utile : en effet je dispose d'un serveur web sur mon G5, et j'ai une IP dynamique. HostPinger permet donc d'envoyer un ping à  un FQDN de votre choix, puis d'agir en conséquence si un nombre paramètrable de pings a été perdu, en envoyant un mail, affichant un message d'alerte, ou en exécutant une commande UNIX. J'ai donc une version 0.5 qui marchotte gentiment. Je suis actuellement sur la version 1, et je refais une bonne partie du code de façon plus propre. J'ai donc recrée totalement l'interface qui n'était vraiment pas un modèle d'ergonomie, et j'ai ajouté des fonctions. j'ai un petit problème totalement stupide mais que je n'arrive pas à  résoudre malgré mes différentes recherches : mon interface se compose de 3 fenêtres, dont deux qui ne s'ouvrent qu'occasionnellement... J'aimerais que l'ouverture de ces fenêtres rende l'accès à  la fenêtre principale impossible... Que cette dernière reste à  l'arrière plan, un peu comme dans le cas d'un message d'alerte en quelque sorte. C'est sûrement très simple, mais je n'ai pas trouvé quelle méthode utiliser  :(

Réponses

  • TMXTMX Membre
    20:55 modifié #2
    Salut,

    il faut que tu rendes tes fenêtres secondaires modales par rapport à  ta fenêtre principale.

    Dans la classe NSWindow, il existe une méthode :
    – (void)setWorksWhenModal:(BOOL)flag

    Cette méthode te permet d'empêcher une fenêtre de recevoir des évênements souris et clavier.  Tu peux très bien employer cette fonction lorsque tu ouvres une fenêtre secondaire.

    J'espère t'avoir aiguillé un peu  8)

    @++
    TMX
  • 20:55 modifié #3
    merci ;) mais j'ai bien peur que setWorksWhenModal ne s'applique qu'aux NSPanel, or il s'agit dans mon cas de NSWindow... Existe-t-il une méthode similaire dans NSWindow ?
  • mpergandmpergand Membre
    20:55 modifié #4
  • TMXTMX Membre
    20:55 modifié #5
    Mais C'EST une méthode de la classe NSWindow.

    Je pense que tu peux donc l'utiliser. Regardes dans le PDF AppKit de l'ADC.  ;)

    @++
    TMX
  • ClicCoolClicCool Membre
    décembre 2004 modifié #6
    dans 1103805782:

    merci ;) mais j'ai bien peur que setWorksWhenModal ne s'applique qu'aux NSPanel, or il s'agit dans mon cas de NSWindow... Existe-t-il une méthode similaire dans NSWindow ?


    Tu peux pas placer tes éléments d'interface graphique dans un NSPanel ?
    A quoi te sert d'utiliser une NSWindow si tu veux en désactiver ce qui justement la différencie d'un panel ? (à  moins que tu n'ais besoin d'une barre de titre à  la NSWindow ? ou qu'il de viennes la "main-Window" ou qq chose comme ça)

    Ceci dit une window peut-être modale
  • 20:55 modifié #7
    dans 1103806251:

    Mais C'EST une méthode de la classe NSWindow.

    Je pense que tu peux donc l'utiliser. Regardes dans le PDF AppKit de l'ADC. ;)

    @++
    TMX


    ??? on a pas les mêmes classes cocoa ou quoi ? lol

    la seule allusion a setWorksWhenModal dans la doc de NSWindow est celle-ci :
    See Also: ? setWorksWhenModal: (NSPanel)

    :P

    je vais regarder le lien que tu me donnes mpergand, merci ;)
  • 20:55 modifié #8
    arf en fait je ne peux pas utiliser runModalForWindow, parce que le bouton qui fait apparaà®tre ma fenêtre est Dà‰JÀ dans un modalForWindow  :)

    par contre effectivement je vais peut-être tout simplement remettre tout mes éléments dans des NSPanel :p (bouhou vais devoir me retaper toutes les connections lol)

    merci à  tous en tout cas
  • ClicCoolClicCool Membre
    20:55 modifié #9
    Peut être ce lien peut t'être utile ?

    How Modal Windows Work :)
  • 20:55 modifié #10
    arf je confondais runModalForWindow avec beginSheet:modalForWindow  :P

    bon j'essaie de démêler ma salade lol

    déjà  effectivement j'obtiens ce que je veux avec runModalForSession :-)
    [NSApp runModalForWindow:mailsWindow];
    


    mais je n'arrive pas à  l'arrêter !!  :) (rooo le boulet que je suis :P )
    j'ai essayé [NSApp stopModal] mais je ne réccupère pas la main sur les autres fenêtres... :P

    j'ai alors essayé autrement :

    NSModalSession mSession = [NSApp beginModalSessionForWindow:mailsWindow];<br />	[NSApp runModalSession:mSession];
    


    mais en utilisant cette méthode les autres fenêtres ne sont pas bloquées... :P

    bref : je naaaaaaage :)
  • mpergandmpergand Membre
    20:55 modifié #11
    Ton problème ne ressemblerait-il pas à  ça :CascadingSheets
  • 20:55 modifié #12
    bin je ne crois pas.... voilà  comment ca s'organise :

    J'ai une fenêtre principale. dans cette fenêtre principale j'ai un sheet qui contient des champs et des boutons. un de ces boutons appelle une fenêtre, et mon but et que tant que cette fenêtre est ouverte, l'utilisateur ne puisse plus accéder à  la fenêtre principale, ni a la sheet qui lui est associée...

    mais à  priori ma fenêtre secondaire n'est pas un sheet, ou je n'ai rien compris (fort possible :) ) ?? :P
  • décembre 2004 modifié #13
    en fait après quelques tests il semble bien que tu ai raison, j'ai sans doute un problème de sheets en cascade.... j'ai plus qu'à  revoir la conception de mon interface si j'ai bien compris :P
    merci pour le lien :-)

    [edit] zoriez pas une appli obj-C open-source qui se sert des modal en tête ? :p je naaaage lol [/edit]
  • Eddy58Eddy58 Membre
    20:55 modifié #14
    Oui, tu peux télécharger les exemples du bouquin Cocoa Programming sur www.cocoaprogramming.net, et dans le chapitre 9, tu trouveras deux projets :
    Le premier, Image Viewer 2, ouvre dans le cadre d'une appli multi-documents un panel de sauvegarde en modal window. Le second, Image Viewer 3, fait pareil mais ouvre le panel de sauvegarde en modal sheet. :)
  • décembre 2004 modifié #15
    merci je vais regarder ca :-) :-)

  • 20:55 modifié #16
    C'EST BON !!!!

    Le problème était que pour faire mes tests je faisais

    [NSApp runModalForWindow:mailsWindow];
    suivi aussitôt par
    [NSApp stopModal];

    et apparament lorsqu'on lance un modal et qu'on l'arrête aussitôt après, ça marche pas bien, il ne s'arrête pas :p
    J'ai tout simplement mis le [NSApp stopModal] dans une autre action et hop ca marche :-)

    désolé d'avoir mis tant de temps pour un truc aussi stupide :P
    merci à  tous, et joyeux noël !! ;) :)
  • décembre 2004 modifié #17
    new problem ! :)

    lorsque je ferme une fenêtre qui a un onglet ouvert, ça bug : un gros carré blanc apparaà®t à  l'emplacement de la fenêtre :p

    donc je me suis dit : pas de problème je fais
    [drawer close];[fenetre close];
    


    mais évidement, l'onglet n'a pas le temps de finir de se fermer et donc ça bug de la même manière :P

    je me suis donc dit : pas de problème je fais :
    <br />[drawer close];<br />while ([drawer state]==NSDrawerClosing) { }<br />[fenetre close];<br />
    

    mais il reste sans fin dans la boucle :P :P

    alors j'ai fait un truc trash pour tester : je fais [onglet close]; je lance un timer qui attends 5 secondes, et après je fais [window close];
    ca marche bien entendu, mais il est évident que je ne vais pas laisser un truc aussi immonde dans le code !!! :crackboom:-

    J'ai essayé aussi de fermer le drawer dans - (void)windowWillClose:(NSNotification *)aNotification
    mais ca ne change rien, le drawer n'a pas le temps de se fermer :P

    à  noter que si je fais un release sur ma fenêtre elle se ferme correctement... Mais évidement si je veux la rouvrir, ca plante ;D

    :why?:

    [edit]
    avec
    [self performSelector:@selector(Fermeture) <br />			   withObject:nil <br />			   afterDelay:0.5];
    

    ca marche aussi of course.... mais il doit quand même y avoir un moyen plus propre !?!??!! [/edit]




    EDIT 2 : en fait il s'agit d'un bug bien complexe... Après des tonnes de test, il s'avère que c'est la conjugaison d'une fenêtre modal que je veux fermer avec un onglet ouvert qui pose problème :P je m'explique :

    1- Si je veux fermer ma fenêtre alors qu'aucun onglet n'est ouvert :
    [NSApp stopModal];<br />[window close]
    

    aucun problème

    2- Si je veux fermer ma fenêtre alors qu'un onglet est ouvert :
    [NSApp stopModal];<br />[window close]
    

    gros bug, un gros carré blanc s'affiche à  l'emplacement qu'occupait la fenêtre.

    3- Fermeture en léger différé de ma fenêtre avec l'onglet ouvert :
    <br />- (IBAction)save:(id)sender<br />{<br /><br />     [NSApp stopModal];<br />     [self performSelector:@selector(Fermeture) withObject:nil afterDelay:0.5]; <br />}<br /><br /><br />-(void)Fermeture    {	[mailsWindow performClose:self]; }<br />
    

    ca marche nickel... c'est dingue nan ??
  • 20:55 modifié #18
    bon je suis complètement désespéré, ca fait deux jours que je passe le debugger au ligne par ligne et je ne comprends TOUJOURS PAS pourquoi ca ne marche pas... comme dit dans le topic "HEEEEEELLLLPPPPP!!!!!!" j'ai un bug complètement con :
    <br />[corpsMail setString:[[[[realArray objectAtIndex:indexUse] objectForKey:UDDicOfMailsMails]objectAtIndex:index]objectForKey:UDCorpsOfTheMail]];<br />
    

    cette ligne de code a pour effet secondaire de me modifier une valeur du NSDictionary contenu dans le NSArray lui-même contenu dans le NSDictionary du NSArray qu'est realArray... (je sais c'est un peu le bordel) :P

    je ne sais vraiment plus quoi faire, j'ai TOUT essayé, je suis à  la limite de balancer tout à  la poubelle :crackboom:- :crackboom:-

    breeeeeeeffff j'en ai MARRE
    donc si quelqu'un a un peu de temps à  me consacrer, je joins mes fichiers sources...

    Pour constater la manipulation qui foire c'est très simple :
    1) compiler l'ensemble. une fenêtre s'ouvre.
    2) Cliquer sur le '+', laisser toutes les valeurs par défaut et cliquer sur le bouton 'paramètres' en face de "Envoyer un ou plusieurs mails".
    3) Cliquer sur le '+' deux fois afin de créer deux mails.
    4) Dans l'onglet qui s'est ouvert, changer la valeur de "corps du mail" : mettez ce que vous voulez, "aaa" dans notre exemple.
    5) Cliquer sur 1ère ligne dans le NSTableView, et de nouveau sur la deuxième ligne : votre valeur de "corps du mail" a disparu....

    la ligne qui fout la merde est la ligne 237 de Mails.m
    Ne faites pas attention aux autres classes, a part FQDN les autres sont un peu en chantier, puisque certaines datent de l'ancienne version de HostPinger et sont donc devenues obsolètes.

    P.S : un petit organigramme expliquant l'architecture des préférences de HostPinger est joint dans le .zip que je transmets ici... :P
    AUTRE PRà‰CISION IMPORTANTE : le seul fichier .nib valable est le French.nib ! l'anglais date de l'ancienne version de HostPinger.

    [Fichier joint supprimé par l'administrateur]
  • Eddy58Eddy58 Membre
    20:55 modifié #19
    J'ai pas jeté de coup d'oeil à  ton appli, mais je trouve que tout ces emboà®tements d'arrays et de dictionarys ça fait beaucoup... :o
    Est-ce vraiment nécessaire ? As tu bien réfléchi à  la structuration de tes modèles et des données ? Je me poserais d'abord ces questions, car si tu te retrouves avec des changements non voulus, et bien tu dois avoir un "sacrès bordel" dans tes pointeurs...??? ;)
  • BruBru Membre
    20:55 modifié #20
    dans 1104360164:

    donc si quelqu'un a un peu de temps à  me consacrer, je joins mes fichiers sources...


    Le problème vient de Mails.m, ligne 197 (dans la méthode updateTable).

    Remplace [tt]setObject:[corpsMail string][/tt] par :
    [tt]setObject:[NSString stringWithString:[corpsMail string]][/tt] et tout rentrera dans l'ordre.

    .
  • BruBru Membre
    20:55 modifié #21
    dans 1104397408:

    Le problème vient de Mails.m, ligne 197 (dans la méthode updateTable).


    Pour la petite histoire...

    corpsMail est une NSTextView, or, il faut savoir comment Apple gère l'édition d'un texte dans une fenêtre. En fait, il n'y a qu'un seul éditeur par fenêtre que tous les contrôles (NSTextField) et toutes les views (NSTextView) se partagent.

    Dans le cas des contrôles, la classe NSControl gère une copie de la NSString éditée, copie que tu récupères par stringValue.

    Mais, ce n'est pas le cas avec NSTextView. A chaque fois que tu appelles la méthode string sur ta view, ça te renvoie la SEULE et UNIQUE chaà®ne utilisée par l'éditeur dans la fenêtre.

    Dans ton cas, à  chaque fois que tu faisais [corpsMail string], tu récupérais le même objet NSString (en fait NSMutableString). Donc, dans ton tableau/dictionnaire, tu stockais plusieurs le même objet, la valeur de l'objet étant la dernière valeur saisie dans la fenêtre (blanc dans ton cas).

    .
  • BruBru Membre
    20:55 modifié #22
    dans 1104397408:

    Remplace ...


    Merci qui ?

    (c'était mon quart d'heure d'autosatisfaction)

    .
  • 20:55 modifié #23
    :kicking: :kicking:  o:) o:) o:) o:)

    tu es mon dieu Bru !!!
    merci merci merci merci merci merci !!!!!  :brule:
    je n'aurais absolument JAMAIS pensé à  faire ca !
  • BaardeBaarde Membre
    20:55 modifié #24
    Bravo Bru !  <3 <3
  • avril 2005 modifié #25
    salut tout le monde !

    Bon j'ai profité de mes vacances pour finir une version 0.1 de HostPinger  :P : http://hostpinger.sourceforge.net

    ma prochaine étape c'est de nettoyer le code qui est vraiment dégueu à  mon avis :P (pas taper je débute)

    En tout cas merci à  tous ceux qui m'ont dépannés et me dépannent quand je butte sur un truc  ;)

    [edit] un béta-testeur m'a ouvert les yeux, faut que je crée un installeur vu que j'utilise un frameworks lol... donc va falloir attendre encore un peu pour tester :P [/edit]

    [edit2] c'est fait... normalement cette fois tout marche lol [/edit]
Connectez-vous ou Inscrivez-vous pour répondre.