Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

Protheus :: ADVPL : The Container : Presents Pandora's box

Era uma vez um objeto que não queria limitar-se pelo escopo, seu desejo era fazer-se presente em todos os momentos, em todos os lugares, e que, como a um "Buraco Negro", tomava para si todos os demais objetos devorando-os e controlando-os. Tornou-se Publico por sua natureza e arrastou contigo tudo o que se lhe apresentava.

Um meio-youkai poderoso em busca do corpo perfeito. Queria tornar-se indestrutível.

Seu Nome a muito se perdeu. Uns o chamavam de Naraku, outros "The Container" (O Recipiente) e, muito recentemente, passou a denominar-se oWnd.

Sem Controle o devorador de objetos poderia ser invocado por GetWndDefault() e, quase tudo o que lhe pertencia estava contido em __ClsArr(). __ClsArr() uma "Internal Function" do "Protheus" (agora mais conhecido como By You) revela todos os poderes e segredos daqueles que podem ser devorados por oWnd.

As histórias se misturam, youkais, Deuses Gregos. Tudo sem controle. Descontrolado. Um perfeito CAOS na mais perfeita "Desordem". E eis que surge o "Mago иαldσ" e invoca o método ThePandorasBox():Open() e o processo descontrolado de controle têm inicio. E agora? Onde está Wally?

Posso usar :cCaption, :cTitle, :HWND, :cResName, ... etc. Uma certeza. O único exclusivo é :HWND mas ele pode trocar de lugar, se teletransportar e te enganar. Ele pode fazer a troca com outro que se pretende pôr-se em seu lugar. Não desaparecerá, mas poderá não estar onde o encontrou da última vez.

Eles são tendenciosos, cuidado. Podem se mesclar, se misturar, se disfarçar e a confusão está feita.

Domine-os para que não seja dominado. Obtenha e tome o controle.

Entenda o seu funcionamento: como aparecem e desaparecem, seu ordenamento, suas nomenclaturas, suas origens e não se deixe enganar, senão o próximo a ser devorado será você!

The Container : O Código


#INCLUDE "PROTHEUS.CH"
#INCLUDE "TRYEXCEPTION.CH"
/*/
 Funcao: U_TContainer()
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
User Function TContainer()

 Local bWindowInit
 
 Local cTitle  := "The Container"
 
 Local nVarNameLen := SetVarNameLen( 100 ) //Redefino para poder usar Nomes Longos
 
 Local oBmpNaraku

 IF !( Type( "oMainWnd" ) == "O" )

  Private oMainWnd
  
  bWindowInit := { || Pandora() , oMainWnd:End() }
 
  DEFINE WINDOW oMainWnd FROM 001,001 TO 400,500 TITLE OemToAnsi( cTitle )
   @ 0,0 BITMAP oBmpNaraku RESNAME "NARAKU" OF oMainWnd SIZE 0,0 NOBORDER WHEN .F. PIXEL
   oBmpNaraku:lAutoSize := .T.
   oBmpNaraku:lStretch  := .T.
   oBmpNaraku:Align   := CONTROL_ALIGN_ALLCLIENT
  ACTIVATE WINDOW oMainWnd MAXIMIZED ON INIT Eval( bWindowInit )

 Else

  Pandora()

 EndIF

 SetVarNameLen( nVarNameLen )    //Restauro o Padrao

Return( NIL )

/*/
 Funcao: Pandora
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function Pandora()

 Local aButtons  := {}
 Local aAdvSize  := MsAdvSize( NIL , .F. )
 Local aInfoAdvSize := { aAdvSize[1] , aAdvSize[2] , aAdvSize[3] , aAdvSize[4] , 0 , 0 }
 Local aObjCoords := { { 000 , 000 , .T. , .T. } }
 Local aMsObjSize := MsObjSize( aInfoAdvSize , aObjCoords )
 
 Local bSet15  := { || oDlg:End() }
 Local bSet24  := { || oDlg:End() } 
 Local bInitDlg  := { || EnchoiceBar( @oDlg , @bSet15 , @bSet24 , NIL , @aButtons ) }

 Local oDlg
 Local oBtnWally
 Local oHideEBar
 Local oShowEBar
 
 Private cAcesso  := "" //humpf... EnchoiceBar() necessita Disso...

 DEFINE MSDIALOG oDlg TITLE "Pandora" FROM aAdvSize[7],0 TO aAdvSize[6],aAdvSize[5]/1.3 OF GetWndDefault() PIXEL 

  @ 0,0 BITMAP oBmpPandora RESNAME "PANDORA" OF oDlg SIZE 0,0 NOBORDER WHEN .F. PIXEL
  oBmpPandora:lAutoSize := .T.
  oBmpPandora:lStretch  := .T.
  oBmpPandora:Align   := CONTROL_ALIGN_ALLCLIENT

  @ ( aMsObjSize[1,1] ) + 005 , ( aMsObjSize[1,2] ) BUTTON oBtnWally PROMPT OemToAnsi( "Onde Está Wally?" )         OF oDlg SIZE 150,13 PIXEL ACTION ShowWally()
  @ ( aMsObjSize[1,1] ) + 020 , ( aMsObjSize[1,2] ) BUTTON oHideEBar PROMPT OemToAnsi( "Esconda a Enchoice Bar" )       OF oDlg SIZE 150,13 PIXEL ACTION HideEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 035 , ( aMsObjSize[1,2] ) BUTTON oShowEBar PROMPT OemToAnsi( "Apresente a Enchoice Bar" )      OF oDlg SIZE 150,13 PIXEL ACTION ShowEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 050 , ( aMsObjSize[1,2] ) BUTTON oHideEBar PROMPT OemToAnsi( "Esconda Botão Ok da Enchoice Bar" )    OF oDlg SIZE 150,13 PIXEL ACTION HideBOKEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 065 , ( aMsObjSize[1,2] ) BUTTON oShowEBar PROMPT OemToAnsi( "Apresente Botão Ok da Enchoice Bar" )   OF oDlg SIZE 150,13 PIXEL ACTION ShowBOKEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 080 , ( aMsObjSize[1,2] ) BUTTON oHideEBar PROMPT OemToAnsi( "Esconda Botão Cancel da Enchoice Bar" )   OF oDlg SIZE 150,13 PIXEL ACTION HideBCancelEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 095 , ( aMsObjSize[1,2] ) BUTTON oShowEBar PROMPT OemToAnsi( "Apresente Botão Cancel da Enchoice Bar" )  OF oDlg SIZE 150,13 PIXEL ACTION ShowBCancelEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 110 , ( aMsObjSize[1,2] ) BUTTON oHideEBar PROMPT OemToAnsi( "Esconda Todos os Botões da Enchoice Bar" )   OF oDlg SIZE 150,13 PIXEL ACTION HideAllButtonsEnchoiceBar()
  @ ( aMsObjSize[1,1] ) + 125 , ( aMsObjSize[1,2] ) BUTTON oShowEBar PROMPT OemToAnsi( "Apresente Todos os Botões da Enchoice Bar" ) OF oDlg SIZE 150,13 PIXEL ACTION ShowAllButtonsEnchoiceBar()

 ACTIVATE DIALOG oDlg CENTERED ON INIT Eval( bInitDlg )

Return( NIL )

