Clipper On Line • Ver Tópico - Uma mudança de hoje: FOR EACH

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

 

Uma mudança de hoje: FOR EACH

Mensagempor JoséQuintas » 15 Set 2016 14:49

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

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 )


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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uma mudança de hoje: FOR EACH

Mensagempor JoséQuintas » 15 Set 2016 14:53

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

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uma mudança de hoje: FOR EACH

Mensagempor JoséQuintas » 18 Set 2016 19:24

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

      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


      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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uma mudança de hoje: FOR EACH

Mensagempor JoséQuintas » 18 Set 2016 19:42

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

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uma mudança de hoje: FOR EACH

Mensagempor JoséQuintas » 12 Jan 2017 12:58

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.

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


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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 23 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro