<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Varrendo DataSet com Métodos Anônimos</title>
	<atom:link href="http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/</link>
	<description>Desenvolvimento de software, tecnologia e afins.</description>
	<lastBuildDate>Wed, 28 Jul 2010 14:19:50 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<item>
		<title>By: Magno Machado Paulo</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-288628</link>
		<dc:creator>Magno Machado Paulo</dc:creator>
		<pubDate>Mon, 21 Jun 2010 12:46:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-288628</guid>
		<description>&lt;a href=&quot;#comment-288627&quot; rel=&quot;nofollow&quot;&gt;@Wagner Freitas &lt;/a&gt; 
Pior que eu acho que não tenho mais o código. Vou ver se encontro, ou implemento novamente (era bem simples) e posto em algum lugar.</description>
		<content:encoded><![CDATA[<p><a href="#comment-288627" rel="nofollow">@Wagner Freitas </a><br />
Pior que eu acho que não tenho mais o código. Vou ver se encontro, ou implemento novamente (era bem simples) e posto em algum lugar.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Wagner Freitas</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-288627</link>
		<dc:creator>Wagner Freitas</dc:creator>
		<pubDate>Mon, 21 Jun 2010 12:30:40 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-288627</guid>
		<description>&lt;a href=&quot;#comment-264096&quot; rel=&quot;nofollow&quot;&gt;@Magno Machado &lt;/a&gt; 

Magno , vc poderia disponibilizar a unit com o IDataSetItator ?
O link informando já não existe mais.
Valeu!</description>
		<content:encoded><![CDATA[<p><a href="#comment-264096" rel="nofollow">@Magno Machado </a> </p>
<p>Magno , vc poderia disponibilizar a unit com o IDataSetItator ?<br />
O link informando já não existe mais.<br />
Valeu!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fabricio</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-279034</link>
		<dc:creator>Fabricio</dc:creator>
		<pubDate>Mon, 10 Aug 2009 12:47:10 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-279034</guid>
		<description>&lt;a href=&quot;#comment-270091&quot; rel=&quot;nofollow&quot;&gt;@Alexandre Machado &lt;/a&gt; 

&lt;i&gt;Ao invés de gastarem a energia (pouca) que resta na CodeGear fazendo por exemplo uma RTTI mais poderosa, fizeram isto aí… lamentável.&lt;/i&gt;

Primeiro ponto: pouca energia? Cá entre nós, entre o D2006 e o D2009 se corrigiu mais erros novos e antigos do que entre 1995 e 2002...  Desde que os profissionais tomaram conta de si mesmos, nunca se viu tanto qc# sendo resolvido. Isso, para mim, é sinal de MUITA energia.

Segundo: anom methods (em alguns lugares, closures) são base para um sem-número de outras features possíveis. Creio que seja esta a causa deles já terem sido implementados.</description>
		<content:encoded><![CDATA[<p><a href="#comment-270091" rel="nofollow">@Alexandre Machado </a> </p>
<p><i>Ao invés de gastarem a energia (pouca) que resta na CodeGear fazendo por exemplo uma RTTI mais poderosa, fizeram isto aí… lamentável.</i></p>
<p>Primeiro ponto: pouca energia? Cá entre nós, entre o D2006 e o D2009 se corrigiu mais erros novos e antigos do que entre 1995 e 2002&#8230;  Desde que os profissionais tomaram conta de si mesmos, nunca se viu tanto qc# sendo resolvido. Isso, para mim, é sinal de MUITA energia.</p>
<p>Segundo: anom methods (em alguns lugares, closures) são base para um sem-número de outras features possíveis. Creio que seja esta a causa deles já terem sido implementados.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fabricio</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-279032</link>
		<dc:creator>Fabricio</dc:creator>
		<pubDate>Mon, 10 Aug 2009 12:40:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-279032</guid>
		<description>&lt;a href=&quot;#comment-276803&quot; rel=&quot;nofollow&quot;&gt;@Jim McKeeth &lt;/a&gt; 
Do you read portuguese?</description>
		<content:encoded><![CDATA[<p><a href="#comment-276803" rel="nofollow">@Jim McKeeth </a><br />
Do you read portuguese?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fernando</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-277407</link>
		<dc:creator>Fernando</dc:creator>
		<pubDate>Mon, 22 Jun 2009 18:12:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-277407</guid>
		<description>Realmente muito bom!</description>
		<content:encoded><![CDATA[<p>Realmente muito bom!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jim McKeeth</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-276803</link>
		<dc:creator>Jim McKeeth</dc:creator>
		<pubDate>Fri, 12 Jun 2009 23:00:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-276803</guid>
		<description>Brilliant!  Thank-you!</description>
		<content:encoded><![CDATA[<p>Brilliant!  Thank-you!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Erick Sasse</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-270111</link>
		<dc:creator>Erick Sasse</dc:creator>
		<pubDate>Sat, 21 Mar 2009 03:16:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-270111</guid>
		<description>Alexandre, concordo que métodos anônimos não são tão importantes, mas já que eles foram criados e já estão a disposição, acho melhor tirar proveito. :)</description>
		<content:encoded><![CDATA[<p>Alexandre, concordo que métodos anônimos não são tão importantes, mas já que eles foram criados e já estão a disposição, acho melhor tirar proveito. <img src='http://www.ericksasse.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alexandre Machado</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-270091</link>
		<dc:creator>Alexandre Machado</dc:creator>
		<pubDate>Sat, 21 Mar 2009 01:40:33 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-270091</guid>
		<description>Copiando do CG forum hoje:

&quot;Good code is its own best documentation. As you&#039;re about to add
a comment, ask yourself, &#039;How can I improve the code so that
this comment isn&#039;t needed?&#039; Improve the code and then document
it to make it even clearer.&quot; -- Steve McConnell Code Complete

99% das implementações usando métodos anônimos em Delphi que vi até hoje diziam assim em sua primeira linha (Parafraseando Obama):

// YES WE CAN!

Ou seja... Sempre fizemos, nunca foi impecílio, só que agora tem uma forma mais estranha de fazer que permite construções realmente bizarras, tipo, uma chamada a um método que se estende por 100 linhas, com 3 ou 4 outros métodos sendo passado como parâmetros... 

Ao invés de gastarem a energia (pouca) que resta na CodeGear fazendo por exemplo uma RTTI mais poderosa, fizeram isto aí... lamentável.

Best regards.</description>
		<content:encoded><![CDATA[<p>Copiando do CG forum hoje:</p>
<p>&#8220;Good code is its own best documentation. As you&#8217;re about to add<br />
a comment, ask yourself, &#8216;How can I improve the code so that<br />
this comment isn&#8217;t needed?&#8217; Improve the code and then document<br />
it to make it even clearer.&#8221; &#8212; Steve McConnell Code Complete</p>
<p>99% das implementações usando métodos anônimos em Delphi que vi até hoje diziam assim em sua primeira linha (Parafraseando Obama):</p>
<p>// YES WE CAN!</p>
<p>Ou seja&#8230; Sempre fizemos, nunca foi impecílio, só que agora tem uma forma mais estranha de fazer que permite construções realmente bizarras, tipo, uma chamada a um método que se estende por 100 linhas, com 3 ou 4 outros métodos sendo passado como parâmetros&#8230; </p>
<p>Ao invés de gastarem a energia (pouca) que resta na CodeGear fazendo por exemplo uma RTTI mais poderosa, fizeram isto aí&#8230; lamentável.</p>
<p>Best regards.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eduardo</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-269627</link>
		<dc:creator>Eduardo</dc:creator>
		<pubDate>Wed, 18 Mar 2009 02:16:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-269627</guid>
		<description>Galera, boa noite.

Comecei a estudar estes metódos anônimos há alguns dias e como não gosto muito desta bagunça que eles trouxeram, encapsulei os métodos em procedures separadas, que por motivos transacionais, utilizam parâmetros do tipo TCustomConnection. No mesmo exemplo do ForEach, eu tenho uma procedure que executa diversas operações transacionais utilizando ADODataSets e kbmMemTables. 

Sei que os exemplos abaixo ficarão confusos, mas foi só para demonstrar como acabei precisando implementar uma TConnectionProc;

-- DataSet, geralmente eu passo uma kbmMemTable.
-- ConnectionProc, é uma procedure que possui TCustomConnection como parâmetro.
-- Connection, é o mesmo parâmetro utilizado em ConnectionProc, porém não consegui fazer de outro modo. Este TCustomConnection vem do ADODataSet de onde foram importados os dados para a kbmMemTable, porém como a kbmMemTable não possui a propriedade Connection nativa, preciso passar o parâmetro da ADODataSet.Connection para dentro desta função via parâmetro mesmo.

Finalmente, acabei precisando fazer o seguinte:

TConnectionProc = procedure(Connection: TCustomConnection) of Object;

procedure ForEach(DataSet: TDataSet; ConnectionProc: TConnectionProc; Connection: TCustomConnection);
var
  bmPos: TBookmark;
begin
  with DataSet do
   begin
     try
       DisableControls;
       bmPos := Bookmark;
       First;

       while not Eof do
        begin
          ConnectionProc( Connection );
          Next;
        end;

     finally
       BookMark := bmPos;
       EnableControls;
     end;
   end;
end;

procedure ReservaOSPecasAplicadas(Conexao: TCustomConnection);
begin
  (...)
end;

procedure GravaDadosGravacao;
var
  Conexao: TCustomConnection;
  ConnectionProc: TConnectionProc;
begin
  ( ... )
  ConnectionProc := ReservaOSPecasAplicadas;
  DMP.ForEach( kbmOSServicoLaboratPecasAplicadas, ConnectionProc, Conexao );
  (...)
end;</description>
		<content:encoded><![CDATA[<p>Galera, boa noite.</p>
<p>Comecei a estudar estes metódos anônimos há alguns dias e como não gosto muito desta bagunça que eles trouxeram, encapsulei os métodos em procedures separadas, que por motivos transacionais, utilizam parâmetros do tipo TCustomConnection. No mesmo exemplo do ForEach, eu tenho uma procedure que executa diversas operações transacionais utilizando ADODataSets e kbmMemTables. </p>
<p>Sei que os exemplos abaixo ficarão confusos, mas foi só para demonstrar como acabei precisando implementar uma TConnectionProc;</p>
<p>&#8211; DataSet, geralmente eu passo uma kbmMemTable.<br />
&#8211; ConnectionProc, é uma procedure que possui TCustomConnection como parâmetro.<br />
&#8211; Connection, é o mesmo parâmetro utilizado em ConnectionProc, porém não consegui fazer de outro modo. Este TCustomConnection vem do ADODataSet de onde foram importados os dados para a kbmMemTable, porém como a kbmMemTable não possui a propriedade Connection nativa, preciso passar o parâmetro da ADODataSet.Connection para dentro desta função via parâmetro mesmo.</p>
<p>Finalmente, acabei precisando fazer o seguinte:</p>
<p>TConnectionProc = procedure(Connection: TCustomConnection) of Object;</p>
<p>procedure ForEach(DataSet: TDataSet; ConnectionProc: TConnectionProc; Connection: TCustomConnection);<br />
var<br />
  bmPos: TBookmark;<br />
begin<br />
  with DataSet do<br />
   begin<br />
     try<br />
       DisableControls;<br />
       bmPos := Bookmark;<br />
       First;</p>
<p>       while not Eof do<br />
        begin<br />
          ConnectionProc( Connection );<br />
          Next;<br />
        end;</p>
<p>     finally<br />
       BookMark := bmPos;<br />
       EnableControls;<br />
     end;<br />
   end;<br />
end;</p>
<p>procedure ReservaOSPecasAplicadas(Conexao: TCustomConnection);<br />
begin<br />
  (&#8230;)<br />
end;</p>
<p>procedure GravaDadosGravacao;<br />
var<br />
  Conexao: TCustomConnection;<br />
  ConnectionProc: TConnectionProc;<br />
begin<br />
  ( &#8230; )<br />
  ConnectionProc := ReservaOSPecasAplicadas;<br />
  DMP.ForEach( kbmOSServicoLaboratPecasAplicadas, ConnectionProc, Conexao );<br />
  (&#8230;)<br />
end;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Cesar</title>
		<link>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/comment-page-1/#comment-267948</link>
		<dc:creator>Cesar</dc:creator>
		<pubDate>Thu, 05 Mar 2009 16:47:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834#comment-267948</guid>
		<description>Taí Frainer!

type
   TProcFieldsDataSet = reference to procedure(RecNo : integer; Fields : TFields);


// método

procedure ForeachInDataSets(DataSet : TDataSet; ProcFieldsDataSet : TProcFieldsDataSet);
begin
   DataSet.DisableControls;

   try
      DataSet.First;

      while not DataSet.Eof do
      begin
         ProcFieldsDataSet(DataSet.RecNo, DataSet.Fields);
         DataSet.Next;
      end;

   finally
      DataSet.EnableControls;
   end;
end;


// Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
   Soma : Currency;
begin
   Soma := 0;

   // Considerando que em ClientDataSet1 tem um campo chamado Valor

   ForeachInDataSets(ClientDataSet1, procedure(RecNo : integer; Fields : TFields)
                     begin
                        Soma := Soma + Fields.FieldByName(&#039;VALOR&#039;).AsCurrency;
                     end);

   ShowMessage(CurrtoStr(Soma));
end;</description>
		<content:encoded><![CDATA[<p>Taí Frainer!</p>
<p>type<br />
   TProcFieldsDataSet = reference to procedure(RecNo : integer; Fields : TFields);</p>
<p>// método</p>
<p>procedure ForeachInDataSets(DataSet : TDataSet; ProcFieldsDataSet : TProcFieldsDataSet);<br />
begin<br />
   DataSet.DisableControls;</p>
<p>   try<br />
      DataSet.First;</p>
<p>      while not DataSet.Eof do<br />
      begin<br />
         ProcFieldsDataSet(DataSet.RecNo, DataSet.Fields);<br />
         DataSet.Next;<br />
      end;</p>
<p>   finally<br />
      DataSet.EnableControls;<br />
   end;<br />
end;</p>
<p>// Exemplo:</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br />
var<br />
   Soma : Currency;<br />
begin<br />
   Soma := 0;</p>
<p>   // Considerando que em ClientDataSet1 tem um campo chamado Valor</p>
<p>   ForeachInDataSets(ClientDataSet1, procedure(RecNo : integer; Fields : TFields)<br />
                     begin<br />
                        Soma := Soma + Fields.FieldByName(&#8216;VALOR&#8217;).AsCurrency;<br />
                     end);</p>
<p>   ShowMessage(CurrtoStr(Soma));<br />
end;</p>
]]></content:encoded>
	</item>
</channel>
</rss>