/*/
 Funcao: ShowWally
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowWally()

 Local aBitMap  := FindMsObject( "TBITMAP" )
 Local aButtons  := FindMsObject( "TBUTTON" )
 Local aMsDialg  := FindMsObject( "MSDIALOG" )
 Local oDlg   := aMsDialg[ aScan( aMsDialg , { |oObj| ( oObj:cCaption == OemToAnsi( "Pandora" ) ) } ) ]
 Local oBtnWally  := GetOctlFocus()

 Local oDlgWally
 Local oBmpWally
 Local oHideWally

 TRYEXCEPTION
  oBmpWally  := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:cResName == OemToAnsi( "WALLY" ) ) } ) ]
    ENDEXCEPTION
 
 TRYEXCEPTION
  oHideWally  := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Olá, eu Sou Wally. Clique aqui e me esconda" ) ) } ) ]
 ENDEXCEPTION

 TRYEXCEPTION
  oDlgWally  := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Ou, aqui, me Mostre em uma Nova Dialog" ) ) } ) ]
    ENDEXCEPTION

 IF ( oBtnWally:cCaption == "Se Escondeu a ele, Apresente-o Clicando aqui" )
  oHideWally  := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Olá, eu Sou Wally. Clique aqui e me esconda" ) ) } ) ]
  oBmpWally  := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:HWND == 4020 ) } ) ]
 EndIF

 IF !( ValType( oBmpWally ) == "O" )
  @ 015,170 BITMAP oBmpWally  RESNAME "WALLY" OF oDlg SIZE 500,500 NOBORDER WHEN .F. PIXEL MESSAGE OemToAnsi( "Olá, eu Sou Wally?" )
 Else
  oBmpWally:Show()
 EndIF  
 IF !( ValType( oHideWally ) == "O" )
  @ 175,170 BUTTON oHideWally PROMPT OemToAnsi( "Olá, eu Sou Wally. Clique aqui e me esconda" ) OF oDlg SIZE 180,13 PIXEL ACTION HideWally()
 Else
  oHideWally:Show()
 EndIF 

 IF !( ValType( oDlgWally ) == "O" )
  @ 190,170 BUTTON oDlgWally PROMPT OemToAnsi( "Ou, aqui, me Mostre em uma Nova Dialog" )  OF oDlg SIZE 180,13 PIXEL ACTION ShowNewWally()
 Else
  oDlgWally:Show()
 EndIF 

 oBtnWally:bAction := { || MsgInfo( "Já Me Encontrou" , "WALLY" ) }

Return( .T. )

/*/
 Funcao: HideWally
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideWally()
 Local aBitMap  := FindMsObject( "TBITMAP" )
 Local aButtons  := FindMsObject( "TBUTTON" )
 Local oDlgWally  := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Ou, aqui, me Mostre em uma Nova Dialog" ) ) } ) ]
 Local oBmpWally  := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:cResName == OemToAnsi( "WALLY" ) ) } ) ]
 Local oBtnWally  := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Onde Está Wally?" ) ) } ) ]
 Local oHideWally := GetOctlFocus()
 Local oShowWally
 IF ( oHideWally:cCaption == "Esconda o Meu Parente" )
  oHideWally   := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Olá, eu Sou Wally. Clique aqui e me esconda" ) ) } ) ]
  oHideWally:Hide()
  oBmpWally   := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:HWND == 4020 ) } ) ]
  oBmpWally:Hide()
  oDlgWally:Hide()
  oShowWally   := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Se Escondeu a ele, Apresente-o Clicando aqui" ) ) } ) ]
  oShowWally:bAction := { || ShowWally() }
 Else
  oHideWally:Hide()
  oBmpWally:Hide()
  oBtnWally:bAction := { || ShowWally() }
  oDlgWally:Hide()
 EndIF 
Return( .T. )

/*/
 Funcao: ShowNewWally
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowNewWally()

 Local aButtons  := {}
 Local aAdvSize  := MsAdvSize( .F. , .F. )
 Local aInfoAdvSize := { aAdvSize[1] , aAdvSize[2] , aAdvSize[3] , aAdvSize[4] , 0 , 0 }
 Local aObjCoords := { { 000 , 000 , .T. , .T. } }
 Local aMsObjSize := MsObjSize( aInfoAdvSize , aObjCoords )
    
 Local bInitDlg  := { || .T. }

 Local oDlg
 Local oBmpWally
 Local oBtnWally
 Local oBtnHideWSelf
 Local oBtnShowWSelf
 Local oBtnHideWParent
 Local oBtnShowWParent

 DEFINE MSDIALOG oDlg TITLE "Wally" FROM aAdvSize[7],0 TO aAdvSize[6],aAdvSize[5]/2.8 OF GetWndDefault() PIXEL 

  @ ( aMsObjSize[1,1] ) + 005 , ( aMsObjSize[1,2] ) BITMAP oBmpWally  RESNAME "WALLY" OF oDlg SIZE 500,500 NOBORDER WHEN .F. PIXEL MESSAGE OemToAnsi( "Olá, eu Sou Wally?" )
  @ ( aMsObjSize[1,1] ) + 160 , ( aMsObjSize[1,2] ) BUTTON oBtnWally  PROMPT OemToAnsi( "Quantos Wally´s?" ) OF oDlg SIZE 180,13 PIXEL ACTION CountWally()
  @ ( aMsObjSize[1,1] ) + 175 , ( aMsObjSize[1,2] ) BUTTON oBtnHideWSelf PROMPT OemToAnsi( "Clique aqui e Me Esconda" ) OF oDlg SIZE 180,13 PIXEL ACTION HideWallySelf()
  @ ( aMsObjSize[1,1] ) + 190 , ( aMsObjSize[1,2] ) BUTTON oBtnShowWSelf PROMPT OemToAnsi( "Se me Escondeu, Apresente-me Clicando aqui" ) OF oDlg SIZE 180,13 PIXEL ACTION MsgInfo( "Já Estou Visível" , "WAlly" )
  @ ( aMsObjSize[1,1] ) + 205 , ( aMsObjSize[1,2] ) BUTTON oBtnHideWSelf PROMPT OemToAnsi( "Esconda o Meu Parente" ) OF oDlg SIZE 180,13 PIXEL ACTION HideWally()
  @ ( aMsObjSize[1,1] ) + 220 , ( aMsObjSize[1,2] ) BUTTON oBtnShowWSelf PROMPT OemToAnsi( "Se Escondeu a ele, Apresente-o Clicando aqui" ) OF oDlg SIZE 180,13 PIXEL ACTION ShowWally()

 ACTIVATE DIALOG oDlg ON INIT Eval( bInitDlg )

Return( .T. )

/*/
 Funcao: CountWally
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function CountWally()

 Local aBitMap  := FindMsObject( "TBITMAP" )
 
 Local nWallyCount := 0
 
 aEval( aBitMap , { |oObj| IF( oObj:cResName == OemToAnsi( "WALLY" ) , ++nWallyCount , NIL ) } )

Return( MsgInfo( nWallyCount ) )

/*/
 Funcao: HideWallySelf
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideWallySelf()
 Local aBitMap := FindMsObject( "TBITMAP" )
 Local aButtons := FindMsObject( "TBUTTON" )
 Local oBmpWally := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:cResName == OemToAnsi( "WALLY" ) ) } ) ]
 Local oBtnWally := aButtons[ aScan( aButtons , { |oObj| ( oObj:cCaption == OemToAnsi( "Se me Escondeu, Apresente-me Clicando aqui" ) ) } ) ]
 oBmpWally:Hide()
 oBtnWally:bAction := { || ShowWallySelf() }
Return( .T. )

/*/
 Funcao: ShowWallySelf
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowWallySelf()
 Local aBitMap := FindMsObject( "TBITMAP" )
 oBmpWally  := aBitMap[ aScan( aBitMap , { |oObj| ( oObj:cResName == OemToAnsi( "WALLY" ) ) } ) ]
 oBmpWally:Show()
Return( .T. )

/*/
 Funcao: HideEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideEnchoiceBar()
 Local aEBar := FindMsObject( "TBAR" )
 aEBar[1]:Hide()
Return( .T. )

/*/
 Funcao: ShowEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowEnchoiceBar()
 Local aEBar := FindMsObject( "TBAR" )
 aEBar[1]:Show()
Return( .T. )

/*/
 Funcao: HideBOKEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideBOKEnchoiceBar()
 Local aBtnBmp := FindMsObject( "TBTNBMP" )
 Local oBtnOk := aBtnBmp[ aScan( aBtnBmp , { |oObj| ( oObj:cCaption == OemToAnsi( "OK" ) ) } ) ]
 oBtnOk:Hide()
Return( .T. )

/*/
 Funcao: ShowBOKEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowBOKEnchoiceBar()
 Local aBtnBmp := FindMsObject( "TBTNBMP" )
 Local oBtnOk := aBtnBmp[ aScan( aBtnBmp , { |oObj| ( oObj:cCaption == OemToAnsi( "OK" ) ) } ) ]
 oBtnOk:Show()
Return( .T. )

/*/
 Funcao: HideBCancelEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideBCancelEnchoiceBar()
 Local aBtnBmp  := FindMsObject( "TBTNBMP" )
 Local oBtnCancel := aBtnBmp[ aScan( aBtnBmp , { |oObj| ( oObj:cCaption == OemToAnsi( "Cancelar" ) ) } ) ]
 oBtnCancel:Hide()
Return( .T. )

/*/
 Funcao: ShowBCancelEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowBCancelEnchoiceBar()
 Local aBtnBmp  := FindMsObject( "TBTNBMP" )
 Local oBtnCancel := aBtnBmp[ aScan( aBtnBmp , { |oObj| ( oObj:cCaption == OemToAnsi( "Cancelar" ) ) } ) ]
 oBtnCancel:Show()
Return( .T. )

/*/
 Funcao: HideAllButtonsEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function HideAllButtonsEnchoiceBar()
 Local aBtnBmp := FindMsObject( "TBTNBMP" )
 aEval( aBtnBmp , { |oObj| oObj:Hide() } )
Return( .T. )

/*/
 Funcao: ShowAllButtonsEnchoiceBar
 Autor: Marinaldo de Jesus
 Data: 26/06/2011
 Uso: Demostrar a Manipulacao de Objetos Visuais do Protheus
