Because, when you generate Oracle Forms application from Oracle
Designer,
it is not always possible to place item at the exact position you want,
this is a
PL/SQL procedure which will do the job for you at runtime.
This procedure accept 4 parameters :
The reference item (VARCHAR2)
which is the item used to define the start display
The item to move (VARCHAR2)
which is the item you want to move
The horizontal position
(VARCHAR2) which can be ‘L’ (left) or ‘R’ (right)
The vertical position
(VARCHAR2) which can be 'F' (floor), 'C' (ceil), 'T' (top), 'B' (bottom)
Horizontal and vertical
arguments accept also a positive or a negative offset
specified in pixel
This is a hard copy of a
Forms dialog
And here is the procedure
called in the WHEN-BUTTON-PRESSED
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;
Then the hard copy of the
screen after the calls to the move_item() procedure
This procedure is
coordinate-system independent so conversion is made
If your screen is in INCHES,
POINTS or CENTIMETERS coordinate-system
If you want the :BL.BT7 item
on the Right + 20 pixels from the reference item, enter :
Move_Item ( 'BL.BTREF','BL.BT7','R+20','F') ;
Code of the Move_item()
procedure
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;