<?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; IDE</title>
	<atom:link href="http://www.techtips.com.br/category/programacao/delphi/ide/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.1</generator>
		<item>
		<title>Compilando projetos Delphi por linha de comando</title>
		<link>http://www.techtips.com.br/programacao/delphi/ide/compilando-projetos-delphi-por-linha-de-comando/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/ide/compilando-projetos-delphi-por-linha-de-comando/#comments</comments>
		<pubDate>Sat, 07 Jul 2007 03:00:22 +0000</pubDate>
		<dc:creator>Jeferson Oliveira</dc:creator>
				<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi/ide/compilando-projetos-delphi-por-linha-de-comando/</guid>
		<description><![CDATA[Introdução Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando: como acioná-lo manualmente, como automatizar a compilação de um projeto, e as diferentes possibilidades de configurações permitidas. Para os exemplos apresentados aqui será utilizado o Delphi 7, mas as mesmas configurações poderão ser utilizadas sem muitas alterações em qualquer versão [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Introdução</strong></p>
<p>Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando: como acioná-lo manualmente, como automatizar a compilação de um projeto, e as diferentes possibilidades de configurações permitidas.</p>
<p>Para os exemplos apresentados aqui será utilizado o Delphi 7, mas as mesmas configurações poderão ser utilizadas sem muitas alterações em qualquer versão do Delphi.</p>
<p><strong>O problema</strong></p>
<p>A compilação de um projeto precisa ser um processo rápido e eficiente.&nbsp;O tempo&nbsp;gasto para abrir o IDE do Delphi,&nbsp;aguardar que ele esteja completamente&nbsp;carregado,&nbsp;abrir o projeto que precisa ser liberado, para só então dar início&nbsp;à compilação, será sempre maior do que o tempo&nbsp;realmente necessário&nbsp;pelo compilador para a geração do arquivo final.</p>
<p><strong>A&nbsp;solução</strong></p>
<p>Para simplificar essa tarefa, tornando-a mais ágil e confiável, temos a possibilidade de&nbsp;acionar o compilador por linha de comando. Esse processo, se corretamente configurado,&nbsp;produzirá o mesmo resultado que seria obtido ao compilar o projeto pelo IDE do Delphi.</p>
<p><strong>O compilador</strong></p>
<p>O compilador do Delphi é o arquivo dcc32.exe que fica localizado em $(DELPHI)\Bin. Para&nbsp;listar os parâmetros do compilador, basta digitar dcc32 no <em>prompt</em> de comando do Windows.</p>
<ul>
<li><strong>Nota:</strong> Se houver mais de uma versão do Delphi instalada no computador, digitar apenas dcc32 acionará a primeira versão do compilador encontrada na variável de ambiente &#8220;PATH&#8221; do Windows. Nesses casos, para acionar uma versão específica do compilador, indique o caminho completo do arquivo dcc32.exe.</li>
</ul>
<p>Abaixo um exemplo das informações exibidas no <em>prompt</em> de comando ao executar o dcc32.exe sem informar qualquer parâmetro:</p>
<pre width="80"><strong>C:\\&gt;</strong>dcc32
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation

Syntax: dcc32 [options] filename [options]

  -A&lt;unit&gt;=&lt;alias&gt; = Set unit alias  -LU&lt;package&gt; = Use package
  -B = Build all units               -M = Make modified units
  -CC = Console target               -N&lt;path&gt; = DCU output directory
  -CG = GUI target                   -O&lt;paths&gt; = Object directories
  -D&lt;syms&gt; = Define conditionals     -P = look for 8.3 file names also
  -E&lt;path&gt; = EXE output directory    -Q = Quiet compile
  -F&lt;offset&gt; = Find error            -R&lt;paths&gt; = Resource directories
  -GD = Detailed map file            -U&lt;paths&gt; = Unit directories
  -GP = Map file with publics        -V = Debug information in EXE
  -GS = Map file with segments       -VR = Generate remote debug (RSM)
  -H = Output hint messages          -W = Output warning messages
  -I&lt;paths&gt; = Include directories    -Z = Output 'never build' DCPs
  -J = Generate .obj file            -$&lt;dir&gt; = Compiler directive
  -JP = Generate C++ .obj file       --help = Show this help screen
  -K&lt;addr&gt; = Set image base addr     --version = Show name and version
Compiler switches: -$&lt;letter&gt;&lt;state&gt; (defaults are shown below)
  A8  Aligned record fields           P+  Open string params
  B-  Full boolean Evaluation         Q-  Integer overflow checking
  C+  Evaluate assertions at runtime  R-  Range checking
  D+  Debug information               T-  Typed @ operator
  G+  Use imported data references    U-  Pentium(tm)-safe divide
  H+  Use long strings by default     V+  Strict var-strings
  I+  I/O checking                    W-  Generate stack frames
  J-  Writeable structured consts     X+  Extended syntax
  L+  Local debug symbols             Y+  Symbol reference info
  M-  Runtime type info               Z1  Minimum size of enum types
  O+  Optimization</pre>
<p>Todos os parâmetros do compilador devem ser precedidos por hífen (-) ou por barra (/).</p>
<p>Entre os diversos parâmetros existentes, os mais relevantes para nosso exemplo são:</p>
<p>B: Indica que deverão ser compiladas&nbsp;todas as <em>units</em>&nbsp;do projeto. É equivalente&nbsp;à opção &#8220;Build&#8221; disponível no menu &#8220;Projects&#8221; do Delphi;</p>
<p>H: Habilita (-H+) ou desabilita (-H-) a exibição de <em>hints</em>.</p>
<p>Q:&nbsp;será realizada uma compilação silenciosa, não emitindo informações sobre todos os arquivos processados pelo compilador. <em>Hints</em>, <em>warnings</em> e erros serão exibidos normalmente.</p>
<p>R: Lista de diretórios nos quais o compilador irá buscar por arquivos de recursos (.RC, .RES) utilizados no projeto;</p>
<p>U: Lista de diretórios nos quais o compilador irá&nbsp;procurar&nbsp;arquivos .PAS ou .DCU utilizados no projeto;</p>
<p>W: Habilita (-W+) ou desabilita (-W-) a exibição de mensagens do compilador. Para habilitar ou desabilitar um alerta&nbsp;específico, basta citar&nbsp;os alertas&nbsp;após o parâmetro, precedidos de + ou -. Exemplo: -W-UNIT_PLATFORM +UNIT_DEPRECATED</p>
<ul>
<li><strong>Nota:</strong> Nos parâmetros que indicam diretórios, caso mais de um diretório seja listado, eles deverão estar separados por ponto e vírgula (;).</li>
</ul>
<p><strong>Nosso projeto de exemplo</strong></p>
<p>Vamos criar um novo projeto, que não fará nada além de produzir algumas situações que nos permitirão tirar proveito dos recursos do compilador. No Delphi 7 acesse File/New/Aplication. Adicione&nbsp;ao form um TFileListBox e um TButton. No evento OnClick do&nbsp;botão, defina&nbsp;o código abaixo:&nbsp;</p>
<pre width="80"><strong>procedure</strong> TfrmPrincipal.btnFazNadaClick(Sender: TObject);
<strong>var</strong>
  i: Integer;
  s: string;
<strong>begin</strong>
  s := 'alo mamae';
  ShowMessage(s);
<strong>end</strong>;</pre>
<p>Salve a <em>unit</em> como <strong>Principal.pas</strong>, salve o projeto como <strong>Compila.dpr</strong> e defina a propriedade <strong>Name</strong> do form como <strong>frmPrincipal</strong>. </p>
<p><strong>Compilação manual</strong></p>
<p>Vamos então começar o uso do compilador. Inicie o <em>prompt</em> de comando do Windows e digite o caminho do compilador seguido do caminho completo do arquivo DPR. Por exemplo:</p>
<pre width="80"><strong>C:\\&gt;</strong>dcc32 T:\\ProjetoExemplo\\Compila.dpr</pre>
<p>Ao executar esse comando será retornado um erro, indicando que o arquivo Principal.dcu não foi encontrado. Esse erro ocorre porque nenhum Principal.pas nem Principal.dcu foram encontrados nos diretórios conhecidos pelo dcc32. Uma forma simples de evitar esse problema é sempre iniciar a compilação a partir do diretório do projeto. Para isso basta alterar o diretório corrente antes de executar o compilador. Como exemplificado abaixo:&nbsp;</p>
<pre width="80"><strong>C:\\&gt;</strong>T:
<strong>T:\\&gt;</strong>cd \\ProjetoExemplo
<strong>T:\\ProjetoExemplo&gt;</strong>dcc32 Compila.dpr</pre>
<p>Se tudo correu bem, nesse ponto a compilação foi executada sem erros, e o arquivo <strong>Compila.exe</strong> foi gerado corretamente. Porém, algumas mensagens foram exibidas pelo compilador:</p>
<pre width="80">Principal.pas(7) Warning: Unit 'FileCtrl' is specific to a platform
Principal.pas(29) Hint: Variable 'i' is declared but never used in TfrmPrincipal.btnFazNadaClick'</pre>
<p>Os <em>hints</em> foram exibidos porque nas&nbsp;propriedades do projeto a opção &#8220;Show hints&#8221; está marcada, o que seria equivalente a passar o&nbsp; parâmetro /H+. Os <em>hints</em> são importantes, pois indicam situações que podem ser melhoradas no nosso código. Afinal, se a variável &#8220;s&#8221; não é utilizada em nenhum ponto do código, para quê declará-la? É possível desabilitar a exibição de <em>hints</em> passando o parâmetro /H-, mas a melhor forma mesmo de evitar essas mensagens é fazendo os ajustes necessários no seu código. No nosso caso vamos então remover a declaração da variável i, que é desnecessária.</p>
<p>Mas, para quem desenvolve somente aplicações para&nbsp;Windows, qual a&nbsp;relevância do alerta que indica que a <em>unit</em> FileCtrl é&nbsp;específica dessa plataforma? Nenhuma. Nesse caso, para deixarmos o log enxuto, contendo apenas as mensagens realmente necessárias, podemos desabilitar esse <em>warning</em>&nbsp;listando-o no parâmetro W. Como o arquivo Principal.dcu já se encontra no diretório e nenhuma alteração foi realizada em Principal.pas ele não precisará ser compilado novamente. Para forçar a compilação de todos os arquivos do projeto vamos inserir também o parâmetro B, que indica ao compilador que deve ser realizada uma compilação de todos os arquivos. O compilador exibe informações sobre cada arquivo sendo compilado. Se desejar omitir essas informações acrescente o parâmetro Q. Ficamos então com o seguinte comando:</p>
<pre width="80"><strong>T:\\ProjetoExemplo&gt;</strong>dcc32 -B Compila.dpr -Q -W-UNIT_PLATFORM</pre>
<p>Nesse ponto a compilação deve ser executada sem qualquer dica ou alerta, ficando a saída parecida com o exemplo abaixo:
<pre width="80">Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
52 lines, 0.20 seconds, 358352 bytes code, 7749 bytes data.</pre>
<p><strong>Automatizando a compilação</strong> </p>
<p>Já conseguimos compilar&nbsp;nosso projeto invocando manualmente o compilador pelo <em>prompt</em> de comando. Mas, como&nbsp;o processo de compilação precisa ser repetido inúmeras vezes, a qualquer tempo, não seria conveniente a cada compilação digitarmos os comandos no <em>prompt</em>. Para automatizar esse processo, podemos criar um arquivo de script com os comandos necessários. Crie um novo arquivo .CMD e insira nele os comandos. Segue o conteúdo do meu arquivo Compila.cmd:</p>
<pre width="80">@echo off
set PRJ=Compila.dpr
set DRIVE_PRJ=T:
set DIR_PRJ=\\ProjetoExemplo
set DIR_DELPHI=c:\\Progra~1\\Borland\\Delphi7\\Bin
set COMP_MSGS=-UNIT_PLATFORM

%DRIVE_PRJ%
cd %DIR_PRJ%
%DIR_DELPHI%\\dcc32.exe -B %PRJ% -Q -W%COMP_MSGS%</pre>
<p>Algumas variáveis foram criadas no arquivo para simplificar a manutenção dos comandos de compilação.&nbsp;Embora&nbsp;a definição dessas variáveis não&nbsp;seja indispensável para esse processo, seu uso é recomendável.</p>
<p>Agora temos uma forma automatizada de compilar nosso projeto, bastando para tanto executar o arquivo Compila.cmd, seja pelo <em>prompt</em> de comando, ou mesmo pelo Windows Explorer.</p>
<p><strong>Definindo os diretórios de componentes</strong></p>
<p>Se utilizássemos em nosso projeto componentes de terceiros, os diretórios onde se encontram seus arquivos de recursos e <em>units</em> precisariam ser informados para o compilador. Para isso são disponibilizados os parâmetros R e U.</p>
<p>Se, por exemplo, utilizássemos um TJvFileListBox, que é um componente da JVCL, bastaria indicar os diretórios da JVCL em nosso arquivo. Como no exemplo abaixo:</p>
<pre width="80">@echo off
set PRJ=Compila.dpr
set DRIVE_PRJ=T:
set DIR_PRJ=\\ProjetoExemplo
set DIR_DELPHI=c:\\Progra~1\\Borland\\Delphi7\\Bin
set COMP_MSGS=-UNIT_PLATFORM
set SEARCH_PATH=D:\\Delphi\\jcl\\lib\\d7;D:\\Delphi\\jvcl\\lib\\d7
set RES_PATH=D:\\Delphi\\jvcl\\resources

%DRIVE_PRJ%
cd %DIR_PRJ%
%DIR_DELPHI%\\dcc32.exe -U%SEARCH_PATH% -R%RES_PATH% -B %PRJ% -Q -W%COMP_MSGS%</pre>
<p><strong>Configurações por projeto</strong></p>
<p>Em alguns projetos é comum utilizarmos vários componentes de terceiros, habilitarmos&nbsp;ou desabilitarmos mensagens do compilador, entre tantas outras configurações que podem ser alteradas com freqüência. Embora o nosso arquivo de script permita configurar todas essas opções atualizá-lo&nbsp;à cada mudança das configurações do projeto não será uma tarefa tão cômoda. Uma maneira mais simples de realizar essas configurações é através das opções do projeto (menu Project/Options). As configurações alteradas pelas opções do projeto serão salvas nos arquivos Compila.cfg e Compila.res, que serão automaticamente lidos pelo dcc32.exe.</p>
<ul>
<li><strong>Nota:</strong> ao utilizar configurações personalizadas por projeto, não se esqueça de adicionar os arquivos .CFG .RES ao controle de versão.</li>
</ul>
<p>Vamos tirar proveito da facilidade das configurações visuais e organizar um pouco nosso projeto. Crie os diretórios bin e dcu dentro do diretório do projeto. Nesses diretórios serão colocados respectivamente o arquivo de saída do nosso projeto (.EXE, .DLL, etc.) e os arquivos .DCU. Para indicar ao compilador como usar esses diretórios&nbsp;acesse as opções do projeto. Na aba &#8220;Directories/Conditionals&#8221; preencha os campos &#8220;Output directory&#8221; e &#8220;Unit output directory&#8221;.</p>
<p><a href="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_4.jpg"><img height="226" alt="ProjectOptions" src="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_thumb_4.jpg" width="240" border="0"></a> </p>
<p>No campo &#8220;Search path&#8221; indique os diretórios&nbsp;dos componentes utilizados no projeto.</p>
<p><a href="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_SearchPath_4.jpg"><img height="176" alt="ProjectOptions_SearchPath" src="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_SearchPath_thumb_4.jpg" width="240" border="0"></a>&nbsp;</p>
<p>Caso no projeto sejam utilizadas diretivas de compilação, bastaria indicá-las no campo &#8220;Conditional defines&#8221;.</p>
<p>Na aba &#8220;Compiler messages&#8221; certifique-se que as opções &#8220;Show hints&#8221; e &#8220;Show warnings&#8221; estejam selecionadas. Uma lista de <em>warnings</em> é exibida nessa aba,&nbsp;permitindo desabilitar aquelas que não são relevantes para o projeto.</p>
<p><a href="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_CompMsgs.jpg"><img height="226" alt="ProjectOptions_CompMsgs" src="http://www.techtips.com.br/arquivos/jeferson/Compilaoporlinhadecomando_D60/ProjectOptions_CompMsgs_thumb.jpg" width="240" border="0"></a> </p>
<p>Após concluir essas configurações não será mais necessário indicar no nosso arquivo&nbsp;de script&nbsp;os diretórios de recuros e de <em>units</em>, nem mesmo indicar os alertas que deverão ser desabilitados, o que reduzirá o conteúdo do arquivo:</p>
<pre width="80">@echo off
set PRJ=Compila.dpr
set DRIVE_PRJ=T:
set DIR_PRJ=\\ProjetoExemplo
set DIR_DELPHI=c:\\Progra~1\\Borland\\Delphi7\\Bin

%DRIVE_PRJ%
cd %DIR_PRJ%
%DIR_DELPHI%\\dcc32.exe -B %PRJ% -Q</pre>
<p><strong>Configurações por máquina</strong></p>
<p>Com a utilização do arquivo de configurações do projeto ganhamos a possibilidade de realizar uma edição visual das configurações da compilação.</p>
<p>Normalmente um <em>build</em> completo só é realizado na máquina de liberação de versão, o que fica a cargo do administrador do projeto, mas&nbsp;é possível que um projeto possua vários desenvolvedores, trabalhando cada um em sua máquina, ou mesmo trabalhando remotamente, em ambientes diferentes, e seja necessário ou desejado que todos possam utilizar as mesmas configurações de compilação nos diversos ambientes. Nesses casos, utilizar&nbsp;um único&nbsp;arquivo de configuração&nbsp;por projeto exigirá que em todas as máquinas os componentes estejam instalados nos mesmos diretórios, ou ao menos estejam em uma estrutura de diretórios que possa ser referenciada por caminhos relativos. O que&nbsp;pode&nbsp;ser um problema&nbsp;se no projeto trabalharem desenvolvedores <em>free-lancers</em>. Uma forma de contornar esse problema é referenciando os componentes por diretórios virtuais, criados pelo comando <em>subst</em> no <em>prompt</em> de comando do Windows. Mas, ainda assim, seria necessário que os mesmos diretórios virtuais fossem criados em todos os computadores. Outra maneira é utilizar configurações gerais por máquina.</p>
<p>Sempre que o compilador é acionado ele busca por configurações no arquivo dcc32.cfg que se encontra no mesmo diretório que o arquivo dcc32.exe, depois procura pelo arquivo dcc32.cfg no diretório do projeto e, finalmente, pelo arquivo NomeDoProjeto.cfg, no nosso caso Compila.cfg, no diretório do projeto. Todas as configurações são consideradas, o que significa que podemos fazer uso de mais de um arquivo ao mesmo tempo. Para o problema citado acima, onde cada máquina pode possuir configurações diferentes, os parâmetros referentes a diretórios componentes poderiam ser definidos em $(Delphi)\Bin\dcc32.cfg, pois podem variar por máquina,&nbsp;e as demais configurações que são gerais, como&nbsp;exibição de alertas, diretivas de compilação, e diretórios&nbsp;para geração de dcus e binários, poderiam ser mantidas no arquivo de configuração do projeto.</p>
<p>O dcc32.cfg pode também ser utilizado para definir configurações&nbsp;e diretórios que se apliquem a todos os projetos utilizados em um determinado ambiente. Fazendo uma analogia com o IDE do Delphi, os diretórios definidos no dcc32.cfg seriam equivalentes aqueles definidos no <em>library path </em>(Tools/Environment options/Library/Library path) tendo, portanto, visibilidade global, válida para todos os projetos; já os diretórios definidos em NomeDoProjeto.cfg são aqueles visíveis pelo <em>Search path</em>(Project/Options/Directories/Conditionals/Search path) e são&nbsp;específicas do projeto em questão.</p>
<p>O arquivo dcc32.cfg deve ser editado manualmente. Para facilitar pode-se copiar o conteúdo do arquivo de configurações do projeto, mas a cada alteração em diretórios ele precisará ser atualizado novamente.</p>
<p><strong>Recursos não disponíveis</strong></p>
<p><font color="#ff0000"><font color="#000000">Um recurso do qual você pode sentir falta ao&nbsp;utilizar o compilador&nbsp;por linha de comando</font></font> <font color="#ff0000"><font color="#000000">é&nbsp;o incremento automático do número da versão do arquivo.&nbsp;Ainda que essa opção tenha sido selecionada nas configurações do projeto, ela não terá efeito, pois não se trata de uma funcionalidade do compilador, mas sim do IDE do Delphi. Uma saída para continuar incrementando a versão do arquivo, seria desenvolver um utilitário com essa funcionalidade, e invocá-lo no arquivo de script, mas isso é assunto para outro artigo.</font></font></p>
<p><strong>Considerações finais</strong></p>
<p>Como vimos, a compilação de projetos por linha de comando é um recurso simples de ser utilizado que pode nos auxiliar muito na padronização do processo de compilação e liberação de versões, tornando essa tarefa mais ágil e confiável.</p>
<p>Caso precise de uma automação completa do processo de liberação de versão,&nbsp;vale a pena conhecer algumas das&nbsp;ferramentas interessantes disponíveis&nbsp;atualmente para essa finalidade, entre as quais tem destaque a comercial <a href="http://www.finalbuilder.com">FinalBuilder</a>, e as gratuitas&nbsp;<a href="http://rake.rubyforge.org/">Rake</a>&nbsp;e&nbsp;<a href="http://msdn2.microsoft.com/en-us/library/wea2sca5(VS.80).aspx">MSBuild</a>, sendo essa última a ferramenta padrão de <em>build</em>&nbsp;do Delphi2007.</p>
<p>Espero com esse artigo ter contribuído de alguma forma para a melhoria do seu processo de compilação.</p>
<p>Comentários, críticas&nbsp;e sugestões serão muito bem-vindos para que os próximos artigos possam ser aprimorados.</p>
<p><center>&copy; <a href="http://">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi/ide/compilando-projetos-delphi-por-linha-de-comando/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>CnWizards para Delphi 2007</title>
		<link>http://www.techtips.com.br/programacao/delphi/cnwinzards-para-delphi-2007/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/cnwinzards-para-delphi-2007/#comments</comments>
		<pubDate>Tue, 01 May 2007 16:10:08 +0000</pubDate>
		<dc:creator>Alexandre José</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Experts]]></category>
		<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi/cnwinzards-para-delphi-2007/</guid>
		<description><![CDATA[Como o CnWizards ainda não possui uma versão estável para Delphi 2007 e eu estava precisando de algumas boas ferramentas que ele possui acabei baixando do CVS dele os fontes e compilando uma versão compatível, mas ainda não estável. Você pode baixar essa instalação clicando aqui. As instruções de como instalar estão dentro do arquivo [...]]]></description>
			<content:encoded><![CDATA[<p>Como o CnWizards ainda não possui uma versão estável para Delphi 2007 e eu estava precisando de algumas boas ferramentas que ele possui acabei baixando do CVS dele os fontes e compilando uma versão compatível, mas ainda não estável.</p>
<p>Você pode baixar essa instalação clicando <a href="http://www.waveobjects.com.br/blog/arquivos/CnWizards_D2007.rar">aqui</a>. As instruções de como instalar estão dentro do arquivo &#8220;<strong>instalar.txt</strong>&#8220;.</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/cnwinzards-para-delphi-2007/feed/</wfw:commentRss>
		<slash:comments>2</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>
		<item>
		<title>Arquivos Gerados Pelo Compilador</title>
		<link>http://www.techtips.com.br/programacao/delphi/ide/arquivos-gerados-pelo-compilador/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/ide/arquivos-gerados-pelo-compilador/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 18:55:46 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi/ide/arquivos-gerados-pelo-compilador/</guid>
		<description><![CDATA[Ao compilar um projeto Delphi, vários arquivos podem ser gerados pelo compilador. Alguns são bem conhecidos, outros nem tanto. Você conhece todos? .dcu, .dpu, .dcuil DCU, ou &#8220;Delphi Compiled Unit&#8221;, contém o código compilado de uma unit .pas, e, opcionalmente, informações de debug que podem ser usadas posteriormente pela IDE. O .dpu é o correspondente [...]]]></description>
			<content:encoded><![CDATA[<p>Ao compilar um projeto Delphi, vários arquivos podem ser gerados pelo compilador. Alguns são bem conhecidos, outros nem tanto. Você conhece todos?</p>
<ul>
<li>.dcu, .dpu, .dcuil</li>
</ul>
<p>DCU, ou &#8220;Delphi Compiled Unit&#8221;, contém o código compilado de uma unit .pas, e, opcionalmente, informações de debug que podem ser usadas posteriormente pela IDE. O .dpu é o correspondente do Kylix, e .dcuil é o mesmo arquivo gerado pelo compilador de Delphi para .Net</p>
<ul>
<li>.dcp, .dcpil</li>
</ul>
<p>O&nbsp;arquivo .dcp é uma espécie de conjunto de todos os DCUs que formam uma package. O .dcpil é a versão .net desses dados, onde também é gerado pelo compilador Delphi ao importar assemblies escritos em outras linguagems, como C#.</p>
<ul>
<li>.exe</li>
</ul>
<p>Geralmente o que você espera que saia de uma compilação: o executável do seu projeto.</p>
<ul>
<li>.dll, .bpl</li>
</ul>
<p>DLLs são bem conhecidas de desenvolvedores windows: são bibliotecas que podem ser compartilhadas por vários executáveis, ou simplesmente servir para modularizar projetos. BPL é uma DLL com informações extras adicionadas pelo compilador Delphi, permitindo compartilhar tipos&nbsp;entre módulos e o executável de forma mais fácil.</p>
<ul>
<li>.map, .rsm, .pdb</li>
</ul>
<p>São arquivos opcionais, habilitados&nbsp;nas opções de projeto,&nbsp;contendo informações de debug. O primeiro contém informações sobre a relação do conteúdo do&nbsp;código fonte e o código gerado, o segundo possui dados específicos para o remote debugger. Arquivos .pdb são informações de debug externas geradas para aplicações .net</p>
<ul>
<li>.xml</li>
</ul>
<p>Se habilitado nas opções de projeto, o compilador também gera arquivos XML contendo documentação sobre as classes, extraídas das suas declarações e de comentários que se relacionam à elas.</p>
<ul>
<li>.drc</li>
</ul>
<p>Se for gerado um map file detalhado, também será gerado um arquivo .drc contendo uma lista de todos os recursos que o compilador incluiu no executável.</p>
<ul>
<li>.hpp, .obj, .lib</li>
</ul>
<p>Pra quem usa C++ Builder, se for habilitado a opção de gerar arquivos para o C++ nas opções de um projeto Delphi, o compilador também gera o .hpp, que é um header de C++ contendo as declarações do que estiver nos seus arquivos .pas.&nbsp;O .obj é o&nbsp;correspondente do .dcu para o C++, e o .lib, corresponde do .dcp. Útil para quem escreve componentes VCL para usar tanto no Delphi quanto no C++.</p>
<p>Sabendo pra que servem os arquivos gerados, e quando são gerados, fica mais fácil gerenciar os arquivos de um projeto, e decidir o que pode ser apagado e o quais devem estar no controle de versão.</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi/ide/arquivos-gerados-pelo-compilador/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando seu pr&#243;prio &quot;splash-screen&quot; na inicializa&#231;&#227;o da IDE do BDS</title>
		<link>http://www.techtips.com.br/programacao/delphi/criando-seu-prprio-splash-screen-na-inicializao-da-ide-do-bds/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/criando-seu-prprio-splash-screen-na-inicializao-da-ide-do-bds/#comments</comments>
		<pubDate>Thu, 18 Jan 2007 19:47:38 +0000</pubDate>
		<dc:creator>Alexandre José</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Linguagem Delphi]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi/criando-seu-prprio-splash-screen-na-inicializao-da-ide-do-bds/</guid>
		<description><![CDATA[Olá pessoal, resolvi colocar uma dica bacana para quem desenvolve pacotes de componentes. Quem utiliza o BDS já reparou que alguns packages, depois de carregados, exibem um pequeno bitmap de 24&#215;24 px.&#160;com a descrição do pacote de ferramentas e a empresa desenvolvedora na tela de inicialização da IDE. Podemos citar entre eles o JediVCS, RemObjects, [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>Olá pessoal, resolvi colocar uma dica bacana para quem desenvolve pacotes de componentes.
<p>Quem utiliza o BDS já reparou que alguns packages, depois de carregados, exibem um pequeno bitmap de 24&#215;24 px.&nbsp;com a descrição do pacote de ferramentas e a empresa desenvolvedora na tela de inicialização da IDE. Podemos citar entre eles o JediVCS, RemObjects, TMS Component Pack entre outros.
<p><img src="http://www.waveobjects.com.br/blog/artigos/artigo002/artigo002_01.png">
<p>Neste pequeno artigo quero mostrar como é fácil e rápido personalizarmos nossos pacotes de componentes com este recurso que a IDE nos oferece.
<p>Primeiramente devemos criar o nosso arquivo de recurso (.RES) com a imagem bitmap que irá ser apresentada na inicialização da IDE. Para isso você pode utilizar qualquer ferramenta de edição de recursos, até mesmo na linha de comando, compilando um arquivo texto com o aplicativo&nbsp;que a Code Gear nos disponibiliza, o BRCC32. Eu recomendo o XN Resource Editor(XRE), desenvolvido por Colin Wilson (Xana News), que além de ser muito bom é FREE. Para baixá-lo acesse o site: <a href="http://www.wilsonc.demon.co.uk/delphi.htm">http://www.wilsonc.demon.co.uk/delphi.htm</a>&nbsp;(vou utilizar ele como base para terminar este artigo mas você pode criar o arquivo da maneira que bem entender, desde que o recurso&nbsp;possua o mesmo nome deste exemplo ou você adapte este exemplo).
<p><strong><u>Criando o arquivo de recurso:</u></strong>
<ol>
<li>Dentro do XRE clique no menu &#8220;Resource&#8221; e selecione a opção &#8220;Import Image Resource&#8221;. Escolha uma imagem Bitmap de 24&#215;24 px;
<li>Após inserir esta imagem o XRE a adicionará no grupo &#8220;Bitmap&#8221; e o nome dela será &#8220;1&#8243;;
<li>Clique no nome &#8220;1&#8243; e renomeie para &#8220;SPLASH_TECHTIPS&#8221;;
<li>Salve o arquivo com o nome SPLASH_TESTE.RES na pasta do seu projeto de componentes.</li>
</ol>
<p><img src="http://www.waveobjects.com.br/blog/artigos/artigo002/artigo002_02.png">
<p><strong><u>Criando a unit de registro do seu splash:</u></strong>
<p>Crie uma unit em branco e adicione ao seu pacote de componentes com a seguinte estrutura:
<pre>unit SplashTeste;

interface

{$R SPLASH_TESTE.RES} 

implementation

uses
  Graphics, ToolsAPI;

procedure AddSplash;
var
  bmpAux : TBitmap;
begin
  bmpAux := TBitmap.Create;
  try
    bmpAux.LoadFromResourceName(HInstance, 'SPLASH_TECHTIPS');

    {$IFDEF VER180}
      SplashScreenServices.AddPluginBitmap('Meus componentes',
        bmpAux.Handle,
        False,
        'Licenciado para TechTips', '');
    {$ENDIF}

  finally
    bmpAux.Free;
  end;
end;

begin
  AddSplash;

end.</pre>
<p>Agora recompile seu pacote de componentes e&nbsp;instale-o novamente. </p>
<p>Reinicie a sua IDE e veja o resultado!</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/criando-seu-prprio-splash-screen-na-inicializao-da-ide-do-bds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Propriedades no Object Inspector para Forms</title>
		<link>http://www.techtips.com.br/programacao/delphi/ide/propriedades-no-object-inspector-para-forms/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/ide/propriedades-no-object-inspector-para-forms/#comments</comments>
		<pubDate>Wed, 17 Jan 2007 15:46:07 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/programacao/delphi/ide/propriedades-no-object-inspector-para-forms/</guid>
		<description><![CDATA[Um recurso que muita gente procura mas não é muito óbvio em primeira vista é como adicionar propriedades em um form que será herdado para que elas apareçam no Object Inspector. Vamos ver como fazer isso. Primeiramente, um package e adicione um novo form nele. Crie uma seção published na declaração do form e adicione [...]]]></description>
			<content:encoded><![CDATA[<p>Um recurso que muita gente procura mas não é muito óbvio em primeira vista é como adicionar propriedades em um form que será herdado para que elas apareçam no Object Inspector. Vamos ver como fazer isso.</p>
<p>Primeiramente, um package e adicione um novo form nele. Crie uma seção published na declaração do form e adicione qualquer propriedade que quiser. No meu caso, a declaração ficou assim:</p>
<pre>type
  TFormComPropriedades = class(TForm)
  private
    FMensagem: string;
  published
    property Mensagem: string read FMensagem write FMensagem;
  end;</pre>
<p>Crie uma nova unit, adicione DesignIntf e DesignEditors no uses da implementação, e inclua uma função Register,&nbsp;ficando tudo assim&nbsp;assim:</p>
<pre>unit FormPropReg;

interface

procedure Register;

implementation

uses UnitFormProp, DesignIntf, DesignEditors;

procedure Register;
begin
  RegisterCustomModule(TFormComPropriedades, TCustomModule);
end;

end.</pre>
<p>Clique com o botão direito no designer do form e selecione Add To Repository. Preencha os dados pra ele aparecer na lista de forms que podem ser herdados. Compile o package, clique com o botão direito sobre ele no Project Manager e selecione Install.</p>
<p>Agora é só criar uma nova aplicação, ir em File/New/Other, escolher o formulário que foi adicionado anteriormente, selecionar inherit (e não copy!), e pronto. As propriedades devem então aparecer no object inspector:</p>
<p><img height="449" src="http://www.techtips.com.br/wp-content/uploads/2007/01/WindowsLiveWriter/PropriedadesnoObjectInspectorparaForms_14C3F/formcomprop31.jpg" width="229" border="0"></p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi/ide/propriedades-no-object-inspector-para-forms/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Abrir Explorer Selecionando o Arquivo Ativo no Delphi</title>
		<link>http://www.techtips.com.br/programacao/delphi/ide/abrir-explorer-selecionando-o-arquivo-ativo-no-delphi/</link>
		<comments>http://www.techtips.com.br/programacao/delphi/ide/abrir-explorer-selecionando-o-arquivo-ativo-no-delphi/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 15:32:33 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/semcategoria/abrir-explorer-selecionando-o-arquivo-ativo-no-delphi/</guid>
		<description><![CDATA[Se você está trabalhando em um arquivo fonte dentro da IDE do Delphi, procurar esse no Windows Explorer acaba sendo uma tarefa comum. Principalmente se você usa o TortoiseSVN ou TortoiseCVS para fazer a integração com o controle de versão. Já pensei em escrever um expert abrir o explorer com o arquivo selecionado. Felizmente, acabou [...]]]></description>
			<content:encoded><![CDATA[<p>Se você está trabalhando em um arquivo fonte dentro da IDE do Delphi, procurar esse no Windows Explorer acaba sendo uma tarefa comum. Principalmente se você usa o TortoiseSVN ou TortoiseCVS para fazer a integração com o controle de versão. Já pensei em escrever um expert abrir o explorer com o arquivo selecionado. Felizmente, acabou sendo bem mais fácil, já que a IDE fornece tudo que precisamos para fazer isso. Como?</p>
<ol>
<li>Vá em Tools/Configure Tools.</li>
<li>Adicione um novo item. Dê o nome de &#8220;Explorer&#8221;.</li>
<li>Preencha a opção &#8220;program&#8221; com &#8220;<font face="Courier New">explorer</font>&#8220;.</li>
<li>Em &#8220;parameters&#8221;, coloque <font face="Courier New">&#8220;/e,/select, $EDNAME</font>&#8220;.</li>
</ol>
<p>E pronto. Agora, selecionando Tools/Explorer, o Windows Explorer vai abrir e selecionar o arquivo que está ativo na IDE do Delphi automaticamente.</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/delphi/ide/abrir-explorer-selecionando-o-arquivo-ativo-no-delphi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

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

