4D v16

Tableaux, popup, listbox

Accueil

 
4D v16
Tableaux, popup, listbox

Tableaux, popup, listbox    


 

 

En complément des manipulations expliquées dans la vidéo, il faut noter que :

Les tableaux font partie des incontournables de 4D.

Pratiques, sans limite, dynamiques, à 1 ou 2 dimensions, ils sont un espace en mémoire qui peut s’afficher sur les formulaires par l’intermédiaire d’objets (popup, combo box, listbox, zones de défilement...).

Nous avons déjà abordé le concept et la mise en œuvre de variables simples à une seule valeur. Un tableau est une variable multi-valuée dont on pourra lire ou écrire chacun des éléments.

On définit pour un tableau le nombre de lignes qu’il contient et son type. Voici à titre de comparaison les différentes étapes de la vie d’une variable et d’un tableau :

EtapeVariable simpleVariable tableau
InitialisationC_TEXTE(vTexte)TABLEAU TEXTE(TabTexte;10) `10 lignes
ValorisationvTexte:="Tascher de la Pagerie"TabTexte{1}:="De Beauharnais" `ligne 1
TabTexte{2}:="Barras" `ligne 2
TabTexte{3}:="Bonaparte" `ligne 3
...
Utilisation$NbCar:=Longueur(vTexte)$Amant:=TabTexte{1}
Effacer le contenuEFFACER VARIABLE(vTexte)TABLEAU TEXTE(TabTexte;0)
(le comportement est différent entre une application interprétée et
compilée, voir la documentation 4D)
Visualisation sur un formulaireDonner le nom de la variable à un objet de type variableDonner le nom de la variable à un objet de type zone de défilement, pop up menu...
TypesEntier, Entier long, Numérique, Alpha, Texte, Booléen, Date, Heure, Image, Blob, pointeursIdentiques aux types de variables sauf Heure et Blob

On remarque que les similitudes sont nombreuses.

Le nom du tableau est utilisé parfois avec les accolades {}, parfois seul. Il s’agit dans ce dernier cas d’une variable (entier long) créée automatiquement par 4D.

Cette variable, associée au tableau, sert d’indice (numéro de ligne) de tableau. C’est par son intermédiaire qu’on peut savoir quelle est la ligne choisie par l’utilisateur, ou forcer la sélection de telle ou telle ligne dans les objets d'interface (popup menu, ...).

C’est la raison pour laquelle vous verrez souvent écrit dans les bases exemples ou les développements des autres développeurs cette syntaxe plus concise :

 [INTERVENTIONS]Objet:=TabObjets{TabObjets}


qu’on peut décrypter comme ceci : "Objet := contenu du tableau {à la ligne choisie}"
Vous trouverez également, plus concise et beaucoup plus générique, cette syntaxe qui utilise la commande Self (pointeur vers l’objet dont la méthode est en cours d’exécution) :
 [INTERVENTIONS]Objet:=Self->{Self->}

Quelle que soit la syntaxe utilisée, le fonctionnement est identique.

Dans 4D, un onglet est un objet unique avec plusieurs titres (valeurs). C’est un des objets d'interface que l'on peut utiliser pour représenter un tableau.

En général on place les onglets en page 0 du formulaire (reportez-vous au chapitre qui aborde ce point)

Vous le constaterez, les tableaux deviennent vite très utiles voire indispensables dans 4D.

Un tableau ne contient que des éléments de même type (vous ne pouvez pas avoir un tableau avec une ligne Alpha, une autre Date et une troisième Heure). Dans ce cas, vous pouvez utiliser un tableau de pointeurs qui pointera potentiellement vers des variables de types différents.

Comme évoqué à la leçon sur les pointeurs, vous pouvez combiner les pointeurs et les tableaux pour obtenir les "tableaux de pointeurs".

Pensez également qu'une Listbox est une série de tableaux accolés (de même dimension M).

C'est un objet qui regroupe et synchronise de 1 à N tableaux.

Dans une Listbox, vous pouvez paramétrer :

  • la Listbox elle-même
  • chacun des en-têtes de colonnes
  • et chacune des colonnes

En tout, si votre Listbox comporte N colonnes, vous avez 2N+1 objets (N colonnes, N entêtes, 1 ListBox).

La Listbox permet :

  • la saisie de données
  • le tri et le déplacement des lignes et des colonnes
  • l’affichage de couleurs alternées
  • l'affichage hiérarchique
  • des cumuls dans le pied de page
  • Elle peut être synchronisée avec des tableaux comme nous le faisons ici ou avec des champs de la sélection courante (ou temporaire) d’une table
  • ...

Sachant que la Listbox synchronise ses colonnes, elle prend le plus petit nombre de lignes des tableaux qui la constituent.

Ce point est important car il vous arrivera d’avoir des tableaux remplis et une Listbox vide car un seul des tableaux est vide.

Bonjour,
dans cette vidéo nous allons apprendre à créer et programmer les tableaux ainsi que les objets permettant de les représenter dans les formulaires.

Comme une variable simple, un tableau doit être :

  • déclaré
  • puis valorisé
  • et enfin utilisé.

Pour bien comprendre nous allons créer un premier tableau dans le formulaire DETAIL de la table INTERVENTIONS.

Ce tableau concernera les objets
Nous devons donc :

  1. créer le tableau en mémoire
  2. mettre un objet sur le formulaire capable de représenter ce tableau en mémoire
  3. vérifier que le tableau contient les bonnes informations
  4. puis lorsqu'on sélectionne dans le tableau transférer la valeur dans le champ

