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.