Página 2 de 2

Uma mudança de hoje: FOR EACH

Enviado: 15 Set 2016 14:49
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 )

Uma mudança de hoje: FOR EACH

Enviado: 15 Set 2016 14:53
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

Uma mudança de hoje: FOR EACH

Enviado: 18 Set 2016 19:24
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.

Uma mudança de hoje: FOR EACH

Enviado: 18 Set 2016 19:42
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.

Uma mudança de hoje: FOR EACH

Enviado: 12 Jan 2017 13:58
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.