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+