Listando Widgets

 

Hoje vamos mostrar como listar todos widgets de uma sessão do Progress. A principal utilidade disso é podermos manipular qualquer objeto da tela usando procedures externas ou as famosas UPC’s da Datasul.

  

O código abaixo usa uma função recursiva para ler os Widgets da tela e gravar em uma temp-table.

 

SESSION:HANDLE -> Pega o handle da sessão, esse comando handle pode ser usado com qualquer objeto como você pode perceber ao utilizar o código abaixo.

  

/*Variavel que guarda o Widget que esta sendo gravada*/

DEFINE VARIABLE hCurrentWidget      AS WIDGET-HANDLE NO-UNDO.

 

DEFINE TEMP-TABLE Widgets NO-UNDO

    FIELD WidgetHandle AS WIDGET-HANDLE

    FIELD WidgetName< CHARACTER

    FIELD >WidgetType< CHARACTER

    FIELD WidgetParent AS WIDGET-HANDLE.   

 

/*Grava o handle da Sessão*/

ASSIGN hCurrentWidget = SESSION:HANDLE.

 

/*Chama a procedure passando o primeiro Widget*/

RUN WidgetList(hCurrentWidget).

 

OUTPUT TO myfile.txt. /* joga os valores do display para um arquivo. */

FOR EACH Widgets NO-LOCK BY WidgetHandle:

    DISPLAY

        INTEGER(WidgetHandle) FORMAT "9999999"

        WidgetName            FORMAT "X(15)"

        WidgetType            FORMAT "X(15)"

        INTEGER(WidgetParent) FORMAT "9999999".

END.

OUTPUT CLOSE.

 

/*  Essa procedure abaixo é o coração do programa, é uma função recursiva que pega todos os widgets que estejam abaixo do handle passado pra ela, no caso o handle da sessão. Veja que ela pode ser usada de diversas outras formas, caso você passe o handle de uma janela ela vai retornar tudo que ela encontrar nessa janela.  */

 

PROCEDURE WidgetList:

 

DEFINE INPUT  PARAMETER hWidgetScope AS WIDGET-HANDLE NO-UNDO.

DEFINE VARIABLE hCurrentWidget      AS WIDGET-HANDLE NO-UNDO.

 

ASSIGN

    hCurrentWidget = hWidgetScope:FIRST-CHILD NO-ERROR.

/*Enquando o Handle for valido, cria a tabela e pega o próximo handle*/

DO WHILE VALID-HANDLE(hCurrentWidget):

    CREATE Widgets.

    ASSIGN

        WidgetHandle = hCurrentWidget

        WidgetName   = hCurrentWidget:NAME

        WidgetType   = hCurrentWidget:TYPE

        WidgetParent = hCurrentWidget:PARENT.

 

    RUN WidgetList(hCurrentWidget).

 

    ASSIGN

        hCurrentWidget = hCurrentWidget:NEXT-SIBLING.

END.

 

END PROCEDURE

 

Conheça o Blog de Progress http:\\progressetecnologia.blogspot.com

 

Abraços e até o próximo artigo.