Satimage Précédent
Quelques pièges à éviter
Accueil Documentation Smile Quelques pièges à éviter  
Table des matières
Quand faut-il utiliser get Retour
Dans la plupart des cas le verbe get est implicite. Par exemple, les deux lignes suivantes sont équivalentes :
set x to bounds of window 1
set x to (get bounds of window 1)
Ici x n'est pas défini à une référence (mais en fait à une liste de nombres entiers), Applescript évaluant implicitement bounds of window 1. Mais dans de nombreuses circonstances, Applescript n'évaluera pas les références comme vous pourriez vous y attendre, et vous devrez forcer l'évaluation en utilisant le verbe get.

Règle de base : si vous pouvez appliquer le verbe set à une expression, c'est que cette expression est très certainement une référence, et non une valeur. Utilisez le verbe get pour obtenir sa valeur.

  • Les références en paramètres de commandes
    uppercase name of window 1 -- error
    Ici uppercase reçoit une référence, et non du texte. Comme toutes les commandes des compléments de pilotage, uppercase ne peut pas résoudre une référence qui renvoie à un objet de Smile. Vous devez utiliser explicitement le verbe get pour forcer l'évaluation avant que le texte ne soit transmis à la commande uppercase :
    uppercase (get name of window 1)
    Smile n'évaluera pas les références imbriquées comme dans :
    set properties of window 1 to {name:name of window 2} -- ne fait rien :-(
    Vous devez utiliser get :
    set properties of window 1 to {name:(get name of window 2)} -- :-)
  • Références indésirables
    set x to item 1 of bounds of window 1 -- error :-(
    Cette ligne ne marchera pas car elle est implicitement inconsistante. De fait, la référence complexe item 1 of bounds of window 1 est passée à Smile, alors que ce que l'on veut vraiment est que Smile évalue bounds of window 1, et qu'ensuite AppleScript gère l'item 1 du résultat.
    set x to item 1 of (get bounds of window 1) -- :-)
    Il arrive parfois qu'Applescript lui non plus n'accepte pas les références :
    repeat with w in (every window)
    end repeat
    -- error

    repeat with w in (get every window)
    end repeat
    -- ok

Conflits de noms Retour

Comme avec n'importe quel langage de programmation, vous devez éviter les conflits de noms. Dans la plupart des langages, les problèmes surgissent à la compilation et non à l'exécution. Dans Smile et avec AppleScript, vous avez la possibilité d'augmenter le contexte à tout moment avec de nouvelles variables ou de nouvelles fonctions. Cela apporte de nombreux avantages, mais peut provoquer des conflits de noms.

Pour voir la liste des variables actuellement définies dans le contexte de Smile, exécutez la ligne suivante dans un terminal AppleScript :

name of every variable of context
Les premières variables de la liste sont celles définies au lancement de Smile, les autres étant celles que vous avez définies depuis en utilisant l'interpréteur AppleScript.

De même :

name of every handler of context
renvoie une liste de noms de fonctions. Au début de la liste, vous trouverez deux fonctions ayant des noms courts : dd et msg. dd est un raccourci pour un réglage standard de display dialog [...]. msg permet d'afficher un paramètre dans la Console. Si vous définissez une variable ou une fonction avec ces noms-là (en particulier pour msg), ces fonctions ne seront plus disponibles.
set dd to 1 -- :-(
set msg to "hello world" -- :-(
A l'intérieur d'une fonction, dd et msg ne seront surdéfinis que localement. Dans un terminal AppleScript, ils le seront de manière globale et jusqu'à ce que vous quittiez l'application.

Se référer à des fenêtres via leur index Retour
  • Lorsque vous créez des objets, vous vous attendez à ce que leurs index soient définis par des valeurs successives croissantes.

    C'est le cas. Par exemple, la fenêtre de texte qui est créée en premier est (généralement) la Console, et par conséquent la Console est la text window 1.
    name of text window 1
      --  "Console"
    Vous pouvez utiliser des index négatifs, qui correspondent à l'ordre inverse. Par exemple, créez une nouvelle text window, puis exécutez la ligne suivante dans cette fenêtre :
    text of text window -1
      --  "text of text window -1"
    Si une fenêtre donnée est la text window 5 et que vous supprimez l'une des fenêtres de texte précédentes (les text window 1 à 4), votre fenêtre devient la text window 4.

  • D'autre part il est classique et utile que la window 1 se réfère à la fenêtre au premier plan.

    C'est aussi le cas : window 1 se réfère à la fenêtre au premier plan, window 2 se réfère à la fenêtre au second plan, et ainsi de suite. Pour se référer à une fenêtre en fonction de sa position à l'écran (du premier plan à l'arrière-plan), utilisez la classe window (qui est virtuelle). Par exemple vous pouvez exécuter la ligne suivante dans un nouveau terminal AppleScript :
    window 1 is text window -1
      --  true
  • La propriété index d'une fenêtre correspond à sa position à l'écran. Ainsi vous pouvez ramener une fenêtre au premier plan, ou l'envoyer à l'arrière-plan, en utilisant sa propriété index.
    set index of window 1 to -1
    -- renvoie la fenêtre du premier plan au dernier plan

    set index of window 2 to 1
    -- inverse l'ordre des deux premières fenêtres
    Par ailleurs, sachez que si par exemple un dialogue a un index donné, disons 5, cela ne signifie pas qu'il s'agit du dialog 5. Il s'agit de la window 5. L'index d'une fenêtre ne correspond pas à l'ordre dans lequel elle a été créée.
English version
Copyright ©2008 Paris, Satimage