<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>TechTips &#187; Práticas</title>
	<atom:link href="http://www.techtips.com.br/category/programacao/praticas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.techtips.com.br</link>
	<description>Dicas de Tecnologia</description>
	<lastBuildDate>Wed, 24 Jun 2009 19:06:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Modulariza&#231;&#227;o de Aplicativos &#8211; Single Package</title>
		<link>http://www.techtips.com.br/programacao/modularizao-de-aplicativos-single-package/</link>
		<comments>http://www.techtips.com.br/programacao/modularizao-de-aplicativos-single-package/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 18:42:50 +0000</pubDate>
		<dc:creator>Wanderson</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Práticas]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/modularizao-de-aplicativos-single-package/</guid>
		<description><![CDATA[Quem desenvolve aplicativos modularizados, pode já ter se deparado com uma desvantagem comum quando se trata de distribuir pacotes de runtime: como controlar quais packages distribuir junto com o aplicativo/módulos e suas versões e facilitar suas atualizações? Normalmente quando compilamos um aplicativo com a opção “Build with runtime packages” marcada, no mínimo teremos que redistribuir [...]]]></description>
			<content:encoded><![CDATA[<p>Quem desenvolve aplicativos modularizados, pode já ter se deparado com uma desvantagem comum quando se trata de distribuir pacotes de runtime: como controlar quais packages distribuir junto com o aplicativo/módulos e suas versões e facilitar suas atualizações?</p>
<p>Normalmente quando compilamos um aplicativo com a opção “Build with runtime packages” marcada, no mínimo teremos que redistribuir os pacotes rtlxx.bpl e vclxx.bpl (onde o “xx” equivale à versão do Delphi, pelo menos até o Delphi 7), mais os pacotes referenciados pelas units da vcl e/ou de terceiros.</p>
<p>Agora imagine um projeto grande, onde temos vários componentes de terceiros empregados. Quantos arquivos extras se tornariam dependências para o aplicativo?</p>
<p>Procurando uma maneira simples para minimizar o número de arquivos a serem distribuídos em conjunto com um aplicativo que use runtime packages, me deparo com o excelente tutorial de <a href="http://www.saxon.co.uk/SinglePkg/">Keith Johnson</a>, ao qual não posso acrescentar muita coisa, por já ser muito completo e didático. Contento-me a simplificá-lo e torná-lo útil para a realidade de muitos aqui.</p>
<h3>Direto ao ponto</h3>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image001.gif"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image001-thumb.gif" border="0" alt="clip_image001" width="379" height="180" /></a></p>
<p>Figura 1 – Aplicativo com pacotes dinâmicos de forma convencional.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image002.gif"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image002-thumb.gif" border="0" alt="clip_image002" width="379" height="144" /></a></p>
<p>Figura 2 – Aplicativo com pacotes dinâmicos carregando de um único pacote.</p>
<p>Abra o Delphi, crie um novo aplicativo e salve o projeto. Adicione os componentes necessários de forma natural, como se fosse um projeto comum e salve.</p>
<p>Agora você pode fechar seu projeto e criar um novo package, ou criá-lo no mesmo grupo de projetos. Para simplificar, vou usar a segunda opção. Crie uma Unit vazia dentro deste novo package.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image0016.gif"><img src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image0016-thumb.gif" border="0" alt="clip_image001[6]" width="295" height="337" /></a></p>
<p>Você deverá percorrer TODOS os forms do seu projeto, vasculhando as cláusulas Uses para que todas as units referenciadas sejam adicionadas àquela unit do nosso pacote. Nosso objetivo será fazer com que o pacote importe todas essas units implicitamente para dentro dele, para que o executável tenha apenas ele como dependência. Para isso vá até Project -&gt; Options e escolha a opção “Directories/Conditionals”, altere o “Output directory” e o “DCP directory” para uma pasta onde estará seu executável (o “DCP directory” é necessário na hora da compilação do executável, pois ele vai procurar pelo arquivo .dcp do pacote, mas em tempo de execução, ele só precisará do arquivo .bpl), ou onde ele tenha acesso pelo path do Windows.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image003.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image003-thumb.jpg" border="0" alt="clip_image003" width="515" height="349" /></a></p>
<p>É preferível deixar junto ao executável como numa pasta “bin” do seu projeto para facilitar a localização e distribuição, evitando um “bpl hell”. Clique em Ok e vá até aquela unit que você criou dentro do pacote. Adicione uma cláusula Uses a ela e coloque todas as units referenciadas pelo seu aplicativo.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image005.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image005-thumb.jpg" border="0" alt="clip_image005" width="531" height="186" /></a></p>
<p>No diretório de saída que você acabou de configurar, coloque uma cópia da SysInit.dcu, que se encontra em $(BDS)\lib (ex: C:\Arquivos de programas\CodeGear\RAD Studio\5.0\lib). Esta unit faz-se necessária, pois se você tentar compilar seu projeto sem ela, vai disparar uma exceção, informando que não foi possível encontrar SysInit.dcu (lembre-se: o search path que você configurou sobrepõe o default do Delphi, daí ele não achar). Mesmo assim, esta unit não deve ser adicionada na sessão uses da unit do pacote, deverá apenas permanecer lá na pasta de destino. Vá até a sessão “requires” do seu pacote lá no Project manager e elimine TODAS as referências a outros packages, deixando-a vazia.</p>
<p>Agora compile seu pacote. Irá aparecer uma mensagem, dizendo que você deve incluir os packages da lista para manter compatibilidade com outros pacotes já instalados.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image006.gif"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image006-thumb.gif" border="0" alt="clip_image006" width="389" height="305" /></a></p>
<p>É agora que vem o segredo: Escolha “Cancel” para que as units referenciadas sejam importadas para dentro de nosso pacote, e não as referências aos seus respectivos packages. Outro diálogo aparecerá com a mensagem: “If these changes are not applied, errors may occur when the package is loaded. Cancel changes?”.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image008.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image008-thumb.jpg" border="0" alt="clip_image008" width="522" height="113" /></a></p>
<p>Escolha “Yes” agora. Toda vez que esse pacote for recompilado você deverá seguir estes passos.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image010.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image010-thumb.jpg" border="0" alt="clip_image010" width="526" height="408" /></a></p>
<p>Se você verificar o resultado, poderá comprovar um package de até vários megabytes na pasta de destino (em um projeto que temos por aqui, está em torno de 13MB). Então, acabou? Ainda não, só mais uns ajustes no executável.</p>
<p>Considerando que você seguiu meu conselho e criou uma pasta só para os binários (“bin”, onde estarão .exe, .dcp, .bpl), selecione o projeto do executável agora, vá até Project -&gt; Options e escolha a opção “Directories/Conditionals”, lá em “Search path”, coloque o caminho da pasta Bin do seu projeto e faça o mesmo para o “Output directory”.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image012.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image012-thumb.jpg" border="0" alt="clip_image012" width="554" height="349" /></a></p>
<p>Ainda nesta tela, escolha a opção “Packages”, marque a opção “Build with runtime pakages” e no Edit, limpe tudo, para adicionar apenas o nome do seu pacote.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image014.jpg"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image014-thumb.jpg" border="0" alt="clip_image014" width="555" height="410" /></a></p>
<p>Clique em Ok e dê um build no seu aplicativo. Com isso, você já poderá notar uma redução de até 90% no tamanho do executável.</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image015.gif"><img style="0px" src="http://www.techtips.com.br/wp-content/uploads/2008/11/clip-image015-thumb.gif" border="0" alt="clip_image015" width="552" height="143" /></a></p>
<p>Como já dito antes, para a distribuição do nosso aplicativo teste, apenas os 2 arquivos acima marcados serão necessários.</p>
<h3>Conclusão</h3>
<p>Quais as vantagens que podemos tirar deste método? Teremos todas as vantagens de se utilizar pacotes dinâmicos em um aplicativo, como velocidade na compilação (lembre-se que na maioria das vezes, você compilará apenas o código associado diretamente ao seu aplicativo, pois o código dos componentes já está embutido no pacote), executáveis e dlls muito menores (muito mais simples e rápido para atualizar seu aplicativo junto aos clientes) e maior facilidade para implementação de plugins, seja com dlls ou bpls. Se você colocar regras de negócio em um pacote ou fizer uso de rotinas muito sigilosas, poderá distribuir apenas os bpls do pacote livremente entre os desenvolvedores do projeto sem medo, pois estará fazendo uso do encapsulamento de código a seu favor.</p>
<p>E as desvantagens? Se você considerar todos os benefícios desta abordagem, o fato de ter que atualizar um pacote de 13MB (se compactar pode cair para 4MB ou 5MB) toda vez que mudar algum componente não pesará tão contra assim.</p>
<p>Este exemplo criou um único pacote com todas as units utilizadas pelo aplicativo, mas se você preferir poderá criar 2, 3 ou quantos pacotes precisar, separando-os por categoria, como pacotes de componentes visuais, acesso a dados, regras de negócio ou outra categoria que for necessária para seu projeto.</p>
<p>Este é o meu primeiro post, e espero que seja útil para quem precisar aplicar tais conceitos.</p>
<p><center>&copy; <a href="http://">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/modularizao-de-aplicativos-single-package/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Comparando imagens dentro de um banco de dados</title>
		<link>http://www.techtips.com.br/programacao/delphi/comparando-imagens-dentro-de-um-banco-de-dados/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/comparando-imagens-dentro-de-um-banco-de-dados/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 13:58:32 +0000</pubDate>
		<dc:creator>Alexandre José</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Práticas]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/praticas/comparando-imagens-dentro-de-um-banco-de-dados/</guid>
		<description><![CDATA[Imagine que você trabalha na FOX e o produtor dos Simpsons pediu que você montasse um banco de dados de imagens do seriado, mas, como detalhe, pediu que as imagens nunca se repetissem.  Putz, como posso desenvolver isso?    x    Para esta dificuldade, uma das soluções que podemos utilizar é o MD5. O MD5 [...]]]></description>
			<content:encoded><![CDATA[<p>Imagine que você trabalha na FOX e o produtor dos Simpsons pediu que você montasse um banco de dados de imagens do seriado, mas, como detalhe, pediu que as imagens nunca se repetissem. </p>
<p>Putz, como posso desenvolver isso?</p>
<p> <img src="http://www.alexandrejose.com.br/img/Comparandoimagensdentrodeumbancodedados_149BC/simp01.png" alt="" />  x  <img src="http://www.alexandrejose.com.br/img/Comparandoimagensdentrodeumbancodedados_149BC/simp02.png" alt="" /> </p>
<p>Para esta dificuldade, uma das soluções que podemos utilizar é o MD5. O MD5 é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., usado por softwares com protocolo ponto-a-ponto (P2P), por exemplo. Através deste algorítimo podemos verificar se arquivos são iguais ou não. Isto incluem imagens!</p>
<p>Agora tudo ficou mais fácil! No final deste artigo existe um exemplo desenvolvido em Delphi 7 que possui uma Unit de funções chamada MD5.pas. Dentro dela existem funções que convertem vários formatos de entrada de dados para o hash MD5, tais como: MD5String, MD5File, MD5Stream e MD5DigestToStr.</p>
<p>Supondo que você fosse desenvolver o sistema de armazenamento de imagens, você utilizaria o MD5Stream para calcular o hash das imagens já armazenadas, jogando as mesmas dentro de uma variável TMemoryStream e o MD5File para o arquivo a ser inserido. Se eles forem iguais a imagem já existe no banco. Agora ficou fácil demais! <img src='http://www.techtips.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.alexandrejose.com.br/download/CompImg.rar">Download</a></p>
<p><center>&copy; <a href="http://www.waveobjects.com.br/blog">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi/comparando-imagens-dentro-de-um-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Delphi Basics &#8211; Constructors, Aula 1</title>
		<link>http://www.techtips.com.br/programacao/delphi-basics-constructors-aula-1/</link>
		<comments>http://www.techtips.com.br/programacao/delphi-basics-constructors-aula-1/#comments</comments>
		<pubDate>Sun, 15 Apr 2007 10:29:31 +0000</pubDate>
		<dc:creator>Alexandre José</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Linguagem Delphi]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Práticas]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi-basics-constructors-aula-1/</guid>
		<description><![CDATA[A&#160;partir de hoje iniciarei uma série de artigos que abordam principalmente conceitos básicos de programação na linguagem Delphi. Pretendo nessa série de artigos abordar tudo relacionado à linguagem em si, como classes e objetos, encapsulamento, construtores/destrutores, exceções, hierarquia de classes e por ai em diante. Inicialmente vamos criar uma unit chamada CursoDelphiBasic.pas, esta unit será [...]]]></description>
			<content:encoded><![CDATA[<p>A&nbsp;partir de hoje iniciarei uma série de artigos que abordam principalmente conceitos básicos de programação na linguagem Delphi.</p>
<p>Pretendo nessa série de artigos abordar tudo relacionado à linguagem em si, como classes e objetos, encapsulamento, construtores/destrutores, exceções, hierarquia de classes e por ai em diante. </p>
<p>Inicialmente vamos criar uma unit chamada <strong>CursoDelphiBasic.pas</strong>, esta unit será nossa classe de trabalho durante o desenvolvimento desta série. Sempre no final do artigo você poderá fazer o download da unit atualizada.</p>
<p>A estrutura inicial de nossa unit será esta:</p>
<p>
<pre>unit CursoDelphiBasics;

interface

type
  TCursoDelphiBasics = class
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create;
  end;

implementation

{ TCursoDelphiBasics }

constructor TCursoDelphiBasics.Create;
begin

end;

end.</pre>
</p>
<p>Para iniciar esta série de artigos vamos começar abordando um pouco os constructors. </p>
<p>Você sabe o que é um constructor?</p>
<p>Provavelmente você já deve ter utilizado o método Create com o objetivo de alocar memória para algum objeto. Este método é um constructor! Um método que você utiliza para inicializar e para alocar memória à uma instância desta mesma classe. Complicado? Claro que não! Vamos criar o construtor da nossa classe?</p>
<p>Dentro da cláusula <strong>public</strong> vamos digitar o seguinte método:</p>
<p><strong>constructor</strong> Create;</p>
<p>Logo após isto digite Ctrl + Shift + C. Repare que abaixo de <strong>implementation</strong> o Delphi criou a estrutura de nosso método:</p>
<p><strong>constructor</strong> TCursoDelphiBasics.Create;<br /><strong>begin</strong> </p>
<p><strong>end</strong>; </p>
<p>Agora você já tem uma classe e o seu constructor! <img src='http://www.techtips.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Para inicializar nossa classe dentro de qualquer form, como por exemplo o Form1, basta implementarmos o seguinte código dentro do OnCreate dele:</p>
<p>
<pre>procedure TForm1.FormCreate(Sender: TObject);
var
  AMinhaClasse : TCursoDelphiBasics;
begin
  AMinhaClasse := TCursoDelphiBasics.Create;
  try

  finally
    AMinhaClasse.Free;
  end;
end;</pre>
</p>
<p>No próximo artigo vamos implementar, parametrizar&nbsp;e abordar os recursos disponíveis na criação do nosso constructor. <a href="http://www.waveobjects.com.br/blog/artigos/source/CursoDelphiBasics_Aula1.rar">Download do fonte atualizado</a>. Até a próxima.</p>
<p><center>&copy; <a href="http://www.waveobjects.com.br/blog">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi-basics-constructors-aula-1/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>FastMM e Delphi 2006</title>
		<link>http://www.techtips.com.br/programacao/fastmm-e-delphi-2006/</link>
		<comments>http://www.techtips.com.br/programacao/fastmm-e-delphi-2006/#comments</comments>
		<pubDate>Thu, 22 Feb 2007 16:06:39 +0000</pubDate>
		<dc:creator>Alexandre José</dc:creator>
				<category><![CDATA[Componentes]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Gerenciamento de Memória]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Linguagem Delphi]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Práticas]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/fastmm-e-delphi-2006/</guid>
		<description><![CDATA[Continuando um tema anteriormente publicado, neste artigo vamos começar a detectar os vazamentos de memória (memory leaks) existentes em nossos aplicativos. (isso se existirem, é claro&#8230;) A partir do&#160;Delphi 2006 o gerenciador de memória padrão que acompanha o Delphi passa a ser o FastMM. Quem não trabalha com Delphi 2006 pode baixar o FastMM aqui. [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando um tema anteriormente publicado, neste artigo vamos começar a detectar os vazamentos de memória (memory leaks) existentes em nossos aplicativos. (isso se existirem, é claro&#8230;)</p>
<p>A partir do&nbsp;Delphi 2006 o gerenciador de memória padrão que acompanha o Delphi passa a ser o FastMM. Quem não trabalha com Delphi 2006 pode baixar o FastMM <a href="http://sourceforge.net/project/showfiles.php?group_id=130631">aqui</a>.</p>
<p>Se você estiver começando agora a desenvolver com Delphi deve estar se perguntando: Tá, e dai? O que é memory leak?</p>
<p><strong>Memory leak é um objeto criado pela aplicação que não foi corretamente destruído.</strong></p>
<p>Você pode simular esta situação criando qualquer objeto no OnCreate do formulário principal da sua aplicação. Exemplo:</p>
<p>
<pre>procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally

  end;
end;</pre>
</p>
<p>Execute o aplicativo e feche-o. Você notará que não acontece nada! <img src='http://www.techtips.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Esse teste ridículo foi feito só para você ver como é comum ocorrerem problemas que resultem em&nbsp;vazamentos de memória (memory leaks)&nbsp;como a falta de atenção (nesse caso),&nbsp;a pressa, Control+C / Control+V entre alguns outros.</p>
<p>Agora insira esta linha logo após o begin da sua procedure:</p>
<p>ReportMemoryLeaksOnShutdown := True;</p>
<p>Deixando o código assim:</p>
<p>
<pre>procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally

  end;
end;</pre>
</p>
<p>Repita a operação e veja o que acontece após fechar o aplicativo:</p>
<p><img src="http://www.waveobjects.com.br/blog/img/FastMMeDelphi2006_60DB/ML0127.png"> </p>
<p>Veja que recebemos a notificação do TStringList que criamos e das 3 linhas que adicionamos (String x 3) a ele. A&nbsp;partir dai podemos começar a evitar esse tipo de erro na hora de desenvolvermos aplicativos.</p>
<p>Uma dica importante é você utilizar o&nbsp;bloco <strong>try&#8230;finally&#8230;end;</strong> sempre que criar um objeto dinamicamente. Isto evita que ocorra um erro no meio da execução e ele não seja destruído devidamente. Veja os dois exemplos:</p>
<p><u>Método não apropriado:</u></p>
<p>
<pre>procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  lstVazamento.Add('Linha 1');
  lstVazamento.Add('Linha 2');
  lstVazamento.Add('Linha 3');
  lstVazamento.Free;
end;</pre>
</p>
<p><u>Método apropridado de utilização:</u></p>
<p>
<pre>procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally
    lstVazamento.Free;
  end;
end;</pre>
</p>
<p>Utilizando o bloco <strong>try&#8230;finally&#8230;end;</strong> mesmo que ocorra algum erro na execução do procedimento o objeto é destruído. Pelo método não apropriado lstVazamento não seria destruído caso ocorresse algum problema na execução da linha lstVazamento.Add(&#8216;Linha 1&#8242;);, por exemplo.</p>
<p>Em tempo: utilizando ReportMemoryLeaksOnShutdown := True; a mensagem ocorrerá sempre que o aplicativo for terminado, inclusive fora do Delphi. Para evitarmos esse situação, substitua o True por DebugHook &lt;&gt; 0; deixando a linha assim:</p>
<p>ReportMemoryLeaksOnShutdown := DebugHook &lt;&gt; 0; </p>
<p>Para quem utiliza outras versões do Delphi isto deve ser configurado no arquivo FastMM4Options.inc.</p>
<p>No&nbsp;próximo artigo abordaremos mais funções do FastMM&nbsp;e configurações do arquivo FastMM4Options.inc para quem utiliza FastMM em versões mais antigas do Delphi. Até mais!</p>
<p><center>&copy; <a href="http://www.waveobjects.com.br/blog">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/fastmm-e-delphi-2006/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.584 seconds -->
