Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com

Accueil

 
4D v20 R8
Sous-formulaires en page

Sous-formulaires en page  


 

 

Les sous-formulaires en mode page peuvent afficher des données relatives à l'enregistrement courant ou toute valeur pertinente en fonction du contexte (variables, images, etc.). Il peuvent également, et c'est là leur intérêt majeur, comporter des fonctionnalités avancées et interagir avec le formulaire parent (widgets). Les sous-formulaires en page bénéficient de propriétés et d'événements spécifiques, et peuvent être entièrement contrôlés par programmation.

Note : Il est possible de générer des composants proposant des fonctionnalités supplémentaires via des sous-formulaires. Pour plus d'informations sur ce point, reportez-vous au chapitre Développer et installer des composants 4D.

Pour utiliser un sous-formulaire en mode page, il suffit de désélectionner l'option Sous-formulaire liste dans la Liste des propriétés pour l'objet sous-formulaire. Dans ce cas, les propriétés relatives à la configuration des sous-formulaires en liste (Mode de sélection, Double-clic sur ligne, etc.) ne sont plus affichées :

Le sous-formulaire en page utilise le formulaire entrée désigné par la propriété “Formulaire détaillé”. A la différence d’un sous-formulaire en mode liste, le formulaire utilisé peut provenir de la même table que le formulaire parent. Il est également possible d’utiliser un formulaire projet. En exécution, un sous-formulaire en mode page dispose des caractéristiques d’affichage standard d’un formulaire entrée. Les mécanismes des formulaires sortie (liés notamment à la gestion des taquets) ne sont pas activés.

Les sous-formulaires en page sont gérés via des propriétés spécifiques facilitant leur intégration et leur interaction avec le formulaire parent.

Une variable peut être liée à un objet sous-formulaire. Par défaut, cette variable n'est pas nommée, ce qui permet à votre code d'y accéder via un pointeur obtenu à l'aide de la commande (voir dans le manuel Langage de 4D). La variable a un type (cf. paragraphe suivant) et peut être représentée sous la forme d’une variable standard dans le formulaire parent. Sa modification déclenche des événements formulaire et permet ainsi de synchroniser les valeurs du formulaire parent et du sous-formulaire :

  • L’événement formulaire Sur données modifiées permet d’indiquer au conteneur de sous-formulaire que la valeur de la variable a été modifiée côté sous-formulaire.
  • L'événement formulaire Sur modif variable liée permet d’indiquer au sous-formulaire (méthode formulaire du sous-formulaire) que la variable a été modifiée côté formulaire parent.

Cette propriété permet de définir le type de la variable associée à l’objet sous-formulaire. Le type de la variable détermine la nature des valeurs échangées entre le formulaire parent et le sous-formulaire via la variable associée.
Par défaut, le type de la variable est Aucun. Si vous conservez cette option, vous devrez typer explicitement la variable par programmation pour que la base puisse fonctionner en mode compilé (cf. dans le manuel Langage).

Si vous sélectionnez le type Objet (ainsi qu'un nom de variable spécifique), vous pourrez lire ou fixer les propriétés de cet objet depuis le contexte du sous-formulaire via la commande (voir Utiliser l'objet associé au sous-formulaire ci-dessous).

Source  

Cette propriété permet de sélectionner différents types de sources :

  • <Aucun> : choisissez ce type de source si vous souhaitez utiliser un formulaire projet ou un formulaire de composant comme sous-formulaire. Ces sous-formulaires sont utilisables en mode page uniquement : l’option "Sous-formulaire liste" doit être désélectionnée pour qu’ils puissent fonctionner.
    Pour qu’un formulaire de composant apparaisse dans la liste "Formulaire détaillé", il doit avoir été publié dans le composant (cf. paragraphe ).
  • Nom de table : choisissez ce type de source si vous souhaitez utiliser un formulaire de la table.

Un objet sous-formulaire peut comporter une méthode objet, permettant de contrôler son fonctionnement, notamment lors du déclenchement d’événements. Pour la description des événements gérés par les sous-formulaires en page, reportez-vous à la documentation de la commande

A noter que l’interaction entre le contenu de l’objet sous-formulaire et le formulaire parent doit être gérée par des mécanismes spécifiques (cf. ci-dessous le paragraphe Programmation inter-formulaires avancée).

La variable liée au sous-formulaire permet de relier les deux contextes (formulaire et sous-formulaire) pour mettre au point des interfaces sophistiquées. Imaginons par exemple un sous-formulaire représentant une pendule dynamique, inséré dans un formulaire parent contenant une variable saisissable de type heure :

Les deux objets (variable heure et conteneur du sous-formulaire) ont le même nom de variable. Dans ce cas, à l’ouverture du formulaire parent, les deux valeurs sont automatiquement synchronisées par 4D. Si la valeur de la variable est définie à plusieurs emplacements, la valeur utilisée sera celle qui aura été chargée en dernier lieu. L’ordre de chargement suivant est appliqué :
1-Méthodes objet du sous-formulaire
2-Méthode formulaire du sous-formulaire
3-Méthodes objet du formulaire parent
4-Méthode formulaire du formulaire parent

A l’exécution du formulaire parent, la synchronisation des variables doit être effectuée par le développeur à l’aide des événements formulaires adéquats. Deux types d’interactions peuvent se produire : du formulaire vers le sous-formulaire et inversement.

Scénario 1 : La valeur de la variable du formulaire parent est modifiée et cette modification doit être répercutée dans le sous-formulaire. Dans notre exemple, l’heure de Heureparis passe à 12:15:00, soit parce que l’utilisateur l’a saisie, soit parce qu’elle est mise à jour dynamiquement (via la commande par exemple).

Dans ce cas, vous devez utiliser l'événement formulaire Sur modif variable liée. Cet événement doit être coché dans les propriétés du sous-formulaire, il sera généré dans la méthode formulaire du sous-formulaire.

L’événement formulaire Sur modif variable liée est généré :

  • dès qu’une valeur est affectée à la variable du formulaire parent, même si la même valeur est réaffectée,
  • si le sous-formulaire appartient à la page formulaire courante ou à la page 0.

A noter que, comme dans l’exemple ci-dessus, il est préférable d’utiliser la commande qui retourne un pointeur vers le conteneur de sous-formulaire plutôt que sa variable car il est possible d’insérer plusieurs sous-formulaires dans un même formulaire parent (par exemple, une fenêtre affichant des fuseaux horaires contiendrait plusieurs pendules). Dans ce cas, seul un pointeur permet de connaître le conteneur de sous-formulaire à l’origine de l’événement.

Scénario 2 : Le contenu du sous-formulaire est modifié et cette modification doit être répercutée dans le formulaire parent. Dans notre exemple, imaginons que l’interface du sous-formulaire permette à l’utilisateur de déplacer "manuellement" les aiguilles. 

Dans ce cas, vous devez affecter la valeur de l’objet à la variable du conteneur du sous-formulaire parent depuis le sous-formulaire. Comme dans l’exemple précédent, il est conseillé d’utiliser pour cela la commande avec le sélecteur Objet conteneur sous formulaire qui retourne un pointeur vers le conteneur du sous-formulaire. 

Cette affectation génère l’événement formulaire Sur données modifiées dans la méthode de l’objet conteneur du sous-formulaire parent, ce qui vous permet d’effectuer tout type d’action. L’événement doit être coché dans les propriétés du conteneur de sous-formulaire.

Note : Bien entendu, la modification "manuelle" des aiguilles de la pendule génère également l’événement formulaire Sur données modifiées dans la méthode de l’objet de la variable valeurPendule, dans le sous-formulaire.

4D associe automatiquement un objet de langage () à chaque sous-formulaire. Le contenu de cet objet peut être lu et/ou modifié depuis le contexte du sous-formulaire, ce qui vous permet de partager des valeurs dans un contexte local.

L'objet peut être créé automatiquement ou être la variable du conteneur parent, si elle a été explicitement nommée et typée Objet (voir ci-dessus). Dans tous les cas, l'objet est retourné par la commande , qui peut être appelée directement dans le sous-formulaire (l'usage d'un pointeur est inutile). Comme les objets sont toujours passés par référence, si l'utilisateur modifie une valeur de propriété dans le sous-formulaire, elle sera automatiquement mise à jour dans l'objet lui-même.

Par exemple, dans votre sous-formulaire, les libellés des champs sont stockés dans l'objet associé afin de vous permettre d'afficher différentes langues :

Vous pouvez modifier les libellés depuis le sous-formulaire en affectant des valeurs à l'objet InvoiceAddress :

 C_OBJET($lang)
 $lang:=Creer objet
 Si(<>lang="fr")
    $lang.CompanyName:="Société :"
    $lang.LastName:="Nom :"
 Sinon
    $lang.CompanyName:="Company:"
    $lang.LastName:="Name:"
 Fin de si
 InvoiceAddress.Label:=$lang

Pour plus d'informations, veuillez vous reporter à la description de la commande .

La communication entre le formulaire parent et les instances des sous-formulaires peut nécessiter d’aller au-delà de l’échange d’une valeur via la variable associée. En effet, vous pouvez souhaiter mettre à jour des variables dans les sous-formulaires en fonction d’actions effectuées dans le formulaire parent et inversement. Si l’on reprend l’exemple du sous-formulaire de type "pendule dynamique", on peut souhaiter définir une ou plusieurs heures d’alerte par pendule. 

Pour répondre à ces besoins, 4D propose les mécanismes suivants :

  • utilisation du paramètre "sous-formulaire" avec la commande  afin de désigner l’objet sous-formulaire et commande .
  • appel de l’objet conteneur depuis le sous-formulaire via la commande ,
  • exécution d’une méthode dans le contexte du sous-formulaire via la commande .

Outre le sélecteur Objet conteneur sous formulaire, la commande admet un paramètre permettant de préciser dans quel sous-formulaire chercher l’objet dont le nom est passé en deuxième paramètre. Cette syntaxe n’est utilisable que lorsque le sélecteur Objet nommé est passé. 

Par exemple, l’instruction suivante :

 $ptr:=OBJET Lire pointeur(Objet nommé;"MonBouton";"MonSousForm")

... permet de récupérer un pointeur sur la variable "MonBouton" se trouvant dans l’objet sous-formulaire "MonSousForm". Cette syntaxe permet d’accéder depuis le formulaire parent à tout objet se trouvant dans un sous-formulaire.
A noter également la commande qui permet de récupérer le nom de l’objet ayant le focus.

La commande permet à une instance de sous-formulaire d’envoyer un événement à l’objet conteneur du sous-formulaire, qui peut alors le traiter dans le contexte du formulaire parent. L’événement est reçu dans la méthode de l’objet conteneur. Il peut s’agir à l’origine de tout événement détecté par le sous-formulaire (clic, glisser-déposer, etc.). 

Le code de l’événement est libre (par exemple, 20000 ou -100). Vous pouvez soit utiliser un code correspondant à un événement existant (par exemple, 3 pour Sur validation), soit utiliser un code personnalisé. Dans le premier cas, seuls les événements présents dans la liste des événements "cochables" des conteneurs de sous-formulaire peuvent être utilisés (cf. Liste des propriétés). L'événement doit en outre être coché. Dans le second cas, le code ne doit correspondre à aucun événement formulaire existant. Il est conseillé d’utiliser une valeur négative pour avoir l’assurance que 4D n’utilisera pas ce code dans les versions futures.  

Pour plus d'informations, reportez-vous à la description de la commande .

La commande permet à un formulaire ou à l’un de ses objets de demander l’exécution d’une méthode dans le contexte de l’instance du sous-formulaire, ce qui lui donne accès aux variables, objets, etc., du sous-formulaire. Cette méthode peut en outre recevoir des paramètres.

Ce mécanisme est illustré dans le schéma suivant :

Pour plus d'informations, reportez-vous à la description de la commande .

La commande peut rechercher l’objet de destination dans le formulaire parent même si elle exécutée depuis un sous-formulaire.



Voir aussi  

Sous-formulaires en liste

 
PROPRIÉTÉS 

Produit : 4D
Thème : Sous-formulaires et widgets
Nom intl. : Page subforms

 
PAGE CONTENTS 
 
HISTORIQUE 

Modifié : 4D v16 R5

 
UTILISATION DE L'ARTICLE

4D - Mode Développement ( 4D v20 R8)