HOWTO développement Sashipa

 

 Repositionner des champs.

Le positionnement par défaut des champs ne vous convient pas.

 

Utiliser un deuxième fieldContainer, inclus dans le fieldContainer principal

Vous avez plusieurs champs (par exemple des checkBoxField) qui vous prennent beaucoups de place et vous souhaitez les regrouper sur plusieurs colonnes.

  <cardForm db='dbBase'>
    <title>Fiche Personne</title>
    <location x='10' y='10' />
    <cardSchemaTableRef schemaTable='tblPersonne' updateAfterInsert='yes' 
                        multipleInsert='yes' queries='sudi' />
    <fieldContainer>
      <!-- ... autres champs ... -->
      <fieldContainer displaySubLabels='no'>
        <label>Langages maîtrisés</label>
        <size w='300' h='52' />
        <layout type='grid' gridRows='3' gridColumns='2' />
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolanglaislu' />
        </checkBoxField>
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolanglaisecrit' />
        </checkBoxField>
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolallemandlu' />
        </checkBoxField>
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolallemandecrit' />
        </checkBoxField>
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolespagnollu' />
        </checkBoxField>
        <checkBoxField>
          <schemaColumnRef schemaColumn='tblPersonne_Boolespagnolecrit' />
        </checkBoxField>
      </fieldContainer>
      <!-- ... autres champs ... -->
    </fieldContainer>
  </cardForm>

Remarques concernant le fieldContainer inclus :

  • L'attribut displaySubLabels='no' signifie que les libellés des champs contenus par le fieldContainer ne seront pas affichés. En effet, ce label est affiché par la case à cocher de toutes façons.
  • On spécifie un label pour le fieldContainer : il sera commun aux six cases à cocher.
  • On spécifie une taille pour le fieldContainer avec l'élément size. Autrement le layout risque de ne pas opérer correctement.
  • On spécifie un layout (ie. un gestionnaire de positionnement).

Un layout est un gestionnaire de positionnement. Les types autorisés sont : table, flow, grid, none :

  • table est le layout par défaut. Il affiche les champs sur deux colonnes de gauche à droite puis de haut en bas. Il respecte la hauteur et la largeur de chaque champs, il agrandit éventuellement les plus petits à la manière d'un tableau HTML.

  • flow positionne les champs les uns à la suite des autres. Quand la largeur maximale du container est atteinte, il revient à la ligne.

  • grid crée une grille de gridColumns colonnes et gridRows lignes (valeurs spécifiées par attributs). Il remplit ensuite avec les champs de gauche à droite puis de haut en bas. Il ignore la hauteur et la largeur de chaque champs, il redimensionne pour tous les champs à la taille des cellules.

  • none supprime le gestionnaire de positionnement. Lorsqu'on l'utilise, il faut spécifier - pour chacun des champs contenus - un élément manualFieldLocation

 

Exemple avec un positionnement manuel (sans layout)

Cette fois-ci, nous voulons positionner les champs des nom et prénom à gauche de l'écran, et les champs de cases à cocher à droite.

Nous allons donc définir deux sous-fieldContainers : un pour les nom et prénom, et un autre pour les cases à cocher. Nous annulons le layout du sous-fieldContainer principal (layout type='none') et nous positionons manuellement les deux sous-fieldContainers. De plus, nous en profitons - pour l'exemple - pour utiliser un layout de type 'flow' avec les cases à cocher.

  <cardForm db='dbBase'>
    <title>Fiche Personne</title>
    <location x='10' y='10' />
    <cardSchemaTableRef schemaTable='tblPersonne' updateAfterInsert='yes' 
                        multipleInsert='yes' queries='sudi' />
    <fieldContainer displaySubLabels='no'>
      <layout type='none' />

      <fieldContainer>
        <manualFieldLocation xField='0' yField='0' />
        <textField>
          <schemaColumnRef schemaColumn='tblPersonne_Nom' />
        </textField>
        <textField>
          <schemaColumnRef schemaColumn='tblPersonne_Prenom' />
        </textField>
      </fieldContainer>

      <fieldContainer>
        <manualFieldLocation xField='0' yField='300' />
        <fieldContainer displaySubLabels='no'>
          <label>Anglais</label>
          <size w='240' h='32' />
          <layout type='flow' />
          <checkBoxField>
            <label>lu</label>
            <schemaColumnRef schemaColumn='tblPersonne_Boolanglaislu' />
            <size w='50' h='20' />
          </checkBoxField>
          <checkBoxField>
            <label>écrit</label>
            <schemaColumnRef schemaColumn='tblPersonne_Boolanglaisecrit' />
            <size w='70' h='20' />
          </checkBoxField>
          <checkBoxField>
            <label>parlé</label>
            <schemaColumnRef schemaColumn='tblPersonne_Boolanglaisparle' />
            <size w='70' h='20' />
          </checkBoxField>
        </fieldContainer>
      </fieldContainer>

    </fieldContainer>
  </cardForm>

