Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [Résolu] Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : Raphael

Date : 29/11/2006 15:55

Bonjour, il me faut ouvrir une boite de dialogue pour demander à l'utilisateur s'il veut sauvegarder son projet avant de charger celui sur lequel il a cliqué... J'ai pris exemple sur le tutoriel du site et sur l'application "textree" et voilà le résultat :

var save = false;
window.openDialog('chrome://ydm/content/dialogs/confirmsave.xul','confirmsave','chrome,centerscreen',save);
alert(save);

Jusque-là, je ne fais qu'ouvrir une boite de dialogue en passant ma variable "save" pour la modifier et après, je la fais s'afficher pour voir si elle a bien été modifiée... Et voici ma Boite de Dialogues :

<dialog
id="confirmsave"
title="&confirmsave.title;"
orient="vertical"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
buttons="accept,cancel"
ondialogaccept="return save();"
ondialogcancel="return true;">

<script>
<![CDATA[
function save()
{
	save = true;
	return true;
}
]]>
</script>

<vbox class="dialogbox" flex="1">
	<label value="&confirmsave.label1;" />
	<label value="&confirmsave.label2;" />
</vbox>	
<hbox>
	<spacer flex="1" />
	<button dlgtype="cancel">
		<image class="bt-close" />
		<spacer flex="1" />
		<label value="&confirmsave.nosave;" />
	</button>
	<button dlgtype="accept">
		<image class="bt-valid" />
		<spacer flex="1" />
		<label value="&confirmsave.save;" />
	</button>
</hbox>
</dialog>

Voilà, je ne comprends pas pourquoi cela ne marche pas, l'alert me renvoie toujours false... Si quelqu'un voit mon erreur... ou si quelqu'un a plus simple, je le remercie d'avance =).

PS : Il faut quand même que je puisse la personnaliser un poil (boutons jolis, etc...) donc pas de "prompt" ou "confirm" a priori... non ?

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : papy

Date : 29/11/2006 16:17

Tu as deux possibilités pour retourner une valeur depuis une fenêtre ouverte avec openDialog

  • soit en utilisant la propriété window.opener de ta fenêtre fille. Elle pointe sur la fenêtre parent et de la tu peux modifier des variables etc.
  • soit en utilisant l'argument. Dans ce cas tu as la même problématique qu'en C si je peux me permettre ;) :

Dans ton exemple tu passes une variable par valeur, c'est à dire qu'une copie est faite, du coup dans la fenêtre fille tu modifie une copie, ce qui explique que ton alert te renvoi toujours false. Tout est passé par valeur en javascript.

Pour passer une variable par référence en javascript, il faut 'bidouiller' un peu. Tu crée un objet vide que tu passe à ta fenêtre fille, celle-ci lui rajoute une propriété, et c'est gagné (normalement)

Dans la fenêtre mère :

var save = new Object();
window.openDialog('chrome://ydm/content/dialogs/confirmsave.xul','confirmsave','chrome,centerscreen',save);
alert(save.value);

Dans la fenêtre fille :

function save()
{
    save.value = true;
    return true;
}

http://www.xulplanet.com/tutorials/xultu(..)

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : Raphael

Date : 29/11/2006 16:44

Merci pour ta réponse papy.

Malheureusement, cela ne marche toujours pas... J'ai essayé avec ton code et ça passe pas. J'ai également essayé avec :

var save = {"valid": false};

et

function save()
{
   save.valid = true;
   return true;
}

Mais ça ne passe pas non plus... Est-ce dû à autre chose dans mon code ?

Saurais-tu m'expliquer la 2° manière ? On ne sait jamais, je n'ai rien à perdre, tout à gagner ^^

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : papy

Date : 29/11/2006 17:10

Pour utiliser window.opener c'est assez simple, ca représente la fenêtre mère (si apellé depuis une fenêtre fille). Essai de déclarer une variable dans le contexte de ta fenêtre mère depuis la fille, un truc du genre

fille :

function save() {
    window.opener.save = true;
}

mere :

window.openDialog('chrome://ydm/content/dialogs/confirmsave.xul','confirmsave','chrome,centerscreen',save);
alert(window.save);
delete window.save; //un petit luxe pour ne pas laisser des attributs inutilisé :P

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : Raphael

Date : 29/11/2006 18:07

C'est quand même étrange tout ça... J'ai modifié le code comme tu me l'indiques mais sans le :

delete window.save;

Et je rajoute derrière :

if (window.save) {
alert('test');
}

En fait tout ce code s'exécute sur un onselect d'un lisbox... Alors quand je clique une 1ère fois, mon alert ne se montre pas à la sortie de mon DialogBox alors qu'en théorie window.save est bien à true non ? Et si je clique sur un autre item, là oui, à chaque fois j'ai mon alert...

C'est quand même étrange non ? Comme si à la sortie de mon DialogBox, mon code s'exécutait trop vite pour que window.save se mette à true de suite.

C'est peut-être en rapport avec le fait que l'autre méthode ne marchait pas chez moi...

Comme je ne sais plus quoi faire pour "localiser" le problème, je vais mettre le reste de mon code :

<listbox id="decklist" flex="1" onselect="setDeck();">
// Charge le Deck sélectionné dans l'interface de YDM
function setDeck()
{
var not_saved = ($("cmd_saveDeck").getAttribute("disabled")) ? false : true;
var save = false;
if (not_saved)
{
	window.openDialog('chrome://ydm/content/dialogs/confirmsave.xul','confirmsave','chrome,centerscreen',save);
}
$("deck_notes").value = window.save; // pour voir la valeur retournée, c'est temporaire...
if (window.save) {
//saveDeck();
alert('test');
}
var Deck_Index = $("decklist").getSelectedItem(0).getAttribute("Deck_Index");
deck = new currentdeck(Deck_Index);
deck.setInfos();
deck.setCards();
deck.setStats();
$("tb-deckbuilding").setAttribute('hidden', false);
deckSaving(false);
}

EDIT : Alors là, je deviens complètement fou ! Je viens de remarquer que la suite de mon code s'exécute AVANT le retour de valeur ! En fait, tous mes problèmes doivent venir de là ! Je pensais que sur un window.openDialog, le code s'arrêtait en attendant la valeur de retour mais il semblerait donc que non !

Comment puis-je procéder du coup ?

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : thefab

Date : 29/11/2006 19:47

Je pensais que sur un window.openDialog, le code s'arrêtait en attendant la valeur de retour mais il semblerait donc que non

Pour ça il faut que la boîte de dialogue soit modale:

window.openDialog("...confirmsave.xul", "confirmsave", "chrome,modal,centerscreen");

# Re: Boites de Dialogues et renvoi de valeurs... Petit souci, elle revient pas...

Envoyé par : Raphael

Date : 29/11/2006 21:08

Ah làlà, si simple et pourtant si introuvable quand on a le nez dedans !

Merci bien thefab, maintenant les 2 méthodes marchent, c'est plus qu'il ne m'en faut... ^^

Merci beaucoup à vous, papy et thefab pour votre aide si précieuse, je vais pouvoir me coucher satisfait =)

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.