Focusser un sous form

J’ai l’impression de devenir complètement idiot : je veux envoyer le focus dans un sous formulaire par programmation, GOTO OBJECT(*;“nomSousform”) n’a aucun effet ???

En effet, même surprise.
Ce que j’ai été obligé de faire :sweat_smile:

  • utiliser l’événement “on get focus” de l’instance de mon sub-form.
  • et mettre dedans une méthode qui execute dans le contexte du sub form.

wog_setFocus

C_LONGINT($evt)
$evt:=Form event code

Case of 
	: ($evt=On Getting Focus)
		wog_setFocus 
...
End case 

Puis dans wog_setFocus :

$formName:=OBJECT Get name(Object current)
EXECUTE METHOD IN SUBFORM($formName;"__focus")

Et enfin, __focus qui fait le boulot :sweat_smile:

GOTO OBJECT(*;"value")

Il y a sûrement plus simple, mais ça cela marche.
J’aurais espéré que l’événement “on get focus” se propage directement au niveau du sub-form, mais non. J’ai donc été obligé d’ajouter un appel à une méthode “wog_setFocus” en haut dans les instances.

J’espère que cela aide ?

Mon but à minima était d’avoir, à l’ouverture d’une liste de base, d’avoir la main directement dans le sub-form widget de recherche. Ca marche. Focus direct, on peut taper en économisant le clic sur le widget de recherche.

image

Lorsqu’un conteneur de sous formulaire a la propriété focusable, lorsque celui-ci prends le focus, c’est l’événement Sur activation du sous-formulaire qui est généré.

1 Like

Merci, Vincent, c’est parfait.
On ne devait jamais ne pas faire :
case of
:(truc)
:(machin)
ELSE
ALERTE(“Mec, ton événement il est pas pris en compte”)
end case

1 Like

J’ai une macro pour le If et le Case of qui me colle systématiquement le Else

Case of 
		  //______________________________________________________
	: ()			
		
		  //______________________________________________________
	Else 		
		  // A "Case of" statement should never omit "Else"		
		  //______________________________________________________
End case 

If ()	
		
Else 	
	  // A "If" statement should never omit "Else" 	
End if 

et une pour la méthode objet et la méthode formulaire qui ajoute systématiquement
le Else :

Case of 		
		  //______________________________________________________
	: ($e.code=)
		
		  //______________________________________________________
	Else 
		ASSERT(False;"Form event activated unnecessarily ("+$e.description+")")
		  //______________________________________________________
End case
``
1 Like

Merci !
J’ai aussi un “rattape mes oublis” (j’avais été pas peu fier de trouver la même chose dans 4dpop :wink: ). Mais sur ce coup-là là j’étais gros jean de toutes façons, je n’avais pas coché “On activate”.

Je viens de regarder la doc :
« Sur activation…Entier long…11…La fenêtre du formulaire passe au premier plan »
Le fait qu’un sous formulaire qui prend le focus déclenche “On activate” mérite plus de publicité… Quand il le perd, ça déclenche “on deactivate” ?

Je crois pas, à tester.

Ce qui serait surement un plus serait que GOTO OBJECT accepte un paramètre optionnel comme Object get Pointer pour indiquer un subform

Je trouve plutôt qu’il est surprenant qu’un sous formulaire avec la propriété focussable soit ni plus ni moins ignoré par GOTO OBJECT. Après tout, c’est un objet du formulaire hôte, il a un nom, il est focussable, donc c’est ce à quoi on s’attendrait… Après, s’il y a plusieurs zones focussables à l’intérieur du sous form, ce serait à lui de gérer. Il me semble que, comme ça, hôte ou sous form, chacun garde ses vaches.

Ça, ce n’est pas normal…
Mais je viens de faire le test et cela fonctionne
Ton conteneur est bien focusable ?

1 Like

Il est grave focussable, la case en est toute usée.

Ce que j’oublie régulièrement est de mettre dans la MF de l’hôte :

Form.subform:=New object

C’était pourtant simple… Heureusement la hot line Juhel fonctionnait le week-end.

Merci pour ta mini base ! Du coup je vais remettre une couche :

    • la doc comporte des liens vers les HDI
    • les commentaires utilisateurs existent mais ne permettent pas l’ajout de lien (de mémoire)

1 ET 2 qu’est-ce que ce serait bien.

Super, merci Vincent, je crois que je vais simplifier mon code :slight_smile:

Du coup, Vincent, j’ai fouillé, et inspiré du searchbox de 4D :

C_LONGINT($evt)
$evt:=Form event
Case of 
	: ($evt=On Load)
		__ob_init (<>ob_wog_search)
		OBJECT SET VISIBLE(*;"focusRing_@";False)
		
		  //: (Form event=On Getting Focus)
		  //OBJECT SET VISIBLE(*;"focusRing_@";True)
		  //GOTO OBJECT(*;"value")
		
	: (Form event=On Losing Focus)
		OBJECT SET VISIBLE(*;"focusRing_@";False)
		
	: (Form event=On Activate)
		OBJECT SET VISIBLE(*;"focusRing_@";True)
		GOTO OBJECT(*;"value")
		
End case 

Ca cela marche.
J’utilise le “on activate” pour détecter le get focus, qui marche “mieux” que le “on getting focus”.
Et le “on losing focus”, qui fonctionne.
Et du coup, le GOTO OBJECT au niveau host en donnant un sous formulaire fonctionne !
Cela génère le “on activate”.

[Edit]
Le “on getting focus” ne marche en fait pas… il est remplacé par “on activate” dans un sou-form, alors que le “on losing focus” fonctionne lui. Pas très logique tout cela…
Mais cela fait marcher l’ensemble sans toute ma tripouille donnée en début de ce post.
Good to know :slight_smile:
Cool.

J’ai prévenu qui de droit…

1 Like

Mais rien ne le prouve pas !