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

Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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
Je pense que tu peux donc l'utiliser. Regardes dans le PDF AppKit de l'ADC.
@++
TMX
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
??? 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
par contre effectivement je vais peut-être tout simplement remettre tout mes éléments dans des NSPanel
merci à tous en tout cas
How Modal Windows Work
bon j'essaie de démêler ma salade lol
déjà effectivement j'obtiens ce que je veux avec runModalForSession :-)
mais je n'arrive pas à l'arrêter !!
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 :
mais en utilisant cette méthode les autres fenêtres ne sont pas bloquées... :P
bref : je naaaaaaage
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
merci pour le lien :-)
[edit] zoriez pas une appli obj-C open-source qui se sert des modal en tête ?
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.
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
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 !!
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
donc je me suis dit : pas de problème je fais
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 :
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
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 :
aucun problème
2- Si je veux fermer ma fenêtre alors qu'un onglet est ouvert :
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 :
ca marche nickel... c'est dingue nan ??
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]
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...???
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.
.
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).
.
Merci qui ?
(c'était mon quart d'heure d'autosatisfaction)
.
tu es mon dieu Bru !!!
merci merci merci merci merci merci !!!!! :brule:
je n'aurais absolument JAMAIS pensé à faire ca !
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]