Redimensionnement dans un sous formulaire

Bonjour,

J’ai besoin de déplacer des éléments dans mon sous formulaire quand celui-ci est redimensionné.

C’est le formulaire principal qui est redimensionné, le sous formulaire inclus se redimensionne aussi par contre l’évènement “sur redimensionnement” ne se déclenche pas dans le sous formulaire et je ne peux donc pas le capter pour coder le déplacement des mes éléments.

Je suppose que cela doit être possible de faire ce que je souhaite, comment procédé vous ?

Bonjour,

Effectivement, l’événement Sur redimensionnement n’est pas déclenché en cascade dans les sous-formulaires.

Mais vous pouvez mettre votre code dans une méthode et dans l’événement Sur redimensionnement du formulaire parent faire :

EXECUTER METHODE DANS SOUS FORMULAIRE (*;“subform”;“maMethode”)

Je vais essayer ça, par contre mon sous formulaire et lui même dans un autre sous formulaire il va falloir que j’arrive à dire a partir du formulaire principal au sous formulaire de niveau un de faire le EXECUTER METHODE …

J’ai moi même de plusieurs niveaux de sous-formulaire.

Dans ce cas la méthode teste le nom du formulaire courant.

Si ce n’est pas le bon elle cherche le formulaire cible et relance un EXECUTER…

EXECUTER METHODE DANS SOUS FORMULAIRE (*;“subform”;“maMethode”;“nomSubform”)

maMethode:

<code 4D>
C_TEXT($1) // Nom du sous-formulaire target

C_LONGINT($Lon_i;$Lon_x)

If (Current form name=$1) // On est dans le bon sous-formulaire

  // Le code de redimensionnement…

Else

ARRAY TEXT($tTxt_objects;0x0000)
FORM GET OBJECTS($tTxt_objects)

$Lon_x:=Find in array($tTxt_objects;$1)

If ($Lon_x>0)
	
	  // Trouvé
	EXECUTE METHOD IN SUBFORM(*;$tTxt_objects{$Lon_x};Current method name)
	
Else 
	
	  // Passer au niveau inférieur
	For ($Lon_i;1;Size of array($tTxt_objects);1)
		
		EXECUTE METHOD IN SUBFORM(*;$tTxt_objects{$Lon_x};Current method name;$1)
		
	End for 
End if 

End if
</code 4D>

Bonjour Merci Vincent,

J’ai réussi à faire ce que je voulais.

juste corrigé quelque bug dans le code que tu m’as donnée :

  • c’est $Long_i et non $Lon_x dans la boucle For

  • dans le EXECUTE METHOD IN SUBFORM, il n’y a pas de paramètre * pour le 1er paramètre, par contre il faut en mettre un en 3eme dans le cas ou la méthode de retourne pas de valeur.

Merci beaucoup.

Je relance mon sujet car j’ai toujours une problématique.

Le problème c’est que lorsque que je ferme le formulaire principal et que je le réouvre, mes élément se retrouve mal placé.

J’ai essayé d’exécuter mon code de redimensionnement dans l’évènement “sur chargement” du sous formulaire, mais à ce moment les coordonnées des éléments reçues avec la commande OBJET LIRE COORDONNÉES me retourne les informations avec les données du formulaire stocker en structure.

Je n’arrive pas à lancer mon repositionnement d’objet à l’ouverture du formulaire.

Désolé, le code publié a été tapé dans le forum c’était juste pour la logique…

Si vous utilisez l’* avec Open form window et que l’option Save geometry est cochée pour le formulaire principal, vous devriez retrouver le formulaire dans l’état où vous l’avez laissé lors de la fermeture.

Non il ne reprends pas sa place.

J’ai résolu mon problème en mettant le code dans l’évènement “sur minuteur”, avec un fixer minuteur(-1) dans l’évènement sur chargement du sous formulaire.

oui, ce n’est plus que dans ce cas que j’utilise le minuteur.

Sinon une autre solution : dans l’événement Sur chargement du formulaire parent est de faire un APPELER FORMULAIRE(current form window;“maMethode”;“nomSubform”)

Ou bien encore :

$win:=Creer fenetre formulaire(“formParent”;…)
APPELER FORMULAIRE($win;“maMethode”;“nomSubform”)
DIALOGUE(“formParent”)

À voir ce qui est le plus fluide en fonction des traitements effectués par ailleurs.

D’après la doc de la commande APPELER FORMULAIRE le 3ème paramètre permet de fournir les parametres de la méthode $2 et pas de donner le nom du sous formulaire.

Je ne peut pas donc lui demander d’exécuter la méthode a l’intérieure de celui-ci.

Si vous reprenez le squelette de la méthode que je vous ai donné plus haut (debuggé comme vous l’avez fait - mais je ne peux pas éditer mon post) vous noterez qu’elle attend un paramètre qui est le nom du sous-formulaire…

Ce que j’utilise : pendant le redimensionnement de FH faire un EXECUTER METHOD IN SUBFORM(“SF”;“laMethodeQuiVaBien”)

Bonsoir Vincent,
faut que je m’explique…

Pour autant que je sache, les “échanges” entre hôte et sous formulaire peuvent se faire par, au choix :
1/ APPELER CONTENEUR SOUS FORMULAIRE/EXECUTER METHOD IN SUBFORM (ouille le franglais)
2/ la modification de la variable liée par l’hôte ou le sous form, qui déclenche un événement formulaire “de l’autre coté du conteneur”

Dans la seconde, je “poste” mon message dans la variable objet liée, ça déclenche un événement dans la cible qui lit le message et se débrouille avec. Ça me semble plus naturel, modulaire, évolutif… C’est pour ça que je n’ai pas mentionné la possibilité 1/. Donc question suivante : pour toi, pourquoi celle ci plutôt que celle là ?

2 considérations :
1] Dissocier le fond de la forme, la variable, pour moi, est dédiée aux données.
2] Je ne suis pas certain que l’événement “On Bound variable change” soit généré “en continu” et aboutisse à la même fluidité que l’exécution de la méthode.

Ceci dit, comme toujours, ce n’est pas un dogme.

  • Si je fais un widget “autonome” dans un composant, je n’ai pas forcément envie de publier une méthode de redimensionnement et obliger le développeur à l’appeler dans son code. Il est plus simple de lui demander de faire monContainer:=monContainer
  • Si je suis dans mon développement, il en va autrement. Je prend l’exemple de l’interface de 4D for iOS, constituée de panneaux entièrement autonomes. Le formulaire hôte appelle une méthode (et une seule) pour tous les panneaux affichés, quel qu’ils soient, chaque panneau ayant au moment du chargement défini les règles de redimensionnement de ses objets qui lui sont propre

Une autre raison pour laquelle j’hésitais était que le typage en objet de la “variable bound” du conteneur s’est mis en place progressivement. Sans lui, l’utilisation comme “déclencheur + porteur de message” était peu agréable. Quand il est devenu “naturel” (type=objet dans les propriétés, fonction Form…), je me suis demandé si ça “obsolétisait” l’autre façon de faire…
Bon, en tout cas j’ai retenu dogmatique, non, pragmatique, oui et ça me convient très bien : merci pour ton aide ! :slight_smile: