AN1009 – Recherche de portée et de nom Searching

Lorsque vous utilisez le nom d’un objet nommé dans une référence (par exemple « myPageFrame.oh » ou « image7.ow ») dans un script ou une règle de mise en page, comment SHIPTide « trouver » cet objet ? S’il y a deux objets ou plus portant le même nom dans votre interface graphique et que vous faites référence à ce nom, à quel objet choisit-il de faire référence ?

Cette note de l’application explique comment SHIPTide effectue la « recherche de nom » et les différentes options du développeur pour contrôler et gérer les comportements inattendus.

Cette partie vidéo de cette note d’application est actuellement en production ; Merci de votre patience.

Règles de recherche de nom

Lorsqu’un nom d’objet est explicitement référencé dans un script ou une règle de disposition, il existe un modèle de recherche prévisible et explicite SHIPTide permet de « trouver » le nom de l’objet référencé.

La recherche commence toujours au niveau de l’« objet référent », c’est-à-dire du script ou de la règle de mise en page faisant référence, et se déroule comme suit :

  • Le nom de l’objet parent est vérifié pour une correspondance
  • Si le nom du parent ne correspond pas, les frères et sœurs directs de l’objet référent (c’est-à-dire les enfants directs sous le parent) sont vérifiés pour une correspondance de nom
  • Notez surtout que les enfants sous la fratrie ne sont pas recherchés : ces noms sont privés/locaux pour les frères et sœurs
  • Si aucun frère ou sœur direct ne correspond, la recherche se répète vers le parent du parent et est répétée
  • Cette recherche récursive vers le haut s’arrête en haut de la « zone » dans laquelle vit le référent (par exemple, l’agencement, les ressources, etc.)
  • Selon que les options de recherche de nom du projet global sont activées ou non SHIPTide peut maintenant traverser de haut en bas la plate-forme, puis les ressources, puis la cargaison, puis les zones d’aménagement à la recherche de la première occurrence de ce nom
  • Si le nom n’est toujours pas trouvé SHIPTide affiche une erreur de référence

Règles de recherche d’objets saisis anonymement

Lorsque, au lieu d’un nom d’objet explicite, vous utilisez un type d’objet anonyme (par exemple « frame » ou « box »), les règles de recherche sont plus restrictives pour éviter une grave confusion dans vos références. Elles sont similaires aux règles de recherche nommées, mais les frères et sœurs ne sont pas inclus dans la recherche :

  • Le type de l’objet parent est vérifié pour une correspondance
  • Si le type parent ne correspond pas, la recherche est répétée vers le parent du parent et répétée
  • Cette recherche récursive vers le haut s’arrête en haut de la « zone » dans laquelle vit le référent (par exemple, l’agencement, les ressources, etc.)
  • Si le type d’objet n’est pas trouvé dans la chaîne parent direct [.parent]*, SHIPTide affiche une erreur de référence

Notez qu’il n’y a pas de recherche globale appliquée pour les références de type d’objet.

Noms qualifiés et non qualifiés

Les références de nom peuvent être « qualifiées » ou « non qualifiées ». Si vous utilisez un nom d’objet seul, tel que « varA », il s’agit d’une référence non qualifiée. Vous ne « qualifiez » pas son emplacement. En revanche, si vous dites « parent.varA », il s’agit d’une référence qualifiée : varA doit être un enfant directement sous le parent. De même, si vous utilisez « layout.d0.homePage », puisque « layout » est un nom réservé de la zone de layout, le nom est un « nom complet » puisqu’il commence par le haut et insiste pour que varA soit un enfant de quelque chose nommé « d0 » qui doit être un enfant de « layout ». Cela ressemble beaucoup aux noms de fichiers sous DOS/Windows, où vous pouvez spécifier un nom complet tel que « C :/folderA/folderB/fileA.png », ou, si vous êtes dans ce dossierB, vous pouvez simplement dire « fileA.png » comme nom non qualifié et le dossier est supposé.

Par exemple, étudiez cet exemple de zone d’interface graphique où les noms non qualifiés « varA » et « varB » sont référencés :

varA et varB sont des noms « non qualifiés », car il n’y a pas de préfixe devant eux. L’étape 1/1X montre comment le parent puis les frères et sœurs directs sont testés et ne correspondent pas. Notez également que sous « varFoo », même si les objets « varA » et « varB » existent, ceux-ci sont privés/locaux pour le frère varFoo et ne sont pas trouvés/recherchés. Vous pouvez les référencer explicitement par le biais de références « qualifiées » (voir ci-dessous), mais les recherches non qualifiées ne plongent pas dans les frères et sœurs.

L’étape 2/2X montre la première récursivité vers le haut du motif de recherche, tout comme l’étape 3/3X. À l’étape 4, nous atteignons le nœud de niveau supérieur « Layout » où la récursivité s’arrête.

À ce stade, les règles de recherche globale prennent le relais (en supposant qu’elles soient activées, voir #Name options de recherche ci-dessous) et dans cet exemple, la recherche globale Layout est activée de sorte que la toute première version descendante des noms varA et varB est mise en correspondance.

Dans cet exemple, ce n’est probablement pas ce que vous vouliez. Vous vouliez probablement les objets varA et varB plus locaux varFoo.

Pour être paranoïaque – peut-être à bon escient – et vous assurer que vous obtenez toujours celui que vous attendez, vous voudrez peut-être désactiver la fonction de recherche globale afin que seule la portée stricte des références soit autorisée. De cette façon, vous n’obtenez jamais un objet dont vous ne vous attendez pas à ce qu’il corresponde à votre référence.

Mais cela ne change rien à la question de savoir comment obtenir les objets varA et varB que vous vouliez en premier lieu… ceux sous « FrameA.varFoo ». La solution consiste à qualifier les noms de référence :

Dans ce cas, la règle de mise en page dans BoxA n’utilise pas les noms non qualifiés « varA » et « varB », mais les qualifie plutôt avec « frame.varFoo. ». Il s’agit d’un combo anonyme et qualifié. Le mot-clé « frame » dit « utilisez le modèle de recherche pour trouver le premier objet de type frame ». C’est ce qu’il fait à l’étape 1 du diagramme. Ensuite, une fois qu’il a fait correspondre « frame » au FrameA, il doit trouver un enfant direct au cadre nommé « varFoo », ce qu’il fait. Ensuite, il doit trouver varA et varB directement en dessous.

Si vous avez référencé « PageA.varA » comme nom qualifié dans BoxA, l’algorithme de recherche effectuerait la récursivité locale/ascendante et trouverait PageA, puis creuserait cela et y trouverait varA.

Recherches préfixées par l’étendue (v5.1.125+)

Introduites dans SHIP v5.1.125, les recherches préfixées par la portée ajoutent une touche supplémentaire à la recherche de noms.

Lorsque la référence est préfixée par un nom/type d’objet suivi d’un double deux-points, par exemple « page ::<reference> », le préfixe (dans ce cas, le type anonyme « page ») est recherché selon les règles de recherche standard.

Les recherches globales ne sont jamais effectuées sur des préfixes anonymes (type d’objet, par exemple « box »), mais uniquement sur le modèle de récursivité parent standard vers le haut, car il y a tellement d’objets « frame » (par exemple) qu’il serait impossible d’être prévisible du point de vue d’un concepteur d’interface graphique. Il y a une exception au concept de recherche globale avec le système de préfixes de portée : les objets racines globaux clés (voir Noms de racine globale) peuvent tous être référencés dans les préfixes de portée par nom ou par type, indépendamment des options de développement/paramètres de recherche globale. Étant donné que les noms et les types de ces objets sont uniques, il n’y a aucune ambiguïté dans ces références. Cela signifie que même si la recherche globale est désactivée, vous pouvez toujours utiliser les noms d’objet ou les types de ces noms de racine de clé, tels que « resources » (le type) ou « Resources » (le nom).

Une fois le préfixe trouvé, le reste de la référence est recherché de manière « globale locale » à partir de ce nœud/objet vers le bas. Il s’agit d’une recherche approfondie dans l’arborescence, qui permet de trouver la première correspondance pour le premier élément de la <référence>. Par exemple, « page ::foo.bar » ne regardera vers le haut que pour le parent de type « page » le plus proche (selon les règles standard de recherche anonyme). Une fois que cet objet de page est trouvé, cette page est le « scope » de la recherche approfondie de la première occurrence de quelque chose nommé « foo ». Quand il trouve foo, il s’attend à ce que « bar » soit un enfant direct.

Voici un autre exemple :

Noms qualifiés et la recherche « ancre »

Lorsque vous faites référence à un nom qualifié, par exemple « PageA.varA », dans un script ou une règle de mise en page, le premier élément de la liste de notation « point » (dans ce cas, « PageA ») est l’objet « anchor ». La recherche est exécutée sur ce nom selon l’algorithme ci-dessus, indépendamment de ce qui vient après le nom de l’ancre. Par exemple, si « frame » est le nom d’ancrage (dans ce cas, un type d’objet anonyme recherchant généralement le cadre parent le plus proche), l’objet de type cadre parent le plus proche devient l’ancre.

Une fois l’ancre trouvée, le reste du nom qualifié doit correspondre strictement dans la relation de type parent-enfant-petit-enfant. Il n’y a plus de recherche sur les deuxième, troisième et suivants noms. .

Options de recherche de nom

Dans la zone « Outils->Options->Paramètres du développeur » dans SHIPTide Vous pouvez modifier le comportement de la recherche globale pour activer/empêcher la recherche globale par nom.

Ces options sont activées par défaut pour préserver le comportement hérité dans les projets, mais nous vous recommandons vivement d’envisager au moins de désactiver la recherche « Inclure la mise en page » afin que les scripts et les règles de mise en page doivent faire référence à d’autres objets de mise en page plus explicitement et que vous ne vous retrouviez pas par accident à faire référence à un objet portant le même nom quelque part à distance et de manière inattendue dans votre mise en page d’interface graphique.

Noms racines globaux

Dans vos constructions de recherche de noms, vous pouvez toujours utiliser le type de zone réservée et/ou leurs noms respectifs qui sont toujours uniques dans le système et se réfèrent toujours absolument à leurs zones respectives. Et ce, quelles que soient les options de recherche globale sélectionnées. Pour être clair, même si toutes les recherches globales sont désactivées, vous pouvez toujours, par exemple, faire référence à « resources » (le type) ou « Resources » (le nom) de l’objet racine système unique contenant la zone de ressources, même si cette référence provient de l’objet a layout area.

Voici une liste des noms/types globaux des objets supérieurs (c’est-à-dire racines) :
Type de nœudNom du nœudDescription
ressourcesRessourcesContient tous les articles réutilisables, tels que les images, les polices, les clips audio, etc.
dispositionDispositionContient la description de la mise en page de votre interface graphique
plateformePlateformeLes aspects matériels accessibles de votre plate-forme décrits dans le manuel de référence de l'interface graphique (GRM) de votre module