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.

application/4DPicture

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"