Remarques :

  • Dans le fieldContainer des cases à cocher est de type 'flow', c'est pourquoi nous redéfinissons une taille pour chacune des cases à cocher. Autrement ces champs prendraient leur taille par défaut, beaucoup trop grande.

 

Définir les tailles par défaut

Lorsque vous ne spécifiez pas la taille d'un champ, celui-ci prend sa taille par défaut. Les tailles par défaut sont définies dans l'élément defaultParameterSet :

  <defaultParameterSet>
    <defaultParameter applyOn='field' type='size'>
      <size w='200' h='20' />
    </defaultParameter>
    <defaultParameter applyOn='writeChoiceFkField' type='size'>
      <size w='200' h='100' />
    </defaultParameter>
    <defaultParameter applyOn='textAreaField' type='size'>
      <size w='200' h='100' />
    </defaultParameter>
  </defaultParameterSet>

L'ordre de définition n'est pas important. La taille définie pour applyOn='field' est la taille par défaut pour tous les champs, sauf si l'on spécifie une taille par défaut pour un champ en particulier. Donc ici, tous les champs aurons la taille (200; 20) sauf les writeChoiceFkField et les textAreaField qui feront (200; 100).

 

Répartir les champs (et listForm) sur plusieurs écrans

Vous avez trop de champs dans votre fiche, ou trop de listForm. Ca ne rentre pas et vous souhaitez retirer une partie de ces composants, pour les rendre accessible dans un écran à part au moyen d'un bouton.

Cela se fait simplement en ajoutant un menuForm dans le premier écran :

  <screen name='SCtblPersonne'>
    <title>Fiche Personne</title>
    <formSet>
      <cardForm db='dbBaseDemo'>
        <title>Fiche Personne</title>
        <location x='10' y='10' />
        <cardSchemaTableRef schemaTable='tblPersonne' queries='sudi' 
                            updateAfterInsert='yes' multipleInsert='no' />
        <fieldContainer>
          <textField>
            <schemaColumnRef schemaColumn='tblPersonne_Nom' />
          </textField>
          ...
        </fieldContainer>
      </cardForm>

      <menuForm>
        <firstButtonLocation x='630' y='432' />
        <buttonSize w='100' h='30' />
        <menuButtonList>
          <menuButton screen='SCtblPersonne_Details'>Détails</menuButton>
        </menuButtonList>
      </menuForm>
        
    </formSet>
  </screen>

  <screen name='SCtblPersonne_Details'>
    <title>Fiche Personne : Détails</title>
    <formSet>
      <cardForm db='dbBaseDemo'>
        <title>Fiche Personne : Détails</title>
        <location x='10' y='10' />
        <cardSchemaTableRef schemaTable='tblPersonne' queries='sudi' 
                            updateAfterInsert='yes' multipleInsert='no' />
        <fieldContainer>
          <textField readOnly='yes'>
            <schemaColumnRef schemaColumn='tblPersonne_Nom' />
          </textField>

          <!-- ... champs de la fiche détails ... -->

        </fieldContainer>
      </cardForm>
    </formSet>
  </screen>

Important ! Le principe selon lequel les informations d'un cardForm sont enregistrés à chaque changement d'écran reste valable. Aussi il est essentiel que le premier écran contienne tous les champs obligatoires. Autrement l'ajout serait impossible.

Si vous n'avez qu'un bouton dans votre menuForm, l'espacement vertical des boutons (verticalGap) n'est pas significatif et on peut ne pas le préciser. De plus, on ne met pas de titre à ce menu.

On remarque que l'on rappelle à l'utilisateur l'enregistrement dont il regarde la fiche détail. Mais ici il peut paraître logique de mettre ces champs de rappel en lecture-seule (readOnly='yes').

 

© Copyright 2003 Sashipa-Melba Team. Ce document de la technologie Sashipa-Melba est sous licence GNU FDL Vous pouvez le copier et modifier librement les copies tant que cette mention apparaît clairement.