Percorrer Handle da rotina (capturar objetos)

Discussão em 'Progress 4GL' iniciado por wellington, Novembro 5, 2015.

  1. wellington

    wellington Membro Participativo

    Bom dia,
    Preciso de ajuda.

    Como eu faço para instanciar uma rotina (por exemplo: ftp\ft4001.r) em uma handle e percorrer todos os objetos desta rotina (fill in, frames etc).

    Tentei usando PERSISTENT jogando para uma handle, mas quando eu percorro os objetos da handle, ele somente me dá Procedures.

    O objetivo é usar os recursos (eventos e procedures) de uma rotina sem carrega-la.

    Obrigado.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    O melhor jeito é usando recursividade

    Segue rotina pronta:

    Código:
    PROCEDURE BuscaWidget.
      DEF INPUT PARAMETER ObjOrigem AS HANDLE. /* Handle do Frame/Objeto Original e dos próximas recursividades */
      DEF VAR ObjAtual AS HANDLE. /* Frame/Objeto Atual */
      DEF VAR ObjFilho AS HANDLE. /* Frame/Objeto 'Filho' */
     
      ObjAtual = ObjOrigem.
     
      DO WHILE VALID-HANDLE(ObjAtual):
      IF VALID-HANDLE(ObjAtual) THEN DO:
      IF ObjAtual:TYPE <> "WINDOW" AND ObjAtual:TYPE <> "FRAME" AND ObjAtual:TYPE <> "FIELD-GROUP" THEN DO:
      MESSAGE "Objeto: " + ObjAtual:NAME VIEW-AS ALERT-BOX.
      END.
      IF ObjAtual:TYPE = "FRAME" OR ObjAtual:TYPE = "FIELD-GROUP" THEN DO:
      ObjFilho = ObjAtual:FIRST-CHILD NO-ERROR.
      IF ERROR-STAT :ERROR = FALSE THEN DO:
      IF VALID-HANDLE(ObjFilho) THEN DO:
      RUN BuscaWidget(ObjFilho).
      END.
      END.
      END.
      ObjAtual = ObjAtual:NEXT-SIBLING NO-ERROR.
      END.
      ELSE LEAVE.
      END.
     
      IF VALID-HANDLE(ObjOrigem) THEN DO:
      ObjOrigem = ObjOrigem:FIRST-CHILD NO-ERROR.
      IF ERROR-STATUS :ERROR THEN RETURN.
      RUN BuscaWidget(ObjOrigem).
      END.
    END PROCEDURE.
    
    Depois basta chamar assim:

    RUN BuscaWidget(INPUT CURRENT-WINDOW). /* Para pegar todos os objetos do programa */

    RUN BuscaWidget(INPUT FRAME MyFrame). /* Para pegar os objetos que estão dentro do frame chamado MyFrame (Nome de exemplo) */

    Abraço

    Rafael
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    No código não é ERROR-STAT, mas sim ERROR-STATUS
  4. wellington

    wellington Membro Participativo

    Veja como estou pegando a handle


    DEFINE VARIABLE b AS widget-handle NO-UNDO.


    RUN rep/re0517.w PERSISTENT SET b.

    A rotina ainda não foi carregada, preciso carregar ela para uma instancia ou então de alguma forma pegar a handle dela.
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Você tentou fazer algo como:

    DEFINE VARIABLE b AS widget-handle NO-UNDO.

    RUN rep/re0517.w PERSISTENT SET b.

    RUN BuscaWidget(INPUT b).
    ou
    RUN BuscaWidget(INPUT b:THIS-PROCEDURE).
    ou
    RUN BuscaWidget(INPUT b:CURRENT-WINDOW).

    ??
  6. wellington

    wellington Membro Participativo

    Sim,
    quando eu uso RUN BuscaWidget(INPUT b), ele somente me retorna TYPE PROCEDURE
    quando eu uso RUN BuscaWidget(INPUT b:CURRENT-WINDOW), ele somente o TYPE WINDO.... e não tem nenhum objecto child

Compartilhe esta Página