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
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()
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()
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.