Pour simplifier les manipulations, nous allons mettre l’ensemble de la programmation dans l’objet. Ça nous permettra au passage de réviser la notion d’événement.

  • nous allons sélectionner l’objet popup/liste déroulante
  • tracer à droite du champ OBJET.
  • on le nomme PopObjets
  • on coche l'événement Sur chargement et sur clic
  • puis on édite la méthode.

 $evt:=Form event
 Case of
    :($evt=On Load//avant l'affichage du formulaire
       ARRAY TEXT(PopObjets;5) //Définition du tableau (Type, Nom et nombre de lignes)
 
  //remplissage des lignes du tableau
       PopObjets{1}:="Formation"
       PopObjets{2}:="Logiciel"
       PopObjets{3}:="Matériel"
       PopObjets{4}:="Réseau"
       PopObjets{5}:="Système"
 
    :($evt=On Clicked//quand l'utilisateur choisit une ligne dans le tableau
       If(PopObjets#0) //si l'utilisateur a choisi une ligne
          $LigneChoisie:=PopObjets //on mémorise la ligne choisie
          $ValeurChoisie:=PopObjets{$LigneChoisie//on mémorise la valeur contenue dans cette ligne
          [Interventions]Objet:=$ValeurChoisie  //on affecte la valeur au champ
       End if
 End case

La méthode objet va être composée d'un certain nombre de lignes :

  • dans un premier temps le test sur l'événement.
  • Si on est sur chargment on créer un tableau de 5 lignes, la 1ère contiendra "formation" etc
  • et lorsqu'on cliquera sur l'objet on effectuera le transfert ici dans l'objet.

Nous allons tracer le fonctionnement de cette méthode en faisant un 1er test.

On voit lors du double-clic sur une intervention qu'on passe sur chargement.

Nous allons pouvoir afficher le tableau qui contient bien 5 éléments et les 5 éléments sont bien valorisés au fur-et-à-mesure.
L'intervention apparaît.

Lorsqu'on choisit une valeur dans le menu on voit ici le numéro de ligne indiqué dans une variable, qui est une variable qui porte le même nom que le tableau, mais qui est une variable de type entier long

et on voit ici les 6 lignes du tableau, les lignes de 1 à 5 plus la ligne zéro sur laquelle nous reviendrons ultérieurement.

A l'éxécution de cette méthode :

  • l'événement concerné est bien "sur clic".
  • on vérifie qu'une ligne ait bien été choisie.
  • si la ligne a été choisie on peut :
  •      - passer par une variable intermédiaire 'lignechoisie" ici
  •      - récupérer la valeur choisie, si on regarde valeur choisie elle contient bien "matériel"
  •      - et on transfère bien cette valeur choisie dans l'objet.

Il est possible de remplacer ces 3 lignes par une seul sous la forme

 [Interventions]Objet:=PopObjets{PopObjets}

Pourquoi ?

Car cette valeur ici est la variable entier long qui contenait 3 tout à l'heure, donc qui indique le numéro de ligne du tableau concerné (qui porte le même nom).
Pour des questions génériques, vous trouverez souvent dans les développements ce type d'écriture :

 [Interventions]Objet:=Self->{Self->}

qui utilise un pointeur vers l'objet.

Puisque la programmation est effectuée actuellement sur l'objet lui-même self fait référence à l'objet et lorsqu'on on écrit Self->{Self->},

on indique le tableau {à la ligne choisie dans le tableau} et on transfère le contenu directement dans l'objet.

On va tracer ça pour vérifier qu'on obtienne bien le même résultat.

  • donc actuellement nous avons bien dans [intervention]objet "réseau".
  • si on affiche PopObjets{PopObjets} on a bien "réseau"
  • si on affiche Self->{Self->} on a bien "réseau"

Donc ce découpage permet de bien comprendre en détail.
Cette écriture est l'écriture la plus générique et la plus portable.

Nous allons maintenant créer un nouveau tableau qui permet de saisir la date à plus ou moins 10 jours.

  • Je duplique l'objet
  • je le renomme
  • je copie
  • et modifie sa méthode.

Pour l'initialisation nous le verrons par la suite il s'agit d'un tableau date de 21 lignes : aujourd'hui + 10 jours -10 jours
et on écrira le code le plus condensé de cette manière
Maintenant comment remplir les lignes ? Nous allons faire une boucle dans laquelle on valorise le tableau de cette manière (date du jour + $i-11).

Le tableau bien évidemment portera le bon nom et maintenant on peut tester :
et on voit ici lorsqu'on choisit une valeur dans le tableau, automatiquement elle est reportée à côté sur la date d'intervention.

Maintenant que vous savez programmer les tableaux il est possible dans 4D de les représenter dans différents objets, par exemple dans une listbox.

Une listbox étant un objet composé de une ou plusieurs colonnes avec une entête et une colonne et c'est justement la colonne qui nous intéresse, dans laquelle on va juste écrire le nom du tableau que nous avons géré en mémoire.

Si maintenant nous retournons sur une intervention, la listbox contient bien les différentes valeurs du tableau et on voit la synchronisation directe entre le choix dans la listbox et la correspondance dans le tableau ici.

Nous allons de la même manière programmer la listbox pour que lorsqu'on clique ou lorsqu'on effectue une nouvelle sélection sur cette listbox, automatiquement la valeur de l'objet soit modifiée.

Donc dans la listbox nous cochons les propriétés sur clic et sur nouvelle sélection.

Il y a juste maintenant à recopier cette ligne dans la méthode objet de la listbox :

 [Interventions]Objet:=PopObjets{PopObjets}

A l'utilisation lorsqu'on sélectionne une valeur dans la listbox à la souris ou avec les flèches du clavier, automatiquement les valeurs sont transférées.

Il serait bien évidemment possible également de faire du glisser déposer si les zones étaient glissables et déposables.

 
 

 
PROPRIÉTÉS 

Produit : 4D
Thème : Tableaux, popup, listbox

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

Autoformation ( 4D v16)