<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>FD Web</title>
	
	<link>http://fdweb.com.br</link>
	<description />
	<pubDate>Sat, 15 Nov 2008 15:00:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/fdweb" type="application/rss+xml" /><item>
		<title>Visual Studio 2008 Express Edition</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/454053714/</link>
		<comments>http://fdweb.com.br/visual-studio-2008-express-edition/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 15:00:43 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[studio]]></category>

		<category><![CDATA[visual]]></category>

		<category><![CDATA[vs2008]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=66</guid>
		<description><![CDATA[As vers&#245;es Express s&#227;o vers&#245;es gratuitas e com alguns recursos limitados do Visual Studio 2008. Na maioria dos casos, as vers&#245;es Express atendem totalmente &#224;s necessidades dos programadores e pequenas empresas, deixando muito pouco a desejar em rela&#231;&#227;o a vers&#227;o completa do Visual Studio. Alguns dos recursos n&#227;o inclu&#237;dos na vers&#227;o Express s&#227;o projetos de [...]]]></description>
			<content:encoded><![CDATA[<p>As vers&otilde;es Express s&atilde;o vers&otilde;es gratuitas e com alguns recursos limitados do Visual Studio 2008. Na maioria dos casos, as vers&otilde;es Express atendem totalmente &agrave;s necessidades dos programadores e pequenas empresas, deixando muito pouco a desejar em rela&ccedil;&atilde;o a vers&atilde;o completa do Visual Studio. Alguns dos recursos n&atilde;o inclu&iacute;dos na vers&atilde;o Express s&atilde;o projetos de teste unit&aacute;rios, ferramenta para cria&ccedil;&atilde;o de relat&oacute;rio como o Crystal Reports, solution folders. Outra diferen&ccedil;a &eacute; que para cada linguagem existe uma ferramenta separada, assim como para web. Dessa forma, temos as seguintes ferramentas:</p>
<ul>
<li> <a href="http://www.microsoft.com/express/vb/default.aspx" target="_blank">Visual Basic 2008 Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vcsharp/" target="_blank">Visual C# 2008 Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vc/" target="_blank">Visual Web Developer Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vwd/" target="_blank">Visual C++ Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/sql/default.aspx" target="_blank">SQL Server 2005 Express Edition</a></li>
</ul>
<p>&Eacute; poss&iacute;vel tamb&eacute;m fazer o download de uma imagem ISO com todas as ferramentas em um mesmo pacote, para instala&ccedil;&otilde;es offline. Para seguir o link para <a href="http://www.microsoft.com/express/download/offline.aspx">Instala&ccedil;&atilde;o Offline do Visual Studio Express Edition</a>.</p>
<p>Tamb&eacute;m &eacute; necess&aacute;rio efetuar o registro de cada uma das ferramentas. A boa not&iacute;cia &eacute; que o registro &eacute; gratuito.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/visual-studio-2008-express-edition/">Visual Studio 2008 Express Edition</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/visual-studio-2008-express-edition/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/visual-studio-2008-express-edition/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Extension Methods</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/451874302/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-extension-methods/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 15:00:03 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[extension]]></category>

		<category><![CDATA[methods]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=51</guid>
		<description><![CDATA[Outro recurso importante introduzido pelo C# &#233; a possibilidade de adicionar novos m&#233;todos &#224; classes j&#225; existentes. Com esse recurso, &#233; poss&#237;vel estender classes nativas do .net framwork (como as classes string ou int). Por exemplo, &#233; poss&#237;vel adicionar um m&#233;todos chamado &#8220;CepValido&#8221; &#224; classe string. E isso &#233; feito de uma forma bem simples. [...]]]></description>
			<content:encoded><![CDATA[<p>Outro recurso importante introduzido pelo C# &eacute; a possibilidade de adicionar novos m&eacute;todos &agrave; classes j&aacute; existentes. Com esse recurso, &eacute; poss&iacute;vel estender classes nativas do .net framwork (como as classes string ou int). Por exemplo, &eacute; poss&iacute;vel adicionar um m&eacute;todos chamado &#8220;CepValido&#8221; &agrave; classe string. E isso &eacute; feito de uma forma bem simples. Apenas um cuidado deve-se tomar com rela&ccedil;&atilde;o ao <em>extension methods: </em>se n&atilde;o bem gerenciados, podem tornar-se um inferno para a manuten&ccedil;&atilde;o d&oacute; c&oacute;digo ou at&eacute; mesmo para a pr&oacute;pria implementa&ccedil;&atilde;o. Se por um lado podem ser muito &uacute;teis, por outro lado podem causar muitos problemas.</p>
<p>Vamos, ent&atilde;o, criar um m&eacute;todo que verifique se uma determinada <em>string</em> possui 8 caracteres e retornar <em>true </em>ou <em>false</em>. Fazemos isso com o c&oacute;digo abaixo:</p>
<blockquote><p>public bool CepValido(string cep)<br />
{<br />
if (cep.Length == <img src='http://fdweb.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
return true;<br />
else<br />
return false;<br />
}</p></blockquote>
<p>Por&eacute;m, este c&oacute;digo &eacute; apenas uma fun&ccedil;&atilde;o normal. Para que ela se torne uma extens&atilde;o da classe string precisamos fazer alguns ajustes ao c&oacute;digo.</p>
<ol>
<li>Os <em>extension methods</em> devem estar em uma classe p&uacute;blica e est&aacute;tica (public static class);</li>
<li>Devem, tamb&eacute;m, ser do tipo <em>public static;</em></li>
<li>Todo m&eacute;todo deve possuir pelo menos um par&acirc;metro, sendo este da classe a ser estendida, e possuir a palavra-chave <em>this</em> antes do tipo da classe;</li>
</ol>
<p>Vamos modificar o c&oacute;digo acima para que se torne, ent&atilde;o, um m&eacute;todo de extens&atilde;o:</p>
<blockquote><p><strong>public</strong> <strong>static</strong> class ExtensionClass<br />
{<br />
<strong>public</strong> <strong>static</strong> bool CepValido(<strong>this</strong> string cep)<br />
{<br />
if (cep.Length == <img src='http://fdweb.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
return true;<br />
else<br />
return false;<br />
}<br />
}</p></blockquote>
<p>Note a visibilidade <strong>public static </strong>tanto na declara&ccedil;&atilde;o da classe como na declara&ccedil;&atilde;o do m&eacute;todo, bem como a palavra-chave <em>this</em> antes do tipo (string) da vari&aacute;vel &#8220;cep&#8221;.</p>
<p>Agora, para poder utilizar a extens&atilde;o que acabamos de criar, basta importar o namespace onde se encontra a nossa classe criada (se for o mesmo namespace que o resto da aplica&ccedil;&atilde;o n&atilde;o &eacute; necess&aacute;rio fazer nada. Se voc&ecirc; n&atilde;o sabe o que &eacute; namespace ent&atilde;o o c&oacute;digo provavelmente ir&aacute; funcionar por si s&oacute;.) para a classe onde iremos utilizar a extens&atilde;o e declarar uma vari&aacute;vel do tipo string. Depois &eacute; s&oacute; chamar o m&eacute;todo CepValido, conforme segue abaixo:</p>
<blockquote><p>private void TesteExtensao()<br />
{<br />
string cep = &#8220;12345678&#8243;;<br />
if (cep.CepValido())<br />
MessageBox.Show(&#8221;Cep V&aacute;lido&#8221;);<br />
else<br />
MessageBox.Show(&#8221;Cep inv&aacute;lido&#8221;);</p>
<p>}</p></blockquote>
<p>Como pode ser visto, &eacute; muito f&aacute;cil implementar m&eacute;todos de extens&atilde;o, possibilitante escrever um c&oacute;digo mais limpo e de f&aacute;cil manutenibilidade (se usados corretamente). &Eacute; importante lembrar, tamb&eacute;m, que caso haja conflito de nomes entre um m&eacute;todo da inst&acirc;ncia de uma classe (por exemplo, toString) e um <em>extension method</em>, os m&eacute;todos da inst&acirc;ncia t&ecirc;m preced&ecirc;ncia sobre os m&eacute;todos de extens&atilde;o, ou seja, o m&eacute;todo nativo ser&aacute; executado.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/">Novidades do C# 3.0: Extension Methods</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-extension-methods/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-extension-methods/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Automatic Properties</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/450886411/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-automatic-properties/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 17:00:53 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[automatic]]></category>

		<category><![CDATA[properties]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=39</guid>
		<description><![CDATA[Esta &#233;, sem d&#250;vida, uma das mais interessantes novidades introduzidas no C# 3.0: Propriedades Autom&#225;ticas. Pelo menos para mim, a declara&#231;&#227;o de propriedades &#233; algo bastante chato, j&#225; que al&#233;m de declarar as propriedades, temos tamb&#233;m que, normalmente, declarar vari&#225;veis privadas e implementar o get e o set de cada propriedade. Com o novo recurso [...]]]></description>
			<content:encoded><![CDATA[<p>Esta &eacute;, sem d&uacute;vida, uma das mais interessantes novidades introduzidas no C# 3.0: <strong>Propriedades Autom&aacute;ticas. </strong>Pelo menos para mim, a declara&ccedil;&atilde;o de propriedades &eacute; algo bastante chato, j&aacute; que al&eacute;m de declarar as propriedades, temos tamb&eacute;m que, normalmente, declarar vari&aacute;veis privadas e implementar o <em>get</em> e o <em>set</em> de cada propriedade. Com o novo recurso de propriedades autom&aacute;ticas isto n&atilde;o &eacute; mais necess&aacute;rio.</p>
<p>Vamos aos exemplos. Vejamos como &eacute; forma antiga (e mais trabalhosa):</p>
<blockquote><p>// Declara as vari&aacute;veis privadas</p>
<p>private string _nome;</p>
<p>private int _idade;</p>
<p>public string Nome<br />
{</p>
<p style="padding-left: 30px;">get</p>
<p style="padding-left: 30px;">{</p>
<p style="padding-left: 60px;">return _nome;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">set</p>
<p style="padding-left: 30px;">{</p>
<p style="padding-left: 60px;">_nome = value;</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>public int Idade</p>
<p>{</p>
<p style="padding-left: 30px;">get</p>
<p style="padding-left: 30px;">{</p>
<p style="padding-left: 60px;">return _idade;</p>
<p style="padding-left: 30px;">}<br />
set</p>
<p style="padding-left: 30px;">{</p>
<p style="padding-left: 60px;">_idade = value;</p>
<p style="padding-left: 30px;">}</p>
<p>}</p></blockquote>
<p>E agora vejamos como fica o c&oacute;digo acima no C# 3.0:</p>
<blockquote><p>public string Nome { get; set; }<br />
public int Idade { get; set; }</p></blockquote>
<p>Bem mais simples, n&atilde;o &eacute; mesmo? E ainda existe um atalho para a declara&ccedil;&atilde;o de propriedades no Visual Studio: basta digitar <strong>prop</strong> e pressionar a tecla TAB. O pr&oacute;prio VS monta o esqueleto da propriedade, como segue abaixo:</p>
<blockquote><p>public int MyProperty { get; set; }</p></blockquote>
<p>Com esse novo recurso e mais o atalho fica muito f&aacute;cil e r&aacute;pido criar propriedades.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/">Novidades do C# 3.0: Automatic Properties</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-automatic-properties/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-automatic-properties/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Object Initializers</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/449614425/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-object-initializers/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 15:00:46 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[object initializers]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=34</guid>
		<description><![CDATA[Uma das novas funcionalidades do C# 3.0 s&#227;o os Objects Initializers, ou Inicializadores de Objetos. Esta novidade possibilita a inicializa&#231;&#227;o de objetos de uma forma mais pr&#225;tica e r&#225;pida. &#201; poss&#237;vel, inclusive, declarar e inicializar objetos com uma &#250;nica instru&#231;&#227;o.
Nas vers&#245;es anteriores, a inicializa&#231;&#227;o de objetos era feita da seguinte forma:
Cliente cli = new Cliente();
cli.Nome [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das novas funcionalidades do C# 3.0 s&atilde;o os Objects Initializers, ou <strong>Inicializadores de Objetos</strong>. Esta novidade possibilita a inicializa&ccedil;&atilde;o de objetos de uma forma mais pr&aacute;tica e r&aacute;pida. &Eacute; poss&iacute;vel, inclusive, declarar e inicializar objetos com uma &uacute;nica instru&ccedil;&atilde;o.</p>
<p>Nas vers&otilde;es anteriores, a inicializa&ccedil;&atilde;o de objetos era feita da seguinte forma:</p>
<blockquote><p>Cliente cli = new Cliente();</p>
<p>cli.Nome = &#8220;Fabio&#8221;;</p>
<p>cli.Idade = 26;</p></blockquote>
<p>Agora podemos abreviar esta inicializa&ccedil;&atilde;o, da seguinte forma:</p>
<blockquote><p>Cliente cli = new Cliente() { Nome = &#8220;Fabio&#8221;, Idade = 26};</p></blockquote>
<p>Ou ainda, para deixar o c&oacute;digo mais leg&iacute;vel:</p>
<blockquote><p>Cliente cli = new Cliente()</p>
<p>{</p>
<p>Nome = &#8220;Fabio&#8221;,</p>
<p>Idade = 26</p>
<p>};</p></blockquote>
<p>De qualquer forma, seja em uma &uacute;nica linha ou mais, n&atilde;o deixa de ser um recurso bastante interessante.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/">Novidades do C# 3.0: Object Initializers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-object-initializers/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-object-initializers/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Implicitly Typed Local Variables</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/448549024/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 16:15:38 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[novidades]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=31</guid>
		<description><![CDATA[Tamb&#233;m conhecida como &#8220;Infer&#234;ncia de tipos de vari&#225;veis&#8221;
O C# 3.0 traz uma nova palavra-chave chamada &#8220;var&#8221;. Com ela &#233; poss&#237;vel declarar uma vari&#225;vel cujo tipo &#233; determinado implicitamente pela express&#227;o utilizada para inicializ&#225;-la. A verifica&#231;&#227;o do tipo da vari&#225;vel &#233; feita em tempo de compila&#231;&#227;o. Vejamos os exemplos a seguir:
// Inicializa a vari&#225;vel Nome com [...]]]></description>
			<content:encoded><![CDATA[<h2>Tamb&eacute;m conhecida como &#8220;Infer&ecirc;ncia de tipos de vari&aacute;veis&#8221;</h2>
<p>O C# 3.0 traz uma nova palavra-chave chamada &#8220;var&#8221;. Com ela &eacute; poss&iacute;vel declarar uma vari&aacute;vel cujo tipo &eacute; determinado implicitamente pela express&atilde;o utilizada para inicializ&aacute;-la. A verifica&ccedil;&atilde;o do tipo da vari&aacute;vel &eacute; feita em tempo de compila&ccedil;&atilde;o. Vejamos os exemplos a seguir:</p>
<blockquote><p>// Inicializa a vari&aacute;vel Nome com a o texto &#8220;Fabio&#8221;. Em tempo de execu&ccedil;&atilde;o, Nome ser&aacute; do tipo <em>string</em></p>
<p>var Nome = &#8220;Fabio&#8221;;</p>
<p>// Inicializa OutroNome a partir de Nome. Ambas as variaveis ser&atilde;o do tipo <em>string</em> e conter&atilde;o o mesmo valor: &#8220;Fabio&#8221;</p>
<p>var OutroNome = Nome;</p>
<p>// Inicializa a vari&aacute;vel idade com o valor 20. Esta vari&aacute;vel ser&aacute; do tipo <em>int</em>;</p>
<p>var idade = 20;</p></blockquote>
<p>Como vimos nos exemplos acima, podemos facilmente declarar uma vari&aacute;vel sem sabermos o tipo exato durante sua declara&ccedil;&atilde;o. Alguns podem se perguntar: por que n&atilde;o utilizar ent&atilde;o o tipo object? Pois bem, como dito, a verifica&ccedil;&atilde;o do tipo da vari&aacute;vel &eacute; feita em tempo de compila&ccedil;&atilde;o, o que significa que uma vari&aacute;vel declarada com o tipo <em>var</em> e inicializada com o texto &#8220;xxx&#8221; ser&aacute;, para o compilador, do tipo string.</p>
<blockquote><p>Ex.</p>
<p>var Nome = &#8220;Fabio&#8221;; // Nome ser&aacute; do tipo string</p>
<p>string OutroNome = Nome; //Funciona pois Nome &eacute; do tipo string</p>
<p>object Sobrenome = &#8220;Centenaro&#8221;; //Inicializa vari&aacute;vel do tipo object</p>
<p>Nome = Sobrenome; //Erro de compila&ccedil;&atilde;o. N&atilde;o &eacute; poss&iacute;vel converter implicitamente object para string. &Eacute; obrigat&oacute;rio efetuar o cast.</p></blockquote>
<p>Outra d&uacute;vida que pode surgir &eacute;: j&aacute; que o tipo <em>var </em>&#8220;converte&#8221; automaticamente a vari&aacute;vel, ent&atilde;o por que continuar usando string, int, bool? A resposta &eacute; muito simples: &Eacute; poss&iacute;vel, sim, usar var no lugar de qualquer outro tipo, por&eacute;m isso torna o c&oacute;digo mais dif&iacute;cil de entender e dar manuten&ccedil;&atilde;o. Al&eacute;m do que, em muitos casos, n&atilde;o podemos inicializar uma vari&aacute;vel com algum valor, e inicializar uma vari&aacute;vel do tipo <em>var</em> com um valor do tipo -1 ou 0 apenas para que ela seja do tipo <em>int</em> &eacute; fazer uso da programa&ccedil;&atilde;o orientada a gambiarra. Se queremos uma vari&aacute;vel do tipo <em>int</em>, ent&atilde;o por que n&atilde;o declar&aacute;-la como <em>int</em>?</p>
<p>Al&eacute;m disso, mais algumas considera&ccedil;&otilde;es devem ser feitas:</p>
<ul>
<li>Este tipo de vari&aacute;vel n&atilde;o pode ser inicializada com o valor <em>null </em>(ou <em>Nothing</em> no VB);</li>
<li>Elas necessitam, obrigatoriamente, serem inicializadas e declaradas na mesma instru&ccedil;&atilde;o;</li>
<li>S&oacute; podem ser usadas como vari&aacute;veis locais, dentro de m&eacute;todos, e n&atilde;o como vari&aacute;veis de uma classe, nem como vari&aacute;veis p&uacute;blicas;</li>
<li>Elas s&atilde;o largamente utilizadas para declarar tipos an&ocirc;minos como parte de express&otilde;es do LINQ. Na verdade, esta &eacute; a principal fun&ccedil;&atilde;o deste tipo de vari&aacute;vel.</li>
</ul><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/">Novidades do C# 3.0: Implicitly Typed Local Variables</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/</feedburner:origLink></item>
		<item>
		<title>Implementando controle de transações com TransactionScope</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/318298322/</link>
		<comments>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 18:55:17 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[transacao]]></category>

		<category><![CDATA[transactionscope]]></category>

		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=27</guid>
		<description><![CDATA[Controle de transa&#231;&#245;es &#233; algo que passa batido em sistemas pequenos ou em sistemas onde a preocupa&#231;&#227;o com a consist&#234;ncia dos dados n&#227;o &#233; relevante (n&#227;o vou entrar na quest&#227;o que se um sistema possui dados inconsistentes ent&#227;o &#233; melhor n&#227;o ter sistema algum). Mas o n&#250;mero de programadores que n&#227;o utilizam algum sistema de [...]]]></description>
			<content:encoded><![CDATA[<p>Controle de transa&ccedil;&otilde;es &eacute; algo que passa batido em sistemas pequenos ou em sistemas onde a preocupa&ccedil;&atilde;o com a consist&ecirc;ncia dos dados n&atilde;o &eacute; relevante (n&atilde;o vou entrar na quest&atilde;o que se um sistema possui dados inconsistentes ent&atilde;o &eacute; melhor n&atilde;o ter sistema algum). Mas o n&uacute;mero de programadores que n&atilde;o utilizam algum sistema de controle de transa&ccedil;&atilde;o &eacute; bastante grande e a preocupa&ccedil;&atilde;o com os dados e a sua consist&ecirc;ncia acaba ficando em segundo plano. Deixou de ser exce&ccedil;&atilde;o o sistema que deve estar pronto em um curt&iacute;ssimo espa&ccedil;o de tempo e com isso outros aspectos que deveriam ser exce&ccedil;&atilde;o se tornaram regras. E controle de transa&ccedil;&atilde;o &eacute; um deles. Neste artigo veremos como implementar um sistema de transa&ccedil;&otilde;es utilizando o .NET Framework.</p>
<h2>Introdu&ccedil;&atilde;o</h2>
<p>O controle de transa&ccedil;&atilde;o serve para garantir a integridade dos dados. Isso significa que atrav&eacute;s dele podemos ter a certeza de que todos os dados ser&atilde;o gravados no banco de dados. Em caso de eventual falha em algum momento da grava&ccedil;&atilde;o todo o processo volta ao estado inicial, sem inser&ccedil;&otilde;es parciais. Ao encontrar um erro durante o processo (leia-se um ou mais <em>inserts</em> em seq&uuml;encia) simplesmente &eacute; dado um <em>rollback</em> e nada &eacute; gravado no banco. Ao completar o processo com sucesso, a transa&ccedil;&atilde;o d&aacute; um <em>commit</em> e grava os dados no banco.</p>
<h2>Exemplificando</h2>
<p>Peguemos um sistema de vendas como exemplo. Para efetuar um pedido, devemos gravar as informa&ccedil;&otilde;es do cliente na tabela <strong>cliente</strong>, os itens do pedido na tabela <strong>itens</strong>, atualizar o estoque na tabela <strong>produtos</strong> e por fim gravar os dados da venda na tabela <strong>vendas</strong>. Agora imaginemos que no meio deste processo &eacute; gerado algum erro. Digamos que j&aacute; tenhamos inserido os dados na tabela de clientes, os itens do pedido e atualizado o estoque. Falta apenas gravar os dados da venda. E neste momento ocorre algum erro. O que fazer com os dados que j&aacute; foram gravados? Como fica o estoque que j&aacute; foi atualizado? Em um sistema que n&atilde;o possui nenhum tipo de controle, isso seria o caos: o estoque fica comprometido, o banco de dados ganha inconsist&ecirc;ncias e nunca o sistema ser&aacute; confi&aacute;vel.</p>
<h2>Pondo a teoria em pr&aacute;tica</h2>
<p>Ent&atilde;o vamos implementar o nosso controle de transa&ccedil;&otilde;es utilizando o TransactionScope, fornecido pela biblioteca <em>System.Transactions.dll</em>. Em primeiro lugar devemos adicionar a referencia da biblioteca em nosso projeto. Com isso, basta ir no menu <strong>Project </strong>e depois em <strong>Add Reference</strong>.</p>
<p><img src="http://img77.imageshack.us/img77/4401/addreferencewm3.jpg" alt="Add Reference" width="374" height="396" /></p>
<p>Depois selecionamos o assembly System.Transactions.</p>
<p><img src="http://img369.imageshack.us/img369/8949/addtransactionup4.jpg" alt="Adding System.Transactions" /></p>
<p>Depois disso &eacute; s&oacute; p&ocirc;r a m&atilde;o na massa. Primeiramente adicionamos a refer&ecirc;ncia &agrave; nossa classe.</p>
<p>Em C#</p>
<blockquote><p>using System.Transactions;</p></blockquote>
<p>Em VB</p>
<blockquote><p>Imports System.Transactions</p></blockquote>
<p>Feito isso, agora implementar o controle de transa&ccedil;&otilde;es:</p>
<p>Em C#</p>
<blockquote><p>TransactionOptions options = new TransactionOptions();<br />
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;</p>
<p>using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))<br />
{<br />
//Insira os comandos de insert aqui</p>
<p>scope.Complete();</p>
<p>}</p></blockquote>
<p>Em VB.NET</p>
<blockquote><p>Using scope As New TransactionScope(TransactionScopeOption.Required, IsolationLevel.ReadCommitted)<br />
&#8216;* Insira os comandos de insert aqui<br />
scope.Complete()<br />
End Using</p></blockquote>
<h2>Par&acirc;metros Necess&aacute;rios</h2>
<p>Para criar uma nova inst&acirc;ncia de um TransactionScope, devemos passar alguns par&acirc;metros.</p>
<h3><strong>TransactionScopeOption</strong></h3>
<p>Em TransactionScopeOption temos as seguintes op&ccedil;&otilde;es:</p>
<p><strong>Required </strong>- Re-utiliza uma transa&ccedil;&atilde;o ativa ou cria uma nova caso n&atilde;o haja nenhuma ativa.</p>
<p><strong>RequiresNew</strong> - Cria sempre uma nova transa&ccedil;&atilde;o sem re-aproveitar outra transa&ccedil;&atilde;o.</p>
<p><strong>Suppress</strong> - Simplesmente n&atilde;o utiliza nenhuma transa&ccedil;&atilde;o.</p>
<h3><strong>IsolationLevel </strong></h3>
<p><strong>Serializable - </strong>Os dados, durante a transa&ccedil;&atilde;o, podem ser lidos mas nenhum dado pode ser adicionado ou modificado.</p>
<p><strong>RepetableRead - </strong>Os dados podem ser lidos e adicionados mas n&atilde;o podem ser modificados.</p>
<p><strong>ReadCommited - </strong>Dados n&atilde;o podem ser lidos, mas podem ser modificados.</p>
<p><strong>ReadUncommited - </strong>Dados podem ser lidos e modificados durante a transa&ccedil;&atilde;o.</p>
<p><strong>Snapshot - </strong>Os dados podem ser lidos e modificados, por&eacute;m, antes de modificar alguma informa&ccedil;&atilde;o, a transa&ccedil;&atilde;o verifica se o conjunto de dados permanecem os mesmos. Se tiverem sido alterados, uma exce&ccedil;&atilde;o &eacute; gerada.</p>
<p><strong>Chaos</strong> - As altera&ccedil;&otilde;es pendentes de transa&ccedil;&otilde;es em n&iacute;veis superiores n&atilde;o podem ser sobrepostas.</p>
<p><strong>Unspecified</strong> - Um IsolationLevel diferente do atual est&aacute; sendo usado, mas n&atilde;o &eacute; poss&iacute;vel determinar o seu tipo. Neste caso &eacute; gerada uma exce&ccedil;&atilde;o.</p>
<h2>Finalizando</h2>
<p>Implementar um controle de transa&ccedil;&otilde;es &eacute; algo muito simples e poupa muita dor de cabe&ccedil;a. O ideal seria que todos os sistemas, por mais simples que sejam, utilizassem um controle como este. Desta forma seria poss&iacute;vel entregar sistemas mais seguros e confi&aacute;veis, melhorando a qualidade do produto e a imagem do desenvolvedor junto aos clientes.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/">Implementando controle de transa&ccedil;&otilde;es com TransactionScope</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/</feedburner:origLink></item>
		<item>
		<title>Buscando o preview de um arquivo EPS em C# com ASP.NET</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/313931576/</link>
		<comments>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 16:26:56 +0000</pubDate>
		<dc:creator>Daniel Nogueira</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<category><![CDATA[asp.net]]></category>

		<category><![CDATA[eps]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=26</guid>
		<description><![CDATA[Dentro de um arquivo EPS (Encapsulated Postscript) podemos encontrar um preview da imagem  em TIFF. O TIFF encontrado no EPS &#233; bastante &#250;til para n&#227;o necessitamos de programas como o PhotoShop, CorelDraw, Illustrator ou outros para serem visualizados, como por exemplo gerar um thumbnail da imagem.
Neste artigo vou mostrar como buscar este TIFF para [...]]]></description>
			<content:encoded><![CDATA[<p>Dentro de um arquivo EPS (Encapsulated Postscript) podemos encontrar um preview da imagem  em TIFF. O TIFF encontrado no EPS &eacute; bastante &uacute;til para n&atilde;o necessitamos de programas como o PhotoShop, CorelDraw, Illustrator ou outros para serem visualizados, como por exemplo gerar um thumbnail da imagem.</p>
<p>Neste artigo vou mostrar como buscar este TIFF para podermos trabalhar com ele.</p>
<h2>Exemplo</h2>
<p>Este exemplo consiste em efetuar o upload de um arquivo EPS, e mostrar o preview do arquivo EPS na p&aacute;gina.</p>
<p>1 - Crie o arquivo Default.aspx que vai conter a interface do exemplo;</p>
<p>2 - Insira no arquivo um component FileUpload e o renomeie para FileUploadEps;</p>
<p>3 - E insira um componente Button e o renomeie para ButtonUploadEps;</p>
<p>Arquivo Default.aspx</p>
<blockquote><p>&lt;%@ Page Language=&#8221;C#&#8221; AutoEventWireup=&#8221;true&#8221;  CodeFile=&#8221;Default.aspx.cs&#8221; Inherits=&#8221;_Default&#8221; %&gt;</p>
<p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;</a>&gt;</p>
<p>&lt;html xmlns=&#8221;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml&#8221;</a> &gt;<br />
&lt;head runat=&#8221;server&#8221;&gt;<br />
&lt;title&gt;Preview de Arquivos EPS&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;<br />
&lt;div&gt;<br />
&lt;asp:FileUpload ID=&#8221;FileUploadEps&#8221; runat=&#8221;server&#8221; Style=&#8221;position: relative&#8221; /&gt;<br />
&lt;asp:Button ID=&#8221;ButtonUploadEps&#8221; runat=&#8221;server&#8221; OnClick=&#8221;ButtonUploadEps_Click&#8221; Style=&#8221;position:relative&#8221; Text=&#8221;Upload EPS&#8221; /&gt;<br />
&lt;/div&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>4 - Crie o arquivo Default.aspx.cs que vai conter o c&oacute;digo em C#;</p>
<p>5 - Use os seguintes namespace:</p>
<blockquote><p>using System;<br />
using System.Data;<br />
using System.Configuration;<br />
using System.Web;<br />
using System.Web.Security;<br />
using System.Web.UI;<br />
using System.Web.UI.WebControls;<br />
using System.Web.UI.WebControls.WebParts;</p>
<p>using System.Web.UI.HtmlControls;</p>
<p>using System.IO;<br />
using System.Drawing;<br />
using System.Drawing.Imaging;</p></blockquote>
<p>6 - Crie o evento de click do bot&atilde;o &#8220;ButtonUploadEps&#8221; e insira nele o seguinte c&oacute;digo:</p>
<blockquote><p>FileStream fileStreamEps = null;<br />
string strCaminhoEpsUpload = &#8220;&#8221;;</p>
<p>//* Verifica se o usu&aacute;rio selecionou algum arquivo<br />
if (FileUploadEps.PostedFile.FileName != &#8220;&#8221;)<br />
{</p>
<p>//* Monta o caminho da onde o arquivo vai ser salvo<br />
strCaminhoEpsUpload = MapPath(&#8221;.&#8221;) + &#8220;\\&#8221; + Path.GetFileName(FileUploadEps.PostedFile.FileName);</p>
<p>//* Executa o upload do arquivo<br />
FileUploadEps.PostedFile.SaveAs(strCaminhoEpsUpload);</p>
<p>//* Abre o arquivo e l&ecirc; o header<br />
fileStreamEps = File.Open(strCaminhoEpsUpload, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);</p>
<p>byte[] buf = new byte[32];</p>
<p>//* Passa para o buffer o header do arquivo<br />
fileStreamEps.Read(buf, 0, 32);</p>
<p>//* Converte para uint<br />
uint idArquivo = obtemU(buf, 0);</p>
<p>//* Verifica se o arquivo de entrada &eacute; um EPS<br />
if (idArquivo != 0xc6d3d0c5)<br />
{</p>
<p>return;</p>
<p>}</p>
<p>//* obtem o uint<br />
uint TIFOff = obtemU(buf, 20);</p>
<p>//* Verifica se foi encontrado no EPS a identifica&ccedil;&atilde;o de preview<br />
if (TIFOff == 0)<br />
{</p>
<p>return;</p>
<p>}</p>
<p>//* N&atilde;o posicionou no TifOffset<br />
if (fileStreamEps.Seek(TIFOff, SeekOrigin.Begin) != TIFOff)<br />
{<br />
return;<br />
}</p>
<p>//* obtem o uint<br />
uint TIFSize = obtemU(buf, 24);</p>
<p>//* Redimensiona o buffer<br />
byte[] msBuf = new Byte[TIFSize];</p>
<p>//* Passa o arquivo para a mem&oacute;ria<br />
MemoryStream memoryStreamEps = new MemoryStream(msBuf);<br />
fileStreamEps.Read(msBuf, 0, (int)TIFSize);</p>
<p>//* Cria um novo bitmap apartir do conteudo da memoria<br />
Bitmap bitMapEps = new Bitmap(memoryStreamEps);</p>
<p>//* Mostra a imagem na tela<br />
bitMapEps.Save(Response.OutputStream, ImageFormat.Jpeg);<br />
bitMapEps.Dispose();<br />
}</p></blockquote>
<p>7 - Crie uma fun&ccedil;&atilde;o para obter o uint:</p>
<blockquote><p>private static uint obtemU(byte[] buf, int pos)<br />
{<br />
return (uint)(buf[pos] + 0&#215;100 * buf[pos + 1] + 0&#215;10000 * buf[pos + 2] + 0&#215;1000000 * buf[pos + 3]);<br />
}</p></blockquote>
<p>Vale lembrar que n&atilde;o s&atilde;o todos os EPS que contem um arquivo de preview. Na hora de salvar a imagem em EPS o usu&aacute;rio tem a escolha, se deseja salvar o preview, e em qual qualidade ser&aacute; gerado o preview.</p>
<h2>Download do Exemplo</h2>
<p>Clique <a href="http://fdweb.com.br/downloads/EpsPreviewCSharpAspNet.rar">aqui</a> para efetuar o download  do projeto de exemplo. O projeto foi criado no Visual Studio 2005.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/">Buscando o preview de um arquivo EPS em C# com ASP.NET</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/</feedburner:origLink></item>
		<item>
		<title>Gerando arquivos PDF com PHP</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/227401304/</link>
		<comments>http://fdweb.com.br/gerando-arquivos-pdf-com-php/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 19:03:27 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programação]]></category>

		<category><![CDATA[fpdf]]></category>

		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/gerando-arquivos-pdf-com-php/</guid>
		<description><![CDATA[Introdu&#231;&#227;o
Os arquivos PDF se transformaram ao longo do tempo em um padr&#227;o para troca de documentos. Desde relat&#243;rios at&#233; contratos, este formato tem sido usado em larga escala devido a sua portabilidade - &#233; poss&#237;vel abrir arquivos deste tipo em qualquer sistema operacional - al&#233;m de, geralmente, ser um arquivo pequeno. Isso sem falar que [...]]]></description>
			<content:encoded><![CDATA[<h2>Introdu&ccedil;&atilde;o</h2>
<p>Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato tem sido usado em larga escala devido a sua portabilidade - &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional - al&eacute;m de, geralmente, ser um arquivo pequeno. Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado, garantindo, desta forma, que o arquivo ir&aacute; sempre manter o mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF, ao inv&eacute;s de outros formatos, como DOC, por exemplo.</p>
<p>Neste artigo iremos conhecer os fundamentos da cria&ccedil;&atilde;o de um arquivo PDF utilizando a linguagem PHP. Para tal, ser&aacute; usada a biblioteca <a title="FPDF - PHP Classes" href="http://www.phpclasses.org/browse/package/421.html" target="_blank">FPDF</a>, respons&aacute;vel pela cria&ccedil;&atilde;o do arquivo. O download pode ser feito <a title="FPDF" href="http://www.fpdf.org/en/download.php" target="_blank">aqui</a>.</p>
<h2>Conhecendo as principais fun&ccedil;&otilde;es</h2>
<p>Abaixo est&atilde;o relacionadas as principais fun&ccedil;&otilde;es que ser&atilde;o utilizadas para a cria&ccedil;&atilde;o do arquivo, com a respectiva descri&ccedil;&atilde;o.</p>
<p><strong>SetFont </strong>- Define a fonte que ser&aacute; usada para imprimir o texto. &Eacute; obrigat&oacute;rio setar ao menos uma vez a fonte que ser&aacute; utilizada no documento.</p>
<p><strong>SetTitle </strong>- Define o t&iacute;tulo do documento.</p>
<p><strong>SetSubject </strong>- Define o assunto do documento.</p>
<p><strong>SetX </strong>-  Define a abscissa da posi&ccedil;&atilde;o corrente. A grosso modo podemos dizer que informa a posi&ccedil;&atilde;o a partir da margem esquerda do documento.</p>
<p><strong>SetY </strong>- Explicando de uma forma simples, indica a linha (posi&ccedil;&atilde;o vertical).</p>
<p><strong>Cell </strong>- Imprime uma c&eacute;lula (&aacute;rea retangular) com bordas opcionais, cor de fundo e texto. O canto superior-esquerdo da c&eacute;lula corresponde &agrave; posi&ccedil;&atilde;o atual. O texto pode ser alinhado ou centralizado. Depois de chamada, a posi&ccedil;&atilde;o atual se move para a direita ou para a linha seguinte. &Eacute; poss&iacute;vel p&ocirc;r um link no texto. Se a quebra de p&aacute;gina autom&aacute;tica est&aacute; habilitada e a pilha for al&eacute;m do limite, uma quebra de p&aacute;gina &eacute; feita antes da impress&atilde;o.</p>
<p><strong>Ln </strong>- Faz uma quebra de linha. A abscissa corrente volta para a margem esquerda e a ordenada &eacute; somada ao valor passado como par&acirc;metro.</p>
<p><strong>MultiCell </strong>- Este m&eacute;todo permite imprimir um texto com quebras de linha. Podem ser autom&aacute;tica (assim que o texto alcan&ccedil;a a margem direita da c&eacute;lula) ou expl&iacute;cita (atrav&eacute;s do caracter n). Ser&atilde;o geradas tantas c&eacute;lulas quantas forem necess&aacute;rias, uma abaixo da outra.</p>
<p><strong>Image </strong>- Permite inserir uma imagem no documento. Os tipos permitidos s&atilde;o JPG e PNG.</p>
<p><strong>AddPage </strong>- Acrescenta uma p&aacute;gina ao documento.</p>
<p><strong>PageNo </strong>- Informa a p&aacute;gina atual.</p>
<p><strong>AliasNbPages </strong>- Define um apelido para a impress&atilde;o do n&uacute;mero total de p&aacute;ginas.</p>
<p><strong>Header </strong>e <strong>Footer </strong>- Estes m&eacute;todos inserem automaticamente o cabe&ccedil;alho e rodap&eacute; das p&aacute;ginas do documento. Por&eacute;m, para utiliz&aacute;-las, &eacute; necess&aacute;rio criar uma subclasse para sobrepor os m&eacute;todos originais.</p>
<p><strong>Output</strong> -   Envia o documento para o destino informado. Pode-se abrir o arquivo no navegador, fazer o download ou mesmo salvar o arquivo no disco.</p>
<h3>OBSERVA&Ccedil;&Atilde;O:</h3>
<p>Sempre que for necess&aacute;rio setar a posi&ccedil;&atilde;o X e Y, sete primeiro o Y e depois o X.</p>
<h2>Criando nosso primeiro documento</h2>
<p>Agora vamos ver como criar um arquivo simples, contendo algum texto e uma imagem.</p>
<blockquote><p>&lt;?</p>
<p>require_once(&#8221;fpdf/fpdf.php&#8221;);</p>
<p>$texto = &#8220;Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato<br />
tem sido usado em larga escala devido a sua portabilidade  - &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional - al&eacute;m de, geralmente, ser um arquivo pequeno.<br />
Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado,  garantindo, desta forma, que o arquivo ir&aacute; sempre manter o  mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma<br />
apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF,  ao inv&eacute;s de outros formatos, como DOC, por exemplo.&#8221;;</p>
<p>//defininfo a fonte !<br />
define(&#8217;FPDF_FONTPATH&#8217;,'fpdf/font/&#8217;);</p>
<p>//instancia a classe<br />
//uso: FPDF(orientacao - retrato ou paisagem), unidade de medida, tamanho do papel)<br />
$pdf = new FPDF(&#8221;P&#8221;,&#8221;mm&#8221;,&#8221;A4&#8243;);</p>
<p>//define a fonte a ser usada<br />
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,10);</p>
<p>//define o titulo<br />
$pdf-&gt;SetTitle(&#8221;Criando nosso primeiro arquivo PDF !&#8221;);</p>
<p>// seta a posicao vertical e horizontal<br />
$pdf-&gt;SetY(&#8221;-1&#8243;);</p>
<p>//assunto<br />
$pdf-&gt;SetSubject(&#8221;Cria&ccedil;&atilde;o de arquivos PDF com PHP!&#8221;);</p>
<p>//escreve o texto<br />
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)<br />
$pdf-&gt;Cell(0,5,&#8221;Criando arquivos PDF com PHP&#8221;,0,0,&#8217;L');<br />
$pdf-&gt;Cell(0,5,&#8217;http://fdweb.com.br&#8217;,0,1,&#8217;R');<br />
$pdf-&gt;Cell(0,0,&#8221;,1,1,&#8217;L');<br />
$pdf-&gt;Ln(8);</p>
<p>//Seta a fonte do texto do documento<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);</p>
<p>// insere a imagem<br />
//uso: Image(caminho, posicao X,posicao Y,altura, largura)<br />
//$pdf-&gt;Image(&#8221;http://fdweb.com.br/downloads/logo.jpg&#8221;, $pdf-&gt;GetX(), $pdf-&gt;GetY(), 20, 20);<br />
$pdf-&gt;Image(&#8221;logo.jpg&#8221;,10,30);</p>
<p>//posiciona horizontalmente<br />
$pdf-&gt;SetY(&#8221;30&#8243;);<br />
$pdf-&gt;SetX(&#8221;50&#8243;);</p>
<p>//Insere o texto do documento<br />
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)<br />
$pdf-&gt;MultiCell(0,5,$texto,0,&#8221;L&#8221;,0);</p>
<p>$pdf-&gt;Output(&#8221;arquivo pdf&#8221;,&#8221;I&#8221;);</p>
<p>?&gt;</p></blockquote>
<p>Este exemplo mostra como criar um arquivo simples, com texto e uma imagem.</p>
<h2>Implementando cabe&ccedil;alho e rodap&eacute;</h2>
<p>Para que todas as p&aacute;ginas possuam cabe&ccedil;alho e rodap&eacute; padr&atilde;o, temos que estender a classe FPDF e sobrepor os m&eacute;todos Header e Footer. Note que a partir desse momento, ao inv&eacute;s de chamarmos a classe FPDF para gerarmos os documentos iremos passar a chamar a nossa classe estendida. Observe:</p>
<blockquote><p>&lt;?</p>
<p>require_once(&#8221;fpdf/fpdf.php&#8221;);</p>
<p>class PDF extends FPDF<br />
{</p>
<p>// sobrep&otilde;e o m&eacute;todo header<br />
function Header()<br />
{<br />
//escreve o texto<br />
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)<br />
//$this-&gt;SetY(-1);<br />
$this-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);<br />
$this-&gt;Cell(0,5,&#8221;Criando arquivos PDF com PHP&#8221;,0,0,&#8217;L');<br />
$this-&gt;Cell(0,5,&#8217;http://fdweb.com.br&#8217;,0,1,&#8217;R');<br />
$this-&gt;Cell(0,0,&#8221;,1,1,&#8217;L');<br />
$this-&gt;Ln(8);</p>
<p>}<br />
// sobrep&otilde;e o m&eacute;todo footer<br />
function Footer()<br />
{<br />
//Vai para 1.5 cm da parte inferior</p>
<p>$this-&gt;SetY(-15);</p>
<p>//Seleciona a fonte Arial it&aacute;lico 8</p>
<p>$this-&gt;SetFont(&#8217;Arial&#8217;,'I&#8217;,8);</p>
<p>//Imprime o n&uacute;mero da p&aacute;gina corrente e o total de p&aacute;ginas</p>
<p>$this-&gt;Cell(0,10,&#8217;P&aacute;gina &#8216;.$this-&gt;PageNo().&#8217; de {total}&#8217;,0,0,&#8217;C');<br />
}<br />
}</p>
<p>$texto = &#8220;Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato<br />
tem sido usado em larga escala devido a sua portabilidade  - &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional - al&eacute;m de, geralmente, ser um arquivo pequeno.<br />
Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado,  garantindo, desta forma, que o arquivo ir&aacute; sempre manter o  mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma<br />
apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF,  ao inv&eacute;s de outros formatos, como DOC, por exemplo.&#8221;;</p>
<p>//defininfo a fonte !<br />
define(&#8217;FPDF_FONTPATH&#8217;,'fpdf/font/&#8217;);</p>
<p>//instancia a classe<br />
//uso: PDF(orientacao - retrato ou paisagem), unidade de medida, tamanho do papel)<br />
$pdf = new PDF(&#8221;P&#8221;,&#8221;mm&#8221;,&#8221;A4&#8243;);</p>
<p>$pdf-&gt;AliasNbPages( &#8216;{total}&#8217; );</p>
<p>$pdf-&gt;AddPage();</p>
<p>//define a fonte a ser usada<br />
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,10);</p>
<p>//define o titulo<br />
$pdf-&gt;SetTitle(&#8221;Criando nosso primeiro arquivo PDF !&#8221;);</p>
<p>//assunto<br />
$pdf-&gt;SetSubject(&#8221;Cria&ccedil;&atilde;o de arquivos PDF com PHP!&#8221;);</p>
<p>//Seta a fonte do texto do documento<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);</p>
<p>// insere a imagem<br />
//uso: Image(caminho, posicao X,posicao Y,altura, largura)<br />
//$pdf-&gt;Image(&#8221;http://fdweb.com.br/downloads/logo.jpg&#8221;,$pdf-&gt;GetX(),$pdf-&gt;GetY(),20,20);<br />
$pdf-&gt;Image(&#8221;logo.jpg&#8221;,10,30);</p>
<p>//posiciona horizontalmente<br />
$pdf-&gt;SetY(&#8221;30&#8243;);<br />
$pdf-&gt;SetX(&#8221;50&#8243;);</p>
<p>//Insere o texto do documento<br />
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)<br />
$pdf-&gt;MultiCell(0,5,$texto,0,&#8221;L&#8221;,0);</p>
<p>$pdf-&gt;Output();</p>
<p>?&gt;</p></blockquote>
<p>Podemos notar que o c&oacute;digo sofreu tr&ecirc;s altera&ccedil;&otilde;es:</p>
<p>Declaramos  $pdf = new PDF() ao inv&eacute;s de $pdf = new FPDF().</p>
<p>Acrescentamos as linhas : $pdf-&gt;AliasNbPages( &#8216;{total}&#8217; ); e $pdf-&gt;AddPage();</p>
<p>O c&oacute;digo que montava o cabe&ccedil;alho foi para dentro da fun&ccedil;&atilde;o Header, saindo do corpo do documento.</p>
<h2>Considera&ccedil;&otilde;es Finais</h2>
<p>Antes de finalizar &eacute; bom ressaltar alguns itens:</p>
<p>- N&atilde;o esquecer de informar a fonte antes de imprimir qualquer texto. Caso contr&aacute;rio a p&aacute;gina ou o texto anterior ao primeiro SetFont n&atilde;o aparecer&aacute; no documento;</p>
<p>- Setar sempre a posi&ccedil;&atilde;o Y primeiro. Primeiro Y depois X, e n&atilde;o o contr&aacute;rio.</p>
<p>- Se for necess&aacute;rio colocar algum texto no final de cada p&aacute;gina, como por exemplo a soma total de um campo, basta usar a fun&ccedil;&atilde;o GetY &eacute; para determinar a posi&ccedil;&atilde;o da impress&atilde;o dentro do documento. Isso pode ser verificado dentro de um loop <em>for </em>ou <em>while</em>. Por exemplo, o c&oacute;digo abaixo imprime o n&uacute;mero de linha de 1 a 150. Ao chegar no final da p&aacute;gina (ou seja, a 27cm) ele escreve a palavra <strong>total</strong> e continua a impress&atilde;o da linha seguinte na pr&oacute;xima p&aacute;gina:</p>
<blockquote><p>for($i=1;$i&lt;=150;$i++)<br />
{</p>
<p>if ($pdf-&gt;GetY() &gt;= 270)<br />
{<br />
$pdf-&gt;Cell(0,5,&#8221;total: &#8220;,0,0);<br />
$pdf-&gt;AddPage();<br />
$pdf-&gt;Cell(0,5,&#8221;Line $i - &#8221; . $pdf-&gt;GetY() ,0,1);<br />
}<br />
else<br />
{<br />
$pdf-&gt;Cell(0,5,&#8221;Line $i - &#8221; . $pdf-&gt;GetY() ,0,1);<br />
}</p>
<p>}</p></blockquote>
<h2>Concluindo</h2>
<p>Vimos que criar arquivos PDF pode ser uma tarefa bem simples. Claro que documentos ou relat&oacute;rios mais bem elaborados e/ou complexos podem dar um pouco mais de trabalho, mas o resultado final fica com aspecto mais profissional e elegante.</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/gerando-arquivos-pdf-com-php/">Gerando arquivos PDF com PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/gerando-arquivos-pdf-com-php/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/gerando-arquivos-pdf-com-php/</feedburner:origLink></item>
		<item>
		<title>Trabalhando com a taskbar do windows no Visual Basic</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/198604237/</link>
		<comments>http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 13:14:28 +0000</pubDate>
		<dc:creator>Daniel Nogueira</dc:creator>
		
		<category><![CDATA[Programação]]></category>

		<category><![CDATA[Visual Basic]]></category>

		<category><![CDATA[Bandeija de tarefas]]></category>

		<category><![CDATA[Taskbar]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/</guid>
		<description><![CDATA[Trabalhar com os objetos da taskbar ( bandeja do sistema ) do windows que se encontra ao lado do rel&#243;gio &#233; bem &#250;til para nossas aplica&#231;&#245;es. Permitimos ao usu&#225;rio deixar a nossa aplica&#231;&#227;o rodando em &#8220;segundo plano&#8221; n&#227;o mantendo-a no desktop, deixando a &#225;rea de trabalho limpa. Assim quando a aplica&#231;&#227;o estiver rodando um processo [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhar com os objetos da taskbar ( bandeja do sistema ) do windows que se encontra ao lado do rel&oacute;gio &eacute; bem &uacute;til para nossas aplica&ccedil;&otilde;es. Permitimos ao usu&aacute;rio deixar a nossa aplica&ccedil;&atilde;o rodando em &#8220;segundo plano&#8221; n&atilde;o mantendo-a no desktop, deixando a &aacute;rea de trabalho limpa. Assim quando a aplica&ccedil;&atilde;o estiver rodando um processo demorado, damos a liberdade para o usu&aacute;rio executar outras tarefas, sem manter o desktop cheio.</p>
<p>Para inserir, modificar, e remover objetos da taskbar, usaremos uma API do windows que se encontra em shell32 e o m&eacute;todo a ser chamado &eacute; o &#8220;Shell_NotifyIconA&#8221; .</p>
<h2>Exemplo</h2>
<p>Neste artigo, vamos criar um simples exemplo, mostrando como trabalhar com est&aacute; API em nossas aplica&ccedil;&otilde;es criadas em Visual Basic em sua vers&atilde;o 6.</p>
<p>Primeiro vamos criar a interface do exemplo:</p>
<p>1. Crie um novo projeto Standard EXE.</p>
<p>2. Crie a seguinte estrutura de menus, no formul&aacute;rio:</p>
<p>mnuIconeTaskbar</p>
<p>- mnuIconeTaskbarAlterar &#8220;Alterar &Iacute;cone&#8221;</p>
<p>- mnuIconeTaskbarMostrarFormulario &#8220;Mostrar Formul&aacute;rio&#8221;</p>
<p>- mnuIconeTaskbarSair &#8220;Sair&#8221;</p>
<p>3. Vamos precisar usar o componente CommonDialog, para adicionar este componente ao seu projeto entre no menu Project-&gt;Components.. e marque na lista o item &#8220;Microsoft Common Dialog Control 6.0&#8243;, se n&atilde;o constar na lista este item, voc&ecirc; tem que instalar o Service Pack 6 do Visual Basic que pode ser encontrado para download aqui . Insira este componente no formul&aacute;rio e renomeie para &#8220;cmmdlgArquivo&#8221;.</p>
<h2>Code</h2>
<p>Agora com a nossa interface pronta, vamos a parte de c&oacute;digo. Ap&oacute;s o Option Explicit declare o tipo typeIconeTaskbar, que ser&aacute; usado para guardarmos os dados que precisamos para criar o &iacute;cone na taskbar:</p>
<blockquote><p> Private Type typeIconeTaskbar<br />
cbSize As Long<br />
hWnd As Long<br />
uId As Long<br />
uFlags As Long<br />
uCallBackMessage As Long<br />
hIcon As Long<br />
szTip As String * 64<br />
End Type</p></blockquote>
<p>Declare as constantes que usaremos no decorrer do nosso exemplo:</p>
<blockquote><p> Private Const cntIconeTaskbarInsere = &amp;H0<br />
Private Const cntIconeTaskbarAltera = &amp;H1<br />
Private Const cntIconeTaskbarRemove = &amp;H2<br />
Private Const cntIconeTaskbarMensagem = &amp;H1<br />
Private Const cntIconeTaskbarIcone = &amp;H2<br />
Private Const cntIconeTaskbarTipo = &amp;H4</p>
<p>Private Const cntMouseMove = &amp;H200<br />
Private Const cntMouseEsquerdoDuploClick = &amp;H203<br />
Private Const cntMouseEsquerdoDown = &amp;H201<br />
Private Const cntMouseEsquerdoUp = &amp;H202<br />
Private Const cntMouseDireitoDuploClick = &amp;H206<br />
Private Const cntMouseDireitoDown = &amp;H204<br />
Private Const cntMouseDireitoUP = &amp;H205</p></blockquote>
<p>As constantes que come&ccedil;am com cntIconeTaskbar, s&atilde;o relativas a o objeto na taskbar. E as que come&ccedil;am com cntMouse, s&atilde;o relativas aos eventos do mouse.</p>
<p>Declare a API para podermos interagir com a taskbar:</p>
<blockquote><p> Private Declare Function apiIconeTaskbar Lib &#8220;shell32&#8243; _<br />
Alias &#8220;Shell_NotifyIconA&#8221; (ByVal dwMessage As Long, objIconeTaskbar As typeIconeTaskbar) As Boolean</p></blockquote>
<p>Ainda na parte publica do formul&aacute;rio, declare a seguinte vari&aacute;vel:</p>
<blockquote><p> Dim objTaskbar As typeIconeTaskbar</p></blockquote>
<p>Agora vamos criar duas subs, uma para esconder o formul&aacute;rio e a outra para mostra-lo:</p>
<blockquote><p> Sub subEscondeFormulario()</p>
<p>Me.Hide</p>
<p>objTaskbar.cbSize = Len(objTaskbar)<br />
objTaskbar.hWnd = Me.hWnd<br />
objTaskbar.uId = vbNull<br />
objTaskbar.uFlags = cntIconeTaskbarIcone Or cntIconeTaskbarTipo Or cntIconeTaskbarMensagem<br />
objTaskbar.uCallBackMessage = cntMouseMove<br />
objTaskbar.hIcon = Me.Icon<br />
objTaskbar.szTip = Me.Caption &amp; vbNullChar</p>
<p>apiIconeTaskbar cntIconeTaskbarInsere, objTaskbar</p>
<p>End Sub</p></blockquote>
<p>Na sub subEscondeFormulario ao ser chamada , executamos um hide no nosso formul&aacute;rio e definimos as propriedades do nosso objeto, para inseri-lo no taskbar. No objeto, definimos o comprimento na propriedade cbSize. Na propriedade hWnd definimos o identificador do nosso formul&aacute;rio. Definimos como nulo o uId. Definimos quais ser&atilde;o os flags na propriedade uFlags. Definimos qual o evento que ser&aacute; gerado por este objeto na propriedade uCallBackMessage. Na propriedade hIcon definimos o &iacute;cone que ser&aacute; apresentado na taskbar, que no caso ser&aacute; o &iacute;cone que estiver definido no formul&aacute;rio e por ultimo a propriedade szTip, onde fica armazenado o caption do objeto na taskbar.</p>
<p>Ap&oacute;s definirmos as propriedades do objeto, executamos a API para inserir o objeto na taskbar. O par&acirc;metro para a API saber que est&aacute; inserindo um objeto, est&aacute; apontado por cntIconeTaskbarInsere.</p>
<p>Agora crie a subMostraFormul&aacute;rio, que altera o WindowState do formul&aacute;rio para vbNormal, mostra o formul&aacute;rio, seta o focus nele e atualiza o formul&aacute;rio. Ap&oacute;s, executa a API para remover o objeto da taskbar:</p>
<blockquote><p> Sub subMostraFormulario()</p>
<p>Me.WindowState = vbNormal</p>
<p>Me.Show</p>
<p>Me.SetFocus</p>
<p>Me.Refresh</p>
<p>apiIconeTaskbar cntIconeTaskbarRemove, objTaskbar</p>
<p>End Sub</p></blockquote>
<p>No evento Load do formul&aacute;rio, executa a subEscondeFormulario:</p>
<blockquote><p> Private Sub Form_Load()</p>
<p>subEscondeFormulario</p>
<p>End Sub</p></blockquote>
<p>No evento Resize do formul&aacute;rio, verifica se o formul&aacute;rio foi minimizado, se sim, executa a subEscondeFormulario:</p>
<blockquote><p> Private Sub Form_Resize()</p>
<p>If Me.WindowState = vbMinimized Then _<br />
subEscondeFormulario</p>
<p>End Sub</p></blockquote>
<p>Agora vamos criar o evento MouseMove do formul&aacute;rio. Nele verificamos qual o evento foi executado no nosso objeto que se encontra na taskbar. Caso for um duplo clique com o bot&atilde;o esquerdo, mostramos o formul&aacute;rio. Caso clicarmos com o bot&atilde;o direito do mouse no objeto, abrir&aacute; um menu para selecionarmos uma das op&ccedil;&otilde;es:</p>
<blockquote><p> Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)</p>
<p>Dim lngEvento As Long<br />
Dim sFilter As String</p>
<p>lngEvento = X / Screen.TwipsPerPixelX</p>
<p>Select Case lngEvento</p>
<p>Case cntMouseEsquerdoDown</p>
<p>Case cntMouseEsquerdoUp</p>
<p>Case cntMouseEsquerdoDuploClick</p>
<p>subMostraFormulario</p>
<p>Case cntMouseDireitoDown</p>
<p>PopupMenu mnuIconeTaskbar</p>
<p>Case cntMouseDireitoUP</p>
<p>Case cntMouseDireitoDuploClick</p>
<p>End Select</p>
<p>End Sub</p></blockquote>
<p>Agora vamos criar os eventos do nosso menu. No mnuIconeTaskbarAlterar vamos vai abrir uma caixa de dialogo onde podemos selecionar o novo &iacute;cone do nosso formul&aacute;rio. Alterando tamb&eacute;m o &iacute;cone que se encontra na taskbar:</p>
<blockquote><p> Private Sub mnuIconeTaskbarAlterar_Click()</p>
<p>cmmdlgArquivo.DialogTitle = &#8220;Selecione um &iacute;cone&#8221;</p>
<p>cmmdlgArquivo.Filter = &#8220;Icone (*.ico)|*.ico|Todos os arquivos (*.*)|*.*&#8221;<br />
cmmdlgArquivo.ShowOpen</p>
<p>If cmmdlgArquivo.FileName &lt;&gt; &#8220;&#8221; Then</p>
<p>Me.Icon = LoadPicture(cmmdlgArquivo.FileName)<br />
objTaskbar.hIcon = Me.Icon<br />
apiIconeTaskbar cntIconeTaskbarAltera, objTaskbar</p>
<p>End If</p>
<p>End Sub</p></blockquote>
<p>No mnuIconeTaskbarMostrarFormulario, vamos apenas chamar a subMostraFormulario:</p>
<blockquote><p> Private Sub mnuIconeTaskbarMostrarFormulario_Click()</p>
<p>subMostraFormulario</p>
<p>End Sub</p></blockquote>
<p>E finalizando o nosso exemplo, vamos criar o evento do mnuIconeTaskbarSair:</p>
<blockquote><p> Private Sub mnuIconeTaskbarSair_Click()</p>
<p>subMostraFormulario</p>
<p>Unload Me</p>
<p>End Sub</p></blockquote>
<h2>Debug</h2>
<p>Pronto! Agora &eacute; s&oacute; testar, execute o projeto.<br />
Ao iniciar o formul&aacute;rio, o mesmo ser&aacute; escondido, e um &iacute;cone ser&aacute; criado na sua taskbar. Ao dar um duplo click no &iacute;cone com o bot&atilde;o esquerdo o formul&aacute;rio ser&aacute; mostrado, e o &iacute;cone removido da bandeja. Ao minimizar a aplica&ccedil;&atilde;o, o formul&aacute;rio &eacute; escondido novamente, e inserido o &iacute;cone na taskbar. Ao clicar no &iacute;cone com o bot&atilde;o direito do mouse, teremos tr&ecirc;s op&ccedil;&otilde;es: Sair, para fecharmos a aplica&ccedil;&atilde;o e remover o &iacute;cone da bandeja. Mostrar Formul&aacute;rio, para chamar o formul&aacute;rio novamente e remover o &iacute;cone da bandeja. E a ultima op&ccedil;&atilde;o que &eacute; Alterar &Iacute;cone, para alterarmos o &iacute;cone do formul&aacute;rio e do objeto da taskbar.</p>
<h2>Download do Exemplo</h2>
<p>O link para download do exemplo:<br />
<a href="http://www.fdweb.com.br/downloads/TaskbarVB.zip"> http://www.fdweb.com.br/downloads/TaskbarVB.zip</a></p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/">Trabalhando com a taskbar do windows no Visual Basic</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/</feedburner:origLink></item>
		<item>
		<title>Arquivo Torrent: O que é e como funciona</title>
		<link>http://feeds.feedburner.com/~r/fdweb/~3/190404638/</link>
		<comments>http://fdweb.com.br/arquivo-torrent-o-que-e-como-funciona/#comments</comments>
		<pubDate>Sun, 25 Nov 2007 22:16:42 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
		
		<category><![CDATA[Geral]]></category>

		<category><![CDATA[torrent]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/arquivo-torrent-o-que-e-como-funciona/</guid>
		<description><![CDATA[O Torrent &#233; uma tecnologia que permite o compartilhamento de qualquer tipo de arquivo pela internet, sendo muito usado para a distribui&#231;&#227;o de v&#237;deos, m&#250;sicas e programas. Sua forma de trabalho &#233; muito eficaz e evita, por exemplo, que determinados usu&#225;rios s&#243; fa&#231;am download, mas n&#227;o compartilhem arquivos (pelos menos teoricamente). Isso porque a taxa [...]]]></description>
			<content:encoded><![CDATA[<p>O Torrent &eacute; uma tecnologia que permite o compartilhamento de qualquer tipo de arquivo pela internet, sendo muito usado para a distribui&ccedil;&atilde;o de v&iacute;deos, m&uacute;sicas e programas. Sua forma de trabalho &eacute; muito eficaz e evita, por exemplo, que determinados usu&aacute;rios s&oacute; fa&ccedil;am download, mas n&atilde;o compartilhem arquivos (pelos menos teoricamente). Isso porque a taxa de download &eacute; equivalente &agrave; taxa de upload, ou seja, somente compartilhando &eacute; que voc&ecirc; consegue baixar arquivos. Por esta raz&atilde;o, quando voc&ecirc; est&aacute; iniciando um determinado download, a velocidade utilizada &eacute; lenta e vai aumentando de acordo com o que j&aacute; foi baixado do arquivo. Quanto mais voc&ecirc; tiver de um arquivo, mais usu&aacute;rios se conectar&atilde;o ao seu computador e pela regra, a taxa de velocidade do seu download aumenta.</p>
<h2>Como o BitTorrent funciona</h2>
<p>Para que voc&ecirc; possa fazer download (e upload) pelo BitTorrent, &eacute; necess&aacute;rio que cada item compartilhado esteja associado a um arquivo denominado <strong>torrent</strong>, cuja extens&atilde;o &eacute; .torrent (por exemplo, infowester.torrent). Trata-se de um arquivo pequeno, mas que cont&eacute;m as informa&ccedil;&otilde;es necess&aacute;rias para o compartilhamento, como o local onde o arquivo est&aacute; e a seq&uuml;&ecirc;ncia que verifica a integridade deste. Esse arquivo pode estar dispon&iacute;vel em um site e, quando acessado, inicia o download do arquivo compartilhado (desde que o BitTorrent esteja instalado). Isso significa que voc&ecirc; precisa achar um torrent do arquivo que voc&ecirc; deseja baixar. Para encontrar torrents voc&ecirc; pode usar sites voltados a este fim. H&aacute; v&aacute;rios na internet, basta digitar a palavra &#8220;torrent&#8221; em mecanismos de busca para localiz&aacute;-los.</p>
<p>Para entender o compartilhamento de arquivos do Torrent, &eacute; necess&aacute;rio conhecer alguns termos:</p>
<p><strong>Seed (ou seeding):</strong> &eacute; a denomina&ccedil;&atilde;o dada ao computador que possui um arquivo completo compartilhado, como o computador que primeiramente disponibilizou o arquivo e os outros que o baixaram por inteiro;</p>
<p><strong>Peer:</strong> nome dado a cada computador que compartilha arquivos. Quando voc&ecirc; est&aacute; baixando algo pelo Torrent, seu computador &eacute; um peer, ou seja, um ponto ou um n&oacute; da rede;</p>
<p><strong>Leech (ou leeching):</strong> &eacute; a denomina&ccedil;&atilde;o dada ao momento em que um computador faz download;</p>
<p><strong>Tracker:</strong> denomina&ccedil;&atilde;o dada ao servidor que &eacute; respons&aacute;vel por organizar os arquivos dispon&iacute;veis e direcionar os downloads;</p>
<p><strong>Swarm:</strong> nome dado ao conjunto de computadores que est&atilde;o compartilhando o mesmo arquivo. Se, por exemplo, o arquivo infowester.pdf est&aacute; sendo compartilhado por 2 seeds e por 8 peers, o swarm do arquivo cont&eacute;m 10 computadores (2 seeds + 8 peers).</p>
<p>O tracker &eacute; um dos principais respons&aacute;veis pelo funcionamento da rede do Torrent, pois ele praticamente gerencia a distribui&ccedil;&atilde;o de arquivos porque possui informa&ccedil;&otilde;es sobre onde est&atilde;o os computadores com os arquivos compartilhados num determinado momento.</p>
<p>Quando voc&ecirc; inicia um download, o tracker &eacute; consultado para que a lista de computadores que possui o arquivo em quest&atilde;o seja informada. Enquanto o download vai sendo feito, seu computador se comunica periodicamente com o tracker para informar o quanto de download j&aacute; foi feito e para saber o quanto falta. &Eacute; importante ao tracker saber o quanto j&aacute; foi baixado ao seu computador porque assim ele pode indicar sua m&aacute;quina &agrave; outra que esteja precisando do &#8220;peda&ccedil;o&#8221; do arquivo que voc&ecirc; j&aacute; tem. Assim, quanto mais computadores estiverem compartilhando aquele arquivo, mais r&aacute;pido ser&aacute; o download, pois h&aacute; mais op&ccedil;&otilde;es de fontes.</p>
<p>Um fato interessante, &eacute; que se por alguma raz&atilde;o o tracker parar de funcionar (quando isso ocorre, geralmente &eacute; tempor&aacute;rio) o swarm continua compartilhando o arquivo que lhe cabe, afinal, cada computador sabe de onde fazer o download. No entanto, nenhuma outra m&aacute;quina poder&aacute; fazer parte do swarm, pois n&atilde;o h&aacute; tracker que possa direcion&aacute;-la.</p>
<h2>Clientes Torrent</h2>
<p>Para poder baixar um arquivo .torrent &eacute; necess&aacute;rio utilizar um programa que entenda o arquivo .torrent e fa&ccedil;a o download dos arquivos contidos dentro dele. Este programa chamamos de cliente torrent (ou torrent client). Existem diversos programas espalhados pela internet. Um dos melhores e mais usados &eacute; o uTorrent, que pode ser baixado <a title="uTorrent" href="http://www.utorrent.com/download.php" target="_blank">aqui</a>.</p>
<p>O programa &eacute; bem f&aacute;cil de usar, possuindo uma interface bastante intuitiva. Fora o fato de ter suporte &agrave; l&iacute;ngua tupiniquim.</p>
<h2>Conclus&atilde;o</h2>
<p>Agora que j&aacute; temos uma boa id&eacute;ia do que &eacute; e de como funcionam os arquivos Torrent, &eacute; s&oacute; sair por a&iacute; baixando seus filmes e m&uacute;sicas favoritas! O c&eacute;u &eacute; o limite ( e a banda da internet tamb&eacute;m!).</p><p>Confira ofertas de: <a href="http://centenaro.org/submarino/?pal=DVD" rel="external" target="_Blank">DVD</a>, <a href="http://centenaro.org/submarino/?pal=filmes" rel="external" target="_Blank">filmes</a>, <a href="http://centenaro.org/submarino/?pal=celular" rel="external" target="_Blank">celular</a>, <a href="http://centenaro.org/submarino/?pal=notebook" rel="external" target="_Blank">notebook</a>, <a href="http://centenaro.org/submarino/?pal=livros" rel="external" target="_Blank">livros</a>, <a href="http://centenaro.org/submarino/?pal=jogos" rel="external" target="_Blank">jogos</a>, <a href="http://centenaro.org/submarino/?pal=Wii" rel="external" target="_Blank">Wii</a>, <a href="http://centenaro.org/submarino/?pal=PS3" rel="external" target="_Blank">PS3</a>, <a href="http://centenaro.org/submarino/?pal=MP4" rel="external" target="_Blank">MP4</a></p><p>a</p>
<p><a href="http://fdweb.com.br/arquivo-torrent-o-que-e-como-funciona/">Arquivo Torrent: O que &eacute; e como funciona</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/arquivo-torrent-o-que-e-como-funciona/feed/</wfw:commentRss>
		<feedburner:origLink>http://fdweb.com.br/arquivo-torrent-o-que-e-como-funciona/</feedburner:origLink></item>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=fdweb</feedburner:awareness></channel>
</rss><!-- Loaded originally in 0.77 seconds (2008-11-21, 13:56:06). -->
