Uma mudança de hoje: FOR EACH

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uma mudança de hoje: FOR EACH

Mensagem por JoséQuintas »

Esta aqui precisei fazer uma parte de cada vez, pra não me atrapalhar:

Código: Selecionar todos

FUNCTION IndDbf( cDbf )

   LOCAL nCont, nCont2, aIndices, aIndDbf

   aIndDbf := {}
   aIndices := CnfDbfInd()
   FOR nCont = 1 TO Len( aIndices )
      IF aIndices[ nCont, 1 ] == cDbf
         FOR nCont2 = 1 TO Len( aIndices[ nCont, 3 ] )
            AAdd( aIndDbf, aIndices[ nCont, 3, nCont2 ] )
         NEXT
         EXIT
      ENDIF
   NEXT

   RETURN aClone( aIndDbf )

Código: Selecionar todos

FUNCTION IndDbf( cDbf )

   LOCAL aFileList, aTagList := {}, aThisFile, aThisTag

   aFileList := CnfDbfInd()
   FOR EACH aThisFile IN aFileList
      IF aThisFile[ 1 ] == cDbf
         FOR EACH aThisTag IN aThisFile[ 3 ]
            AAdd( aTagList, aThisTag )
         NEXT
         EXIT
      ENDIF
   NEXT

   RETURN aClone( aTagList )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uma mudança de hoje: FOR EACH

Mensagem por JoséQuintas »

Aqui não lembro qual o indicativo da quantidade de elementos, pra usar no lugar de Len( acFileList ):

Código: Selecionar todos

   acFileList := Directory( "*.*" )
   FOR EACH oElement IN acFileList
      GrafTempo( oElement:__EnumIndex, Len( acFileList ) )
      IF IsFileToBackup( oElement[ F_NAME ] )
         hb_ZipFile( cZipName, oElement[ F_NAME ] )
      ENDIF
      Inkey()
   NEXT
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uma mudança de hoje: FOR EACH

Mensagem por JoséQuintas »

Uma outra alteração numa rotina simples, mas acaba exigindo o uso de __EnumIndex

Código: Selecionar todos

      FOR nCont = 1 TO Len( GetList )
         IF nMRow == GetList[ nCont ]:Row .AND. nMCol >= GetList[ nCont ]:Col .AND. nMCol <= ( GetList[ nCont ]:Col + GetLen( GetList[ nCont ] ) )
            IF GetPreValidate( GetList[ nCont ] )
               nPos := nCont
               nEXITState := GE_MOUSEHIT
            ENDIF
         ENDIF
      NEXT

Código: Selecionar todos

      FOR EACH oElement IN GetList
         IF nMRow == oElement:Row .AND. nMCol >= oElement:Col .AND. nMCol <= ( oElement:Col + GetLen( oElement ) )
            IF GetPreValidate( oElement )
               nPos := oElement:__EnumIndex
               nEXITState := GE_MOUSEHIT
            ENDIF
         ENDIF
      NEXT
Fica mais claro o que faz com cada GET, que seria o oElement.
Como não tem mais a variável nCont, só resta usar o oElement:__EnumIndex pra saber a posição atual.
Mesmo assim, acho que valeu a pena.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uma mudança de hoje: FOR EACH

Mensagem por JoséQuintas »

Só faltou um acelerador aí, que já faltava antes:

Código: Selecionar todos

FOR EACH oElement IN GetList
    IF nMRow == oElement:Row .AND. nMCol >= oElement:Col .AND. nMCol <= ( oElement:Col + GetLen( oElement ) )
      IF GetPreValidate( oElement )
       nPos := oElement:__EnumIndex
       nEXITState := GE_MOUSEHIT
      EXIT
      ENDIF
    ENDIF
   NEXT
Se encontrar o que interessa, não precisa mais testar os outros gets, e já sai do FOR/EACH.
Neste caso não tem a ver com FOR/EACH, também faltava isto no FOR/NEXT.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uma mudança de hoje: FOR EACH

Mensagem por JoséQuintas »

Só faltou um comentário final aqui:

No começo do uso do FOR EACH, usar :__EnumIndex me parecia que era algo só pra complicar.
Com o tempo, achei até legal pra evitar variável adicional e me acostumei com ele.

Ele substitui o tradicional nCont, quando precisamos dele.

Código: Selecionar todos

FOR nCont = 1 TO Len( aArray )
   ? nCont, aArray[ nCont ]
NEXT

Código: Selecionar todos

FOR EACH oElement IN aArray
   ? oElement:__EnumIndex, oElement
NEXT
Numa rotina pequena como a acima parece complicar algo simples.
Mas em rotinas gigantescas, NÃO usar FOR EACH e :_EnumIndex é que faz complicar.

Levei um tempinho pra considerar isso como vantagem, deve acontecer o mesmo com todos.
É só questão de lembrar que isso existe, e começar a usar quando surgir oportunidade.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder