<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" 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/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Erick Sasse</title>
	
	<link>http://www.ericksasse.com.br</link>
	<description>Desenvolvimento de software, tecnologia e afins.</description>
	<lastBuildDate>Wed, 24 Jun 2009 11:01:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ericksasse" type="application/rss+xml" /><feedburner:emailServiceId>ericksasse</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
		<title>Como desabilitar rapidamente constraints e triggers de um banco SQL Server</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/eK3bYd8CMns/</link>
		<comments>http://www.ericksasse.com.br/como-desabilitar-rapidamente-constraints-e-triggers-de-um-banco-sql-server/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 22:36:21 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=876</guid>
		<description><![CDATA[Quando se está importando dados para um banco, as constraints e triggers podem ser um chato obstáculo. Em alguns casos poder ser muito mais fácil desabilitar tudo e reativar no final do processo. Pesquisando sobre isso, encontrei essa ótima dica no StackOverflow.
Para desabilitar todas as constraints e triggers de todas as tabelas do banco:
exec sp_msforeachtable [...]]]></description>
			<content:encoded><![CDATA[<p>Quando se está importando dados para um banco, as constraints e triggers podem ser um chato obstáculo. Em alguns casos poder ser muito mais fácil desabilitar tudo e reativar no final do processo. Pesquisando sobre isso, encontrei essa <a href="http://stackoverflow.com/questions/123558/sql-server-2005-t-sql-to-temporarily-disable-a-trigger/123966#123966">ótima dica</a> no StackOverflow.</p>
<p><strong>Para desabilitar todas as constraints e triggers de todas as tabelas do banco:</strong></p>
<p><code>exec sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"<br />
exec sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER ALL"</code></p>
<p><strong>Para habilitar:</strong></p>
<p><code>exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"<br />
exec sp_msforeachtable "ALTER TABLE ? ENABLE TRIGGER ALL"</code></p>
<p>Alias, essa <strong>sp_msforeachtable</strong> é muito interessante e pode ser explorada de muitas formas diferentes. Testei no SQL Server 2008, mas deve funcionar no 2005 pelo menos.</p>
<p>Um detalhe a ser observado é que esse comando não desabilita constraint de PK nem UNIQUE.</p>
<p><map name='google_ad_map_876_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/876?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_876_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=876&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fcomo-desabilitar-rapidamente-constraints-e-triggers-de-um-banco-sql-server%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/como-desabilitar-rapidamente-constraints-e-triggers-de-um-banco-sql-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/como-desabilitar-rapidamente-constraints-e-triggers-de-um-banco-sql-server/</feedburner:origLink></item>
		<item>
		<title>Google Friend Connect Habilitado no Blog</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/1FdzzFPU8xI/</link>
		<comments>http://www.ericksasse.com.br/google-friend-connect-habilitado-no-blog/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 02:44:56 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=867</guid>
		<description><![CDATA[Acabei de habilitar o Google Friend Connect aqui no meu blog. Se você está lendo isso através de um leitor RSS ou outro meio, precisará acessar o site para ver a barra no topo o quadro na lateral do site.
A proposta do Google Friend Connect é aproximar as pessoas que visitam o blog, além de [...]]]></description>
			<content:encoded><![CDATA[<p>Acabei de habilitar o <a href="http://www.google.com/friendconnect/">Google Friend Connect</a> aqui no meu blog. Se você está lendo isso através de um leitor RSS ou outro meio, precisará acessar o site para ver <span style="text-decoration: line-through;">a barra no topo</span> o quadro na lateral do site.</p>
<p>A proposta do Google Friend Connect é aproximar as pessoas que visitam o blog, além de permitir usar suas contas de outros grandes sites como Google, Yahoo, AIM ou OpenID para interagir com o blog, postar comentários, recomendar a amigos, etc.</p>
<p>Ainda não pesquisei muito a respeito para ativar todos esses recursos. Por enquanto você pode se &#8220;inscrever&#8221; no site ai em cima. No próximo passo pretendo vincular a parte de comentários, mas isso vai depender da boa receptividade do recurso. Então se você acha uma boa idéia, inscreva-se aí. <img src='http://www.ericksasse.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><map name='google_ad_map_867_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/867?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_867_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=867&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fgoogle-friend-connect-habilitado-no-blog%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/google-friend-connect-habilitado-no-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/google-friend-connect-habilitado-no-blog/</feedburner:origLink></item>
		<item>
		<title>Como Assinar Digitalmente Seus Aplicativos</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/jc85ldd11XI/</link>
		<comments>http://www.ericksasse.com.br/como-assinar-digitalmente-seus-aplicativos/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:59:03 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=860</guid>
		<description><![CDATA[No Windows Vista, quando o usuário tem o UAC ativado e vai instalar um aplicativo, uma confirmação é solicitada. Se seu aplicativo não possuir uma assinatura digital, uma tela bem ameaçadora de aviso é mostrada ao usuário dizendo que um programa não identificado precisa da sua autorização para ser executado. Avisos parecidos também aparecem em [...]]]></description>
			<content:encoded><![CDATA[<p>No Windows Vista, quando o usuário tem o UAC ativado e vai instalar um aplicativo, uma confirmação é solicitada. Se seu aplicativo não possuir uma assinatura digital, uma tela bem ameaçadora de aviso é mostrada ao usuário dizendo que um programa não identificado precisa da sua autorização para ser executado. Avisos parecidos também aparecem em diversos outros momentos, como quando se tenta executar um programa por uma caminho de rede.</p>
<p>Uma forma de amenizar esses alertas ao usuário é assinar digitalmente seus aplicativos. A assinatura digital teoricamente garante ao usuário que o arquivo veio realmente da empresa desenvolvedora, e mostra telas bem mais amigáveis, mostrando o nome da sua empresa como origem do aplicativo.</p>
<p>Isso mostra que toda empresa de software deveria assinar seus aplicativos. E foi isso que nós implementamos aqui nos últimos dias e vou dar algumas dicas de como fazer.</p>
<ul>
<li>Você precisa comprar um certificado digital de uma <a href="http://msdn.microsoft.com/en-us/library/ms995347.aspx">entidade certificadora de confiança</a> da Microsoft. Eu comprei da Comodo através da <a href="http://www.ksoftware.net/code_signing.html">K Software</a>. Segui os procedimentos descritos na própria página e foi tranquilo. Utilizei o Internet Explorer durante todo o processo, pois no Chrome não foi legal.</li>
<li>Após compra você vai receber um e-mail solicitando os documentos da empresa para comprovar que ela existe e que você é o responsável. Eu mandei o cartão CNPJ da empresa impresso em PDF pelo site da Receita Federal.</li>
<li>Eles também pedem um telefone pois dizem que vão te ligar, mas não me ligaram.</li>
<li>Depois de um ou dois dias recebi o e-mail dizendo que o certificado estava pronto, com o link para baixar. Utilizei o Internet Explorer 8 e seguindo as instruções, o certificado foi instalado na minha máquina.</li>
<li>Como eu iria fazer a assinatura durante nosso processo de build, precisava copiar o certificado para nossa máquina de build. Então exportei o certificado, entrando em Opções de Internet, Conteúdo, Certificados. Dessa forma foi gerado um arquivo .pfx, que é exatamente o que o FinalBuilder precisa na sua action Authenticode para aplicar assinaturas.</li>
<li>Também é necessária uma URL da entidade certificadora para aplicar timestamp nos arquivos. Isso geralmente está nas páginas de FAQ da entidade. Como <a href="http://www.instantssl.com/code-signing/code-signing-faq.html">aqui</a> no caso da Comodo.</li>
<li>Copiei o arquivo .pfx para minha máquina de build, apontei o FinalBuilder para ele, configurei a URL de timestamp e pronto, meus arquivos (*.exe) estão todos assinados!</li>
<li>Que eu saiba não existe limite e você pode assinar quantos arquivos quiser durante a validade do seu certificado.</li>
<li>Nós assinamos todos executáveis (*.exe), incluindo instaladores.</li>
<li>Também é possível assinar outros tipos de arquivos, mas como eu não fiz, não tenho dicas a respeito.</li>
<li>Para quem não usa FinalBuilder, precisa pesquisar como fazer sem ele, pois eu não fui atrás disso. Na página da K Software existe propaganda de uma ferramenta para assinar, mas tenho certeza que ou existem aplicativos no próprio Windows para isso, ou gratuítos em algum lugar para baixar.</li>
</ul>
<p>Espero que isso ajude um pouco.</p>
<p><map name='google_ad_map_860_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/860?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_860_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=860&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fcomo-assinar-digitalmente-seus-aplicativos%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/como-assinar-digitalmente-seus-aplicativos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/como-assinar-digitalmente-seus-aplicativos/</feedburner:origLink></item>
		<item>
		<title>Updates 3 e 4 para Delphi 2009</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/9DSjB8biMA4/</link>
		<comments>http://www.ericksasse.com.br/updates-3-e-4-para-delphi-2009/#comments</comments>
		<pubDate>Thu, 28 May 2009 10:14:35 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=854</guid>
		<description><![CDATA[É isso ai, de uma só vez a CodeGear disponibilizou dois updates para o Delphi 2009. Se você também usa o C++ Builder, serão 3 updates.

Post do Nick Hodges aqui.
Release notes aqui.
Lista do que foi corrigido no Update 3 aqui.
Lista do que foi corrigido no Update 4 (database pack) aqui.

Para instalar eu simplesmente lancei o &#8220;Check [...]]]></description>
			<content:encoded><![CDATA[<p>É isso ai, de uma só vez a CodeGear disponibilizou dois updates para o Delphi 2009. Se você também usa o C++ Builder, serão 3 updates.</p>
<ul>
<li>Post do Nick Hodges <a href="http://blogs.embarcadero.com/nickhodges/2009/05/27/39241">aqui</a>.</li>
<li>Release notes <a href="http://edn.embarcadero.com/article/39390">aqui</a>.</li>
<li>Lista do que foi corrigido no Update 3 <a href="http://edn.embarcadero.com/article/39387/">aqui</a>.</li>
<li>Lista do que foi corrigido no Update 4 (database pack) <a href="http://edn.embarcadero.com/article/39392/">aqui</a>.</li>
</ul>
<p>Para instalar eu simplesmente lancei o &#8220;Check for Updates&#8221; do meu Delphi e pronto, mas você também pode baixar os updates da <a href="http://www.codegear.com/downloads/regusers/delphi">área de download para usuários registrados</a>. Que foi o que eu fiz para instalar no restante das máquinas aqui.</p>
<p>A instalação foi tranquila, porém no about no meu Delphi, na caixa &#8220;Installed Updates&#8221; não aparece o Update 3, apenas o 4. Isso aconteceu para mais alguém aí? Vou testar em outras máquinas aqui para ver o que acontece.</p>
<p>Não achei nada sobre Windows 7 na lista de correções, então acredito que o <a href="http://www.ericksasse.com.br/problema-com-delphi-no-windows-7/">problema do debugger</a> continue.</p>
<p><map name='google_ad_map_854_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/854?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_854_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=854&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fupdates-3-e-4-para-delphi-2009%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/updates-3-e-4-para-delphi-2009/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/updates-3-e-4-para-delphi-2009/</feedburner:origLink></item>
		<item>
		<title>Novos Brinquedos</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/wBOYiNBBoJA/</link>
		<comments>http://www.ericksasse.com.br/novos-brinquedos/#comments</comments>
		<pubDate>Fri, 22 May 2009 21:36:11 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=850</guid>
		<description><![CDATA[Nas últimas semanas adquiri alguns novos brinquedos e pretendo em breve falar um pouco deles aqui:

MacBook
iPhone 3G
Sony Reader Digital Book PRS-505

Se quiserem saber algo específico sobre estes equipamentos, fiquem a vontade para postar nos comentários e eu responderei nos futuros posts.



]]></description>
			<content:encoded><![CDATA[<p>Nas últimas semanas adquiri alguns novos brinquedos e pretendo em breve falar um pouco deles aqui:</p>
<ul>
<li><a href="http://www.apple.com/br/macbook/">MacBook</a></li>
<li><a href="http://www.apple.com/br/iphone/">iPhone 3G</a></li>
<li><a href="http://www.sonystyle.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=10551&amp;storeId=10151&amp;langId=-1&amp;productId=8198552921665245739">Sony Reader Digital Book PRS-505</a></li>
</ul>
<p>Se quiserem saber algo específico sobre estes equipamentos, fiquem a vontade para postar nos comentários e eu responderei nos futuros posts.</p>
<p><map name='google_ad_map_850_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/850?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_850_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=850&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fnovos-brinquedos%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/novos-brinquedos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/novos-brinquedos/</feedburner:origLink></item>
		<item>
		<title>Varrendo DataSet com Métodos Anônimos</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/0qVYkrwfpgU/</link>
		<comments>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 01:05:56 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=834</guid>
		<description><![CDATA[Métodos anônimos é um dos novos recursos trazidos pelo Delphi 2009. De início ele parece meio estranho e podemos levar um tempo para nos acostumar com a sintaxe, mas podem ser bem úteis em alguns casos como o que eu vou mostrar agora.
Quantas vezes você já não precisou escrever código para varrer um dataset do [...]]]></description>
			<content:encoded><![CDATA[<p>Métodos anônimos é um dos novos recursos trazidos pelo Delphi 2009. De início ele parece meio estranho e podemos levar um tempo para nos acostumar com a sintaxe, mas podem ser bem úteis em alguns casos como o que eu vou mostrar agora.</p>
<p>Quantas vezes você já não precisou escrever código para varrer um dataset do início ao fim?</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">DataSet<span style="color: #000066;">.</span><span style="color: #006600;">First</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000000; font-weight: bold;">not</span> DataSet<span style="color: #000066;">.</span><span style="color: #000066;">Eof</span> <span style="color: #000000; font-weight: bold;">do</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  <span style="color: #808080; font-style: italic;">//</span>
  <span style="color: #808080; font-style: italic;">// Faz alguma coisa com o registro atual</span>
  <span style="color: #808080; font-style: italic;">//</span>
  DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Isso pode ficar ainda maior se você precisar usar DisableControls ou ainda restaurar o ponteiro do registro do DataSet após a varredura:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span>
  Bookmark<span style="color: #000066;">:</span> TBookmark<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  DataSet<span style="color: #000066;">.</span><span style="color: #006600;">DisableControls</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">try</span>
    Bookmark <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Bookmark</span><span style="color: #000066;">;</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">First</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000000; font-weight: bold;">not</span> DataSet<span style="color: #000066;">.</span><span style="color: #000066;">Eof</span> <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">begin</span>
      <span style="color: #808080; font-style: italic;">//</span>
      <span style="color: #808080; font-style: italic;">// Faz alguma coisa com o registro atual</span>
      <span style="color: #808080; font-style: italic;">//</span>
      DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Bookmark</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Bookmark<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">finally</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">EnableControls</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Esse código todo é praticamente repetido em todas as varreduras que precisamos fazer em um DataSet. Então seria muito útil se pudéssemos extrair esse código e trocar apenas a parte que &#8220;faz alguma coisa com o registro atual&#8221;. </p>
<p>É aqui que os métodos anônimos nos ajudam muito.</p>
<p>Na unit SysUtils do Delphi, existe um tipo TProc declarado desta forma:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">type</span>
  TProc <span style="color: #000066;">=</span> reference <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #000000; font-weight: bold;">procedure</span><span style="color: #000066;">;</span></pre></div></div>

<p>E vamos usá-lo para criar uma procedure que recebe um dataset e um método anônimo como parâmetros:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">procedure</span> ForEach<span style="color: #000066;">&#40;</span>DataSet<span style="color: #000066;">:</span> TDataSet<span style="color: #000066;">;</span> Proc<span style="color: #000066;">:</span> TProc<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  Bookmark<span style="color: #000066;">:</span> TBookmark<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  DataSet<span style="color: #000066;">.</span><span style="color: #006600;">DisableControls</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">try</span>
    Bookmark <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Bookmark</span><span style="color: #000066;">;</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">First</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000000; font-weight: bold;">not</span> DataSet<span style="color: #000066;">.</span><span style="color: #000066;">Eof</span> <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">begin</span>
      Proc<span style="color: #000066;">;</span>
      DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">Bookmark</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Bookmark<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">finally</span>
    DataSet<span style="color: #000066;">.</span><span style="color: #006600;">EnableControls</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>E com isso podemos chamar a procedure dessa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">ForEach<span style="color: #000066;">&#40;</span>Table1<span style="color: #000066;">,</span>
  <span style="color: #000000; font-weight: bold;">procedure</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    ShowMessage<span style="color: #000066;">&#40;</span>Table1NAME<span style="color: #000066;">.</span><span style="color: #006600;">Value</span><span style="color: #000066;">&#41;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></pre></div></div>

<p>Como eu disse, a sintaxe inicialmente é meio estranha, mas com o tempo você acostuma. No exemplo acima eu codifiquei uma procedure sem nome e sem parâmetros e passei para ser executado em cada registro. Eu tinha um dataset chamado Table1 no form. ShowMessage será chamado para cada registro. Além disso, ele desativa os controles conectados ao dataset e restaura o ponteiro no final.</p>
<p>Perceberam como isso facilita nossa vida? Então pronto, pode ir remover o monte de código duplicado que você tem em seus aplicativos. <img src='http://www.ericksasse.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Existe ainda uma idéia mais legal que é transformar esse recurso em um helper para a classe TDataSet, mas isso eu vou deixar para vocês como lição de casa ou para um próximo post aqui no blog.</p>
<p><strong>Update:</strong> Eu já estava prevendo que alguém comentasse isso. Sim, eu sei que já era possível antes com ponteiros de funções, mas com métodos anônimos é muito mais legal e é uma forma de tirar proveito dessa novidade do Delphi 2009. Para quem ainda não tem o Delphi 2009, vale a dica do amigo Marcos Douglas, postada nos comentários.</p>
<p><map name='google_ad_map_834_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/834?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_834_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=834&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fvarrendo-dataset-com-metodos-anonimos%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/varrendo-dataset-com-metodos-anonimos/</feedburner:origLink></item>
		<item>
		<title>Problemas com Delphi no Windows 7</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/oKxwV2eznco/</link>
		<comments>http://www.ericksasse.com.br/problema-com-delphi-no-windows-7/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 21:13:19 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=829</guid>
		<description><![CDATA[Depois de realizar mais testes, cheguei a conclusão que infelizmente o Windows 7 ainda não é uma boa opção para quem trabalha com Delphi.
Rodando o Delphi 2009 encontrei problemas na hora de usar o debugger em aplicativos com mais de uma thread. Quando uma exception é levantada, não é possível dar um break e resetar o [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de realizar mais testes, cheguei a conclusão que infelizmente o Windows 7 ainda não é uma boa opção para quem trabalha com Delphi.</p>
<p>Rodando o Delphi 2009 encontrei problemas na hora de usar o debugger em aplicativos com mais de uma thread. Quando uma exception é levantada, não é possível dar um break e resetar o aplicativo (Ctrl+F2) e você precisa reiniciar a IDE.</p>
<p>Já notifiquei o pessoal da CodeGear, mas como essa é uma versão beta e não suportada do Windows, não posso querer que eles resolvam.</p>
<p>Fica aí o alerta para os desenvolvedores Delphi.</p>
<p><map name='google_ad_map_829_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/829?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_829_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=829&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fproblema-com-delphi-no-windows-7%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/problema-com-delphi-no-windows-7/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/problema-com-delphi-no-windows-7/</feedburner:origLink></item>
		<item>
		<title>Google Chrome no Windows 7 64 bits</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/VnOubxTW-Hc/</link>
		<comments>http://www.ericksasse.com.br/google-chrome-no-windows-7-64-bits/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 18:08:19 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=822</guid>
		<description><![CDATA[Seguindo esta dica consegui fazer o Chrome funcionar perfeitamente no Windows 7.
Bastou adicionar o parâmetro &#8220;-in-process-plugins&#8221; no atalho do executável conforme screenshot abaixo:




]]></description>
			<content:encoded><![CDATA[<p>Seguindo <a href="http://www.blogsdna.com/1900/how-to-run-google-chrome-on-windows-7-64-bit-version.htm">esta dica</a> consegui fazer o Chrome funcionar perfeitamente no Windows 7.</p>
<p>Bastou adicionar o parâmetro &#8220;-in-process-plugins&#8221; no atalho do executável conforme screenshot abaixo:</p>
<p><img class="alignnone size-full wp-image-821" title="chromewindowsseven64bits" src="http://www.ericksasse.com.br/wp-content/uploads/2009/01/chromewindowsseven64bits.png" alt="chromewindowsseven64bits" width="377" height="533" /></p>
<p><map name='google_ad_map_822_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/822?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_822_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=822&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fgoogle-chrome-no-windows-7-64-bits%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/google-chrome-no-windows-7-64-bits/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/google-chrome-no-windows-7-64-bits/</feedburner:origLink></item>
		<item>
		<title>Primeiras impressões do Windows 7 com Delphi, Firebird e mais</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/TGG49avdoN0/</link>
		<comments>http://www.ericksasse.com.br/primeiras-impressoes-do-windows-7-delphi-firebird/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 17:36:46 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Firebird]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=813</guid>
		<description><![CDATA[Instalei o Windows 7 Beta build 7000 em uma máquina de testes e já deu tempo de brincar um pouco. A instalação foi totalmente tranquila, reconheceu todo o hardware assim como o Vista já fazia. Optei pela versão 64 bits, que já venho usando no Vista há algum tempo.
A nova task bar realmente é bem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ericksasse.com.br/wp-content/uploads/2009/01/windows7delphi2009.png"><img class="size-medium wp-image-814 alignright" title="Windows 7 Beta e Delphi 2009" src="http://www.ericksasse.com.br/wp-content/uploads/2009/01/windows7delphi2009-300x240.png" alt="Windows 7 Beta e Delphi 2009" width="300" height="240" /></a>Instalei o Windows 7 Beta build 7000 em uma máquina de testes e já deu tempo de brincar um pouco. A instalação foi totalmente tranquila, reconheceu todo o hardware assim como o Vista já fazia. Optei pela versão 64 bits, que já venho usando no Vista há algum tempo.</p>
<p>A nova task bar realmente é bem melhor e é a primeira diferença que se nota logo que o sistema inicializa.</p>
<p>Depois disso comecei a instalar alguns dos aplicativos que mais uso no dia-a-dia.</p>
<p>Instalados e rodando sem nenhum problema até agora:</p>
<ul>
<li>Delphi 2009</li>
<li>Firebird 2.1</li>
<li>IBExpert</li>
<li>TortoiseSVN</li>
<li>Mozilla Firefox</li>
</ul>
<p><span style="text-decoration: line-through;">Não funcionaram</span> Funcionando após algum ajuste:</p>
<ul>
<li>Google Chrome: O Windows avisa que tem problema de compatibilidade conhecido. E descobri essa <a href="/google-chrome-no-windows-7-64-bits/">dica de como fazer funcionar</a>.</li>
</ul>
<p>Conclusão, estou considerando sériamente em arriscar e instalar ele na minha máquina principal.</p>
<p>Para quem está interessado em testar e não tem assinatura MSDN nem TechNet, acho que ele vai estar disponível publicamente para download amanhã.</p>
<p><map name='google_ad_map_813_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/813?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_813_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=813&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fprimeiras-impressoes-do-windows-7-delphi-firebird%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/primeiras-impressoes-do-windows-7-delphi-firebird/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/primeiras-impressoes-do-windows-7-delphi-firebird/</feedburner:origLink></item>
		<item>
		<title>Windows 7 Beta disponível para download</title>
		<link>http://feedproxy.google.com/~r/ericksasse/~3/JqtvJPlMMjc/</link>
		<comments>http://www.ericksasse.com.br/windows-7-beta-disponivel-para-download/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 11:59:03 +0000</pubDate>
		<dc:creator>Erick Sasse</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=810</guid>
		<description><![CDATA[Já estou baixando minha cópia do Windows 7 Beta que foi disponibilizada nas últimas horas para todos os assinantes MSDN e TechNet.
Por mais que eu esteja bem satisfeito com o Vista, não dá pra negar que o mercado em geral não aceitou bem essa versão e por isso a Microsoft está acelerando o lançamento do [...]]]></description>
			<content:encoded><![CDATA[<p>Já estou baixando minha cópia do Windows 7 Beta que foi disponibilizada nas últimas horas para todos os assinantes MSDN e TechNet.</p>
<p>Por mais que eu esteja bem satisfeito com o Vista, não dá pra negar que o mercado em geral não aceitou bem essa versão e por isso a Microsoft está acelerando o lançamento do Windows 7.</p>
<p>Depois que terminar de baixar e instalar em alguma máquina para testes, posto meus comentários aqui.</p>
<p><map name='google_ad_map_810_553e3b693ffb9e44'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/810?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_810_553e3b693ffb9e44' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=810&amp;url= http%3A%2F%2Fwww.ericksasse.com.br%2Fwindows-7-beta-disponivel-para-download%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://www.ericksasse.com.br/windows-7-beta-disponivel-para-download/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.ericksasse.com.br/windows-7-beta-disponivel-para-download/</feedburner:origLink></item>
	</channel>
</rss>
