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

SheikYerbouti

procédure PL/SQL Move_item() ♪

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

- Auteur : SheikYerbouti

- Parution : 1 juillet 2004

- Mise à jour : 1 juillet 2004

- Licence :

Sommaire

- Introduction

- I. Démonstration

- Remerciements

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.