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.