domogest
Formulaire hérité
But
Le but de cette démo est de démontrer le remplacement du formulaire hérité par un sous-formulaire.
Constitution du sous-formulaire
Il comporte un logo, des boutons et une barre d'onglets pour assurer le changement de page du formulaire. Seul le fonctionnement des onglets est abordé dans cet exemple.
Caractéristiques des deux solutions :
Formulaire hérité |
Sous-formulaire |
Le formulaire hérité se charge avant le formulaire principal, ce qui ne facilite pas le pilotage du formulaire hérité par le formulaire principal ; cela nécessite l'utilisation de CALL SUBFORM CONTAINER et EXECUTE METHOD IN SUBFORM |
Le formulaire hérité se charge après le formulaire principal ; s'il contient la barre d'onglets, il faut, pour exécuter la méthode attachée aux onglets, utiliser un CALL FORM |
La variable Form n'est pas disponible au chargement du formulaire hérité |
La variable subform est rattachée comme propriété à Form |
L'affectation du formulaire hérité est figée au développement |
On peut changer dynamiquement le sous-formulaire |
|
Le sous-formulaire n'est pas affiché en mode développement ; si on veut le voir, on peut mettre une image invisible par défaut |
Fonctionnement
Le fonctionnement est intégré au processus d'affichage des formulaires et nécessite des classes.
Création et affichage de la fenêtre
La fenêtre est gérée par une classe windowManager.
$o.action:=""
$formName:="formWithInheritedForm"
$o.window:=New object
$o.window:=cs.windowManager.new(New object(\
"id"; 0; \
"formName"; $formName; \
"callback"; "formWithInheritedForm"; \
"callbackAction"; "tabs"; \
"formType"; Plain form window; \
"title"; "Grandeurs et mesures"; \
"left"; 100; \
"top"; 150; \
"width"; 1700; \
"height"; 1050))
$o.window.displayForm($formName; $o)
La méthode de callback est la méthode du formulaire, l'action à faire est l'action sur les onglets ("tabs").
Méthode formulaire "on load" du formulaire principal
Le nom du conteneur est "header" et sa variable Form.header ; on affecte l'objet Form à la propriété "header" du conteneur, ce qui permet de partager toutes les variables sans forcer les échanges par EXCUTE METHOD IN SUBFORM et CALL CONTAINER ; ce n'est pas possible si le sous-formulaire est chargé avant le formulaire.
: (FORM Event.code=On Load)
//Définition des onglets de page
$tabsName:="tabs"
Form[$tabsName]:=New object
Form[$tabsName].name:=$tabsName
Form[$tabsName].list:=New collection
Form[$tabsName].list.push(New object("id"; Form[$tabsName].list.length+1; "label"; "Liste par nom"; "name"; "name"; "formPage"; 2; "icon"; Get 4D folder(Current resources folder)+"Images"+Folder separator+"ctc"+Folder separator+"1"+Folder separator+"icon_mail_24.png"; "active"; True))
Form[$tabsName].list.push(New object("id"; Form[$tabsName].list.length+1; "label"; "Liste par prénom"; "name"; "firstName"; "formPage"; 1; "icon"; Get 4D folder(Current resources folder)+"Images"+Folder separator+"ctc"+Folder separator+"1"+Folder separator+"icon_modify_24.png"; "active"; True))
Form[$tabsName].default:=New object
//Form[$tabsName].default.tabName:="firstName"
Form[$tabsName].default.tabName:="name"
Form[$tabsName].callback:=Current method name
//Création d'un objet listbox
$listboxName:="displayList"
Form[$listboxName]:=cs.listboxManager.new($listboxName)
//Affectation du sous-formulaire
Form.header:=Form
OBJECT SET SUBFORM(*; "header"; "headerDialog")
Les onglets sont définis à ce niveau mais la liste hiérarchique sera contruite dans la méthode de l'onglet.
L'ordre des onglets n'est pas obligatoirement identique à celui des pages du formulaire ; s'il est identique, on peut omettre la propriété formPage.
Méthode formulaire de l'onglet
L'onglet est construit à partir de l'objet Form.tabs dans l'événement on load qui renvoie un CALL FORM pour effectuer le traitement correspondant à l'onglet choisi, par exemple sélection d'une dataclass, création et chargement de la listbox.
Case of
: (FORM Event.code=On Clicked)
$tabsName:=OBJECT Get name(Object current)
Form[$tabsName].onEvents()
: (FORM Event.code=On Load)
$tabsName:=Form.tabs.name
Form[$tabsName]:=cs.tabsManager.new(Form[$tabsName])
Form[$tabsName].setCurrentTab()
Form.action:="afterSubformsCreation"
CALL FORM(Form.window.id; Form.current.formSpecificMethod)
: (FORM Event.code=On Unload)
$tabsName:=OBJECT Get name(Object current)
Form[$tabsName].hierlist.clear()
End case
L'événement on clicked dispose de l'information pour déclencher le changement de page.
Action tabs
Elle tient compte de l'onglet courant ; dans l'exemple, on construit une liste par prénom ou par nom, avec des colonnes différentes.
Base de démonstration
La base comporte plusieurs démos ; le menu à appeler est "Démo inherited form".
On peut changer dans le code l'onglet par défaut :
//Form[$tabsName].default.tabName:="firstName"
Form[$tabsName].default.tabName:="name"