Voce sabe como funciona e como utilizar o ForEach no Delphi?O suporte ao ForEach foi adicionado no Delphi 2005 e tem como finalidade oferecer uma interface de acesso aos itens das colecoes (listas, filhas, filhas, array, conjuntos, vetores, ...) de forma simplificada e sem se preocupar com contadores ou com indices.A sintaxe do ForEach e:for item in collection dobegin // end;Note que na sitaxe do comando aparece a palavara reservada "in", o que reforca a ideia de um laco de repeticao destinado a trabalhar com conjuntos/colecoes, e e exatamente essa ideia que se deve manter em mente ao utilizar esse recurso em seu codigo fonte.Dependendo do tipo de colecao que se esta trabalhando, o comando tera uma caracteristica especifica, mas sempre mantendo a finalidade original.Vamos ver alguns exemplos de uso.1. Uso em conjuntosEsse e um dos usos mais frequentemente encontrado nos codigos fontes e que particularmente encorajo sua adocao e emprego.Para quem nao esta muito familiarizado com o uso de conjuntos, o exemplo abaixo pode parecer estranho, num primeiro momento, mas numa segunda olhada vera que e muito intuitivo.type TWeekDay = (wdDomingo, wdSegunda, wdTerca, wdQuarta, wdQuinta, wdSexta, wdSabado); TWeek = set of TWeekDay;const STRWEEKDAY: array[TWeekDay] of string = ('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab');var lDay: TWeekDay; lWorkDays: TWeek;begin lWorkDays := [wdSegunda, wdQuarta, wdSexta]; for lDay in lWorkDays do begin ShowMessage(STRWEEKDAY[lDay]); end;end;O exemplo acima define o conjunto TWeek baseado nos dias da semana (TWeekDay) e usa essa definicao para declarar a variavel local lWorkDays.Na primeira linha do bloco, nosso conjunto lWorkDays recebe a atribuicao de tres elementos, ou melhor, de tres dias da semana e e utilizada no ForEach abaixo.Como a colecao aqui e um conjunto, o laco de repeticao do comando for ir percorrer todas as possiveis entradas do conjunto, mas somente executara as instrucoes do bloco quando a respectiva entrada realmente esta presente no conjunto. Assim, no nosso exemplo, a funcao ShowMessage sera chamada tres vezes.Reforco a vantagem do uso do ForEach com conjuntos porque alem de intuitivo o codigo binario gerado e limpo, rapido e nao consome recursos como o quando e utilizado com objetos.2. Uso com stringsA utilizacao do ForEach com strings e um exemplo classico do passado, mas que ao meu ver tem mais pontos negativos do que positivos.const S: string = 'Using ForEach with strings';var lChar: Char;begin for lChar in S do begin if lChar in ['a','e','i','o','u'] then begin // ... end; end;end;Como dito anteriormente, o comando tera uma particularidade que depende do tipo de colecao utilizada, mas sempre centrado na ideia de acessar os elementos da colecao.No exemplo acima nossa colecao abrange todo o espectro do tipo Char, nativo do Delphi, e o laco de repeticao executara tantas vezes quanto for o numero de caracteres da string.Em outras palavras o comando for ira percorrer toda a string, atribuindo para a variavel local lChar o valor de cada caracter.Eu desencorajo a adocao dessa pratica como alternativa para percorrer strings porque o codigo binario gerado e, do ponto de vista de micro-otimizacoes, bastante oneroso por requerer a manipulacao do tipo string.3. Uso com arrays estaticosTambem podemos utilizar