Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Débutant question sur le passage de variables à une proc

9 views
Skip to first unread message

stefen76

unread,
Jul 2, 2006, 2:39:16 AM7/2/06
to
Bonjour,
J'ia une question sur la passage et la récupération de variable entre
proc dans un namespace...

J'ai une proc principale dans laquelle j'ai inséré un bouton, lorsque
je clique sur le bouton je souhaite passer l'id de l'enregistrement à
la fonction appelée.

j'ai donc cela dans ma proc chaimacave::fiche :
set fic_id 2 //Exemple
button .fiche.but_delete -command {chaimacave::delete_fiche fic_id} \

mais quand j'arrive dans ma proc delete_fiche je n'arrive pas à
récupéré la valeur de fic_id...
j'ai mis cela mais j'ai peut-être oublié quelque chose :
proc chaimacave::delete_fiche {id_fiche} {
global dbcmc
upvar #0 fic_id $id_fiche
set confirm [tk_messageBox -message "Confirmez-vous la suppression
définitive de cette fiche ?" -type yesno -icon question]
switch -- $confirm {
yes {
tk_messageBox -message "La fiche $id_fiche a été détruite
définitivement." -type ok -icon info
destroy .fiche
}
no {return}
}
}

Merci à tous pour l'aide.

Stéfen
www.duostore.net
www.ville-commune.net

Miko

unread,
Jul 2, 2006, 4:46:20 AM7/2/06
to
Bonjour,
C'est pourtant simple...
nom_variable = sa référence
$nom_variable = sa valeur

donc
button .fiche.but_delete -command {chaimacave::delete_fiche $fic_id}
devrait donner ce que tu veux.

Miko


ulis

unread,
Jul 2, 2006, 7:49:34 AM7/2/06
to
> button .fiche.but_delete -command {chaimacave::delete_fiche $fic_id}
> devrait donner ce que tu veux.

Heum...
Le $fic_id est dans une chaîne entre accolades et n'est donc pas
remplacé par sa valeur.

Il faut soit :
"chaimacave::delete_fiche $fic_id"
soit :
[list chaimacave::delete_fiche $fic_id]
soit même :
[format {chaimacave::delete_fiche %s} $fic_id]

La première solution n'est pas considérée comme très Tclish.
La deuxième est la plus utilisée.
La troisième est plus puissante mais pas vraiment justifiée ici.

Voici donc mon choix :

set $fic_id 2
button .fiche.but_delete -command [list chaimacave::delete_fiche
$fic_id]

Maintenant juste une question :
Pourquoi chaimacave::delete_fiche et non ::chaimacave::delete_fiche ?
(le premier est un nom relatif et le second un nom absolu)
S'il n'y a pas de hiérarchie de namespaces (emboitement genre poupées
russes)
le nom absolu évite toute ambiguité.

Hop! que ça helpe

ulis le Tclish

Miko

unread,
Jul 3, 2006, 1:35:01 AM7/3/06
to

"ulis" a rectifié (car Miko avait commis):
-> button .fiche.but_delete -command {chaimacave::delete_fiche $fic_id}
-> devrait donner ce que tu veux.

>Heum...
>Le $fic_id est dans une chaîne entre accolades et n'est donc pas
>remplacé par sa valeur.

Honte sur moi.
Du coup, j'explore tout le code que j'ai pondu, pour voir si je n'ai pas
laissé quelque part cette construction calamiteuse...
Et j'en trouve une!!!

Miko l'étourdi


Kroc

unread,
Jul 3, 2006, 3:12:54 AM7/3/06
to
Maurice a écrit :

> .../...


> soit même :
> [format {chaimacave::delete_fiche %s} $fic_id]

Je l'avais encore jamais vue celle-là ! Je vois bien ce que ça fait,
mais dans quel(s) cas c'est mieux que [list chaimacave::delete_fiche
$fic_id] ?

--
David Zolli - Kroc

ulis

unread,
Jul 3, 2006, 5:37:39 AM7/3/06
to

Ici, c'est moins bien.
Là où ça peut être mieux c'est quand la constante entre accolades
comprend plusieurs lignes : utiliser format permet alors d'avoir une
constante qui ressemble plus à un script normal.
Je l'ai utilisé dans un package d'objets.

ulis le chasseur de petites bêtes

ulis

unread,
Jul 3, 2006, 6:14:09 AM7/3/06
to
> Je l'avais encore jamais vue celle-là !

Bon autant se les faire toutes :

Une que j'ai utilisée :

set map [list fic_id $fic_id]
[string map $map {chaimacave::delete_fiche fic_id}]

Et pourquoi pas :

set map [list \$fic_id $fic_id]
[string map $map {chaimacave::delete_fiche $fic_id}]

ulis qu'il va falloir arrêter car maintenant qu'il est lancé...

ulis

unread,
Jul 3, 2006, 6:16:12 AM7/3/06
to

> Du coup, j'explore tout le code que j'ai pondu, pour voir si je n'ai pas
> laissé quelque part cette construction calamiteuse...
> Et j'en trouve une!!!
>
> Miko l'étourdi

Bah... Une de trouvée, dix de perdues !

stefen76

unread,
Jul 3, 2006, 7:30:08 AM7/3/06
to
Merci pour les explications, j'ai suivi tes recommandations et pris ta
2ème solution
Mais pour la question (ci-dessous), je débute en tcl et j'ai pris
exemple que un programme. Donc je ne suis pas contre l'appel par un nom
absolu.

""Maintenant juste une question :
Pourquoi chaimacave::delete_fiche et non ::chaimacave::delete_fiche ?
(le premier est un nom relatif et le second un nom absolu)
S'il n'y a pas de hiérarchie de namespaces (emboitement genre poupées

russes)
le nom absolu évite toute ambiguité. ""

Stéfen
www.duostore.net
www.ville-commune.net

ulis

unread,
Jul 3, 2006, 8:24:13 AM7/3/06
to

> ... je débute en tcl et j'ai pris exemple ...

Oh mais c'est bien ça !
Ça va nous faire plein de questions intéressantes :-)

ulis (en qui le pedago ne sommeille que d'un oeil)

Eric Hassold

unread,
Jul 3, 2006, 9:44:00 AM7/3/06
to
ulis a écrit :

>> button .fiche.but_delete -command {chaimacave::delete_fiche $fic_id}
>> devrait donner ce que tu veux.
>
> Heum...
> Le $fic_id est dans une chaîne entre accolades et n'est donc pas
> remplacé par sa valeur.
>
> Il faut soit :
> "chaimacave::delete_fiche $fic_id"
> soit :
> [list chaimacave::delete_fiche $fic_id]
> soit même :
> [format {chaimacave::delete_fiche %s} $fic_id]
>
> La première solution n'est pas considérée comme très Tclish.
> La deuxième est la plus utilisée.
> La troisième est plus puissante mais pas vraiment justifiée ici.
>

Une precision pour stefen, histoire de debuter comme il fait en Tcl: la
2ieme syntaxe est de loin celle a preferee, car la seule qui
t'assureras que ca marche encore lorsque la valeur des arguments (ici,
la valeur de fic_id) contient par exemple des espaces (par ex. lorsque
c'est une liste. Bon, avec un nom comme "fic_id", on peut supposer que
le probleme ne se posera pas la, mais autant prendre les bonnes habitures.

Eric

-----
Eric Hassold
Evolane - http://www.evolane.com/

0 new messages