Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

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

1. 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
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 CENTIMETRES

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 procedure Move_item() 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+