IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Designer -> génération Forms : une procédure de placement d'item

procédure PL/SQL Move_item()

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Introduction

Lors d'une génération d'écran Forms depuis Designer, il n'est pas toujours possible de placer les éléments exactement à l'endroit voulu.


Voici une procédure qui va permettre de placer très exactement un item par rapport à un autre

Cette procédure accepte 4 paramètres :

  • L'item de référence (VARCHAR2) item utilisé comme point de départ
  • L'item à déplacer (VARCHAR2)
  • La position horizontale souhaitée (VARCHAR2) qui peut être 'L' (left) où 'R' (right)
  • La position verticale souhaitée (VARCHAR2) qui peut être 'F' (floor), 'C' (ceil), 'T' (top), 'B' (bottom)

Les paramètres position horizontale et/où verticale acceptant également un offset positif ou négatif exprimé en pixels

I. Démonstration

Voici une copie d'écran de la forme telle qu'elle pourrait être générée par Designer

Image non disponible

Et voici le block PL/SQL appelé depuis le trigger WHEN-BUTTON-PRESSED du bouton Reference item

 
Sélectionnez
PROCEDURE move_all IS
BEGIN

        Move_Item ( 'BL.BTREF','BL.BT1','L','C')   ;
        Move_Item ( 'BL.BTREF','BL.BT2','L','T')   ;
        Move_Item ( 'BL.BTREF','BL.BT3','L','F')   ;
        Move_Item ( 'BL.BTREF','BL.BT4','L','B')   ;
        
        Move_Item ( 'BL.BTREF','BL.BT5','R','C')   ;
        Move_Item ( 'BL.BTREF','BL.BT6','R','T')   ;
        Move_Item ( 'BL.BTREF','BL.BT7','R','F')   ;
        Move_Item ( 'BL.BTREF','BL.BT8','R','B')   ;

END;

Puis la copie d'écran de la forme après l'appel de la procédure move_item()

Image non disponible


Cette procédure est indépendante du système de coordonnées et fonctionne indistinctement selon que vos écrans sont en CHARACTERS, INCHES, POINTS ou CENTIMÈTRES

Si vous souhaitez que l'item :BL.BT7 soit positionné à droite de l'item BL.BTREF+ 20 pixels entrez :

Move_Item ( 'BL.BTREF','BL.BT7','R+20','F') ;


Voici le code de la procédure Move_item()

 
Sélectionnez
PROCEDURE Move_Item
    (
        PC$Item_Ref    in Varchar2,
        PC$Bouton      in Varchar2,
        PC$Horizontal  in Varchar2,
        PC$Vertical    in Varchar2
    ) IS
  --
  ------------------------------------------
  -- Positionning of item from another one
  ------------------------------------------
  --
  -- IN    : PC$Item_ref (reference item)
  --    : PC$Bouton (item to move)
  --    : PC$Horizontal ('L' on left, 'R' on right)
  --    : PC$Vertical ('F' floor, 'C' ceil, 'T' top, 'B' bottom)
  --
    
    -- Reference item --
    LN$PosX    Number;
    LN$PosY    Number;
    LN$Width    NUMBER;
    LN$Heigth    NUMBER;
    -- Item to move --
    LN$Bwidth    NUMBER;
    LN$Bheigth    NUMBER;
    LN$NewX    NUMBER;
    LN$NewY    NUMBER ;    
    -- Offset --
    LN$Pos    PLS_INTEGER ;
    LN$HOffset    NUMBER := 0 ;
    LN$VOffset    NUMBER := 0 ;
    -- Coordinate system --
    LC$Scoord    VARCHAR2(100) := Get_Form_Property( Name_in('system.current_form'), COORDINATE_SYSTEM ) ;

Begin

    -- Reference item --
    LN$PosX    := Get_Item_Property(PC$Item_Ref, X_POS );
    LN$PosY    := Get_Item_Property(PC$Item_Ref, Y_POS );
    LN$Width    := Get_Item_Property(PC$Item_Ref, WIDTH );
    LN$Heigth    := Get_Item_Property(PC$Item_Ref, HEIGHT );

    -- Item to move --
    LN$BWidth  := Get_Item_Property(PC$Bouton, WIDTH );
    LN$BHeigth := Get_Item_Property(PC$Bouton, HEIGHT );        

    -- Offsets --
    LN$Pos := Instr( PC$Horizontal, '-' ) ;
    If LN$Pos > 0 Then
        LN$HOffset := To_Number( Substr( PC$Horizontal, LN$Pos, 5 ) ) ;
    End if ;
    LN$Pos := Instr( PC$Horizontal, '+' ) ;
    If LN$Pos > 0 Then
        LN$HOffset := To_Number( Substr( PC$Horizontal, LN$Pos, 5 ) ) ;
    End if ;
    
    LN$Pos := Instr( PC$Vertical, '-' ) ;
    If LN$Pos > 0 Then
        LN$VOffset := To_Number( Substr( PC$Vertical, LN$Pos, 5 ) ) ;
    End if ;
    LN$Pos := Instr( PC$Vertical, '+' ) ;
    If LN$Pos > 0 Then
        LN$VOffset := To_Number( Substr( PC$Vertical, LN$Pos, 5 ) ) ;
    End if ;
    
    -- Conversion of offset in pixel --
    If LC$Scoord = 'INCHES' Then
         LN$HOffset := LN$HOffset * 0.0104 ;
         LN$VOffset := LN$VOffset * 0.0104 ;
    ElsIf LC$Scoord = 'POINTS' Then
         LN$HOffset := LN$HOffset * 1.333 ;
         LN$VOffset := LN$VOffset * 1.333 ;
    ElsIf LC$Scoord = 'CENTIMETERS' Then
         LN$HOffset := LN$HOffset * 0.0263 ;
         LN$VOffset := LN$VOffset * 0.0263 ;
    End if ;
    
    If Substr(PC$Horizontal,1,1) = 'L' Then -- on left
        If Substr(PC$Vertical,1,1) Not in ('B','T') Then
              LN$NewX := LN$PosX - LN$BWidth ;
        Else
            LN$NewX := LN$PosX ;
        End if ;
    Else -- on right
        If Substr(PC$Vertical,1,1) Not in ('B','T') Then
            LN$NewX := LN$PosX + LN$Width ;
        Else
            LN$NewX := LN$PosX + LN$Width - LN$BWidth ;
        End if ;
    End if ;
    LN$NewX := LN$NewX + LN$HOffset ;
    
    If Substr(PC$Vertical,1,1) = 'F' Then -- floor
       LN$NewY := (LN$PosY + LN$Heigth) - LN$BHeigth ;
    ElsIf Substr(PC$Vertical,1,1) = 'C' Then -- ceil
          LN$NewY := LN$PosY ;
    ElsIf Substr(PC$Vertical,1,1) = 'T' Then -- top
          LN$NewY := LN$PosY - LN$BHeigth ;
      Else -- bottom
         LN$NewY := LN$PosY + LN$Heigth  ;
    End if ;

    LN$NewY := LN$NewY + LN$VOffset ;
    
    Set_Item_Property( PC$Bouton, POSITION, LN$NewX, LN$NewY ) ;
    
END;

Qu'il suffit de copier dans une de vos librairies PL/SQL attachée à votre forme de référence

Remerciements

Chaleureux remerciements à Developpez.com et à l'équipe SGBD.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+