o laco de repeticao para percorrermos arrays de forma muito semelhante ao exemplo acima.type TMonthDays = array[1..31] of Boolean;var lWorkedDays: TMonthDays; lDay: Boolean; lCounter: Integer;begin FillMemory(@lWorkedDays, SizeOf(lWorkedDays), 0); lWorkedDays[1] := True; lWorkedDays[2] := True; lWorkedDays[5] := True; lCounter := 0; for lDay in lWorkedDays do begin if lDay then Inc(lCounter); end; ShowMessage('Sum: ' + IntToStr(lCounter));end;Observe que nesse nosso exemplo o indice do array nao e utilizado, mas apenas o valor de cada entrada.Aqui temos uma situacao que merece um certo destaque por permitir ao codigo fonte um incremento na clareza e legibilidade, evitando a declaracao de variaveis locais e especificando explicitamente os limites do array.Se considerarmos uma abordagem mais classica usando o laco for comum como, por exemplo:var i: Integer;begin // ... for i = 1 to 31 do // ...corremos o risco de introduzir um bug no sistema caso os limites do array seja moificado.Obviamente podemos evitar esse tipo de bug removendo os hard codes, for i = Low(TMonthDays) to High(TMonthDays) domas ainda assim dependeriamos do uso de uma variavel como contador do laco de repeticao.4. Uso com arrays dinamicosEssa e uma situacao levemente diferente do exemplo acima onde, em vez de termos um array com limites bem definidos, temos um array dinamico cujo tamanho pode variar inclusive durante a execucao do ForEach.Aqui novamente estamos considerando que saber o indice atual do laco de repeticao nao e requerido, mas somente o valor de cada entrada do array.var lWorkedDays: array of Boolean; lDay: Boolean; lCounter: Integer;begin SetLength(lWorkedDays, 31); lWorkedDays[0] := True; lWorkedDays[1] := True; lWorkedDays[4] := True; lCounter := 0; for lDay in lWorkedDays do begin if lDay then Inc(lCounter); end; ShowMessage('Sum: ' + IntToStr(lCounter));end;Uma particularidade do array dinamico e que a primeira entrada tem indice zero (0).Utilizando o ForEach para percorrer o array, seja estatico ou dinamico, o limite inicial e final e tratado de forma transparente pelo compilador.5. Usando com objetosEsse e o ultimo caso de uso do ForEach apresentado nesse artigo e o que merece mais atencao.Como os tipos nativos (conjuntos, strings e arrays) o Delphi tem total conhecimento de como devem ser manipulados. Ja quando a colecao e uma objeto, essa premissa nao e verdadeira e, nesse caso, e voce quem deve instruir o Delphi a acessar os itens do objeto de forma adequada.Observe o exemplo abaixo.var lFiles: TStrings; lFilename: string;begin // ... for lFilename in lFiles do begin // ... end;end; No codigo acima a variavel lFiles esta sendo usada para armazenar uma lista de nomes de arquivos que serao tratados, e o laco de repeticao ira acessar cada item dessa lista e repassar a variavel local lFilename o valor do item (nesse caso, a string com o nome do arquivo).O mesmo caso e valido para outras classes nativas do Delphi como por exemplo TTreeNode, TActionList, ...Bom ai vem a pergunta. Como o Delphi sabe qual e a lista de elementos da minha colecao quando se trata de um objeto?Se voce for na definicao da classe TStrings encontrara um metodo com o nome "GetEnumerator" cujo retorno e um objeto do tipo TStringsEnumerator. E e exatamente esse metodo