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 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
LN$PosX Number;
LN$PosY Number;
LN$Width NUMBER;
LN$Heigth NUMBER;
LN$Bwidth NUMBER;
LN$Bheigth NUMBER;
LN$NewX NUMBER;
LN$NewY NUMBER ;
LN$Pos PLS_INTEGER ;
LN$HOffset NUMBER := 0 ;
LN$VOffset NUMBER := 0 ;
LC$Scoord VARCHAR2(100) := Get_Form_Property( Name_in('system.current_form'), COORDINATE_SYSTEM ) ;
Begin
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 );
LN$BWidth := Get_Item_Property(PC$Bouton, WIDTH );
LN$BHeigth := Get_Item_Property(PC$Bouton, HEIGHT );
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 ;
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
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
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
LN$NewY := (LN$PosY + LN$Heigth) - LN$BHeigth ;
ElsIf Substr(PC$Vertical,1,1) = 'C' Then
LN$NewY := LN$PosY ;
ElsIf Substr(PC$Vertical,1,1) = 'T' Then
LN$NewY := LN$PosY - LN$BHeigth ;
Else
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