Consultor Eletrônico



Kbase 21233: How to align fill-in widgets in Progress
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   10/28/2008
Status: Verified

GOAL:

How to align fill-in widgets in Progress

FACT(s) (Environment):

Windows
Progress 8.x
Progress 9.x

FIX:

1) Save the following procedure as ALIGN.I:


/************************ START OF ALIGN.I ***********************/
&GLOB EM_SETMARGINS   211
&GLOB EC_LEFTMARGIN   1
&GLOB EC_RIGHTMARGIN  2
&GLOB alLeft          0
&GLOB alRight         1
&GLOB alCenter        2

FUNCTION DIV RETURN INTEGER (INPUT iLeft AS INT, INPUT iRight AS INT):
RETURN INTEGER(TRUNC(iLeft / iRight,0)).
END FUNCTION.

PROCEDURE SendMessageA EXTERNAL "USER32.DLL":
DEFINE INPUT PARAMETER lHandle  AS LONG NO-UNDO.
DEFINE INPUT PARAMETER lMessage AS LONG NO-UNDO.
DEFINE INPUT PARAMETER wParam   AS LONG NO-UNDO.
DEFINE INPUT PARAMETER lParam   AS LONG NO-UNDO.
END PROCEDURE.

PROCEDURE DoALign.
DEFINE INPUT PARAMETER hWidget    AS HANDLE  NO-UNDO.
DEFINE INPUT PARAMETER iAlignment AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER DoAlLeft   AS LOGICAL NO-UNDO.

DEFINE VARIABLE iTextWidth AS INTEGER NO-UNDO.
DEFINE VARIABLE iLeft      AS INTEGER NO-UNDO.

ASSIGN iLeft      = 0
       iTextWidth = FONT-TABLE:GET-TEXT-WIDTH-PIXELS(hWidget:SCREEN-VALUE,hWidget:FONT).

IF (iAlignment = {&alCenter}) AND (DoAlLeft = TRUE) THEN
     ASSIGN iLeft = DIV(hWidget:WIDTH-PIXELS, 2) - DIV(iTextWidth,2) - 4.

IF (iAlignment = {&alRight}) AND (DoAlLeft = TRUE) THEN
ASSIGN iLeft = hWidget:WIDTH-PIXELS - iTextWidth - 8.

RUN SendMessageA(hWidget:HWND, {&em_setmargins}, {&ec_leftmargin} + {&ec_rightmargin}, iLeft).
END PROCEDURE.

/****************** END OF ALIGN.I ****************/

2) Include the procedure ALIGN.I in your code.

3) To align fill-in widgets use the following:


RUN DoAlign(FILL-IN-1:HANDLE, {&alLeft}, TRUE). /* Left Align */
RUN DoAlign(FILL-IN-1:HANDLE, {&alRight}, TRUE). /* Right Align */
RUN DoAlign(FILL-IN-1:HANDLE, {&alCenter}, TRUE). /* Center Align */