/*/
Static Function ShowAllButtonsEnchoiceBar()
 Local aBtnBmp := FindMsObject( "TBTNBMP" )
 aEval( aBtnBmp , { |oObj| oObj:Show() } )
Return( .T. )

/*/
 Funcao:  FindMsObject
 Autor:  Marinaldo de Jesus
 Data:  26/06/2011
 Uso:  Retornar Array com os Objetos conforme cMsClassName
 Sintaxe: StaticCall( RNPLIB016 , FindMsObject , cMsClassName )
/*/
Static Function FindMsObject( cMsClassName , oWnd )

 Local aMsObject := {}

 Local oException
 
 TRYEXCEPTION
 
  DEFAULT oWnd := GetWndDefault()
  
  IF !( ValType( oWnd ) == "O" )
   BREAK
  EndIF
  
  IF !( ValType( cMsClassName ) == "C" )
   BREAK
  EndIF

  cMsClassName := Upper( cMsClassName )
  aMsObject  := FindObject( @oWnd , @cMsClassName )
  AddObj( @oWnd , @cMsClassName , @aMsObject )

 CATCHEXCEPTION USIONG oException

 ENDEXCEPTION
 
Return( aMsObject )

/*/
 Funcao:  FindObject
 Autor:  Marinaldo de Jesus
 Data:  26/06/2011
 Uso:  Retornar Array com os Objetos conforme cMsClassName
/*/
Static Function FindObject( oWnd , cMsClassName , aMsObject )
 
 Local aChild
 Local aControls

 Local nChild
 Local nChilds
 Local nControl
 Local nControls
 
 Local oChild

 DEFAULT aMsObject := {}
 
 BEGIN SEQUENCE

  aControls := oWnd:aControls

  IF ( aControls == NIL )
   AddObj( @oWnd , @cMsClassName , @aMsObject )
   oChild := oWnd:oWnd
   IF !( oChild == NIL )
    AddObj( @oChild , @cMsClassName , @aMsObject )
    FindObject( @oChild , @cMsClassName , @aMsObject ) 
   EndIF 
   BREAK
  EndIF

  nControls := Len( aControls )
  For nControl := 1 To nControls
   oChild := aControls[ nControl ]
   IF ( oChild == NIL )
    Loop
   EndIF
   AddObj( @oChild , @cMsClassName , @aMsObject )
   TRYEXCEPTION
    aChild := oChild:aControls 
    IF !( aChild == NIL )
     nChilds := Len( aChild )
     For nChild := 1 To nChilds
      oChild := aChild[ nChild ]
      IF !( oChild == NIL )
       IF ( oChild == NIL )
        Loop
       EndIF
       AddObj( @oChild , @cMsClassName , @aMsObject )
       FindObject( @oChild , @cMsClassName , @aMsObject ) 
      EndIF 
     Next nChild
    EndIF  
   ENDEXCEPTION
  Next nControl

  oChild := oWnd:oWnd
  IF !( oChild == NIL )
   AddObj( @oChild , @cMsClassName , @aMsObject )
   FindObject( @oChild , @cMsClassName , @aMsObject ) 
  EndIF 

 END SEQUENCE

Return( aMsObject )

/*/
 Funcao:  AddObj
 Autor:  Marinaldo de Jesus
 Data:  26/06/2011
 Uso:  Adicionar o Objeto 
/*/
Static Function AddObj( oObj , cMsClassName , aMsObject )

 Local cClassName := Upper( oObj:ClassName() )
 
 Local lAddObj  := .F.

 IF ( cClassName == cMsClassName )
  IF ( lAddObj := ( aScan( aMsObject , { |oFind| ( oFind == oObj ) } ) == 0 ) )
   aAdd( aMsObject , oObj )
  EndIF
 EndIF

Return( lAddObj )

/*/
 Funcao:  GetOctlFocus
 Autor:  Marinaldo de Jesus
 Data:  26/06/2011
 Uso:  Retorna o Objeto Ativo
/*/
Static Function GetOctlFocus()
 Local oWnd := GetWndDefault()
Return( oWnd:oCtlFocus )

A origem de Tudo. Encontre-a clicando aqui

Post Scriptum:

1 ) U_TContainer foi implementada usando o Protheus 10. Para a versão 11 (by you) necessita alguns ajustes.

2 ) Para obter todo o conhecimento proposto, execute U_TContainer diretamente no programa Inicial do Protheus ou via IDE, caso contrário, surpresas aparecerão e, como ainda não tem o domínio... Imagine o que pode acontecer. Para executá-lo via "fórmula" ou "chamada via Menu" ajustes serão necessários. Tendo o domínio. Modifique-o.


[]s
иαldσ dj

Comentários

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã