<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5394441407914227644</id><updated>2024-09-24T20:35:09.042-03:00</updated><title type='text'>Delphi Developing</title><subtitle type='html'>Esse é um espaço dedicado à publicação de artigos, tutoriais e fontes relacionados ao desenvolvimento de software, principalmente baseado no Delphi, objetivado fomentar a utilização de ferramentas e tecnologias disponíveis.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5063709984790872663</id><published>2010-10-01T20:41:00.000-03:00</published><updated>2010-10-01T20:41:09.589-03:00</updated><title type='text'>CnPack IDE Wizards: Incrementando a Produtividade</title><content type='html'>Recentemente foi lançado a versão 0.9.7.591 CnWizards.&lt;br /&gt;
Para aqueles que não conhecem o &lt;a href=&quot;http://cnpack.org/index.php?lang=en&quot;&gt;CnPack IDE Wizards&lt;/a&gt;, este é um plugin para Delphi/C++ Build/RAD Studio que trás um conjunto de ferramentas para melhorar a eficiência de desenvolvimento.&lt;br /&gt;
&lt;br /&gt;
O changelog desde a última release trás as seguintes mudanças:&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: 9pt;&quot;&gt;&lt;br /&gt;
r891: [IDE] Add Support to RAD Studio 2011&lt;br /&gt;
r890: [Prefix Wizard] Fix a Conflict to TntFrame.&lt;br /&gt;
r589: [Procedure Toolbar] Add Saving and Restoring Size of Drop Down Box&lt;br /&gt;
r588: [IDE] Support Delphi 2011 Beta 15.0.3890.34076.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Procedure Toolbar] Fix a Potential Exception when Clicking Location Buttons&lt;br /&gt;
r587: [IDE] Support Delphi 2011 Beta 15.0.3881.33894.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Prefix Wizard] Change Rename Dialog BorderStyle to Sizable.&lt;br /&gt;
r586: [IDE] Support Delphi 2010 Beta 15.0.3875.33573.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Source Highlight] Fix a Position Error when Wide-char-with-single-place Exists in BDS.&lt;br /&gt;
r585: [F2 Rename Identifier] Fix a Position Error when Unicode Char Exists in Delphi 2009 or Up.&lt;br /&gt;
r584: [IDE] Support Delphi 2011 Beta 3870 33544.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Source Highlight] Fix a Position Error when Unicode Char Exists in Delphi 2009 or Up.&lt;br /&gt;
r583: [Source Highlight] Fix a Position Error for WideChar in Delphi 2009 or Above.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [CnDebugViewer] Fix a Searching Problem, Fix a Process Name Problem when new a Window.&lt;br /&gt;
r582: Add support to RAD Studio 2011 beta.&lt;br /&gt;
r581: [Source Highlight] Optimize Support to Anonymous Method.&lt;br /&gt;
r580: [Source Enhancement] Add Auto Quote Match Enter Function.&lt;br /&gt;
r579: [Wizards] Adjust Idle Interval to Keep Performance.&lt;br /&gt;
r578: [Tools] Change Tools Compiler to D7 to avoid False Trojan Warning.&lt;br /&gt;
r577: [Editor Toolbar] Decrease CPU Usage.&lt;br /&gt;
r576: [Editor Wizard] Add Zoom Font Functions.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ASCII Chart] Fix an extension ASCII Display Problem.&lt;br /&gt;
r575: [Setup.exe] Try to Fix/Avoid Trojan Warning.&lt;br /&gt;
r574: [Replace Wizard] Add TRegExpr support.&lt;br /&gt;
r573: [Auto Input] Fix a little bug.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Script Demo] Add RegExprReplace Script.&lt;br /&gt;
r572: [Feed Reader] Try to fix the problem of 0 size C file.&lt;br /&gt;
[Script Wizard] Add support for RegExpr.&lt;br /&gt;
r571: [Ascii Chart] Fix a painting bug under Win7.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Project Backup] Fix a bug of backup path.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Eu utilizo esse plugin há pelo menos 2 anos e hoje ele já está totalmente integrado no dia-a-dia do desenvolvimento. Quando preciso trabalhar em uma IDE sem o CnWizards instalado, percebo como o RAD Studio tem muito espaço para evoluir.&lt;br /&gt;
Dentre as opções que o pacote possui algumas são versões melhoradas de recursos que o IDE do Delphi/C++ Builder já possui, algumas são inovações percebidas imediatamente após a instalação outras você vai descobrindo com o tempo, mas todas são de grande valia.&lt;br /&gt;
Devido ao grande número de ferramentas e opções de customização que esse add-in oferece é comum, de tempos em tempos, descubrir que já existe uma ferramenta para alguma tarefa que faço manualmente ou uma forma diferente e melhor de aproveitar o que já está sendo usado.&lt;br /&gt;
Vou dedicar esse post para descrever algumas notas dos principais recursos que esse maravilho pacote possui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;MessageBox Visual Designer&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Penso que dificilmente, ao desenvolver um software, escapamos de ter que apresentar dialogs de notificações (Confirmação, Solicitação, Erro e Alerta).&lt;br /&gt;
As vezes utiliza-se o ShowMessage, as vezes o MessageBox do próprio delphi, outras vezes um componente de terceiro ou ainda uma solução própria.&lt;br /&gt;
Para auxiliar na hora de definir essas notificações, o CnWizards trás uma tool muito fácil e prática. Ela pode ser acessada através do menu CnPack ou via tecla de atalho, que por padrão vem configurada para CTRL + SHIFT + D.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjivXykqLHiZ2p04u-N-CswtZ5abD0xgTObWn5z7kW-qqB5Ikvp-bNPL3M1A-rYR4waFeaQPH-24SinRe9YKeZXqzuEsHFUWWJCVH_uafEplcxVGL4hOKtwE9fFUMel_ht4DvqHqtOQ73BC/s1600/cnPack+-+MessageBox.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjivXykqLHiZ2p04u-N-CswtZ5abD0xgTObWn5z7kW-qqB5Ikvp-bNPL3M1A-rYR4waFeaQPH-24SinRe9YKeZXqzuEsHFUWWJCVH_uafEplcxVGL4hOKtwE9fFUMel_ht4DvqHqtOQ73BC/s320/cnPack+-+MessageBox.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Na tela você pode especificar todas as informações que o dialog irá exibir bem como visualizar o resultado através do botão &lt;i&gt;Preview&lt;/i&gt;.&lt;br /&gt;
No lado direito há um painel (Return Value) que pode ser marcado e, assim, especificar que tais valores de retorno serão tratados. Assim, ao confirmar, será gerado o código fonte para a apresentação do dialog e também para o tratamento das opções de retorno.&lt;br /&gt;
Há também a aba &lt;i&gt;Settings&lt;/i&gt;&amp;nbsp;que trás algumas opções que definem como o código fonte deve ser gerado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Propery Editor&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;String Caption Editor&lt;/b&gt;: Quando ativado, a propriedade &quot;Caption&quot; dos componentes é associado com um editor de texto (comum a outras propriedades do tipo&amp;nbsp;&lt;i&gt;string&lt;/i&gt;).&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq5V39nBpibxPjOsgI6NlV4yJaVNymFOjjPkRxBpCXMPZewYZN5mJ_PdU8M9lTs5cjl0LOQeWo4QWEEwAiOzx0lL3PbBViv00fD8QRjUolvIBGU-PedAi5c1-jXbkkdNUa3504OpcyIlII/s1600/cnPack+-+Caption.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq5V39nBpibxPjOsgI6NlV4yJaVNymFOjjPkRxBpCXMPZewYZN5mJ_PdU8M9lTs5cjl0LOQeWo4QWEEwAiOzx0lL3PbBViv00fD8QRjUolvIBGU-PedAi5c1-jXbkkdNUa3504OpcyIlII/s320/cnPack+-+Caption.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi47rLYEG077skrqEr4991ZBDXgRZ4yEfR0JlGxh0GPVTOBj9yzqJWM7RFCgaWNIEI4gjUxAsY2gnsvZaCrA29w-nXHN3Aq4vM2TuUPX5De8LWRo-Os2tM_rS7R2dol4JT-TOFhSE4co1Ru/s1600/cnPack+-+Caption2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi47rLYEG077skrqEr4991ZBDXgRZ4yEfR0JlGxh0GPVTOBj9yzqJWM7RFCgaWNIEI4gjUxAsY2gnsvZaCrA29w-nXHN3Aq4vM2TuUPX5De8LWRo-Os2tM_rS7R2dol4JT-TOFhSE4co1Ru/s320/cnPack+-+Caption2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
OBS: Nem todas as propriedades &lt;i&gt;Caption&lt;/i&gt;&amp;nbsp;de todos os componentes serão associados a esse editor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Hint Editor&lt;/b&gt;: Esse editor é acionado através da propriedade &lt;b&gt;Hint &lt;/b&gt;dos componentes visuais. Ele facilita bastante na hora de definir o hint que será exibido o ballon e o que será exibido na barra de status.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCleG9CtM0RiBHc_Ld7FjfMEWal5XxRULY_Au_uU5GApiBZrrkdBAVsRQalaYWXLZN1wePoes6Xo5MbcqWG9KctAVT9shrDLLGsgvdI8-fgHL6XEBtuUFS5LeBXO5u97WzWqwYde8nw4jH/s1600/cnPack+-+HintEditor.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCleG9CtM0RiBHc_Ld7FjfMEWal5XxRULY_Au_uU5GApiBZrrkdBAVsRQalaYWXLZN1wePoes6Xo5MbcqWG9KctAVT9shrDLLGsgvdI8-fgHL6XEBtuUFS5LeBXO5u97WzWqwYde8nw4jH/s320/cnPack+-+HintEditor.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;String List Editor&lt;/b&gt;: Por padrão o Delphi possui um editor default para as propriedades do tipo TStrings. Quando o editor String List do CnWizards está habilitado ele substitui o editor padrão pelo apresentado abaixo.&lt;br /&gt;
Esse editor é muito semelhante ao utilizado na propriedades Caption. A diferença é a presença do botão &lt;i&gt;Code Editor&lt;/i&gt;, no lado direito.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4YumbZU5dJXWHH3liHqxItahnuQWr0z6z7mO_54IrpcpcJ3dq7C4i2qstdtCyQFBAXYPI3k0U5gjsdgqahAdBSJ-nsAYxuI2odg8Y1goWPJqaiUGmkbxMaG80uzfbvfrSJnv_tUS5aeC/s1600/cnPack+-+StringList.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4YumbZU5dJXWHH3liHqxItahnuQWr0z6z7mO_54IrpcpcJ3dq7C4i2qstdtCyQFBAXYPI3k0U5gjsdgqahAdBSJ-nsAYxuI2odg8Y1goWPJqaiUGmkbxMaG80uzfbvfrSJnv_tUS5aeC/s320/cnPack+-+StringList.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Filename Editor&lt;/b&gt;: Esse editor associa um dialog de localização arquivo às propriedades cujo nome é &quot;Filename&quot;.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0d26KuxdaCJQz0f45rUluX281Uw9mTDRutQ2jw3cu-mbpFvVyc3XCPDk9pDdKNjKSBfsYLYL-J4khlJiN-she2t3a95wlgzy0WOUy3O58HK13PoAxCfCByUMtifp5LANxUV-OlfPnffg5/s1600/cnPack+-+Filename.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0d26KuxdaCJQz0f45rUluX281Uw9mTDRutQ2jw3cu-mbpFvVyc3XCPDk9pDdKNjKSBfsYLYL-J4khlJiN-she2t3a95wlgzy0WOUy3O58HK13PoAxCfCByUMtifp5LANxUV-OlfPnffg5/s320/cnPack+-+Filename.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Esse dialog pode ser acessado através do botão &quot;...&quot; situado à direita da propriedade (no Object Inspector).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Constraint Editor&lt;/b&gt;: Exibe os valores de cada uma das propriedades da classe TSizeConstraints diretamente ao lado do nome da propriedade, no object inspector. Evitando ter que expandir tal propriedade para conhecer os valores.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQuPI7FBTFG_YcY5ZCKBGH3zylsy9CBcwkS9BHDa3NQyTGOqvPFMp5ZLQ_-_pP6lRAszS0kpQhSeU9P070J53TmKAU4RrLuxrkwMGYrzaPldG2O9LFU80NDPiY6W4Vcj0cE5G1KWb8MmZM/s1600/cnPack+-+Constraint.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQuPI7FBTFG_YcY5ZCKBGH3zylsy9CBcwkS9BHDa3NQyTGOqvPFMp5ZLQ_-_pP6lRAszS0kpQhSeU9P070J53TmKAU4RrLuxrkwMGYrzaPldG2O9LFU80NDPiY6W4Vcj0cE5G1KWb8MmZM/s320/cnPack+-+Constraint.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Outra ferramenta bastante prática é o editor associado à&amp;nbsp;TSizeConstraints (pressione o botão &quot;...&quot; apresentado na imagem acima ou dê um duplo clique sobre a propriedade &lt;i&gt;Constraints&lt;/i&gt;).&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6jQg4M9Owr4oPR9nzL5nMITGUlt7c0N0VXK21kgdi1iVPYvy1RU_ouDRtJBfAToEQwrRCajvrvQiuqB1II-ug0CRtEhp3aqTxHoHdXIaFFIfRQkgdm8fqEBS-8LwXpQg5zteFymjU8DGR/s1600/cnPack+-+Constraint.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6jQg4M9Owr4oPR9nzL5nMITGUlt7c0N0VXK21kgdi1iVPYvy1RU_ouDRtJBfAToEQwrRCajvrvQiuqB1II-ug0CRtEhp3aqTxHoHdXIaFFIfRQkgdm8fqEBS-8LwXpQg5zteFymjU8DGR/s320/cnPack+-+Constraint.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Esse dialog permite mais facilmente utilizar as dimensões atuais do componente para definir os limites de sua dimensão.&lt;br /&gt;
Inicialmente não ficou muito claro a vantagem de se usar dialog, já que eu poderia simplesmente copiar o valor das propriedades &lt;i&gt;Height&lt;/i&gt;&amp;nbsp;e &lt;i&gt;Widht&lt;/i&gt;. Entretanto depois de algumas vezes que você utiliza esse editor, percebe-se que é mais fácil do que utilizar ctrl + c/ctrl + v.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Scrollbar Editor&lt;/b&gt;: Para as propriedades que representam as barras de scroll (vertical e horizontal), são apresentados os principais itens de sua configuração ao lado do nome da propriedade, evitando que seja necessário expandi-la para verificar.&lt;br /&gt;
Os itens de configurações que são exibidos, como pode ser visto na imagem abaixo, são: Visible, Tranking, Range e Position.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7mIfrfOLN9wWRoEABa0_7o4Guo3Agt1PdecPKKvR6061s1GPqVh2qj_ZJBnLi7y398ks39-nE7ag2WV3Yqxtw8riBMCGYIv-XUUdWM2II829Di0JV_ZQP5DVxNSPvxgPI5EdrQDIRbKJ/s1600/cnPack+-+Scrollbar.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7mIfrfOLN9wWRoEABa0_7o4Guo3Agt1PdecPKKvR6061s1GPqVh2qj_ZJBnLi7y398ks39-nE7ag2WV3Yqxtw8riBMCGYIv-XUUdWM2II829Di0JV_ZQP5DVxNSPvxgPI5EdrQDIRbKJ/s320/cnPack+-+Scrollbar.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Font Editor&lt;/b&gt;: Da mesma forma que o editor do ScrollBar, não é preciso expandir as propriedades do tipo TFont para visualizar sua configuração. Isso proporciona pequenas economias de tempo em etapas de design e manutenção dos formulários.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXagWuBB5OwbaomHyoyT8FoyPSyCBG_QlixhM67Wu82N1Ux2wxuYkXj8DTz2XOR2PyChEMz41OypBFHh9IavwQwd8akgFsJiOaSLzWIxifxxnAJhT4hvWo_7Z5T5iayeTJuXqqMdvnyPA/s1600/cnPack+-+Font.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXagWuBB5OwbaomHyoyT8FoyPSyCBG_QlixhM67Wu82N1Ux2wxuYkXj8DTz2XOR2PyChEMz41OypBFHh9IavwQwd8akgFsJiOaSLzWIxifxxnAJhT4hvWo_7Z5T5iayeTJuXqqMdvnyPA/s320/cnPack+-+Font.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Aling Editor&lt;/b&gt;: Este proporciona um pequeno incremento visual na hora de definir o tipo de alinhamento do componente, apresentando uma imagem associativa.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-eqHXlIc3TYEIHEX3uOSKIZ9HNtk3Dq7XmjtFL-DwLK9ySQ_HrzLuEJ0Mi3RE8jwEGpPDoyq1rPG8E6eewuxZOvL3i9y7aQvGGMe3-GAIqeQszUFyAZXX5MmKnBoH51z_MIgHd6_arMk7/s1600/cnPack+-+Aling.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-eqHXlIc3TYEIHEX3uOSKIZ9HNtk3Dq7XmjtFL-DwLK9ySQ_HrzLuEJ0Mi3RE8jwEGpPDoyq1rPG8E6eewuxZOvL3i9y7aQvGGMe3-GAIqeQszUFyAZXX5MmKnBoH51z_MIgHd6_arMk7/s320/cnPack+-+Aling.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Component Name Editor&lt;/b&gt;: Esse editor está relacionado com um dos recursos mais significativos do CnWizards, que é a padronização dos prefixos utilizados nos nomes dos componentes.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoakvAVxfrpJ2PL39IP0At_yyP6B9DI_Y_8VKUkgFWQof01RNJoHkCjXUAYAZ3Fk28OJ6R-7wRzTqvA8XEcN3OjtH-I-mAYVa3K7EbE8f4gLEWZDW6QVRvXnsKVshDRKr2rdDEUw7l9nBG/s1600/cnPack+-+Name.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoakvAVxfrpJ2PL39IP0At_yyP6B9DI_Y_8VKUkgFWQof01RNJoHkCjXUAYAZ3Fk28OJ6R-7wRzTqvA8XEcN3OjtH-I-mAYVa3K7EbE8f4gLEWZDW6QVRvXnsKVshDRKr2rdDEUw7l9nBG/s320/cnPack+-+Name.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Esse editor associa o dialog apresentado abaixo à propriedade &quot;&lt;b&gt;Name&lt;/b&gt;&quot; dos componentes, facilitando a tarefa de atribuição do nome dos componentes.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp2tyFAvOltSXyAUWDQ4Fv-n93BF2J54xK0Wl3XGWIcc94jkQ5iC2z-N1EMSNe037BN1l1p1L3QjvIoqalrUZWr_gmDGDADylsyoAFwEy_NHd72QMXHBNYdqZolMVlQtIrvQGRGb9WdIU/s1600/cnPack+-+Name3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp2tyFAvOltSXyAUWDQ4Fv-n93BF2J54xK0Wl3XGWIcc94jkQ5iC2z-N1EMSNe037BN1l1p1L3QjvIoqalrUZWr_gmDGDADylsyoAFwEy_NHd72QMXHBNYdqZolMVlQtIrvQGRGb9WdIU/s320/cnPack+-+Name3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;O dialog irá utilizar o prefixo que foi anteriormente definido para o componente e irá sugerir um novo nome, caso este não esteja com o prefixo &lt;i&gt;correto&lt;/i&gt;.&lt;br /&gt;
No caso de um prefixo ainda não ter sido definido para o componente selecionado, um outro dialog será apresentando antes solicitando tal informação.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2q1pRxqUMK5nCbH5UcNry9g1Z4XgwG-nd6vfFtrRi_o3Evmc7mVcUN_99pE7SN_p_s-u-3ykv1lElncqWaYgWcl5B-sco9ic-V4DVT5VJ47joTE2Du8fhvfYiw5LcfwhS9P7Wvk8ajjXU/s1600/cnPack+-+Name2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2q1pRxqUMK5nCbH5UcNry9g1Z4XgwG-nd6vfFtrRi_o3Evmc7mVcUN_99pE7SN_p_s-u-3ykv1lElncqWaYgWcl5B-sco9ic-V4DVT5VJ47joTE2Du8fhvfYiw5LcfwhS9P7Wvk8ajjXU/s320/cnPack+-+Name2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Form&amp;nbsp;Enhancements&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Logo após a instalação você já consegue visualizar muitas mudanças tanto visuais quanto na escrita de código.&lt;br /&gt;
O CnWizard acrescenta duas barras de ferramentas no IDE. Uma para quando o&amp;nbsp;ID está em modo de design e outro para quando o IDE está em modo de edição.&lt;br /&gt;
As opções abaixo referem-se às opções oferecidas para o modo de design.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ClxZNpKiuaxcKt3IYgYCJ3lTACS7QhM0cNfNSJos4UcFPEJDQiMaIQ6XcPlYkCmbMYUZqvmM04YNu7CmzxagpkVIAIV9G2zvUGM04hW9_Sme_29qzIDm5Z4ny1bO-DyM_lZfpgUtHe7x/s1600/cnPack+-+Ico4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ClxZNpKiuaxcKt3IYgYCJ3lTACS7QhM0cNfNSJos4UcFPEJDQiMaIQ6XcPlYkCmbMYUZqvmM04YNu7CmzxagpkVIAIV9G2zvUGM04hW9_Sme_29qzIDm5Z4ny1bO-DyM_lZfpgUtHe7x/s320/cnPack+-+Ico4.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Show/Hide Components&lt;/b&gt;: Em formulários com muitos componentes não visuais, essa opção é de muita utilidade na hora de realizar alguma manutenção. Como o próprio título sugere, a tool permite ocultar os componentes não visuais dos formulários evitando ter que arrastá-los de um campo para outro para poder acessar os demais componentes do formulário.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3J3Xvy65LvjdSz4d93bjFhbLhLdmne3yUB96Y9wELOU5olJbyAQZHhg4juL84MhYFELcGjYMQZ6ekrimq-WPnelHfUv26nNroprQynqd5OomOukEEuY_Dj0pfwpxvQq74D1bhxR75IuYS/s1600/cnPack+-+Ico1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3J3Xvy65LvjdSz4d93bjFhbLhLdmne3yUB96Y9wELOU5olJbyAQZHhg4juL84MhYFELcGjYMQZ6ekrimq-WPnelHfUv26nNroprQynqd5OomOukEEuY_Dj0pfwpxvQq74D1bhxR75IuYS/s320/cnPack+-+Ico1.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Display TabOrder&lt;/b&gt;: Quando essa opção está ativa, é apresentado um pequeno retângulo em cada um dos componentes com o respectivo valor da propriedade &lt;i&gt;TabOrder&lt;/i&gt;. Assim, visualmente consegue-se identificar se a ordem de passagem de focus está ou não de acordo com o esperado.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpnCBSp1IxgpdEChaGbq0d3W8AY2F5OLp59jNcbCGeKdembHpHLN54eUsr1ubR8HEAcGfINSt_PKQoDRjRcqwlX2pCttBB6wevWIw1kWOVx0Pi2P3rfREklKlU1GrcvtwjDYsyER8Lg32C/s1600/cnPack+-+TabOrder1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpnCBSp1IxgpdEChaGbq0d3W8AY2F5OLp59jNcbCGeKdembHpHLN54eUsr1ubR8HEAcGfINSt_PKQoDRjRcqwlX2pCttBB6wevWIw1kWOVx0Pi2P3rfREklKlU1GrcvtwjDYsyER8Lg32C/s320/cnPack+-+TabOrder1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2d_QWVb3C1DslLGinba01GKHdZtR_mJUi_QltJCd-bXoGEoXLNpgQP5P-gPooxHW-s2fO7uO78MWWTzowVX-fDZAWN6QsRJ-Fw9WjCdWviwcFZT01j04KcrN2pkRcCHCpFMbDAAGiyo7m/s1600/cnPack+-+Ico2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2d_QWVb3C1DslLGinba01GKHdZtR_mJUi_QltJCd-bXoGEoXLNpgQP5P-gPooxHW-s2fO7uO78MWWTzowVX-fDZAWN6QsRJ-Fw9WjCdWviwcFZT01j04KcrN2pkRcCHCpFMbDAAGiyo7m/s320/cnPack+-+Ico2.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Auto Set Update TabOrder in the Form&lt;/b&gt;: Outra tool bem útil durante a etapa de design. Com ela a propriedade TabOrder dos componentes é automaticamente setada conforme sua posição na tela.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir7GjD76qenof8nk39o9cFX52glhnQUGkGBGwKWsdPAQrLvz-TprfxBcEsKmF33ZGmNwcVuilR7OOFfj5QtKlMID04TH3SLfDCtKwA4IG3WgBTLV9cofz_03lyOpc7Gal-DGBofPGj45XP/s1600/cnPack+-+Ico3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir7GjD76qenof8nk39o9cFX52glhnQUGkGBGwKWsdPAQrLvz-TprfxBcEsKmF33ZGmNwcVuilR7OOFfj5QtKlMID04TH3SLfDCtKwA4IG3WgBTLV9cofz_03lyOpc7Gal-DGBofPGj45XP/s320/cnPack+-+Ico3.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Auto Update TabOrder after Componentes Moved&lt;/b&gt;: O próprio título da tool já resumo sua função. Quando ativa, o TabOrder é reajustado automaticamente sempre que um componente é movido&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCo6ajq87A-ZU2Ma4Ay1c4ltUEFybb5lTA0ZRslUYdhHVFRXmVIXAwC5pN9uSfvfjCWJOYoHlGp9P3H1ZhEL97OmZaJFV0AkI8HUHSUrJHBNVW06dHWZvBnmHfXvjaHtW0cz8rFVE5xY2n/s1600/cnPack+-+Ico5.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCo6ajq87A-ZU2Ma4Ay1c4ltUEFybb5lTA0ZRslUYdhHVFRXmVIXAwC5pN9uSfvfjCWJOYoHlGp9P3H1ZhEL97OmZaJFV0AkI8HUHSUrJHBNVW06dHWZvBnmHfXvjaHtW0cz8rFVE5xY2n/s320/cnPack+-+Ico5.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Locate Components in Designer&lt;/b&gt;: Localizado bem a direita da barra de ferramentas do CnWizards, essa ferramenta é de grande ajuda quando temos formulários com um número de componentes expressivo. Sua interface é simples e intuitiva.&lt;br /&gt;
Conforme é digitado no campo &lt;i&gt;Find&lt;/i&gt;, a tool remove as entradas que não contém o texto digitado. Ao pressionar ENTER, ou o botão bem da esquerda - &lt;i&gt;Locate and Select Component&lt;/i&gt;, o componente que está selecionado na listagem será automaticamente selecionado no formulário.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiton27QWTiESMyXckGwZwrsV94BYVYYNihUj2NqzCNdA9UNEBIJjV2MPZ2iI1IhRWWQF2agneQW6jt5a6341DosPws3u3VAq5zgG_OGPkmhPFRiITTclQnVcVC49cRZf2Ip4v8FcNRXCRW/s1600/cnPack+-+Locate.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiton27QWTiESMyXckGwZwrsV94BYVYYNihUj2NqzCNdA9UNEBIJjV2MPZ2iI1IhRWWQF2agneQW6jt5a6341DosPws3u3VAq5zgG_OGPkmhPFRiITTclQnVcVC49cRZf2Ip4v8FcNRXCRW/s320/cnPack+-+Locate.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Caso o componente a ser localizado está incluso dentro de, por exemplo, um TPageControl cuja aba não está visível a tool irá automaticamente alterar a respectiva aba como ativa e selecionar o componente desejado. Entretanto, em pacotes de componentes de terceiros esse comportamento não foi verificado, ficando visível apenas as bordas de seleção na área do form onde o componente está localizado.&lt;br /&gt;
Mesmo assim é uma mão na roda!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio75Vik5xj6DvRlz744Cbifcw7fwPGpBuy5Bx8ofzdMYizX7N4eP4tGeuL7JJkHOMAH04mZxjP1BKOnOLHaVixXn0quCu0MNQtBhssZ9MWp3_3sKLEjL9QFyp0XbLKr1bRONQflFMSCJyZ/s1600/cnPack+-+Ico6.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio75Vik5xj6DvRlz744Cbifcw7fwPGpBuy5Bx8ofzdMYizX7N4eP4tGeuL7JJkHOMAH04mZxjP1BKOnOLHaVixXn0quCu0MNQtBhssZ9MWp3_3sKLEjL9QFyp0XbLKr1bRONQflFMSCJyZ/s320/cnPack+-+Ico6.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Arrange the Non-Visual Components&lt;/b&gt;: Quando o formulário possui componentes não-visuais espalhados pelos cantos do form, uma ótima forma de organizá-los é através dessa tool. Ela apresenta um tela com opções que determinam como esses componentes devem ser alinhados e organizados dentro do form.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCsDJARSftxuRzW9M-kv5Qiq03euR8v5Mj7sZZh4eIwo78oQoGquFayBc2ZKsDduaWHNGipYCeQolXiDYgJupUc8LVAWzjwyHPB8hGuBgqME3WSn1FT-W2qsGVbVCYfa_77BTNJGYCsfft/s1600/cnPack+-+Arrange.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCsDJARSftxuRzW9M-kv5Qiq03euR8v5Mj7sZZh4eIwo78oQoGquFayBc2ZKsDduaWHNGipYCeQolXiDYgJupUc8LVAWzjwyHPB8hGuBgqME3WSn1FT-W2qsGVbVCYfa_77BTNJGYCsfft/s320/cnPack+-+Arrange.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Se houver componentes, não-visuais, selecionados, a reorganização será aplicada somente sobre eles. Caso contrário, todos os componentes não-visuais serão movidos conforme as configurações definidas na tela acima.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU40BxCZEgDQ62cXzh3QAC5pleOp_WgPw_FTYZFDU_Qn-Cp9SmmN0GW48gixUK0vLH-qZi4lG-UbQDMQSOjcHxpkIQVTMEwnApH1LEFIzsCI8TBQSnN11Dv6229aj65121mjkSpGVKYyot/s1600/cnPack+-+Ico7.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU40BxCZEgDQ62cXzh3QAC5pleOp_WgPw_FTYZFDU_Qn-Cp9SmmN0GW48gixUK0vLH-qZi4lG-UbQDMQSOjcHxpkIQVTMEwnApH1LEFIzsCI8TBQSnN11Dv6229aj65121mjkSpGVKYyot/s320/cnPack+-+Ico7.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Converte Selected Components to Creating Code&lt;/b&gt;: Logo que deparei-me com essa tool, de imediato pensei: &quot;está aí o recurso que eu sempre tive vontade de implementar&quot;.&lt;br /&gt;
Como pode ser visto na imagem abaixo, a tool apresenta um dialog com o código fonte para o status atual do componente selecionado. O interessante é que só é gerado a respectiva linha de código para as propriedades que foram realmente modificadas.&lt;br /&gt;
A imagem abaixo mostra um exemplo utilizando um componente TButton e o código gerado está no formato C/C++ porque a tool foi utilizada em um projeto do C++ Builder. Se for um projeto Delphi, o código fonte gerado estará no padrão Object Pascal.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMP06O6i7T0j8lb-AZWMgcZSncWWe6B9aolo3axcvitHEjW-vYs-HKwt1lSxIsatB_ZfjfTVf5wYZHXNszbFMcp3kbcGo7a0Hyrvcl4dOIqnGBz2rbb5hUWq9uhbMQWZYpiFYpRT76CAGF/s1600/cnPack+-+Code.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMP06O6i7T0j8lb-AZWMgcZSncWWe6B9aolo3axcvitHEjW-vYs-HKwt1lSxIsatB_ZfjfTVf5wYZHXNszbFMcp3kbcGo7a0Hyrvcl4dOIqnGBz2rbb5hUWq9uhbMQWZYpiFYpRT76CAGF/s320/cnPack+-+Code.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Um recurso extremamente útil quando há a necessidade de fazer várias alterações comportamentais/visuais nos componentes em runtime.&lt;br /&gt;
Quando se trata de alterar as posições dos componentes, é comum acrescentar as linhas de código com atribuições de valores aproximados para as respectivas propriedades e avaliar o resultado visualmente, ou seja, buildando e executando o software. Então se o resultado não foi satisfatório, faz-se pequenos ajustes nos valores das propriedades e novamente o sistema é buildado e executado.&lt;br /&gt;
Muitas vezes esse processo demanda bastante tempo. Já com essa tool, você visualmente altera o formulário para o &quot;estado final&quot; e gera o código dessa alteração, bastando praticamente colar as linhas dentro do método/evento desejado.&amp;nbsp;Simples, não?!&lt;br /&gt;
Mas esse é apenas um dos muitos exemplos de uso prático desse recurso.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMRAKE2h4zhOEHwE0Fvmobu5TG-goywEpWERfPb7kuf1tSx9GUDU9L7FPCR6v7G4-v3rfQ397XBqHEOyjkf8ngnrs0V0jsvAYPBdyEmzdHYME_zMNNcscKMtngOmDc7jGIZ97krcrM3kpq/s1600/cnPack+-+Ico8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMRAKE2h4zhOEHwE0Fvmobu5TG-goywEpWERfPb7kuf1tSx9GUDU9L7FPCR6v7G4-v3rfQ397XBqHEOyjkf8ngnrs0V0jsvAYPBdyEmzdHYME_zMNNcscKMtngOmDc7jGIZ97krcrM3kpq/s320/cnPack+-+Ico8.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Copy Selected Component&#39;s Name to Clipboard&lt;/b&gt;: Impressionante como um recurso tão simples como esse pode facilitar tanto a vida do programador. &lt;br /&gt;
Esse recurso está associado com uma prática muito comum durante o designer/implementação dos formulários, que é procurar pelo componente desejado no formulário para obter seu nome.&lt;br /&gt;
Durante a implementação de algum método ou evento, nem sempre lembramos dos nomes dos componentes. Assim, é comum mudar o modo de exibição do IDE para design; localizar o componente a qual queremos referencia-lo; clicar no object inspector; localizar a propriedade &quot;name&quot;; pressionar um CTRL +&amp;nbsp;C para copiar o nome do componente; voltarmos ao modo de edição; e pressionar CTRL + V.&lt;br /&gt;
O que essa tool faz&amp;nbsp;é muito simples, apenas coloca o nome do(s) componente(s) selecionado(s) na área de transferência e retorna ao modo de edição, o que economiza alguns click de mouse e pressionamento de teclas.&lt;br /&gt;
Pode parecer pouco, mas quando você repete esses passos várias vezes tenho certeza que irá entender o benefício dessa tool.&lt;br /&gt;
Outra ponto bastante interessante é que você não precisa repetir o procedimento para cada componente, é possível você selecionar todos os componentes desejados e só então utilizar essa tool. Ela irá colocar na área de transferência o nome de cada componente acrescentando uma linha em branco entre eles.&lt;br /&gt;
Por padrão, a tecla de atalho CTRL + ALT + N já vem atribuída para esse recurso, que facilita ainda mais seu uso.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhidUSiw-Fm-2gWTtzlOUilpGALK1UghRRAFFXTQBdSSZJjbtDusHoPNr-afSZfQ9jUrj1TgEk1HYP0b7LcdOGTKzRflGgA6fspCwf1ih-AmpPE7JCXQpw4k0IhMLMyChioFDCTJC0akybL/s1600/cnPack+-+Ico8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhidUSiw-Fm-2gWTtzlOUilpGALK1UghRRAFFXTQBdSSZJjbtDusHoPNr-afSZfQ9jUrj1TgEk1HYP0b7LcdOGTKzRflGgA6fspCwf1ih-AmpPE7JCXQpw4k0IhMLMyChioFDCTJC0akybL/s320/cnPack+-+Ico8.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Select Current Form in Current Designer&lt;/b&gt;: Aqui temos outro recurso bem simples, mas que proporciona um melhor conforto ao lidar com o formulários. Quando selecionado ele muda o focus de design&amp;nbsp;para o formulário.&lt;br /&gt;
Pode parecer pouco útil esse recurso e que bastaria, por exemplo, pressionar SHIFT e clicar no mesmo componente que já está selecionado, mas ao pensar em todas as vezes que acidentalmente&amp;nbsp;essa ação resultou no redimencionamento ou na alteração de posição do componente, essa alternativa passar a ser bem útil.&lt;br /&gt;
Basta começar a usá-la que depois de um tempo você sentirá falta quando estiver trabalhando em um IDE sem esse plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIipmLTA5wPS-TOKWy2KfNOIVOjsc8XFlArmqnlk2TCqxd2RvEUKIseJuzq_WLyrS-T0ZxrgUYXr6Sx3sTRxtybFJr2B7FbQqxyo5vsnfSjPyN87iq6J6rDKAOY0ZLer_BgPptQNZO57BT/s1600/cnPack+-+Ico8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIipmLTA5wPS-TOKWy2KfNOIVOjsc8XFlArmqnlk2TCqxd2RvEUKIseJuzq_WLyrS-T0ZxrgUYXr6Sx3sTRxtybFJr2B7FbQqxyo5vsnfSjPyN87iq6J6rDKAOY0ZLer_BgPptQNZO57BT/s320/cnPack+-+Ico8.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Lock Controls&lt;/b&gt;: Essa tool, quando ativada, impede o usuário de alterar tanto a posição quanto as dimensões dos componentes do formulário em focus. Em outras palavras, os componentes ficam bloqueados sendo possível somente selecioná-los.&lt;br /&gt;
Sem sombra de dúvida um recurso muito útil (ou você nunca deslocou um determinado componente do formulário quando na verdade só queria selecioná-lo?!).&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYrhyehvJ09ne2Mxi6NV2IEqTe7kJftziuKNJXm5um78NPKeyVwSJdOTW1ucdhwUoHNDweClAGrW_PxwjlHFBTvtKJoMreGIgC3Jy6-Vu3zMpohQiHWh4f8zD2oe8ApH5NLQmSZy7iMSbT/s1600/cnPack+-+Ico8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYrhyehvJ09ne2Mxi6NV2IEqTe7kJftziuKNJXm5um78NPKeyVwSJdOTW1ucdhwUoHNDweClAGrW_PxwjlHFBTvtKJoMreGIgC3Jy6-Vu3zMpohQiHWh4f8zD2oe8ApH5NLQmSZy7iMSbT/s320/cnPack+-+Ico8.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Toggle Designer Guideline&lt;/b&gt;: Guidelines são aquelas linhas que ajudam no alinhamento dos componentes quando se está movendo-os. O guideline funciona como recurso &quot;magnetic&quot; do winamp, mas levando em consideração a posição dos outros componentes do formulário.&lt;br /&gt;
Mas se esse recurso não é útil ou atrapalha, você tem a opção de desabilitá-lo utilizando esse botão.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZ_cji6JjdV3Uv-j-GmU1Y4smQKyCCZ185AzhNBXt3ZapdHJqRYtSG14LJw7Mleg30wZ16fL9r8YJEf2gvuqzxoXHiTYswzlKsRRjH_xILHOp0ZiFIX18RemXPB7zGcQQ537AmlPHwPMB/s1600/cnPack+-+Icon+Align.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZ_cji6JjdV3Uv-j-GmU1Y4smQKyCCZ185AzhNBXt3ZapdHJqRYtSG14LJw7Mleg30wZ16fL9r8YJEf2gvuqzxoXHiTYswzlKsRRjH_xILHOp0ZiFIX18RemXPB7zGcQQ537AmlPHwPMB/s320/cnPack+-+Icon+Align.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Atalhos para Alinhamento&lt;/b&gt;: Aqui são várias opções, mais especificamente 6, que ajudam muito tem toda a fase de criação dos formulários ou mesmo alteração/manutenção.&lt;br /&gt;
Essas opções ficam disponíveis quando há mais do que um componente selecionado e são destinados para realizar um determinado tipo de alinhamento. Por exemplo, o primeiro deles irá alinhar os componentes à esquerda, o segundo irá alinha-los à direita.&lt;br /&gt;
Note que a imagem de acada botão é bastante intuitiva e, na dúvida, basta posicionar o cursor do mouse sob eles que o hint irá descrevê-los.&lt;br /&gt;
Um ponto importante é que&amp;nbsp;essas opções usam&amp;nbsp;o primeiro&amp;nbsp;componente que foi selecionado como base referencial para o alinhamento. Por exemplo, no caso do alinhamento à esquerda todos os componentes selecionados assumirão a&amp;nbsp;posição esquerda (propriedade &lt;em&gt;Left&lt;/em&gt;) do primeiro componente.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHO1F6qNBl_Z5jC89v_UTwOyFEn6rg6Ixp8acYOGv7ALtK4kXFcMBfutL3rIwdnerE0SGTJGRggurTB5d2LwZ06IY6Y28C0KrwgdXAow70Pq52kZEYyDuZzuStYI6Fa7sbn9W2jakNMhzK/s1600/cnPack+-+Icon+Align.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHO1F6qNBl_Z5jC89v_UTwOyFEn6rg6Ixp8acYOGv7ALtK4kXFcMBfutL3rIwdnerE0SGTJGRggurTB5d2LwZ06IY6Y28C0KrwgdXAow70Pq52kZEYyDuZzuStYI6Fa7sbn9W2jakNMhzK/s320/cnPack+-+Icon+Align.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Atalhos para Espaçamento&lt;/b&gt;: Aqui temos mais 6 opções que também trabalham no possicionamento dos componentes, mas destinados para facilitar o trabalhano no quesito espaçamento.&lt;br /&gt;
Também muito intuitivos. Por exemplo, o segundo botão irá reposicionar verticalmente todos os componentes distribuindo o &lt;em&gt;espaço em branco&lt;/em&gt; entre eles. Essa opção fica disponível quando há mais do que dois componentes selecionados e tanto o componente mais no topo quanto o mais na base do formulário não são reposicionados, mas sim os que estão entre eles.&lt;br /&gt;
Da mesma forma que as opções de alinhamento, há três botões que trabalham com premissa &lt;em&gt;horizontal&lt;/em&gt; e três que trabalham com a premissa &lt;em&gt;vertical&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIk7ACSNClbm5rDN5D7KxXqfhtqle56Zk3nXrWT85LYwxvs_vme8_hyAOvyCHUg36DbXsN_MpjCJ-lv0wvn-_ZNB7PYIBzjUTTeMRRm6W8p6eATAuFvHsseQ9Rn4pGMrk7YATCzLtzeUUq/s1600/cnPack+-+Icon+Align.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIk7ACSNClbm5rDN5D7KxXqfhtqle56Zk3nXrWT85LYwxvs_vme8_hyAOvyCHUg36DbXsN_MpjCJ-lv0wvn-_ZNB7PYIBzjUTTeMRRm6W8p6eATAuFvHsseQ9Rn4pGMrk7YATCzLtzeUUq/s320/cnPack+-+Icon+Align.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Atalhos para Resize&lt;/b&gt;: São atalhos que trabalham com as propriedades Heigh e Width dos componentes. Alguns dessas opções só ficam habilitadas quando há mais do que um componente selecionado.&lt;br /&gt;
São igualmente simples, e dispensa maiores comentários.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlVZNWYC6FG4iAPpf80SHobwMqfDnvuWps-EmOmcazA6x0pQ5jGora2hgdSfu_z8MXhz5p1JsV84d4vSNnZZwFZL3oa31cBA6D2OjAhMs_6mgYxTj_xbxdx4CPeXeGBp1PE7vEP5WrxFrt/s1600/cnPack+-+Icon+Align.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlVZNWYC6FG4iAPpf80SHobwMqfDnvuWps-EmOmcazA6x0pQ5jGora2hgdSfu_z8MXhz5p1JsV84d4vSNnZZwFZL3oa31cBA6D2OjAhMs_6mgYxTj_xbxdx4CPeXeGBp1PE7vEP5WrxFrt/s320/cnPack+-+Icon+Align.png&quot; /&gt;&lt;/a&gt;&lt;b&gt;Atalhos para Posicionamento&lt;/b&gt;: Aqui temos mais algumas opções que agilizam a tarefa de alinhar componentes.&lt;br /&gt;
Bastam alguns poucos clicks para entender como eles funcionam.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Editor Enhancements&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Guide Lines&lt;/strong&gt;&lt;br /&gt;
&lt;div style=&quot;font-weight: normal; margin: 0px;&quot;&gt;Esse melhoramento faz com que o IDE destaque e identifique individualmente os blocos de códigos através de cores e linhas de conexão.&lt;/div&gt;As statments (&lt;b&gt;if&lt;/b&gt;,&amp;nbsp;&lt;b&gt;try&lt;/b&gt;,&amp;nbsp;&lt;b&gt;for&lt;/b&gt;,&amp;nbsp;&lt;b&gt;while&lt;/b&gt;,&amp;nbsp;&lt;b&gt;begin-end&lt;/b&gt;, ...) que delimitam os blocos de códigos são destacadas em cores diferentes dependendo de seu nível. Além de facilitar a identificação dos trechos de código, em procedures grandes esse recurso proporciona uma segunda funcionalidade que é identificar se um bloco está ou não dentro de outro bloco sem precisar deslocar-se.&lt;br /&gt;
O recurso se adapta facilmente aos diversos padrões de formatação de código fonte.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIk64NYEZ5XIhr-99RTLudrQexbFfJgA7Kcngws-Gc7JZw6LqXBVBQU1RSzCMaoFp-PtwdKmISYvj_mcndQoz_pXvbhtd6iJmcamUOXH8yrqqmTqqILhZa-KaWEUr17uvmweGB8lUavay/s1600/Guide+Lines.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIk64NYEZ5XIhr-99RTLudrQexbFfJgA7Kcngws-Gc7JZw6LqXBVBQU1RSzCMaoFp-PtwdKmISYvj_mcndQoz_pXvbhtd6iJmcamUOXH8yrqqmTqqILhZa-KaWEUr17uvmweGB8lUavay/s640/Guide+Lines.png&quot; width=&quot;235&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Highlight Matched Brackets&lt;/strong&gt;:&amp;nbsp;Propõem&amp;nbsp;uma melhora na identificação dos limites dos parênteses &quot;()&quot; e dos conchetes &quot;[]&quot; destacondo-os em cores diferenciadas.&lt;br /&gt;
Um exemplo prático do quão útil essa melhoria representa é em linhas de código que possuem expressões matemáticas com vários parênteses ou então em condições lógicas mais complexas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsFg1loNFIVne8SVB88xLj3KdMWUFVHpUDLNBAi43e4J43Ie6sZrfLvYwiih3vLy3ZVgQd7_Za6TWZLWQ4HwLS1BgyPtIXhgkAfr_xVfEzShlTKzND1j3jhxWGCKMDtNvTvN4dDbeGju9c/s1600/bracked.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsFg1loNFIVne8SVB88xLj3KdMWUFVHpUDLNBAi43e4J43Ie6sZrfLvYwiih3vLy3ZVgQd7_Za6TWZLWQ4HwLS1BgyPtIXhgkAfr_xVfEzShlTKzND1j3jhxWGCKMDtNvTvN4dDbeGju9c/s1600/bracked.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;Auto Imput Matched Bracket&lt;/strong&gt;: Insere automaticamente um &lt;i&gt;fecha conchetes&lt;/i&gt;&amp;nbsp;(&quot;]&quot;) quando você digita &quot;[&quot;. O mesmo ocorre com o parênteses e chaves (&quot;{}&quot;)..&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Extented Home Key&lt;/strong&gt;: Quando pressionamos a tecla HOME no modo de edição do IDE o cursor é deslocado para a primeira coluna da linha corrente. Com essa opção ativada, a tecla HOME passa a ter uma segunda função quando é pressionado pela segunda vez&amp;nbsp;consecutiva que é posicionar o cursor no primeiro caracter válido.&lt;br /&gt;
Basicamente ele irá ignorar todos os espaços em branco situados na esquerda da linha.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Auto add &quot;end&quot; when pressing ENTER after &quot;begin&quot;&lt;/strong&gt;: Durante a escrita de código fonte, ao digitarmos &quot;begin&quot; e pressionarmos a tecla ENTER, esse recurso irá&amp;nbsp;automaticamente&amp;nbsp;acrescentar um &quot;end&quot; na linha abaixo&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Tab/Shift + Tab to Ident/Unindent Selected Block&lt;/strong&gt;: Por padrão o Delphi vem configurado para usar as combinações CTRL + I e CTRL + U para identar/retroceder identação do um bloco de código que está selecionado.&lt;br /&gt;
O CnWizard reconfigura essa função atribuindo essa tarefa de identação para as respectivas combinações TAB/SHIFT + TAB, as quais são mais largamente utilizadas.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;F3/Shift + F3 to search the selected text&lt;/strong&gt;: A tecla F3 passa a ser utilizada para procurar a próxima ocorrência da última pesquisa, enquanto que Shift + F3 tenta encontrar a ocorrência imediatamente acima da posição corrente do cursor.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Show Total Lines Count&lt;/strong&gt;: Exibe o canto inferior esquerdo do editor o total de linhas da atual unit aberta. Evitando ter que deslocar-se até o final do arquivo para obter o número total de linhas que a unit possui.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4gSA_oFhsCyxZxW7Odasw66cmO7_eb1hdbtnVwQ8kAivUJZ2BihIR2nfR4SdgmoVN8mjmOcH2ADOEL03L3VzM0SG-PBTGs_wD6X1mQSoFAwDIm2U6hCGgLYJyb68sn5X2w7nGyJFe5jpZ/s1600/lines.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4gSA_oFhsCyxZxW7Odasw66cmO7_eb1hdbtnVwQ8kAivUJZ2BihIR2nfR4SdgmoVN8mjmOcH2ADOEL03L3VzM0SG-PBTGs_wD6X1mQSoFAwDIm2U6hCGgLYJyb68sn5X2w7nGyJFe5jpZ/s1600/lines.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Change var name&lt;/strong&gt;: Um das opções de refacting que o RAD Studio trás é o &quot;Rename Variable&quot; que, ao ativá-lo, apresenta um dialog solicitando o novo nome e, após, exibe um tool panel com todas as ocorrências encontradas onde o usuário pode optar por continuar o refacturing.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTlDnzxvlJZo03Q1qRR7PRwd7IpgHzRmWRotmZQ9mb0OW-ZB_RCzsiV-Sw0DfkK2FM9t-klFxXAaR_zTgIaOsbUb4DYfay1D6cwnfweagsVBgB9eFn7W6sFfdEsRYkaSwU2aZ-RrAfuifJ/s1600/F2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTlDnzxvlJZo03Q1qRR7PRwd7IpgHzRmWRotmZQ9mb0OW-ZB_RCzsiV-Sw0DfkK2FM9t-klFxXAaR_zTgIaOsbUb4DYfay1D6cwnfweagsVBgB9eFn7W6sFfdEsRYkaSwU2aZ-RrAfuifJ/s1600/F2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Uma versão melhorada desse recurso está incluso no CnWizards e pode ser acessado pressionando a tecla F2 sobre a variável/método a qual se deseja renomear. Mas essa tecla de atalho não está limitada a apenas ao editor de código.&lt;br /&gt;
Em mode de design o pressionamento da tecla F2 irá exibir um dialog solicitando o novo nome do componente que está selecionado.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ-Ii6SOkgSUXcH28bt68UTigrJW6rC_xQEL-Kxtrwxsz6Yl05Ym8tqCGfjAxzIgC4zVLC3k9WNk7NcJSUmYUOfP9XjeGY95z52GaOiBAMQ26GDCQYiVqJkFxKKCJI88YFf6L1Yic58LHi/s1600/f22.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;241&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ-Ii6SOkgSUXcH28bt68UTigrJW6rC_xQEL-Kxtrwxsz6Yl05Ym8tqCGfjAxzIgC4zVLC3k9WNk7NcJSUmYUOfP9XjeGY95z52GaOiBAMQ26GDCQYiVqJkFxKKCJI88YFf6L1Yic58LHi/s320/f22.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Tools&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Uses Cleaner&lt;/strong&gt;&lt;br /&gt;
Quando estamos na etapa de criação/design de formulários é normal fazermos algumas combinações e testes para encontrar os componentes mais adequados para a solução em questão. Nesse processo costuma-se acrescentar, remover e substituirmos alguns componentes por outros mais adequados.&lt;br /&gt;
Os componentes novos quase sempre acrescentam novas entradas de units na cláusula uses quando são dropados no form pela primeira vez. No entanto, quando removemos ou substituimos esses componentes do formulário, o Delphi não remove as respectivas units da cláusula uses e, dependendo da frenquência com que é feito essa ação, podemos chegar a ter várias referências desnecessárias.&lt;br /&gt;
O simples fato de instalarmos uma versão mais recente de algum pacote de componentes, por exemplo, pode tornar a referência de algumas units obsoletas.&lt;br /&gt;
A função dessa tool tem o objetivo justamente de fazer uma limpeza na cláusula uses, removendo todas as entradas desnecessárias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Comments Cropper&lt;/strong&gt;&lt;br /&gt;
Uma ótima ferramenta quando a intenção é distribuir/publicar código fonte.&lt;br /&gt;
Essa tool é um assistente destinado, principalmente, à eliminação de comentários do código fonte. Além disso o dialog trás opções bem interessantes como a eliminação de linhas em brancos duplicadas e remoção de TODOs.&lt;br /&gt;
A range de ação não&amp;nbsp;necessariamente&amp;nbsp;se aplica a apenas a corrente unit, é possível extender para até um diretório.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGLSkYi_9eHb4pac_cJpQ73nbOkRR2Ox6h63IV5sOlorX34NPSl-yjz4Ygk6oduEokSA7-DRsgCe4xBwA6b7nnrDu4NvdG1I1tvSApX2VtOm8lVGVaAYTX36qoPP9bahijEnDRHT8Ujvtz/s1600/Comments.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;278&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGLSkYi_9eHb4pac_cJpQ73nbOkRR2Ox6h63IV5sOlorX34NPSl-yjz4Ygk6oduEokSA7-DRsgCe4xBwA6b7nnrDu4NvdG1I1tvSApX2VtOm8lVGVaAYTX36qoPP9bahijEnDRHT8Ujvtz/s400/Comments.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;MSDN Help Wizard&lt;/strong&gt;&lt;br /&gt;
Permite de forma prática e ágil realizar pesquisas no help MSDN, da Microsoft.&lt;br /&gt;
A tool disponibiliza dois atalhos. Um deles é o MSDN Toolbar (Shift + F1)&amp;nbsp;que permite inserir palavras de pesquisa e, ao ser pressionado ENTER ou o botão &lt;em&gt;search&lt;/em&gt;, é aberto no IDE&amp;nbsp;a página do&amp;nbsp;MSDN exibindo o resultado da pesquisa. O outro atalho, MSDN Help (Alt + F1),&amp;nbsp;apenas abre no IDE a página de pesquisa do MSDN.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwD9Ta_OBt2KUvE_Ha0UyDNd81mig5STvuU-RUHQ-cy1QybJwST6DGI7_D6jYGDQF6O74tNqUE28Wp8zZWK0i3r1gOx_-ze5NWAT10u__jE-4Lh9E4qNyRZBNeKmyeQT3CDH9LzQyF8uG8/s1600/msdn1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;205&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwD9Ta_OBt2KUvE_Ha0UyDNd81mig5STvuU-RUHQ-cy1QybJwST6DGI7_D6jYGDQF6O74tNqUE28Wp8zZWK0i3r1gOx_-ze5NWAT10u__jE-4Lh9E4qNyRZBNeKmyeQT3CDH9LzQyF8uG8/s320/msdn1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
O MSDN Toolbar também armazena o histórico de pesquisas e pode ter o número máximo de entradas de log configurado.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh529FIl-OxHAsrpfNLX9T6XwS1UTDijP_lHzQXpFuggC7Tvk69zPj86lyWcfL0o55X_KLoZCr0LnjTjrkV05Y_K4wcGYGH8HzuxbItQWLaI2Z7AqMJZkb40aUtOpX9f5TwO6E5PUmeeb/s1600/msdn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh529FIl-OxHAsrpfNLX9T6XwS1UTDijP_lHzQXpFuggC7Tvk69zPj86lyWcfL0o55X_KLoZCr0LnjTjrkV05Y_K4wcGYGH8HzuxbItQWLaI2Z7AqMJZkb40aUtOpX9f5TwO6E5PUmeeb/s1600/msdn.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Copy as HTML Format&lt;/strong&gt;&lt;br /&gt;
Pense em todas as vezes que, por exemplo, ao redigir um email você copiou um trecho de código fonte e depois ficou vários minutos apenas &lt;em&gt;colorindo&lt;/em&gt; as palavras reservadas e outros identificadores e símbolos para imitar a highlight syntaxe do Delphi.&lt;br /&gt;
Bom, agora não é mais preciso gastar um tempo preciso para essa tarefa. Através dessa tool o texto selecionado é posto na área de transferência incluindo também a formatação.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYPv4sAtAz-1GMEWu0VRQFY0Edys3fK-oH2Hay1KVfV53k3JDfRwhlX4pfOKe2UxM0NoWAHSqsE49Dxp7l_9vmhH7xRLAfbFgZcPJWVfXjSk9taWrqvaaLm8Kuz5DXuoh9iPvEawxMgacq/s1600/copy+as+html.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;131&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYPv4sAtAz-1GMEWu0VRQFY0Edys3fK-oH2Hay1KVfV53k3JDfRwhlX4pfOKe2UxM0NoWAHSqsE49Dxp7l_9vmhH7xRLAfbFgZcPJWVfXjSk9taWrqvaaLm8Kuz5DXuoh9iPvEawxMgacq/s400/copy+as+html.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
O CnWizard acrescenta um item no menu de contexto que é exibido em modo de edição e&amp;nbsp;a imagem acima mostra onde essa opção pode ser encontrada.&lt;br /&gt;
Observe que muitas outras opções estão disponíveis e vale cada segundo de tempo investido para conhecer esses recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Source Statistics&lt;/strong&gt;&lt;br /&gt;
Coletar informações estatísticas é a proposta dessa tool.&lt;br /&gt;
Ao ser acessada (CnPack -&amp;gt; Source Statistics) um dialog semelhante ao da imagem abaixo é apresentado solicitando o ranger de arquivos a serem pesquisados.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglDvAeIYygmlSRXm1YtCV-8N-aeU416RjSfSH0glh7iAhCMryV4guSc3v3N11i4d3dDIKbexqjDunLFeinVfSuO1k9l2VH-gu1hZ3R9f4WGlGELa0iBwRoGz5l2c2dpduQTeD937BMDs1-/s1600/statistic1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglDvAeIYygmlSRXm1YtCV-8N-aeU416RjSfSH0glh7iAhCMryV4guSc3v3N11i4d3dDIKbexqjDunLFeinVfSuO1k9l2VH-gu1hZ3R9f4WGlGELa0iBwRoGz5l2c2dpduQTeD937BMDs1-/s320/statistic1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ao pressionar o botão &quot;&lt;b&gt;Calculate&lt;/b&gt;&quot;, será apresentado um dialog com informações básicas de cada unit ou a soma delas, no caso de pertencer a um projeto.&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGUpmnhjtut05eGTAWkY1VRz5v48Hhh8C3j1AQo_CwT8LkO7YebsrXGqGiXhWzix1k6NXmIUxAb37hS1HvyHKFqwcYuf2uTSGS2tp0t68MbGK5ANcuMLpJCvlGrsd6YqV58dFWpcQ5petU/s1600/statistic2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGUpmnhjtut05eGTAWkY1VRz5v48Hhh8C3j1AQo_CwT8LkO7YebsrXGqGiXhWzix1k6NXmIUxAb37hS1HvyHKFqwcYuf2uTSGS2tp0t68MbGK5ANcuMLpJCvlGrsd6YqV58dFWpcQ5petU/s320/statistic2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Source Templates&lt;/strong&gt;&lt;br /&gt;
Particularmente utilizo muito esse recurso e tem se mostrado de extretamente útil.&lt;br /&gt;
O Source Templates é semelhante ao Live Templates do Delphi. No entanto ele não permite a edição de campos diretamente no editor. Em vez disso, é apresentado um dialog solicitando o conteúdo de cada um desses campos definidos no template.&lt;br /&gt;
O CnWizard trás um editor para gerenciar todos os templates definidos e permite, inclusive, associar uma tecla de atalho para cada template.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj00sJWHqsrq4J2kYBMaWlYePzAf3Gh_Wquz4kbOMoSHQlWL411nNAtkEN6vU-bzxTDV4dG2kOdbMyUUllHfQeFL3oAcQ7raElHZ6P-i_RQqpH-GaFAwaPG7w1Cc_EB4k61xQMkOlG1qHmH/s1600/template.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj00sJWHqsrq4J2kYBMaWlYePzAf3Gh_Wquz4kbOMoSHQlWL411nNAtkEN6vU-bzxTDV4dG2kOdbMyUUllHfQeFL3oAcQ7raElHZ6P-i_RQqpH-GaFAwaPG7w1Cc_EB4k61xQMkOlG1qHmH/s320/template.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Um diferencial no Source Templates é o número de customizações e informações dinâmicas que se pode utilizar na criação dos template.&lt;br /&gt;
Na imagem acima também pode-se observar a definição de um template que utilizo para a geração do cabeçalhos de comentários nos métodos.&lt;br /&gt;
A quantidade de recursos utilizados no script acima é pequena, mas o suficiente para entender o que tudo se pode fazer com essa tool.&lt;br /&gt;
Quando ativado um dialog, igual ao apresentado abaixo, é listando todos os campos definidos no template com a opção de definir um valor/texto.&lt;br /&gt;
De forma geral, vejo essa tool como uma evolução do Live Template do Delphi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Code Editor Wizard&lt;/strong&gt;&lt;br /&gt;
Aqui temos um conjunto rico de opções que podemos utilizar para auxiliar as tarefas de codificação, documentação, edição, investigação, code review, ...&lt;br /&gt;
Cada item do menu apresentando na imagem abaixo representa um pequena ferramenta.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0i43iT2kvLi7UbohinlgtOa25foKfA9vtNVazD8RHgFEU_82UFQp4BG4uuJslrJX9Ldc22fgPwsSNuMqxjfiUxRszRrOLYdYYfEHyIJNPCEzYtBdG8Zhfy5v-Za2C87sv-OpXhtbryHx/s1600/menu.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0i43iT2kvLi7UbohinlgtOa25foKfA9vtNVazD8RHgFEU_82UFQp4BG4uuJslrJX9Ldc22fgPwsSNuMqxjfiUxRszRrOLYdYYfEHyIJNPCEzYtBdG8Zhfy5v-Za2C87sv-OpXhtbryHx/s320/menu.png&quot; width=&quot;139&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Vou deixar por sua conta a&amp;nbsp;prazerosa&amp;nbsp;tarefa de descobrir o benefício que cada um desses itens têm a oferecer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Replace in Files&lt;/strong&gt;&lt;br /&gt;
Até hoje não entendi a razão do Delphi não trazer uma ferramenta de substituição de texto que se extenda para além do arquivo corrente.&lt;br /&gt;
Um exemplo de uso prático é a substituição do nome de um classe, variável ou definição que é utilizado em vários arquivos. Na verdade esse é apenas um exemplo, há muitas maneiras úteis de se utilizar&amp;nbsp;&lt;i&gt;batch file replace&lt;/i&gt;.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQGPcERnPL6QpCHprYFk27MMq0_h-PHcB5lkid53y-q25wQofhLxqZ22ksvtTG1C5-KWAnj6bXc0-gSXbj4S6abjCtRzFDmYWHU97puiv7I3aYwuL98kuTgaSQQ8zbsVn_ddig1BMNUYjR/s1600/replace.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQGPcERnPL6QpCHprYFk27MMq0_h-PHcB5lkid53y-q25wQofhLxqZ22ksvtTG1C5-KWAnj6bXc0-gSXbj4S6abjCtRzFDmYWHU97puiv7I3aYwuL98kuTgaSQQ8zbsVn_ddig1BMNUYjR/s320/replace.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Prefix Wizard&lt;/strong&gt;&lt;br /&gt;
Em ambientes de trabalho que utilizam ferramentas de desenvolvimento baseadas em componentes, é clássico e certo a&amp;nbsp;discussão&amp;nbsp;em torno da padronização de prefixos para os componentes.&lt;br /&gt;
O que essa ferramenta faz é gerenciar a lista de prefixos de seus respectivos componentes e incentivar o desenvolvedor a adotá-los.&lt;br /&gt;
Toda vez que um componente é dropado no formulário, um dialog é apresentado solicitando o nome do componente. Entrentanto o próprio CnWizard já faz uma sugestão de nome acrescentando o prefixo estipulado para aquele componente.&lt;br /&gt;
No caso de um prefixo ainda não ter sido definido, um outro dialog é apresentado requisitando tal informação.&lt;br /&gt;
A imagem abaixo apresenta a tela de configuração dessa ferramenta (observe o número de customizações disponíveis).&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8aPw1zn9xMeoFPUa_CmX0Gag_yOuHecfqtlzvnMYBnDemMsJkAUR0d3raPSn-hFjj3pwGMFn6ww-U-2NrKZJaEQpkbRkszZ82zOW9LWFtppcUaBn4mdV5w08jg3eTo_Hux96eYyVwXzvL/s1600/Prefix.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8aPw1zn9xMeoFPUa_CmX0Gag_yOuHecfqtlzvnMYBnDemMsJkAUR0d3raPSn-hFjj3pwGMFn6ww-U-2NrKZJaEQpkbRkszZ82zOW9LWFtppcUaBn4mdV5w08jg3eTo_Hux96eYyVwXzvL/s320/Prefix.png&quot; width=&quot;264&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Mas essa tool ainda reserva uma opção a mais que é o compartilhamento da lista de prefixo.&lt;br /&gt;
Ela permite definir a localização do arquivo na qual essas opções e a lista dos prefixos serão armazenadas, permitindo que outras estações de trabalho utilizem as mesmas configurações.&lt;br /&gt;
No caso de um estação acrescentar ou modificar alguma opção, imediatamente a mudança fica visível para os demais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;IDE Config Backup/Restore Tool&lt;/strong&gt;&lt;br /&gt;
Pense em todas as vezes que você instalou ou reinstalou o Delphi/C++ Builder e passou um bom tempo reconfigurando o IDE para assumir a mesma condição anterior. Ou pior, depois de muito tempo descobre que esquecei de copiar um template, ou outro recursos qualquer.&lt;br /&gt;
É justamente para sanar esse problema que o CnWizard trás uma ferramenta capaz de fazer backup e restauração do IDE.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA6bLUvNNg9l9zuQXmoOlUo9iALMVw4VMzuEC4p65DL7LgYnJuYkYvfWln8n7hG9-BxH6oVBivw8T7N1HRkMDiBUCH4Y3d-NosXSSHEhOWdL-jcW4uVAgVsWYN9S29ONbDru_et7x-rvsf/s1600/IDE+Backup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA6bLUvNNg9l9zuQXmoOlUo9iALMVw4VMzuEC4p65DL7LgYnJuYkYvfWln8n7hG9-BxH6oVBivw8T7N1HRkMDiBUCH4Y3d-NosXSSHEhOWdL-jcW4uVAgVsWYN9S29ONbDru_et7x-rvsf/s320/IDE+Backup.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Conclusão&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
O que foi apresentado nesse artigo é uma parcela muito pequena da quantidade de ferramentas que esse pacote oferece.&lt;br /&gt;
O potencial de desenvolvimento que o CnPack proporciona é imenso tanto é que mesmo após 2 anos, e durante a escrita desse post, descobrir recursos que não haviam sido notados antes.&lt;br /&gt;
Para aqueles que desejam ler um &lt;i&gt;pouquinho&lt;/i&gt; mais sobre os demais melhoramentos, eu indico esse documento: &lt;a href=&quot;http://www.intitec.com/varios/Delphi_al_limite_2009.pdf&quot;&gt;http://www.intitec.com/varios/Delphi_al_limite_2009.pdf&lt;/a&gt;&lt;br /&gt;
São nada menos do que 294 páginas!</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5063709984790872663/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5063709984790872663?isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5063709984790872663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5063709984790872663'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/10/cnpack-ide-wizards-incrementando.html' title='CnPack IDE Wizards: Incrementando a Produtividade'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjivXykqLHiZ2p04u-N-CswtZ5abD0xgTObWn5z7kW-qqB5Ikvp-bNPL3M1A-rYR4waFeaQPH-24SinRe9YKeZXqzuEsHFUWWJCVH_uafEplcxVGL4hOKtwE9fFUMel_ht4DvqHqtOQ73BC/s72-c/cnPack+-+MessageBox.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5204660064867830457</id><published>2010-09-30T17:17:00.204-03:00</published><updated>2011-10-14T08:38:37.573-03:00</updated><title type='text'>Delphi XE (2011) + ZeosLib 7 + PostgreSQL 9.0</title><content type='html'>Hoje instalei o recem lançado Embarcadero RAD Studio XE e gostei do que encontrei nele. Também pretendo escrever algumas notas sobre essa versão nos próximos dias.&lt;br /&gt;
Há algum tempo eu escrevi um pequeno passo-a-passo de como instalar o pacote de componentes ZeosLib no Delphi 2010 (&lt;a href=&quot;http://flovato.blogspot.com/2009/10/zeoslib-for-delphi-2010.html&quot;&gt;http://flovato.blogspot.com/2009/10/zeoslib-for-delphi-2010.html&lt;/a&gt;) e hoje volto novamente a esse assunto mas com uma abordagem levemente diferente.&lt;br /&gt;
Também, a poucas semanas atrás, tivemos o lançamento da versão 9.0 do PostgreSQL e fiquei curioso para saber o quanto essa nova versão é suportada pelo ZeosLib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download&lt;/b&gt;&lt;br /&gt;
A última versão oficial, estável e disponível do ZeosDBO é a versão &lt;a href=&quot;http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/zeosdbo-6.6.6-stable/ZEOSDBO-6.6.6-stable.zip/download&quot;&gt;6.6.6&lt;/a&gt; que foi lançada em 30 de Dezembro de 2009 e oferece suporte para o Delphi 5 até Delphi 2007 (Delphi 11).&lt;br /&gt;
A versão 7.0 já era ansiosamente aguardada pelo público que utilizava desde o Delphi 2009 devido ao suporte UNICODE e, ainda hoje, continua em desenvolvimento e sem data certa para lançamento.&lt;br /&gt;
No artigo anterior foi utilizado uma revision alfa do ZeosLib 7 e,&amp;nbsp;da mesma forma, iremos utilizar a revision mais recente do branch&amp;nbsp;&lt;em&gt;testing&lt;/em&gt; para o Delphi 2011 (XE).&lt;br /&gt;
&lt;br /&gt;
Faça o checkout do branch de teste do ZeosLib (&lt;a href=&quot;svn://zeos.firmos.at/zeos/branches/testing&quot;&gt;svn://zeos.firmos.at/zeos/branches/testing&lt;/a&gt;) para um diretório qualquer.&lt;br /&gt;
Se seu &lt;i&gt;client svn&lt;/i&gt; for de linha de comando, abra o prompt de comandos e desloque-se até o diretório onde deseja fazer o checkout e execute o comando:&lt;br /&gt;
&lt;b&gt;svn checkout svn://zeos.firmos.at/zeos/branches/testing&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Caso tenha instalado o &lt;a href=&quot;http://tortoisesvn.tigris.org/&quot;&gt;Tortoise &lt;/a&gt;ou qualquer outro client svn, o procedimento é ainda mais fácil.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHd8GpwuZvDHPzsbPUBj95RjFjYuYYhk_8g7ZUDjvgxUOoh-1rxgRnF_t2xOoP7DEjF9toZy0iwBAnyjtFAunss_z8algYsLpQntE5R-7WrJdsw1pd4-Rv3S2ZfPBeTU5DGT2uXm7-He7x/s1600/ZeosCheckout.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHd8GpwuZvDHPzsbPUBj95RjFjYuYYhk_8g7ZUDjvgxUOoh-1rxgRnF_t2xOoP7DEjF9toZy0iwBAnyjtFAunss_z8algYsLpQntE5R-7WrJdsw1pd4-Rv3S2ZfPBeTU5DGT2uXm7-He7x/s1600/ZeosCheckout.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Nesse artigo o diretório&amp;nbsp;&lt;i&gt;D:\Delphi\Componentes\ZeosDBO2011\&lt;/i&gt;&amp;nbsp;será o local escolhido para o checkout, sendo utilizado como diretório base. Assim, no caso de você escolher um caminho diferente, basta reajustar as configurações no passo-a-passo de instalação para esse novo caminho.&lt;br /&gt;
&lt;br /&gt;
OBS: A revision utilizada durante a escrita desse artigo foi a r822.&lt;br /&gt;
Além disso, se tiver dúvidas de como realizar o &lt;b&gt;&lt;i&gt;checkout&lt;/i&gt;&lt;/b&gt;, há uma imensa quantidade de tutoriais que explicam detalhadamente esse tema (&lt;a href=&quot;http://www.google.com.br/search?gcx=c&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=svn+checkout&quot;&gt;link de pesquisa&lt;/a&gt;).&lt;br /&gt;
Por último, há a possibilidade de você baixar diretamente do sourceforge (&lt;a href=&quot;http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/&quot;&gt;http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/&lt;/a&gt;), quando assim uma release for disponibilizada.&lt;br /&gt;
&lt;br /&gt;
Se tudo estiver correto, o pacote irá apresentar uma estrutura de diretórios igual ou muito semelhante ao da imagem abaixo.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxUsFdWlXKudarFJhvEgP8c8lrtq9yuOvYdQlgEB2sQQVv2jeztGzGW-R784tReXfPf2pRPwfxZxtArFP74VOphslGMlBgrjMrEGkL1QIOqnAVS4Y-c2D3d-jVROcBu_L4kZQ-mQcOmMPx/s1600/ZeosDBO+-+Diret%25C3%25B3rios.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxUsFdWlXKudarFJhvEgP8c8lrtq9yuOvYdQlgEB2sQQVv2jeztGzGW-R784tReXfPf2pRPwfxZxtArFP74VOphslGMlBgrjMrEGkL1QIOqnAVS4Y-c2D3d-jVROcBu_L4kZQ-mQcOmMPx/s1600/ZeosDBO+-+Diret%25C3%25B3rios.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Instalando o Pacote&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyDwOMuZuQJHuI04i1nERNBMQT1all6ZYlY8s_4Ep23d2fUGpgtxB_LnXHxKySfizqTk6jstPr1VmAZkqUirdAe87azz5w8j_AFsEcN9U4b1F-0JLShhXP0dUkk9nO7v2dgv3QnjPgaVTj/s1600/ZeosDBO+Install.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyDwOMuZuQJHuI04i1nERNBMQT1all6ZYlY8s_4Ep23d2fUGpgtxB_LnXHxKySfizqTk6jstPr1VmAZkqUirdAe87azz5w8j_AFsEcN9U4b1F-0JLShhXP0dUkk9nO7v2dgv3QnjPgaVTj/s1600/ZeosDBO+Install.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
O procedimento de instalação é bastante simples:&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;1&lt;/b&gt;. Abra o IDE do Delphi com permissões de administrador. Apesar de não ser obrigatório, deixo como uma forte recomendação em decorrência de problemas que tive em outras&amp;nbsp;ocasiões.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2&lt;/b&gt;. No IDE do Delphi, clique na opção &quot;&lt;i&gt;Open Project&lt;/i&gt;&quot; no menu &quot;&lt;i&gt;File&lt;/i&gt;&quot; e vá até o subdiretório &quot;\packages\delphi&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;15&lt;/span&gt;&lt;/b&gt;&quot; do local onde o foi feito o checkout do ZeosLib. Lá, abra o grupo de projetos &lt;b&gt;ZeosDbo.groupproj&lt;/b&gt;.&lt;br /&gt;
OBS: O &quot;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;15&lt;/span&gt;&lt;/b&gt;&quot; nesse path identifica a versão do Delphi que, nesse caso, refere-se ao Delphi XE. Caso esteja utilizando uma outra versão, deve-se abrir o grupo de projetos correspondente a essa versão (Delphi&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;13&lt;/span&gt; = Delphi 2009; Delphi&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;14&lt;/span&gt; = Delphi 2010; Delphi&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;15&lt;/span&gt; = Delphi XE; ...).&lt;br /&gt;
&lt;br /&gt;
Uma segunda dica para aqueles que &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;já possuem o ZeosDBO 7 instalado&lt;/span&gt; e querem atualizá-lo, recomendo que, antes de iniciar a instalação, remova a versão atual do IDE e, após isso, delete todos os arquivos criados no último build (.dcp, .dcu, .loca, .identcache, .dsk, .map e .bpl).&lt;br /&gt;
Esses últimos podem ser encontrados na pasta &quot;&lt;b&gt;build&lt;/b&gt;&quot; (&lt;i&gt;\packages\delphi15\&lt;b&gt;build&lt;/b&gt;&lt;/i&gt;). Assim, certifique-se de que essa pasta não contenha arquivos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3&lt;/b&gt;. Build todos os projetos (menu &lt;i&gt;Project &lt;/i&gt;-&amp;gt; &lt;i&gt;Build All Projects&lt;/i&gt;);&lt;br /&gt;
&lt;br /&gt;
Se tudo estiver OK, o Delphi irá informar a ocorrência de muitos hints e warnings durante o build dos packages. Não se preocupe, por hora vamos considerar que essas notificações não representam problemas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9bnbEEkcr9Nx9uxhcQWLej3tk5YLUmNRLMaB1dqVbT9YLdhMwmufCxqcg_XHmik_xQhZVDBrGHvKhrnKkTcZBdCUm8fCgzUgwgpnMKmDYEehQF2rUYu0XDZ-OaVjBes4HjHQgDlWrzQ7u/s1600/Zeosbuild.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9bnbEEkcr9Nx9uxhcQWLej3tk5YLUmNRLMaB1dqVbT9YLdhMwmufCxqcg_XHmik_xQhZVDBrGHvKhrnKkTcZBdCUm8fCgzUgwgpnMKmDYEehQF2rUYu0XDZ-OaVjBes4HjHQgDlWrzQ7u/s1600/Zeosbuild.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Entretanto, muito provavelmente será apresentar uma mensagem de erro informando não ter encontrado um determinado arquivo fonte (Exemplo: &quot;&lt;i&gt;... [DCC Fatal Error] ZCore.dpk(51): F1026 File not found: &#39;ZVariant.dcu&#39; ...&lt;/i&gt;&quot;).&lt;br /&gt;
Para corrigir isto basta apenas&amp;nbsp;localizar o respectivo arquivo mencionado na mensagem de erro a partir do subdiretório &quot;&lt;b&gt;src&lt;/b&gt;&quot; no local onde o checkout foi feito e acrescentar o caminho completo no&amp;nbsp;&lt;strong&gt;&lt;em&gt;Libray Path&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;do Delphi (Menu&amp;nbsp;&lt;i&gt;Tools -&amp;gt; Options -&amp;gt; Environment Options -&amp;gt; Delphi Options -&amp;gt; Library&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Para evitar essa e várias outras notificações informando não ter encontrado um arquivo específico, acrescente cada um dos subdiretórios presentes no diretório raíz do ZeosLib no &lt;i&gt;Library Path&lt;/i&gt;, como é mostrado na imagem abaixo.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Bue55FYYE8f2SbJBWEQkGWhjUk6yjFuG55vmxP4OH69bGPKVgVhx9k0n_ksYYNhYcitWEQ_NMRzAdb5s11s0cpG8Vjurs7p4Vborl9_iGs1HOeXSnt52yrLpHoOEpNTPQVbupXnV9Djl/s1600/image002.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Bue55FYYE8f2SbJBWEQkGWhjUk6yjFuG55vmxP4OH69bGPKVgVhx9k0n_ksYYNhYcitWEQ_NMRzAdb5s11s0cpG8Vjurs7p4Vborl9_iGs1HOeXSnt52yrLpHoOEpNTPQVbupXnV9Djl/s400/image002.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Garanta que todas essas sete entradas, destacadas na imagem acima, estejam presentes no &lt;i&gt;Library Path&lt;/i&gt; do Delphi. Especialmente a última, porque a compilação não irá emitir uma mensagem de erro se tal entrada não estiver presente. Entretanto, contribuirá com um efeito indesejado na hora de instalar o pacote de componentes.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Observe que na definição dos paths eu utilizo &quot;&lt;b&gt;$(DelphiComponents)\&lt;/b&gt;&quot;.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Na minha estação de trabalho há uma variável de ambiente chamada&amp;nbsp;&lt;b&gt;DelphiComponents&lt;/b&gt;&amp;nbsp;que tem a finalidade de referenciar o diretório onde todos os componentes/pacotes de terceiros estão localizados.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Isso facilita a migração e uso de versões diferentes de componentes sem que seja necessário a reconfiguração dos path nos projetos ou no IDE do Delphi.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
Caso não tenha ou não queira adicionar essa variável de ambiente, apenas substitua &quot;&lt;b&gt;$(DelphiComponents)\&lt;/b&gt;&quot; pelo path onde o ZeosDBO está localizado (que nesse artigo é &amp;nbsp;D:\Delphi\Componentes\ZeosDBO2011).&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_7IMeP0SjM_fYnEO1Z3DPyv-eBMgWx8jmyT3AseoKAbgMn6fXF6pLObobGcji6ncKqfrqXMOfQCbkTPBhi9l5MQFibLNuu6jw0aK5yFC-x_oN_GKyqQzRolHxAj_u1vL_DXH1FbYPQnB2/s1600/ZeosDBO+-+Vari%25C3%25A1vel+de+Ambiente.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;278&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_7IMeP0SjM_fYnEO1Z3DPyv-eBMgWx8jmyT3AseoKAbgMn6fXF6pLObobGcji6ncKqfrqXMOfQCbkTPBhi9l5MQFibLNuu6jw0aK5yFC-x_oN_GKyqQzRolHxAj_u1vL_DXH1FbYPQnB2/s320/ZeosDBO+-+Vari%25C3%25A1vel+de+Ambiente.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
OBS: Se após acrescentar os diretórios na&lt;i&gt; Library Path&lt;/i&gt; o Delphi continuar exibindo a mensagem de erro, basta fechá-lo e reabrí-lo. Não esqueça de reabrí-lo com permissões de administrador!&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4&lt;/b&gt;. Instale o pacote de componentes selecionando a opção &quot;&lt;i&gt;Install&lt;/i&gt;&quot; (no menu de contexto) do pacote &quot;&lt;i&gt;ZComponentDesign150.bpl&lt;/i&gt;&quot;;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDBVQdSzgoqutuR-0hnVc4xteOCsg9DWkI8NLrlQCvykcmhiPO7kqbUR2bI78wHnE0phaFoRCVGL45bT2uAfjsQzsGpdPZhGWu-HE2aJcUuDKdIpHdMDetwlsyeMnm7de_3j9cROFnmCkB/s1600/zeosinstall.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDBVQdSzgoqutuR-0hnVc4xteOCsg9DWkI8NLrlQCvykcmhiPO7kqbUR2bI78wHnE0phaFoRCVGL45bT2uAfjsQzsGpdPZhGWu-HE2aJcUuDKdIpHdMDetwlsyeMnm7de_3j9cROFnmCkB/s1600/zeosinstall.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin: 0px;&quot;&gt;
Se ao tentar instalar&amp;nbsp;o pacote &quot;&lt;i&gt;ZComponentDesign150.bpl&lt;/i&gt;&quot; for&amp;nbsp;apresentado uma mensagem de erro igual ao da imagem abaixo, isso significa que o Delphi não encontrou o arquivo .BPL específico.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq0Nn93tUKh4LGBi0DADDtDDJCSXliEbUiwwxDTxP9C95mrX54tKMOqAnK7b3msCzNY2_TKAiCDOJJ6WvqSGaALIrEPHwdkmFmBGHx2VSLFawtsWap_xwwRL5AL7MJDk8qXUYY28RV0kT4/s1600/ZeosDBO+Error.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq0Nn93tUKh4LGBi0DADDtDDJCSXliEbUiwwxDTxP9C95mrX54tKMOqAnK7b3msCzNY2_TKAiCDOJJ6WvqSGaALIrEPHwdkmFmBGHx2VSLFawtsWap_xwwRL5AL7MJDk8qXUYY28RV0kT4/s1600/ZeosDBO+Error.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A forma mais prática e rápida de corrigir esse problema é colocando o diretório onde tal .BPL está localizada no&lt;i&gt;&amp;nbsp;System Path&lt;/i&gt;.&lt;br /&gt;
Observe que ao ser buildado os pacotes do ZeosLib, será criado um diretório chamado &lt;b&gt;build&lt;/b&gt;&amp;nbsp;localizado no subdiretório &quot;&lt;b&gt;.\packages\delphi15&lt;/b&gt;&quot;.&lt;br /&gt;
Assim, basta acrescentar esse caminho (D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build) na lista de diretórios da variável de ambiente &quot;&lt;b&gt;PATH&lt;/b&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizfhdM27GzFdZLHwfYS_drZ9-KqWQt7H6plR6dsRcIumLwWZlXelDPi2J3n5p0-WAlU27nrF5QbR6VURZ6kLNfVaqDQHY8-FjejKKuGcMvEgSDpKmBNOx484aSnnYYIca7OFAHf-tXtvZU/s1600/image003+%25281%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizfhdM27GzFdZLHwfYS_drZ9-KqWQt7H6plR6dsRcIumLwWZlXelDPi2J3n5p0-WAlU27nrF5QbR6VURZ6kLNfVaqDQHY8-FjejKKuGcMvEgSDpKmBNOx484aSnnYYIca7OFAHf-tXtvZU/s320/image003+%25281%2529.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
OBS: Qualquer alteração nas variáveis de ambiente irá requerer fechar e abrir novamente o Delphi, para que as alterações tenham efeito.&lt;br /&gt;
&lt;br /&gt;
Se ao tentar instalar&amp;nbsp;o pacote &quot;&lt;i&gt;ZComponentDesign150.bpl&lt;/i&gt;&quot; for&amp;nbsp;apresentado uma mensagem de erro igual ou semelhante ao da imagem abaixo, muito provavelmente ocorreu um descuido na especificação dos path do ZeosDBO.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzL7uJLrycUwRnyEBjJiRuHcjQPZlasNDsx7j7wli_Nk1VQiigcBy4cDPNRv72FGDurj2QJbXEAIrGlYDobZ2wwUO564nPTPyEmeBUtUXGj_WkcxQ8gXz6_Gs2Rr4ta3jvT8UCfm2koNDO/s1600/zeosfalha1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzL7uJLrycUwRnyEBjJiRuHcjQPZlasNDsx7j7wli_Nk1VQiigcBy4cDPNRv72FGDurj2QJbXEAIrGlYDobZ2wwUO564nPTPyEmeBUtUXGj_WkcxQ8gXz6_Gs2Rr4ta3jvT8UCfm2koNDO/s1600/zeosfalha1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Classifico como descuido porque esse erro foi&amp;nbsp;ocasionado&amp;nbsp;quando estava tentando instalar o ZeosDBO que estava em um path diferente daquele referenciado no System Path e no Library Path (no IDE do Delphi).&lt;br /&gt;
Assim, garanta que todos os path apontem exatamente para o diretório onde o ZeosDB está localizado.&lt;br /&gt;
&lt;br /&gt;
Se tudo correr bem o Delphi irá apresentar um dialog informando a lista dos componentes que foram instalados.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixMWRd0mLcaLxoZAmfNEj1fcgp48RzqfwlOtMfY1mwB78zw-MlZXmSJPm_my1YxxzFwMxBqzef10hpOUC95v3Y7NY9XilsTe_NGHT2FYYvhcpzRYKsNTy8AkftA-BRahNNEEMNDvFqvtWJ/s1600/zeosok.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixMWRd0mLcaLxoZAmfNEj1fcgp48RzqfwlOtMfY1mwB78zw-MlZXmSJPm_my1YxxzFwMxBqzef10hpOUC95v3Y7NY9XilsTe_NGHT2FYYvhcpzRYKsNTy8AkftA-BRahNNEEMNDvFqvtWJ/s1600/zeosok.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5&lt;/b&gt;. Validando a instalação do pacote&lt;br /&gt;
Opcionalmente, você pode confirmar se a instalação realmente está consistente verificando os pacotes de componentes instalados no Delphi.&lt;br /&gt;
Para isso acesse&amp;nbsp;o menu &lt;i&gt;Component&lt;/i&gt;&amp;nbsp;-&amp;gt; &lt;i&gt;Install Packages ...&lt;/i&gt;&amp;nbsp;e localize a entrada &quot;Zeos Database Components&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsg9J6EsqKHJratEXiGcMTWD_GiFpqHGtFH5AQzSXB4Ez5CDG60caiSRUxT0Ds9ZQfWMUc4ovIz1Rj7W75hnsfvXGBUBHYtjXF8z56sV8-uYCB0EP_jscjlSzhbZ1shW3DdRtmU0rs931/s1600/zeoscomp.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;248&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWsg9J6EsqKHJratEXiGcMTWD_GiFpqHGtFH5AQzSXB4Ez5CDG60caiSRUxT0Ds9ZQfWMUc4ovIz1Rj7W75hnsfvXGBUBHYtjXF8z56sV8-uYCB0EP_jscjlSzhbZ1shW3DdRtmU0rs931/s320/zeoscomp.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Muitos tem relatados que mesmo a instalação do pacote ter sido bem sucedida, o Delphi não mostra a paletta de componentes do ZeosDBO.&lt;br /&gt;
Isso ocorre porque algum dos passos acima foi pulado ou não realizado de forma correta. E, normalmente, a razão do problema reside em dois pontos:&lt;br /&gt;
1º. Esqueceu de acrescentar a pasta de build (&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: x-small;&quot;&gt;$(DelphiComponents)\packages\delphi15\build&lt;/span&gt;) no&amp;nbsp;&lt;i&gt;Library Path&lt;/i&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
2º. Não especificou a pasta de build do ZeosDBO no System Path;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Uma forma fácil de confirmar isso é digitar “&lt;b&gt;set path&lt;/b&gt;” no prompt de comandos.&lt;/div&gt;
&lt;div&gt;
Observe que na imagem abaixo o caminho &quot;D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build&quot; está presente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1INOIruPktMmt1tgYPm386jPQlgjj2I29lPcbnfi5ay3DHWM7LSTxQ8fpG0Lmh76CRWXILHqtOy1w5_mu0-oTHwjA91-mae7u4wUx0HxX3U5WLdl1agxWBEiCk1sfq_HaGIAJjpWUfo_j/s1600/image003.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;261&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1INOIruPktMmt1tgYPm386jPQlgjj2I29lPcbnfi5ay3DHWM7LSTxQ8fpG0Lmh76CRWXILHqtOy1w5_mu0-oTHwjA91-mae7u4wUx0HxX3U5WLdl1agxWBEiCk1sfq_HaGIAJjpWUfo_j/s400/image003.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;Conexão com PostgreSQL 9.0&lt;/strong&gt;&lt;br /&gt;
A primeira questão a ser verificada é se essa versão do ZeosDBO consegue, ao menos, conectar-se ao PostgreSQL.&lt;br /&gt;
Nesse ponto é assumido que você já tenha instalado o PostgreSQL 9.X.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitRi3pi_wVsHxyxceeMeB80AI9BdROkEvPFjh0prCybGf6WajRTHc3vaKKtV1obGas95JpC2ZHNsYWgXDYndhncmkGEjNeQq3ysC85IodG_1oXgJDtg7eGGz323pch3mQ3CtdmBE1KXwRK/s1600/zeos+oi.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitRi3pi_wVsHxyxceeMeB80AI9BdROkEvPFjh0prCybGf6WajRTHc3vaKKtV1obGas95JpC2ZHNsYWgXDYndhncmkGEjNeQq3ysC85IodG_1oXgJDtg7eGGz323pch3mQ3CtdmBE1KXwRK/s320/zeos+oi.png&quot; width=&quot;284&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Para esse teste básico, um novo projeto foi criado e um componente &lt;em&gt;TZConnection&lt;/em&gt; foi dropado no formulário.&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Observe na imagem ao lado que a conexão foi efetuada com sucesso sobre a própria base de dados do postgres (metadados).&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Um ponto a ser destacado é que na lista de protocolos (propriedade &lt;em&gt;Protocol&lt;/em&gt;) não há um item &quot;postgresql-&lt;strong&gt;9&lt;/strong&gt;&quot;, como esperado. Assim, a opção mais provável foi utilizar&amp;nbsp;&quot;postgresql-&lt;strong&gt;8&lt;/strong&gt;&quot;.&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Penso que com o tempo seja&amp;nbsp;acrescentado uma opção&amp;nbsp;exclusiva para a versão 9 do postgresql, já que essa introduz mudanças significativas.&lt;/div&gt;
&lt;br /&gt;
A configuração do componente TZConnection no DFM é apresentado como:&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;object ZConnection1: TZConnection&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Properties.Strings = (&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&#39;codepage=UTF8&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&#39;client_encoding=UTF8&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AutoCommit = False&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Connected = True&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Protocol = &#39;postgresql-8&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;HostName = &#39;127.0.0.1&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Port = 5432&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Database = &#39;postgres&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;User = &#39;postgres&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Password = &#39;MinhaSenha&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Left = 126&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Top = 16&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Após configurar o componente e alterar a propriedade &lt;strong&gt;Connected&lt;/strong&gt; para &lt;strong&gt;True&lt;/strong&gt;, pela primeira vez, uma notificação de erro igual ao da imagem abaixo foi apresentada.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXEklAHjTJNAH4j0QaDSdipm9wPY1wnGSn5xmejnj-MxroZBBJUB24gAKoHupqc_y2ivQEyqdtat7jnp-XHnlcg6x9bN91aPTvuKVsRx1dHCFY0iSxMi1oSN6V4N0DaIByjD6yqjfZvNDm/s1600/postgres.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXEklAHjTJNAH4j0QaDSdipm9wPY1wnGSn5xmejnj-MxroZBBJUB24gAKoHupqc_y2ivQEyqdtat7jnp-XHnlcg6x9bN91aPTvuKVsRx1dHCFY0iSxMi1oSN6V4N0DaIByjD6yqjfZvNDm/s1600/postgres.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Esse é um problema clássico que é resolvido de duas maneiras: 1) Copiando os devidos arquivos para a pasta do projeto; ou 2) Acrescentando o diretório onde tais arquivos se encontram no PATH do sistema.&lt;/div&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;
Todas as DLLs estão localizados no subdiretório &quot;&lt;strong&gt;bin&lt;/strong&gt;&quot; do diretório de instalação do PostgreSQL (provavelmente &lt;em&gt;C:\Program Files\PostgreSQL\9.0\bin&lt;/em&gt;).&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6MDgk2ukk_TB208QXbajtEj7d-Khhu3G-3q0iwPxhmpVF7D8L_e1tGQJApgEqKOABSzLKv7c1Bp27vXQ6yl2BDbyNh4KzoaqPwAZgDyHnCCYU0DA1vBu7fgrczkUul80fzvSEiFnuhL-l/s1600/path+2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6MDgk2ukk_TB208QXbajtEj7d-Khhu3G-3q0iwPxhmpVF7D8L_e1tGQJApgEqKOABSzLKv7c1Bp27vXQ6yl2BDbyNh4KzoaqPwAZgDyHnCCYU0DA1vBu7fgrczkUul80fzvSEiFnuhL-l/s1600/path+2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Como mostra a imagem acima, a solução escolhida foi acrescentar o diretório de instalação do PostgreSQL&amp;nbsp;no Path do sistema para que não seja necessário ter que&amp;nbsp;copiar novamente as DLLs para novos projetos que usem o ZeosDBO.&lt;br /&gt;
Após isso só foi necessário fechar e reabrir o Delphi e a conexão ocorreu como esperada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Realizando consultas&lt;/strong&gt;&lt;br /&gt;
Após uma conexão bem sucedida, realizei alguns testes com os componentes básicos para exibir os registros das tabelas.&lt;br /&gt;
Na imagem abaixo pode-se notar o componente DBGrid exibindo informações&amp;nbsp;da tabela &quot;information_schema.table&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWyAeSpowrFlaIbEepYjGxhZV_7H6TNoPT10fmt1wwU7_FmI86xgBxLd6NP2_VOuGIExaQWy_aZGaUIqM1vxv62UnoxfAwVgvKhWoDduddNfttRU_WJWs44FzOVOyQRK5Z1VS7y90cpzPY/s1600/zeos.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWyAeSpowrFlaIbEepYjGxhZV_7H6TNoPT10fmt1wwU7_FmI86xgBxLd6NP2_VOuGIExaQWy_aZGaUIqM1vxv62UnoxfAwVgvKhWoDduddNfttRU_WJWs44FzOVOyQRK5Z1VS7y90cpzPY/s1600/zeos.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Apesar de ter realizados alguns poucos testes básicos em modo de design, aparentemente os componentes estão funcionando bem. Não notei qualquer tipo de falha.&lt;br /&gt;
Para validar prováveis problemas de suportes que muitas vezes são observados em circunstâncias específicas ou após um bom tempo de uso, resolvi migrar todo um sistema desenvolvido no Delphi 2010 para o Delphi XE.&lt;br /&gt;
Esse sistema possui um framework de banco de dados baseado no ZeosDBO e, em teoria, buildar e executar esse sistema através do Delphi XE iria expor qualquer falta de suporte para com o PostgreSQL 9.0, já que esse framework faz uso&amp;nbsp;moderado dos recurso/componentes do ZeosDBO e o sistema possui uma base de dados relativamente grande.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Migrando o sistema para o Delphi XE&lt;/strong&gt;&lt;br /&gt;
Imaginei que seria mais trabalhoso, mas praticamente não foi preciso fazer muita coisa. &lt;br /&gt;
Ao abrir o grupo de projeto desse sistema que foi criado no Delphi 2010, o Delphi XE nem mesmo realizou qualquer tipo de conversão de formato.&lt;br /&gt;
O único trabalho que tive foi substituir, na cláusula &lt;em&gt;require&lt;/em&gt; dos projetos&amp;nbsp;a referência&amp;nbsp;de alguns pacotes de componentes de terceiros (por exemplo: substituir &lt;em&gt;tms2010&lt;/em&gt; por &lt;em&gt;tms2011&lt;/em&gt;). O que não custou mais do que 30 minutos.&lt;br /&gt;
Só encontrei problemas com alguns pacotes de terceiros que estavam sendo utilizados. Entretanto, para todos já havia uma versão mais recente que suportavam o Delphi XE. Assim, o trabalho real foi instalar as versões novas desses pacotes, com exceção de um deles que&amp;nbsp;necessitou alguma intervenção manual.&lt;br /&gt;
&lt;br /&gt;
Bom, aqui o que nos interessa é a suporte do ZeosDBO ao PostgreSQL 9.0 e&amp;nbsp;em relação a&amp;nbsp;isso surpreendentemente não foi necessário modificar uma linha se quer do framework de banco de dados (esse framework foi criado em 2008 com a ainda recente versão 6.6.4 do ZeosDBO!).&amp;nbsp;O sistema foi buildado 100% sem qualquer problema (apenas alguns poucos hints).&lt;br /&gt;
O foco desse post não é a migração de sistemas para o Delphi XE, mas a experiência foi muito positiva. E encorajo qualquer um que use o Delphi 2010 para fazer esse upgrade.&lt;br /&gt;
Inicialmente fiquei pensando que era bom demais para ser verdade e que bastaria rodar o sistema para as cores de cabeça aparecerem. Para minha felicidade, o software executou normalmente passando com sucesso em todos os testes automatizados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br /&gt;
Tenho a total consciência que por mais&amp;nbsp;amplo que seja a utilização dos componentes e das funcionalidades do ZeosDBO nesse framework de banco de dados,&amp;nbsp;é precipitado concluir que&amp;nbsp;a versão alfa da versão 7.0 seja totalmente compatível com o PostgreSQL 9.X, mas sinto-me tranquilo para incentivar a qualquer um que já esteja pensando em fazer algum tipo de migração/upgrade parecido para que o faça.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5204660064867830457/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5204660064867830457?isPopup=true' title='24 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5204660064867830457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5204660064867830457'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/09/delphi-xe-2011-zeoslib-7-postgresql-90.html' title='Delphi XE (2011) + ZeosLib 7 + PostgreSQL 9.0'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHd8GpwuZvDHPzsbPUBj95RjFjYuYYhk_8g7ZUDjvgxUOoh-1rxgRnF_t2xOoP7DEjF9toZy0iwBAnyjtFAunss_z8algYsLpQntE5R-7WrJdsw1pd4-Rv3S2ZfPBeTU5DGT2uXm7-He7x/s72-c/ZeosCheckout.png" height="72" width="72"/><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5919846040959989174</id><published>2010-08-20T21:32:00.000-03:00</published><updated>2010-08-20T21:32:51.360-03:00</updated><title type='text'>Quanto vale o seu site?</title><content type='html'>Fugindo um pouco do tema desenvolvimento de software a qual esse blog é dedicado, dedico este post a tratar de um assunto que muitas vezes passa desapercebido, mas que para um blogueiro ou um webmaster é um dilema.&lt;br /&gt;
Quanto vale o seu site? Quanto vale todo o esforço despendido? Por quanto devo vender?&lt;br /&gt;
&lt;br /&gt;
Quando se pensa em qual valor cobrar por um determinado site, temos muitas variáveis que entram nos custos fixos como horas trabalhadas, manutenção, divulgação, horas extras, registros, etc.&lt;br /&gt;
Por outro lado, para definir o valor final muitas outras variáveis entram no cálculo onde algumas não figuram na realidade de um determinado negócio, enquanto outras são os pontos chaves. Dentre esses pontos podemos citar o número de visitas que o site recebe, a popularidade, o pagerank, ...&lt;br /&gt;
Quando o assunto é estimar o quando um site vale, entramos em infindáveis discussões.&lt;br /&gt;
Para ajudar nessa tarefa temos a disposição algumas ferramentas online muito interessantes.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.smartpagerank.com/&quot;&gt;SmartPageRank&lt;/a&gt;: Uma ferramenta bastante completa que estima o valor potencial do seu site e também apresenta outras informas como tempo de domínio, Google PageRank, backlinks, páginas indexas (no Google, Yahoo, MSN, AltaVista e AllTheWeb) e tráfego.&lt;br /&gt;
&lt;a href=&quot;http://www.dnscoop.com/&quot;&gt;DNScoop&lt;/a&gt;: Estima o valor do site através de alguns critérios (particularmente eu não obtive sucesso com alguns blogs que testei).&lt;br /&gt;
&lt;a href=&quot;http://www.cubestat.com/&quot;&gt;CubeStat&lt;/a&gt;: Com os links que testei, o valor estimado ficou muito distantes do que julgo real. E as informações como&lt;br /&gt;
&lt;a href=&quot;http://bizinformation.org/br/&quot;&gt;BizInformation&lt;/a&gt;: No meu ponto de vista essa foi uma das ferramentas cujo avaliação resultou em um valor mais próximo do que considero aceitável. Entretanto essa é uma opinião bem particular e, acredito, até pouco confiável já que cada caso é um caso.&lt;br /&gt;
O melhor é você experimentar e tirar suas próprias conclusões.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5919846040959989174/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5919846040959989174?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5919846040959989174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5919846040959989174'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/08/quanto-vale-o-seu-site.html' title='Quanto vale o seu site?'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-832609112848264092</id><published>2010-08-06T20:30:00.004-03:00</published><updated>2010-08-11T17:19:15.051-03:00</updated><title type='text'>Delphi++: Primeiras impressões</title><content type='html'>Nas últimas semanas tenho lido em foruns alguns post bastante tímidos sobre um tal de Delphi++. Na maioria das vezes&amp;nbsp;contendo o comentário de um ou mais membros classificando-o como &lt;em&gt;fake&lt;/em&gt;.&lt;br /&gt;
Bom, resolvi ir atrás do tema para entender realmente do que se tratava&amp;nbsp;e, para minha surpresa, encontrei uma nova ferramenta de desenvolvimento com uma proposta no mínimo interessante e que, ao meu entender, tem a intenção de brigar por um &lt;em&gt;lugar ao sol&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Nesse artigo não irei descrever o que é o Delphi++, sua proposta nem todos os recurso que possui, mas sim comentar as primeiras impressões sobre seu IDE comparando-o com o do Delphi.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Instalação&lt;/strong&gt;&lt;br /&gt;
No site oficial &lt;a href=&quot;http://delphiplusplus.com/&quot;&gt;++Technologies&lt;/a&gt;&amp;nbsp;é possível fazer o download da versão beta,&amp;nbsp;após registrar-se.&lt;br /&gt;
Essa é a primeira versão do IDE e está ainda em estágio beta (v1.0.43.b) mas&amp;nbsp;é simplesmente fantástica, considerando o que ela já oferece.&lt;br /&gt;
Ao fazer o &lt;a href=&quot;http://delphiplusplus.com/downloads/Delphi++Setup.zip&quot;&gt;download&lt;/a&gt; notei que a instalação possua pouco menos de 12&amp;nbsp;MB. Isso fez baixar a expectativa de encontrar um boa ferramenta de desenvolvimento. E se comparar com a instalação do Delphi 2010, 12MB representa pouco mais do que nada.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRvjRGEvKVH19G6QPys-NT11axp1BSSGbgHYJ5Tyq-iheNBI-Q6K5OyZ3JkCOLgY-lyLGFmi1PO1y-FIvut_jYXGT3Dy8cLRhjlb9J9W6bRMDjkhI35BVoghVXEisid1kpccTyMh8GDBZ/s1600/Delphi+++-+Setup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRvjRGEvKVH19G6QPys-NT11axp1BSSGbgHYJ5Tyq-iheNBI-Q6K5OyZ3JkCOLgY-lyLGFmi1PO1y-FIvut_jYXGT3Dy8cLRhjlb9J9W6bRMDjkhI35BVoghVXEisid1kpccTyMh8GDBZ/s400/Delphi+++-+Setup.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A instalação é muito tranquila sem nada de diferente. Basta um Next, Next, Nex e pronto.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Inicialização&lt;/strong&gt;&lt;br /&gt;
Logo na tela de abertura já se pode notar um incrível semelhança com o Delphi da Embarcadero.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZHajtUf_sNm30MjomE_qQ7bYw2acK4qJNSrnjsoe3FTtIp9-tXnX-SP7clj8KGGB5VkuVloho9InVrzJRCHkj1CniywtcllQSxDjmJaMHqjdbH616r1rNrKDlQOkAZ-yAkT8xR5lM4C5k/s1600/Delphi+++-+Splash.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZHajtUf_sNm30MjomE_qQ7bYw2acK4qJNSrnjsoe3FTtIp9-tXnX-SP7clj8KGGB5VkuVloho9InVrzJRCHkj1CniywtcllQSxDjmJaMHqjdbH616r1rNrKDlQOkAZ-yAkT8xR5lM4C5k/s400/Delphi+++-+Splash.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Na tela de spash nenhuma informação é apresentada que dê ideia do que está sendo realizado durante o start up. E apesar da instalação ser leve, a abertura do IDE passou a impressão de não ser tão leve assim.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;IDE&lt;/strong&gt;&lt;br /&gt;
A semelhança com o Delphi não ficou somente somente na tela de spash, todo o IDE é muito familiar. Até mesmo a disposição dos painéis e tools.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-3wqcbY-BEoFcDJZy4ISlKdamgh-7ZbAdw2eq9iJ2iX9S38XMtrsV3cSlrDZl1cm10jfsGDcaONHYs8zLzm_ZDK_BBWUWfxfd0ymuUJuKlzZ0TPh8iRrXSg9j3CTc3rLRT4ZhWFbi0mQ/s1600/Delphi+++-+IDE.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; bx=&quot;true&quot; height=&quot;232&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-3wqcbY-BEoFcDJZy4ISlKdamgh-7ZbAdw2eq9iJ2iX9S38XMtrsV3cSlrDZl1cm10jfsGDcaONHYs8zLzm_ZDK_BBWUWfxfd0ymuUJuKlzZ0TPh8iRrXSg9j3CTc3rLRT4ZhWFbi0mQ/s400/Delphi+++-+IDE.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;Tool Palette&lt;/strong&gt;&lt;br /&gt;
Aqui está um ponto muito interessante.&lt;br /&gt;
O Delphi++ conta com&amp;nbsp;muitos dos componentes básicos que são oferecidos pelo Delphi, inclusive componentes para acesso a banco de dados.&lt;br /&gt;
O fato de ser utilizado o mesmo ícone para os componentes de mesma proposta facilita bastante sua localização.&lt;br /&gt;
Abaixo está a lista de todos os componentes que estão contidos em cada uma das paletas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQDpS2s9nmNbG0A016u-YCaB92F59Nm62SvE-2ACqdlmFYzGwZmil-HKieKXaK3B9MdDnSpLA6WEgHg-2oj0_TIL7kqlxUAaHHetewlg_HnvUVmE3bCbfrSMHvim8cSzW6oMF6FHHAkeg/s1600/tool+Pallete.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQDpS2s9nmNbG0A016u-YCaB92F59Nm62SvE-2ACqdlmFYzGwZmil-HKieKXaK3B9MdDnSpLA6WEgHg-2oj0_TIL7kqlxUAaHHetewlg_HnvUVmE3bCbfrSMHvim8cSzW6oMF6FHHAkeg/s400/tool+Pallete.png&quot; width=&quot;231&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Não há muito o que customizar na exibição esse Tool Panel. Na verdade essa é uma característica comum a todas as Tool Panel do IDE. A interface é um tanto rígida e não há quase opções de customização.&lt;br /&gt;
Comparando com a Tool Palette do Delphi, o que mais senti falta é da usabilidade do Tool Palette. Enquanto que no Delphi pode-se acrescentar um componente na tela com um duplo-click sobre o componente ou com um arrasta-e-solta, no Delphi++ é requerido que vc necessariamente selecione o componente na Tool Palette e clique no formulário para dropá-lo.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Object Inspector&lt;/strong&gt;&lt;br /&gt;
Na primeiras olhadas para o Object Inspector o que mais chama a atenção é colorido nos nomes das propriedades.&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtBq0za7OUPtsGKp_YM20oAci9hDfoexTe1_3uLv0LcyKJ4uCL6IIEC5eJC8Myacs98XQ0LxQgORZr4kYb3ToS_G2wH6MCy9qlXzjWfxv1qf9zbEsa0FSN5kR6EA1Owv-FMuiYKxzqIxnc/s1600/Delphi+++-+Object+Inspector.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtBq0za7OUPtsGKp_YM20oAci9hDfoexTe1_3uLv0LcyKJ4uCL6IIEC5eJC8Myacs98XQ0LxQgORZr4kYb3ToS_G2wH6MCy9qlXzjWfxv1qf9zbEsa0FSN5kR6EA1Owv-FMuiYKxzqIxnc/s320/Delphi+++-+Object+Inspector.png&quot; /&gt;&lt;/a&gt;Diferentemente do que é feito nas versões 2009 e 2010 do Delphi, a apresentação das propriedades no Object Inspector não&amp;nbsp;é agrupadas por categoria, elas são apresentadas uma abaixo a outra em ordem alfabética. Infelizmente também não há&amp;nbsp;opções de rearranjamento ou reagrupamento.&lt;br /&gt;
Depois de um tempo, olhando com atenção percebe-se que a cor da na qual as propriedades são exibidas dependente do seu tipo. Por exemplo, observe na imagem ao lado. Todas as propriedades da cor verde são do tipo Boolean, assim como as que são do tipo Integer estão em roxo.&lt;br /&gt;
&lt;br /&gt;
Em relação aos tipos de propriedades apresentadas e comparando com&amp;nbsp;as apresentadas no Delphi 2010, notei que há pouquíssimas diferenças, e todas as que identifiquei se tratavam de propriedades que foram acrescentando na versão 2010.&lt;br /&gt;
O mesmo ocorre com os tipos de eventos.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Editor&lt;/strong&gt;&lt;br /&gt;
O editor do código fonte&amp;nbsp;trás muitos dos recursos originais do Delphi, inclusive utiliza as mesmas teclas de atalho para tarefas comuns (por exemplo o F12 que alterna entre o modo de design e de edição). No entanto nem tudo funciona 100% e o editor passa uma impressão de não ser muito maleável.&lt;br /&gt;
Nas primeiras linhas de código escrito notei que o TAB não identava o código; ainda não há um auto-complete, live-template, code parameters&amp;nbsp;e outras facilidades.&lt;br /&gt;
Para que está acostumado com o code-completion (CTRL + Space) certamente irá sentir um pouco de desconforto. Nos release testada o popup só era apresentado&amp;nbsp;após o pressionamento&amp;nbsp;o ponto final (&quot;.&quot;).&lt;br /&gt;
A editor de design do Delphi++ também tem várias limitações. O que notei é que o usuário precisa utilizar constantemente o mouse para ajustar o focus no ponto correto. Isso dificulta muito a alternância entre o formulário e o Object Inspector durante, por exemplo,&amp;nbsp;a tela de criação&amp;nbsp;e design dos formulários.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Mãos a obra&lt;/strong&gt;&lt;br /&gt;
Depois de analisar esses e muitos outros recursos, resolvi colocar a mão na massa e implementar alguma coisa para avaliar a linguaguem propriamente dita.&lt;br /&gt;
Comecei dropando alguns componentes no formulário, ajustando algumas propriedades, alinhando os componentes, acrescentei um MainMenu, inclui alguns itens no menu, ...&lt;br /&gt;
&lt;br /&gt;
Quando dei um duplo-click sobre um dos itens do menu com a intenção de implementar o evento &lt;i&gt;OnClick&lt;/i&gt;, a duas pequenas diferenças surgiram. Uma é a declaração do evento não incluir o nome da classe (algo como procedure TForm1.menuOpenOnClick ...); a segunda foi ver que em vez de &lt;i&gt;TObject&lt;/i&gt;, o parâmetro Sender do evento é do tipo &lt;b&gt;&lt;i&gt;any&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; gFileName: string;&lt;br /&gt;
&lt;br /&gt;
procedure menuOpen_OnClick(Sender: any);&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp; lFStream: TFileStream;&lt;br /&gt;
&amp;nbsp; lCharacter: Char;&lt;br /&gt;
&amp;nbsp; lBuffer: string;&lt;br /&gt;
&amp;nbsp; lSize: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; if &lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;self:&lt;/span&gt;&lt;/strong&gt;dlgOpen.Execute then&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lFStream := TFileStream.Create(self:dlgOpen.FileName, fmOpenRead);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lBuffer := &#39;&#39;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while lFStream.Read(lCharacter, 1) = 1 do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lBuffer := lBuffer + lCharacter;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;self:&lt;/span&gt;&lt;/strong&gt;memFile.Lines.Text := lBuffer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gFileName := &lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;self:&lt;/span&gt;&lt;/strong&gt;dlgOpen.FileName;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lFStream.Free;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Estava esperando visualizar uma unit com a estrutura de um arquivo pascal padrão (secões: unit, interface, type e&amp;nbsp;implementation), mas tudo que se observa é a declaração dos métodos.&lt;br /&gt;
No método acima é a implementação do evento OnClick da opção &quot;Open&quot; do menu &quot;File&quot; que foi acrescentado no formulário.&lt;br /&gt;
A simples tarefa de abir um arquivo e importar seu conteúdo para um componente TMemo demandou um tempinho considerável porque a estrutura do arquivo e&amp;nbsp;a bliblioteca de funções não são iguais ao do Delphi.&lt;br /&gt;
Inicialmente comecei tentando utilizar as funções FileOpen, FileRead e FileClose para acesso ao arquivo desejado, mas sempre era exibida uma mensagem de erro indicando que tal função não existia. Não há a cláusula &quot;uses&quot;, para fazer a importação/referência&amp;nbsp;a units.&lt;br /&gt;
Então, depois de um tempo notei que entre&amp;nbsp;as mais&amp;nbsp;de 400 classes oferecidas pelo Delphi++, TFileStream estava incluída.&lt;br /&gt;
Outro ponto bastante importante é que a referência para componentes do formulário não é feito digitando o nome do componente diretamente, é necessário incluir &quot;&lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;self:&lt;/strong&gt;&lt;/span&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
OBS: Para aqueles que já implementaram ou tiveram algum tipo de contato com o código fonte de macros em aplicativos office, por exemplo, perceberá uma semelhança.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;procedure menuNew_OnClick(Sender: any);&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; self:memFile.Lines.Text := &#39;&#39;;&lt;br /&gt;
&amp;nbsp; gFileName := &#39;&#39;;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure menuSave_OnClick(Sender: any);&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp; lFStream: TFileStream;&lt;br /&gt;
&amp;nbsp; lSize, i: Integer;&lt;br /&gt;
&amp;nbsp; lText: string;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; if gFileName = &#39;&#39; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if self:dlgSave.Execute then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gFileName := self:dlgSave.FileName;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; if gFileName &amp;lt;&amp;gt; &#39;&#39; then&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lFStream := TFileStream.Create(gFileName, fmCreate or fmOpenWrite);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lText := self:memFile.Lines.Text;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lSize := &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;Str.Len&lt;/span&gt;(lText);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i := 1 to lSize do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lFStream.Write(lText[i], 1);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lFStream.Free;&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
A implementação do evento OnClick da opção &quot;Save&quot; do menu, também foi um pequeno desafio a parte.&lt;br /&gt;
Custou um tempo descobrir que a função &quot;&lt;i&gt;Length&lt;/i&gt;&quot; (que retorna o número de caracteres de uma string) não existe e que em vez dela deve-se utilizar &quot;&lt;b&gt;Str.Len&lt;/b&gt;&quot;.&lt;br /&gt;
Na verdade &quot;&lt;i&gt;Str.&lt;/i&gt;&quot; concentra a maioria das funções de manipulação de strings. Assim como &quot;&lt;b&gt;Date.&lt;/b&gt;&quot; é o ponto de partida para encontrar funções de manipulação de data.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;procedure menuExit_OnClick(Sender: any);&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; Self.Close;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
constructor&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
end.&lt;/div&gt;&lt;br /&gt;
Uma divergência com relação a maioria das ferramentas de desenvolvimento é que todo o projeto é armazenado em um único arquivo e na forma binária. Se você abrir o arquivo de projeto com um editor de texto, não irá identificar o código fonte. A visualização e edição fica restrita exclusivamente ao IDE do Delphi++.&lt;br /&gt;
&lt;br /&gt;
Caso deseje visualizar o projeto inteiro, pode&amp;nbsp; fazer o download&amp;nbsp;nesse &lt;a href=&quot;http://rapidshare.com/files/411478798/Delphi___-_Hellow_Word.7z&quot;&gt;link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Conclusões&lt;/strong&gt;&lt;br /&gt;
Ao meu ver o Delphi++ é (me desculpe o termo) uma intenção de cópia do Embarcadero RAD Studio que está em um estágio prematuro, mas que já mostra ser uma alternativa.&lt;br /&gt;
O IDE segue a tendência atual das ferramentas de desenvolvimento de não ser exclusivo ao suporte&amp;nbsp;de uma única linguagem de programação, e&amp;nbsp;isso é muito bom. Entretanto, na atual versão (1.0 beta 2) ainda há muito o que ser feito, melhorado, e a ser corrigido,&amp;nbsp;para poder oferecer aos usuários um experiência adequada e um ambiente que proporcione agilidade&amp;nbsp;no desenvolvimento.&lt;br /&gt;
A falta de documentação é outro ponto negativo que dificulta bastante os primeiros passos, mas aos que já conhecem a linguagem rapidamente resolve os&amp;nbsp;impasses.&lt;br /&gt;
Por outro lado essa é uma conclusão comparada com o RAD Studio 2010, que é uma ferramenta madura e que tem sido constantemente evoluída desde, se não estou enganado, 1995.&lt;br /&gt;
Se formos considerar que o Delphi++ ainda está em fase beta, não há como desmerecer esse fabuloso trabalho, ainda mais pelo fato de que já nessa versão beta é oferecido suporte multi-plataforma (recurso previsto somente para a versão 2011 do RAD Studio, e olha lá). &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
No mínimo eu concluo que vale a pena acompanhar o decorrer dos fatos.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/832609112848264092/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/832609112848264092?isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/832609112848264092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/832609112848264092'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/08/delphi-primeiras-impressoes.html' title='Delphi++: Primeiras impressões'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRvjRGEvKVH19G6QPys-NT11axp1BSSGbgHYJ5Tyq-iheNBI-Q6K5OyZ3JkCOLgY-lyLGFmi1PO1y-FIvut_jYXGT3Dy8cLRhjlb9J9W6bRMDjkhI35BVoghVXEisid1kpccTyMh8GDBZ/s72-c/Delphi+++-+Setup.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-25697734411928595</id><published>2010-07-16T23:13:00.001-03:00</published><updated>2010-07-18T22:49:59.137-03:00</updated><title type='text'>Diretivas de Compilação - WARNINGS, HINTS e MESSAGES</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;$WARNINGS&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Warnings&lt;/strong&gt; são alertas emitidos durante a compilação que apontam para um potencial ou real problema no código fonte.&lt;br /&gt;
Algumas vezes, por exemplo, os warnings se referem a variáveis que foram declaradas mas que não estão sendo usadas. Esse é um caso onde não há um problema, mas mesmo assim vale a pena dar atenção para esse warning porque ele é um indício de que há espaço para tornar seu código fonte mais limpo/claro.&lt;br /&gt;
O ideal é nunca ter qualquer warning emitido durante a compilação.&lt;br /&gt;
&lt;br /&gt;
Em certos casos o compilador emite alertas para um trecho de código do qual temos a certeza de estar correto, e que esse alerta poderia ser desconsiderado sem qualquer receio.&lt;br /&gt;
Para essa situação nós podemos usar a diretiva de compilação &lt;strong&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$WARNINGS}&lt;/span&gt;&lt;/strong&gt; para desabilitar a emisão dos warnings em um certo techo de código.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$WARNINGS OFF}&lt;br /&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;// Seu código fonte&lt;/span&gt;&lt;br /&gt;
{$WARNINGS ON}&lt;/div&gt;&lt;br /&gt;
Uma outra abordagem mais recomendada para essa situação é desabilitar somente o warning específico a qual se tem ciência de não representar problema. Isso evita que outros warnings sejam desconsiderados não intencionalmente em decorrência de uma modificação futura nesse trecho de código, principalmente se o trecho de código for relativamente grande.&lt;br /&gt;
&lt;br /&gt;
A sitaxe é:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$WARN &lt;em&gt;identifier&lt;/em&gt; OFF}&lt;br /&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;// Seu código fonte&lt;/span&gt;&lt;br /&gt;
{$WARN &lt;em&gt;identifier&lt;/em&gt; ON}&lt;/div&gt;onde &quot;&lt;em&gt;identifier&lt;/em&gt;&quot; é o símbolo correspondente do warning.&lt;br /&gt;
&lt;br /&gt;
Considere o exemplo abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;unit&lt;/strong&gt; uTest;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;interface&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp; procedure&lt;/strong&gt; MyTest; &lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;experimental&lt;/span&gt;&lt;/strong&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;implementation&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;procedure&lt;/strong&gt; MyTest;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// Código fonte&lt;/span&gt;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;/div&gt;&lt;br /&gt;
Para quem não sabe &quot;&lt;span style=&quot;color: red;&quot;&gt;experimental&lt;/span&gt;&quot; é uma palavra reservada que pode ser usada para métodos, funções, units e outros com a intenção clara de sinalizar que tal implementação está, como o próprio nome sugere, em face experimental e que deve ser cauteloso no seu uso.&lt;br /&gt;
Ao compilar esse exemplo será apresentado uma mensagem semelhante a essa:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;[DCC Warning] Project2.dpr(13): W1003 Symbol &#39;MyTest&#39; is experimental&lt;/div&gt;&lt;br /&gt;
O código de identificação desse warning, como mostra a mensagem, é &lt;strong&gt;1003&lt;/strong&gt;&amp;nbsp;e o correspondente símbolo é&amp;nbsp;&amp;nbsp;SYMBOL_EXPERIMENTAL. Dessa forma, caso queira anular tal alerta em um trecho de código, basta usar:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$WARN &lt;span style=&quot;color: red;&quot;&gt;SYMBOL_EXPERIMENTAL&lt;/span&gt; OFF}&lt;br /&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;// trecho de código&lt;/span&gt;&lt;br /&gt;
{$WARN &lt;span style=&quot;color: red;&quot;&gt;SYMBOL_EXPERIMENTAL&lt;/span&gt; ON} &lt;/div&gt;&lt;br /&gt;
Não tenho intenção de listar todos os símbolos pré-definidos que o Delphi possui, mas vou detalhar alguns poucos:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HIDING_MEMBER&lt;/strong&gt;: Warning produzido quando uma descendente declara uma nova propriedade com o mesmo nome que uma propriedade do ancestral.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HIDDEN_VIRTUAL&lt;/strong&gt;: Warning produzido quando um descendente declara um método, não especificado como override, e com o mesmo nome de um método virtual do ancestral.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HRESULT_COMPAT&lt;/strong&gt;: Warning sobre o uso do tipo &quot;Integer&quot; no lugar de um HRESULT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;STRING_CONST_TRUNCED&lt;/strong&gt;: Todos os warnings sobre instâncias na qual o compilador atribui um string literal ou um valor constante para um short string cujo tamanho é menor do que o suficiente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SYMBOL_DEPRECATED&lt;/strong&gt;: Habilita/desabilita todos os warnings sobre símbolos definidos como deprecated na unit corrente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SYMBOL_EXPERIMENTAL&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings sobre símbolos definidos&amp;nbsp;como experimental na unit corrente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SYMBOL_PLATFORM&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings sobre símbolos definidos como platform na unit corrente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SYMBOL_LIBRARY&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings sobre símbolos definidos&amp;nbsp;library na unit corrente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIT_DEPRECATED&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings&amp;nbsp;relacionadas a units definidas como&amp;nbsp;deprecated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIT_EXPERIMENTAL&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings&amp;nbsp;relacionadas a units definidas como&amp;nbsp;experimental.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIT_LIBRARY&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings&amp;nbsp;relacionadas a units definidas como&amp;nbsp;library.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIT_PLATFORM&lt;/strong&gt;:&amp;nbsp;Habilita/desabilita todos os warnings&amp;nbsp;relacionadas a units definidas como&amp;nbsp;platform. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZERO_NIL_COMPAT&lt;/strong&gt;: Warnings sobre instâncias na qual o compilador converte o valor 0 como sendo um nil.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GARBAGE&lt;/strong&gt;: Warnings produzidos quando há caracteres diferentes de espaços em branco após o marcador &#39;end.&#39;.&lt;/li&gt;
&lt;/ul&gt;Esses e todos os demais símbolos de&amp;nbsp;alertas pode ser conferido&amp;nbsp;na unit&amp;nbsp;&lt;strong&gt;DCCStrs.pas&lt;/strong&gt;, que faz parte da biblioteca do Delphi (provavelmente em %ProgramFiles%\...\sources\toolsapi\DCCStrs.pas).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;color: blue;&quot;&gt;Pontos importantes&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Quando uma diretiva &lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$WARNINGS}&lt;/span&gt; ou &lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$WARN}&lt;/span&gt; é utilizada para alterar o estado padrão de um determinado tipo de alerta, esse estado permanece até que seja encontrada outra diretiva de mesmo tipo modificando seu estado ou até que seja encontrado o final da unit.&lt;br /&gt;
Uma diretiva de compilação só tem efeito dentro do contexto da unit a qual é utilizada e a partir do ponto onde estão definidas dentro do arquivo. Ao ser passado o contexto para outra unit, o estado da diretiva é revertido para sua condição padrão.&lt;br /&gt;
&lt;br /&gt;
Mas se a intenção é habilitar/desabilitar um determinado warning para um projeto inteiro, como fazer?&lt;br /&gt;
Vejo duas formas de fazer isso. Uma usando um arquivo auxiliar e outra usando o IDE o Delphi para selecionar quais warnings devem ou não ser considerados.&lt;br /&gt;
A primeira solução consiste em você utilizar um arquivo contendo as opções desejadas e acrescentar uma diretiva &lt;strong&gt;{$INCLUDE filename}&lt;/strong&gt; ou &lt;strong&gt;{$I filename}&lt;/strong&gt; em todas as unit do projeto.&lt;br /&gt;
A diretiva &lt;strong&gt;{$INCLUDE}&lt;/strong&gt; tem o objetivo de copiar o conteúdo de um determinado arquivo para o ponto onde ela está definida.&lt;br /&gt;
No entanto, essa solução não faz muito sentido em ser utilizada para um caso isolado. Faz mais sentido quando se tem um arquivo central com várias defines, constantes, ... onde este é incluído (com &lt;strong&gt;{$I}&lt;/strong&gt;) em todos os arquivos do projeto.&lt;br /&gt;
Imagino que já devem ter visto em algum projeto, por exemplo, o uso de um arquivo Types.inc com todas as definições usadas. Esse é um bom ponto para aplicar esse caso.)&lt;br /&gt;
&lt;br /&gt;
A segunda forma, mais recomendada e também mais fácil é marcar/desmarcar quais warnings deverão ou não ser emitidos no próprio IDE do Delphi.&lt;br /&gt;
Para isso acesse a opção do menu Project -&amp;gt; Options e vá até a aba &quot;Hints and Warnings&quot;. &lt;br /&gt;
Bom, a partir daqui não há mais razão de detalhar os passos. O processo é bem intuitivo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDicezjx3aLKt1TtfUtia4UrjdtseAR6Q4p6uH80j7nrm87J5irk9D3pokMv6riZm1WvOdw48x_ZphPFxEqnGV_uJax_cRg9dk_qQ8QPyqqBni64YK32xh3xeKyl-ROLBM56QZXimrHqtj/s1600/Options.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDicezjx3aLKt1TtfUtia4UrjdtseAR6Q4p6uH80j7nrm87J5irk9D3pokMv6riZm1WvOdw48x_ZphPFxEqnGV_uJax_cRg9dk_qQ8QPyqqBni64YK32xh3xeKyl-ROLBM56QZXimrHqtj/s320/Options.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Caso queira conhecer um pouco mais sobre os tipos de mensagens de erros e warnings tratados pelo Delphi, acesse o link &lt;a href=&quot;http://docwiki.embarcadero.com/RADStudio/en/Error_and_Warning_Messages_(Delphi)_Index&quot;&gt;http://docwiki.embarcadero.com/RADStudio/en/Error_and_Warning_Messages_(Delphi)_Index&lt;/a&gt;.&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;strong&gt;Estados dos Alertas&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Aqui está outro ponto muito importante e que nem sempre é mencionado.&lt;br /&gt;
O warning não possui somente dois estados (ON e OFF), mas sim três. Exatamente!&lt;br /&gt;
O terceiro estado é &lt;span style=&quot;color: red;&quot;&gt;ERROR&lt;/span&gt; que instrui o compilador a tratar o warning como sendo um erro, ou seja, aumenta o nível de atenção daquele tipo de alerta.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$WARN SYMBOL_EXPERIMENTAL OFF}&lt;br /&gt;
{$WARN SYMBOL_EXPERIMENTAL ON}&lt;br /&gt;
{$WARN SYMBOL_EXPERIMENTAL &lt;span style=&quot;color: red;&quot;&gt;ERROR&lt;/span&gt;}&lt;/div&gt;&lt;br /&gt;
Essa opção pode ser bastante útil quando, por exemplo, há muitas ocorrências de warning no projeto e você quer dar atenção para um tipo específico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;$MESSAGES&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O Delphi possui a diretiva de compilação &lt;strong&gt;$Message&lt;/strong&gt; que nos permite instrumentar o código fonte de forma a salientar pontos importantes que devem ser observados quando o código for compilado.&lt;br /&gt;
Essa diretiva trabalha diretamente com o compilador o qual irá emitir o texto definido no corpo da definição tratando-a conforme seu nível atenção.&lt;br /&gt;
&lt;br /&gt;
A sintaxe é a seguinte:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$MESSAGE HINT|WARN|ERROR|FATAL &#39;Textstring&#39;}&lt;/div&gt;&lt;br /&gt;
onde &lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;HINT|WARN|ERROR|FATAL&lt;/span&gt; é o nível de atenção/importância da mensagem e &lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&#39;Textstring&#39;&lt;/span&gt; é a mensagem que deve ser emitida pelo compilador.&lt;br /&gt;
&lt;br /&gt;
O level da mensagem é opcional e, se não especificado, será assumido o valor padrão, ou seja, HINT. Já a sequência do testo é obrigatória e deve utilizar a sintaxe da string, ou seja, delimitada por aspas simples.&lt;br /&gt;
Destaco a importância de conhecer o significado que cada tipo de mensagem possui porque o compilador irá tratar essas mensagens da mesma forma como trata os alertas nativos.&lt;br /&gt;
&lt;br /&gt;
HINT: Notificações quase sempre informativas e não incorrem risco&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$Message &#39;Essa mensagem é do tipo HINT&#39;}&lt;br /&gt;
{$Message &lt;span style=&quot;color: red;&quot;&gt;Hint&lt;/span&gt; &#39;Essa mensagem também é do tipo HINT&#39;}&lt;/div&gt;&lt;br /&gt;
WARN: Notificação de alerta para um real ou potencial risco&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$Message &lt;span style=&quot;color: red;&quot;&gt;Warn&lt;/span&gt; &#39;Essa mensagem é do tipo WARNING&#39;}&lt;/div&gt;&lt;br /&gt;
Error: Falha de sintaxe ou semântica&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$Message &lt;span style=&quot;color: red;&quot;&gt;Error&lt;/span&gt; &#39;Essa mensagem é do tipo ERROR&#39;}&lt;/div&gt;&lt;br /&gt;
Fatal: Interrompe a compilação imediatamente&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$Message &lt;span style=&quot;color: red;&quot;&gt;Fatal&lt;/span&gt; &#39;Essa mensagem é do tipo FATAL&#39;}&lt;/div&gt;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;$HINTS&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Esse artigo tem explorado mais o lado técnico dos Warnings e Hints no Delphi do que propriamente sua utilização.&lt;br /&gt;
Esse é uma outra abordagem com ampla gama para exploração. Penso que poderia ser redigido um artigo enorme falando só das diversas formas de empregar, e de forma adequada, esse recurso que não é uma exclusividade do Delphi, muito pelo contrário.&lt;br /&gt;
Mas por enquanto iremos concluir esse texto com mais algumas notas sobre a diretiva {$HINT}.&lt;br /&gt;
&lt;br /&gt;
O Delphi permite que a emissão de mensagens que são do tipo HINT possa ser habilita ou desabilitada através de:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$HINTS ON}&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #666666;&quot;&gt;// Trecho de código&lt;/span&gt;&lt;br /&gt;
{$HINTS OFF} &lt;/div&gt;&lt;br /&gt;
Vamos utilizar um exemplo simples.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;b&gt;procedure &lt;/b&gt;Teste;&lt;br /&gt;
&lt;b&gt;var&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;a, b: Integer;&lt;br /&gt;
&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;{$HINTS ON}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;a := 1;&lt;br /&gt;
&lt;b&gt;end&lt;/b&gt;;&lt;/div&gt;&lt;br /&gt;
Ao compilar, será apresentado duas mensagens do tipo hint.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;[DCC Hint] uTest.pas(13): H2077 Value assigned to &#39;a&#39; never used&lt;br /&gt;
[DCC Hint] uTest.pas(11): H2164 Variable &#39;b&#39; is declared but never used in &#39;Teste&#39;&lt;/div&gt;&lt;br /&gt;
Agora experimente substituir a linha onde aparece &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$HINTS ON}&lt;/span&gt; por &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$HINTS OFF}&lt;/span&gt; e recompile o código. Irá observar que ambas as mensagens não serão mais apresentadas.&lt;br /&gt;
Aqui a regra é a mesma. A diretiva é relevante apenas no contexto da unit e para as linhas abaixo.&lt;br /&gt;
&lt;br /&gt;
Até a próxima.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/25697734411928595/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/25697734411928595?isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/25697734411928595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/25697734411928595'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/07/diretivas-de-compilacao-warnings-hints.html' title='Diretivas de Compilação - WARNINGS, HINTS e MESSAGES'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDicezjx3aLKt1TtfUtia4UrjdtseAR6Q4p6uH80j7nrm87J5irk9D3pokMv6riZm1WvOdw48x_ZphPFxEqnGV_uJax_cRg9dk_qQ8QPyqqBni64YK32xh3xeKyl-ROLBM56QZXimrHqtj/s72-c/Options.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-4675423554107822411</id><published>2010-07-12T22:37:00.000-03:00</published><updated>2011-10-13T08:55:24.145-03:00</updated><title type='text'>Ranking de popularidade das linguagens de programação</title><content type='html'>Um assunto que frenquentemente faz parte das discussões dos grupos de desenvolvedores é o quanto uma determinada linguagem de programação está diceminada no mercado em um dado momento.&lt;br /&gt;
Muitas vezes embasadas em opiniões próprias ou simplesmente por questão de afinidade, a conversa tende a abordar&amp;nbsp;o universo restrito ao grupo.&lt;br /&gt;
Mas você sabe realmente qual a porcentagem de adoção da linguaguem de programação que você utiliza?&lt;br /&gt;
Se você fosse investir seu tempo para aprender uma linguagem, mas gostaria que a escolha fosse consciente, por onde começar?&lt;br /&gt;
&lt;br /&gt;
A tabela abaixo foi extraída na data de hoje (12-Julho-2010) do site &lt;a href=&quot;http://www.tiobe.com/&quot;&gt;TIOBE&lt;/a&gt;,&amp;nbsp;que eu considero um ótimo referencial no assunto.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; border=&quot;1&quot; bordercolordark=&quot;#003366&quot; bordercolorlight=&quot;#c0c0c0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;     &lt;th&gt;Position&lt;br /&gt;
Jul 2010&lt;/th&gt;     &lt;th&gt;Position&lt;br /&gt;
Jul 2009&lt;/th&gt;     &lt;th&gt;Delta in Position&lt;/th&gt;     &lt;th&gt;Programming&lt;br /&gt;
Language&lt;/th&gt;     &lt;th&gt;Ratings&lt;br /&gt;
Jul 2010&lt;/th&gt;     &lt;th&gt;Delta&lt;bt&gt;Jul 2009&lt;/bt&gt;&lt;/th&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/Java.html&quot;&gt;Java&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;18.673%&lt;/td&gt;&lt;td&gt;-1.78%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/C.html&quot;&gt;C&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;18.480%&lt;/td&gt;&lt;td&gt;+1.16%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/C__.html&quot;&gt;C++&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;10.469%&lt;/td&gt;&lt;td&gt;+0.05%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/PHP.html&quot;&gt;PHP&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;8.566%&lt;/td&gt;&lt;td&gt;-0.70%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;5&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/C_.html&quot;&gt;C#&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;5.730%&lt;/td&gt;&lt;td&gt;+1.19%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;6&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/(Visual)_Basic.html&quot;&gt;(Visual) Basic&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;5.516%&lt;/td&gt;&lt;td&gt;-2.27%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/Python.html&quot;&gt;Python&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;4.217%&lt;/td&gt;&lt;td&gt;-0.22%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/Perl.html&quot;&gt;Perl&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;3.099%&lt;/td&gt;&lt;td&gt;-1.10%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;9&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/Objective-C.html&quot;&gt;Objective-C&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;2.498%&lt;/td&gt;&lt;td&gt;+1.99%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;10&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/JavaScript.html&quot;&gt;JavaScript&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;2.432%&lt;/td&gt;&lt;td&gt;-1.08%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;11&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/Delphi.html&quot;&gt;Delphi&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;2.323%&lt;/td&gt;&lt;td&gt;+0.33%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td&gt;12&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;    &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/Ruby.html&quot;&gt;Ruby&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;1.982%&lt;/td&gt;&lt;td&gt;-0.59%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;13&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/content/paperinfo/tpci/PL_SQL.html&quot;&gt;PL/SQL&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.772%&lt;/td&gt;&lt;td&gt;-0.12%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;14&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/SAS.html&quot;&gt;SAS&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.701%&lt;/td&gt;&lt;td&gt;-0.09%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;15&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/Pascal.html&quot;&gt;Pascal&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.639%&lt;/td&gt;&lt;td&gt;-0.07%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td&gt;16&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;    &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/Lisp_Scheme_Clojure.html&quot;&gt;Lisp/Scheme/Clojure&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.622%&lt;/td&gt;&lt;td&gt;+0.01%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;17&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/MATLAB.html&quot;&gt;MATLAB&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.581%&lt;/td&gt;&lt;td&gt;+0.07%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;18&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Down.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/ABAP.html&quot;&gt;ABAP&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.548%&lt;/td&gt;&lt;td&gt;-0.15%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;19&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Same.gif&quot; /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/Lua.html&quot;&gt;Lua&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.535%&lt;/td&gt;&lt;td&gt;+0.00%&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;     &lt;td&gt;20&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;     &lt;td&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.tiobe.com/tiobe_index/images/Up.gif&quot; /&gt; &lt;/td&gt;     &lt;td&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/paperinfo/tpci/PowerShell.html&quot;&gt;PowerShell&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;0.493%&lt;/td&gt;&lt;td&gt;+0.17%&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Essa tabela é apenas uma das várias tabelas e gráficos estatísticos que são disponibilizados no site &lt;a href=&quot;http://www.tiobe.com/&quot;&gt;TIOBE&lt;/a&gt;.&lt;br /&gt;
Além do ranking atual é possível obter um histórico de longo prazo de cada uma das linguagens de programações apresentada na tabela das 20 primeiras posições, bastando clicar sobre o link em seus nomes (coluna &quot;&lt;strong&gt;Programming Language&lt;/strong&gt;&quot;).&lt;br /&gt;
&lt;br /&gt;
Vamos aproveitar e ver o histórico dos últimos 8 anos com relação ao Delphi.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasyRNmXg48t493J-bTRKPXj4MNCYd4F5VzXqhyDVdZARFhOqskjgfQ5X7qdTYjIOFIGgJqWVQFBTv4Fy4DTNQt5RuNcEFFo6pVg2JLAb_a_OSH6qfbuQlW8H8neraN14HOzYD15pNBCg9/s1600/history_Delphi.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; rw=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasyRNmXg48t493J-bTRKPXj4MNCYd4F5VzXqhyDVdZARFhOqskjgfQ5X7qdTYjIOFIGgJqWVQFBTv4Fy4DTNQt5RuNcEFFo6pVg2JLAb_a_OSH6qfbuQlW8H8neraN14HOzYD15pNBCg9/s400/history_Delphi.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Para quem é desenvolvedor Delphi a alguns anos certamente irá saber qual a versão que vez tanto sucesso para proporcionar aquele pico, em 2004. Se não sabe, acessa a página da &lt;a href=&quot;http://en.wikipedia.org/wiki/Embarcadero_Delphi&quot;&gt;wikipedia&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Além do&amp;nbsp;TIOBE,&amp;nbsp;&lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;, há outros sites onde também é possível conferir quais as linguagens de programação mais cultuadas.&lt;br /&gt;
Aqui destaco o LangPop.com (&lt;a href=&quot;http://www.langpop.com/&quot;&gt;http://www.langpop.com/&lt;/a&gt;) que utiliza as informações de pesquisa realizadas em sites como Google, Yahoo, Google Code e vários outros, para montar os quadros de ranking das linguagens de programação mais &lt;i&gt;procuradas&lt;/i&gt;.&lt;br /&gt;
Dependendo do local onde as informações foram coletadas, o ranking fica sensivelmente diferente. Nesse site você encontra também uma tabela que é o resultado normalizado de todas as outras (com valores bem menos tendenciosos).&lt;br /&gt;
&lt;br /&gt;
Até a próxima.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/4675423554107822411/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/4675423554107822411?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4675423554107822411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4675423554107822411'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/07/ranking-de-popularidade-das-linguagens.html' title='Ranking de popularidade das linguagens de programação'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasyRNmXg48t493J-bTRKPXj4MNCYd4F5VzXqhyDVdZARFhOqskjgfQ5X7qdTYjIOFIGgJqWVQFBTv4Fy4DTNQt5RuNcEFFo6pVg2JLAb_a_OSH6qfbuQlW8H8neraN14HOzYD15pNBCg9/s72-c/history_Delphi.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-6559595698721293874</id><published>2010-07-11T23:21:00.000-03:00</published><updated>2010-07-11T23:21:28.187-03:00</updated><title type='text'>Segredos do ForEach</title><content type='html'>Você sabe como funciona e como utilizar o &lt;i&gt;ForEach &lt;/i&gt;no Delphi?&lt;br /&gt;
O suporte ao ForEach foi adicionado no Delphi 2005 e tem como finalidade oferecer uma interface de acesso aos itens das coleções (listas, filhas, filhas, array, conjuntos, vetores, ...) de forma simplificada e sem se preocupar com contadores ou com índices.&lt;br /&gt;
&lt;br /&gt;
A sintaxe do ForEach é:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;b&gt;for &lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;item &lt;/span&gt;&lt;b&gt;in &lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;collection &lt;/span&gt;&lt;b&gt;do&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// &lt;br /&gt;
&lt;b&gt;end&lt;/b&gt;;&lt;/div&gt;&lt;br /&gt;
Note que na sitaxe do comando aparece a palavara reservada &quot;&lt;b&gt;in&lt;/b&gt;&quot;, o que reforça a idéia de um laço de repetição destinado a trabalhar com conjuntos/coleções, e é exatamente essa idéia que se deve manter em mente ao utilizar esse recurso em seu código fonte.&lt;br /&gt;
Dependendo do tipo de coleção que se está trabalhando, o comando terá uma característica específica, mas sempre mantendo a finalidade original.&lt;br /&gt;
&lt;br /&gt;
Vamos ver alguns exemplos de uso.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;1. Uso em conjuntos&lt;/span&gt;&lt;br /&gt;
Esse é um dos usos mais&amp;nbsp;freqüentemente&amp;nbsp;encontrado nos códigos fontes e que particularmente encorajo sua adoção e emprego.&lt;br /&gt;
Para quem não está muito familiarizado com o uso de &lt;i&gt;conjuntos&lt;/i&gt;, o exemplo abaixo pode parecer&amp;nbsp;estranho, num primeiro momento, mas numa segunda olhada verá que é muito intuitivo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;type&lt;br /&gt;
&amp;nbsp; TWeekDay = (wdDomingo, wdSegunda, wdTerca, wdQuarta, wdQuinta, wdSexta, wdSabado);&lt;br /&gt;
&amp;nbsp; TWeek = set of TWeekDay;&lt;br /&gt;
const&lt;br /&gt;
&amp;nbsp; STRWEEKDAY: array[TWeekDay] of string =&lt;br /&gt;
&amp;nbsp; (&#39;Dom&#39;, &#39;Seg&#39;, &#39;Ter&#39;, &#39;Qua&#39;, &#39;Qui&#39;, &#39;Sex&#39;, &#39;Sab&#39;);&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp; lDay: TWeekDay;&lt;br /&gt;
&amp;nbsp; lWorkDays: TWeek;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; lWorkDays := [wdSegunda, wdQuarta, wdSexta];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;for lDay in lWorkDays do&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ShowMessage(STRWEEKDAY[lDay]);&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
O exemplo acima define o conjunto TWeek baseado nos dias da semana (TWeekDay) e usa essa definição para declarar a variável local lWorkDays.&lt;br /&gt;
Na primeira linha do bloco, nosso conjunto&amp;nbsp;lWorkDays recebe a atribuição de três elementos, ou melhor, de três dias da semana e é utilizada no ForEach abaixo.&lt;br /&gt;
Como a coleção aqui é um &lt;i&gt;conjunto&lt;/i&gt;, o laço de repetição do comando &lt;i&gt;for&lt;/i&gt; ir percorrer todas as possíveis entradas do conjunto, mas somente executará as instruções do bloco quando a respectiva entrada realmente está presente no conjunto. Assim, no nosso exemplo, a função ShowMessage será chamada três vezes.&lt;br /&gt;
Reforço a vantagem do uso do ForEach com conjuntos porque além de intuitivo o código binário gerado é limpo, rápido e não consome recursos como o quando é utilizado com objetos.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;2. Uso com strings&lt;/span&gt;&lt;br /&gt;
A utilização do ForEach com strings é um exemplo clássico do passado, mas que ao meu ver tem mais pontos negativos do que positivos.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;const&lt;br /&gt;
&amp;nbsp; S: string = &#39;Using ForEach with strings&#39;;&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp; lChar: Char;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;for lChar in S do&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if lChar in [&#39;a&#39;,&#39;e&#39;,&#39;i&#39;,&#39;o&#39;,&#39;u&#39;] then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; begin &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Como dito anteriormente, o comando terá uma particularidade que depende do tipo de coleção utilizada, mas sempre centrado na idéia de acessar os elementos da coleção.&lt;br /&gt;
No exemplo acima nossa coleção abrange todo o espectro do tipo &lt;i&gt;Char&lt;/i&gt;, nativo do Delphi, e o laço de repetição executará tantas vezes quanto for o número de caracteres da string.&lt;br /&gt;
Em outras palavras o comando &lt;i&gt;for&lt;/i&gt;&amp;nbsp;irá percorrer toda a string, atribuindo para a variável local &lt;i&gt;lChar&lt;/i&gt;&amp;nbsp;o valor de cada caracter.&lt;br /&gt;
Eu desencorajo a adoção dessa prática como alternativa para percorrer strings porque o código binário gerado é, do ponto de vista de micro-otimizações, bastante oneroso por requerer a manipulação do tipo string.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;3. Uso com arrays estáticos&lt;/span&gt;&lt;br /&gt;
Também podemos utilizar o laço de repetição para percorrermos arrays de forma muito semelhante ao exemplo acima.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;type&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TMonthDays = array[1..31] of Boolean;&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays: TMonthDays;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lDay: Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lCounter: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;FillMemory(@lWorkedDays, SizeOf(lWorkedDays), 0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[1] := True;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[2] := True;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[5] := True;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lCounter := 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;for lDay in lWorkedDays do&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if lDay then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Inc(lCounter);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ShowMessage(&#39;Sum: &#39; + IntToStr(lCounter));&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Observe que nesse nosso exemplo o índice do array não é utilizado, mas apenas o valor de cada entrada.&lt;br /&gt;
Aqui temos uma situação que merece um certo destaque por permitir ao código fonte um incremento na clareza e&amp;nbsp;legibilidade, evitando a declaração de variáveis locais e especificando explicitamente os limites do array.&lt;br /&gt;
Se considerarmos uma abordagem mais clássica usando o laço &lt;em&gt;for&lt;/em&gt; comum como, por exemplo:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; // ...&lt;br /&gt;
&amp;nbsp; for i = 1 to 31 do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;/div&gt;corremos o risco de introduzir um bug no sistema caso&amp;nbsp;os limites&amp;nbsp;do array seja moificado.&lt;br /&gt;
Obviamente podemos evitar esse tipo de bug removendo os &lt;em&gt;hard codes,&lt;/em&gt;&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;nbsp; for i =&amp;nbsp;Low(TMonthDays) to&amp;nbsp;High(TMonthDays) do&lt;/div&gt;mas ainda assim dependeríamos do uso de uma variável como contador do laço de repetição.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;4. Uso com arrays dinâmicos&lt;/span&gt;&lt;br /&gt;
Essa é uma situação levemente diferente do exemplo acima onde, em vez de termos um array com limites bem definidos, temos um array dinâmico&amp;nbsp;cujo tamanho&amp;nbsp;pode variar inclusive durante a execução do ForEach.&lt;br /&gt;
Aqui novamente estamos considerando que saber&amp;nbsp;o índice&amp;nbsp;atual do laço de repetição não é requerido, mas somente o valor de cada&amp;nbsp;entrada do array.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays: array of Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lDay: Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lCounter: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;SetLength(lWorkedDays, 31);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[0] := True;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[1] := True;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lWorkedDays[4] := True;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lCounter := 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;for lDay in lWorkedDays do&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if lDay then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Inc(lCounter);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ShowMessage(&#39;Sum: &#39; + IntToStr(lCounter));&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Uma particularidade do array dinâmico é que a primeira entrada tem índice zero (0).&lt;br /&gt;
Utilizando o ForEach para percorrer o array, seja estático ou dinâmico, o limite inicial e final é tratado de forma transparente pelo compilador.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;5. Usando com objetos&lt;/span&gt;&lt;br /&gt;
Esse é o último caso de uso do ForEach apresentado nesse artigo e o que merece mais atenção.&lt;br /&gt;
Como os tipos nativos (conjuntos, strings e arrays) o Delphi tem total conhecimento de como devem ser manipulados. Já quando a coleção é uma objeto, essa premissa não é verdadeira e, nesse caso, é você quem deve instruir o Delphi a acessar os itens do objeto de forma adequada.&lt;br /&gt;
&lt;br /&gt;
Observe o exemplo abaixo.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; lFiles: TStrings;&lt;br /&gt;
&amp;nbsp; lFilename: string;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; // ...&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;for lFilename in lFiles do&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
end; &lt;/div&gt;&lt;br /&gt;
No código acima&amp;nbsp;a variável &lt;em&gt;lFiles&lt;/em&gt; está sendo usada para armazenar uma lista de nomes de arquivos que serão tratados, e o laço de repetição irá acessar cada item dessa lista e repassar à variável local &lt;em&gt;lFilename&lt;/em&gt; o valor do item (nesse caso, a string com o nome do arquivo).&lt;br /&gt;
O mesmo caso é válido para outras classes nativas do Delphi como por exemplo&amp;nbsp;TTreeNode, TActionList, &amp;nbsp;...&lt;br /&gt;
Bom aí vem a pergunta. Como o Delphi sabe qual é a lista&amp;nbsp;de elementos da minha coleção quando se trata de um objeto?&lt;br /&gt;
Se você for na definição da classe TStrings encontrará um método com o nome &quot;GetEnumerator&quot; cujo retorno é um objeto do tipo TStringsEnumerator. E é exatamente esse método que será usado pelo ForEach para acessar os elementos da lista.&lt;br /&gt;
&lt;br /&gt;
Para ser mais específico, um pré-requisito para usar o ForEach com objetos (instâncias de classes) é justamente a existência e implementação do método GetEnumerator pela classe do objeto.&lt;br /&gt;
Se você tentar usar um objeto qualquer o próprio compilador irá notificar sobre esse requisito, apresentando uma mensagem semelhante:&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;[DCC Error] Unit1.pas(145): E2431 for-in statement cannot operate on collection type &#39;TMyList&#39; because &#39;TMyList&#39; does not contain a member for &#39;GetEnumerator&#39;, or it is inaccessible&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Além disso, o método GetEnumerator não pode retornar qualquer valor, ele deverá retornar uma instância cuja classe possua dois métodos específicos (&lt;i&gt;GetCurrent &lt;/i&gt;e &lt;i&gt;MoveNext&lt;/i&gt;) que serão utilizados para instruir o ForEach a percorrer os itens do objeto.&lt;br /&gt;
O método &lt;i&gt;GetCurrent &lt;/i&gt;será utilizado para retornar o valor do atual elemento da lista e o método &lt;i&gt;MoveNext &lt;/i&gt;irá&amp;nbsp;posicionar&amp;nbsp;o cursor no próximo item ou retornando False quando não há mais elementos na lista.&lt;br /&gt;
&lt;br /&gt;
Vamos criar um exemplo simples para&amp;nbsp;ilustrar&amp;nbsp;como isso é feito.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;TMyList = class;&lt;br /&gt;
&lt;br /&gt;
TMyListEnumerator = class&lt;br /&gt;
private&lt;br /&gt;
&amp;nbsp; FIndex: Integer;&lt;br /&gt;
&amp;nbsp; FMyItems: TMyList;&lt;br /&gt;
public&lt;br /&gt;
&amp;nbsp; constructor Create(ARef: TMyList);&lt;br /&gt;
&amp;nbsp; function GetCurrent: Integer; inline;&lt;br /&gt;
&amp;nbsp; function MoveNext: Boolean;&lt;br /&gt;
&amp;nbsp; property Current: Integer read GetCurrent;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
A classe TMyListEnumerator será a responsável por acessar a lista de valores de TMyList.&lt;br /&gt;
O layout acima é exatamente o que você precisa implementar para todas as classes a qual deseja dar suporte ao ForEach, modificando apenas o tipo de retorno de acordo com o tipo de item das classes. Por exemplo, se coleção mantém uma lista de valores de ponto flutuante, substitua a o tipo &quot;Integer&quot; (no layout acima) por &quot;float&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;TMyList = class&lt;br /&gt;
&amp;nbsp; protected&lt;br /&gt;
&amp;nbsp; &amp;nbsp; FName: string;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; FItems: array of Integer;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; public&lt;br /&gt;
&amp;nbsp; &amp;nbsp; destructor Destroy; override;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; function Add(const Value: Integer): Integer;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; function GetEnumerator: TMyListEnumerator;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
A classe TMyList é nossa coleção a qual mantém um array de valores inteiros (propriedade &lt;i&gt;FItems&lt;/i&gt;).&lt;br /&gt;
Agora observe a implementação dos métodos da coleção. Nada de diferente a não ser pelo método &lt;i&gt;GetEnumerator&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;destructor TMyList.Destroy;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;SetLength(FItems, 0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;inherited;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyList.Add(const Value: Integer): Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := Length(FItems);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;SetLength(FItems, Result + 1);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;FItems[Result] := Value;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyList.GetEnumerator: TMyListEnumerator;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := TMyListEnumerator.Create(Self);&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
A implementação da nosso classe de enumeração não tem nada de complexo ou diferente, e o próprio código é auto explicativo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;constructor TMyListEnumerator.Create(ARef: TMyList);&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;inherited Create;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;FIndex := -1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;FMyItems := ARef;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyListEnumerator.GetCurrent: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := FMyItems.FItems[FIndex];&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyListEnumerator.MoveNext: Boolean;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := FIndex &amp;lt; (Length(FMyItems.FItems) - 1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if Result then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Inc(FIndex);&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Caso tenha tido algum tipo de dificuldade, faça o download do projeto de&amp;nbsp;exemplo&amp;nbsp;(link &lt;a href=&quot;http://rapidshare.com/files/406448596/ForEach.7z&quot;&gt;http://rapidshare.com/files/406448596/ForEach.7z&lt;/a&gt;) que contém todo o código fonte utilizado nesse artigo.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/6559595698721293874/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/6559595698721293874?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/6559595698721293874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/6559595698721293874'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/07/segredos-do-foreach.html' title='Segredos do ForEach'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5757727779392978670</id><published>2010-06-28T01:08:00.000-03:00</published><updated>2010-06-28T01:08:15.550-03:00</updated><title type='text'>Atribuindo nomes às threads</title><content type='html'>Para quem trabalha com programação multi-thread sabe que a depuração do código é um tarefa bem complicada.&lt;br /&gt;
Percorrer o caminho inverso do fluxo de execução de uma tarefa que é intercalada por threads requer tempo de &amp;nbsp;habilidade.&lt;br /&gt;
O Delphi 2010 trás uma novidade interessante que promete ajudar nessa árdua tarefa, agora é possível &lt;i&gt;nomear&lt;/i&gt;&amp;nbsp;as threads.&lt;br /&gt;
Observe a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqRNoZlwqpf4cyfWNdRmVqpXgZqF73ao7J7ykrqqaMaE4cwrxS426Q5b3fAl-f9wvPAzdPa0CgVPw-teSMt_YpMCikoqr-TO0hXvJKYMHQalsuK4bNlWhq6zwGeYmSV5_-RzmuO70nvtSr/s1600/Threads.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;340&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqRNoZlwqpf4cyfWNdRmVqpXgZqF73ao7J7ykrqqaMaE4cwrxS426Q5b3fAl-f9wvPAzdPa0CgVPw-teSMt_YpMCikoqr-TO0hXvJKYMHQalsuK4bNlWhq6zwGeYmSV5_-RzmuO70nvtSr/s640/Threads.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
No Delphi 2010 foi introduzido o método&amp;nbsp;&lt;strong class=&quot;selflink&quot;&gt;NameThreadForDebugging&amp;nbsp;&lt;/strong&gt;na classe TThread e é utilizado tanto para nomear quanto para renomear uma thread específica.&lt;br /&gt;
Sua assinatura trás dois parâmetros:&amp;nbsp;AThreadName e AThreadID.&lt;br /&gt;
O primeiro é o nome que será dado à thread e o segundo parâmetro é o ID da thread a ser nomeada. No caso do segundo parâmetro ser omitido, ou ser -1, a operação será realizada sob a corrente thread que está rodando.&lt;br /&gt;
Outro detalhe é que o nome atribuído é do tipo AnsiString, ou seja, pode ser necessário um typecast explícito.&lt;br /&gt;
&lt;br /&gt;
Vamos ver na prática como o recurso é aplicado.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;procedure TMyThread.Execute;&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadName: AnsiString;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #b6d7a8;&quot;&gt;{$IFDEF VER210}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadName := AnsiString(Self.ClassName + &#39;_&#39; + IntToStr(FCount));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;NameThreadForDebugging&lt;/b&gt;(lThreadName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #b6d7a8;&quot;&gt;{$ENDIF}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;while not Terminated do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Sleep(300);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Não se esqueça que esse método só está disponível no Delphi 2010 e, provavelmente, nas versões superiores. No caso do código fonte ser utilizado em versões anteriores, use utilize a diretiva de compilação&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{$IFDEF VER210}&lt;/span&gt; para evitar erro de compilação/compatibilidade.&lt;br /&gt;
&lt;br /&gt;
Apesar desse recurso ser introduzido somente na versão 2010, existe um método que pode ser aplicado para as versões anteriores.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;{$IFDEF MSWINDOWS}&lt;br /&gt;
&lt;br /&gt;
procedure SetDebbugerThreadName(const AThreadName: AnsiString; const AThreadID: LongWord = $FFFFFFFF);&lt;br /&gt;
type&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TThreadNameInfo = record&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;FType: &amp;nbsp; &amp;nbsp; LongWord; &amp;nbsp;// Deve ser sempre 0x1000&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;FName: &amp;nbsp; &amp;nbsp; PAnsiChar; // Ponteiro para o nome da thread&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;FThreadID: LongWord; &amp;nbsp;// Thread ID (-1 indica a corrente thread)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;FFlags: &amp;nbsp; &amp;nbsp;LongWord; &amp;nbsp;// Não utilizado, deve ser zero.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadInfo: TThreadNameInfo;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadInfo.FType &amp;nbsp; &amp;nbsp; := $1000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadInfo.FName &amp;nbsp; &amp;nbsp; := PAnsiChar(AThreadName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadInfo.FThreadID := AThreadID;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lThreadInfo.FFlags &amp;nbsp; &amp;nbsp;:= 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;try&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;RaiseException($406D1388, 0, SizeOf(lThreadInfo) div SizeOf(LongWord), @lThreadInfo);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;except&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
{$ENDIF}&lt;/div&gt;&lt;br /&gt;
O uso dessa função tem exatamente o mesmo efeito que o método&amp;nbsp;&lt;strong class=&quot;selflink&quot;&gt;NameThreadForDebugging&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Um exemplo completo utilizando ambas formas pode ser baixada &lt;a href=&quot;http://rapidshare.com/files/403426223/Threads.7z.html&quot;&gt;aqui&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5757727779392978670/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5757727779392978670?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5757727779392978670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5757727779392978670'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/06/atribuindo-nomes-as-threads.html' title='Atribuindo nomes às threads'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqRNoZlwqpf4cyfWNdRmVqpXgZqF73ao7J7ykrqqaMaE4cwrxS426Q5b3fAl-f9wvPAzdPa0CgVPw-teSMt_YpMCikoqr-TO0hXvJKYMHQalsuK4bNlWhq6zwGeYmSV5_-RzmuO70nvtSr/s72-c/Threads.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-1235104601375276690</id><published>2010-06-08T01:59:00.000-03:00</published><updated>2010-06-08T01:59:32.580-03:00</updated><title type='text'>Customizando o Help Insight no Delphi</title><content type='html'>Recentemente li um artigo sobre &lt;strong&gt;Help Insight&lt;/strong&gt; que chamou bastante minha atenção.&lt;br /&gt;
Acredito que todos saibam o que é ou já tiveram contato com essa funcionalidade, mas para aqueles que não estão acostumado com o nome &lt;em&gt;Help Insight&lt;/em&gt;, esse é um recurso do IDE do Delphi que apresenta um popup com uma breve descrição sobre o identificador (classe, método, função, variável, ...) na qual o cursor do mouse está posicionado.&lt;br /&gt;
Também é possível invocar o Help Insight através do&amp;nbsp;pressionamento&amp;nbsp;das teclas&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;CTRL + SHIFT + H&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;
Por padrão é apresentado nesse popup menu as seguintes informações:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Nome do identificador&lt;/li&gt;
&lt;li&gt;Categoria do identificador (Campo, variável, método, classe, propriedade, ...)&lt;/li&gt;
&lt;li&gt;Localização (nome da unit seguido pelo número da linha e da coluna)&lt;/li&gt;
&lt;li&gt;Tipo (Se o identificador é string, integer, ...)&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg8voJGwKap6dk8Y1v64Zd1amS5yD6IyMkxaDROVzFAbeIR17H8GmvJSImAtOXw_aKgW4hc754n-7C5eZBixCiiXK_7edAhyu5zN62wemR9xhgQoEnGPTOGEusHBI29-rCLCfskOZpplLT/s1600/HIForm.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg8voJGwKap6dk8Y1v64Zd1amS5yD6IyMkxaDROVzFAbeIR17H8GmvJSImAtOXw_aKgW4hc754n-7C5eZBixCiiXK_7edAhyu5zN62wemR9xhgQoEnGPTOGEusHBI29-rCLCfskOZpplLT/s320/HIForm.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
No caso do identificador ser um método, function ou procedure, a descrição é extendida apresentando também o(s) parâmetro(s) e o valor de retorno.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUjpZxV8ocvwgLq-aPegjAOecC9UJrg83MqB6WSSyav6fHl6LT3SmxaBEGwWBACMyxKi9f991uR3dbNRmIxLCzJKncA_TQawObCB5ZDhp84KkihNHrF3lTJT4rKxMW285KKRqrK2LYWxBr/s1600/HI_Method.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;137&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUjpZxV8ocvwgLq-aPegjAOecC9UJrg83MqB6WSSyav6fHl6LT3SmxaBEGwWBACMyxKi9f991uR3dbNRmIxLCzJKncA_TQawObCB5ZDhp84KkihNHrF3lTJT4rKxMW285KKRqrK2LYWxBr/s400/HI_Method.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Isso tudo é feito automaticamente pelo IDE em tempo de edição, ou seja, nem necessitar que o código seja compilado.&lt;br /&gt;
O que eu não sabia, e é o objetivo desse artigo, é que o conteúdo do popup menu pode ser customizado exibindo informações mais detalhadas a respeito do identificador em questão.&lt;br /&gt;
Essa customização deve estar situada imediatamente acima do identificador a qual se deseja trabalhar e tem seu início demarcado através de um comentário &lt;em&gt;coringa&lt;/em&gt; (///, três barras) seguido por uma tag XML reconhecida pelo Help Insight viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;As tags XML atualmente reconhecida são:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;summary&lt;/li&gt;
&lt;li&gt;param&lt;/li&gt;
&lt;li&gt;returns&lt;/li&gt;
&lt;li&gt;permission&lt;/li&gt;
&lt;li&gt;remarks&lt;/li&gt;
&lt;li&gt;comments&lt;/li&gt;
&lt;/ul&gt;Agora vamos ver um exemplo prático contendo todas essas tags.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;/// &amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Verificar se um determinado componente/field teve ou não seu conteúdo&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; alterado. O método é utilizado dentro do framework para sinalizar os&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; componentes que foram modificados durante uma operação de update.&amp;lt;/summary&amp;gt;&lt;br /&gt;
/// &amp;lt;param name=&quot;FieldComp&quot;&amp;gt; Registro contendo informações sobre o field/componente. &amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param name=&quot;Index&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Índice do registro dentro da lista (&amp;lt;c&amp;gt;FFieldList&amp;lt;/c&amp;gt;). &amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;param name=&quot;Modified&quot;&amp;gt;&amp;nbsp; Parâmetro de saída que deve ser setado para True/False, dependendo&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; do status verificado pelo método. Por padrão, o parâmetro vem&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; com o valor True. &amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;returns&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; O valor retornado deve significar que o método obteve sucesso ao comparar o&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; valor original com o valor atual do componente/field, ou seja, que o valor&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; do parâmetro Modified é válido.&amp;lt;/returns&amp;gt;&lt;br /&gt;
/// &amp;lt;permission&amp;gt; Esse método é utilizado internamente apenas quando o formulário está em estado&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; de alteração de registro. A implementação original trás suporte para os&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; componentes mais comumente utilizados, entretanto, em caso de customização ou&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; extenção do suporte a outros componentes, esse método pode sempre ser&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; reimplementado nos formulários filhos. &amp;lt;/permission&amp;gt;&lt;br /&gt;
/// &amp;lt;remarks&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Originalmente esse método foi concebido para ser utilizado pelo framework como&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; um serviço. Assim, evite chamá-lo diretamente a menos que saiba com exatidão&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; o que está fazendo. &amp;lt;/remarks&amp;gt;&lt;br /&gt;
/// &amp;lt;comments&amp;gt;&amp;nbsp; Caso necessite reimplementar o método, é recomendado que faça uma chamada à&lt;br /&gt;
/// &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; implementação da classe pai (Exemplo: Result := inherited;). &amp;lt;/comments&amp;gt;&lt;/div&gt;&lt;br /&gt;
Observe que foi utilizado também as tags &lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; e &lt;/span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;/b&gt;. Essas tags delimitam um área de texto que será formatada no estilo de código fonte do Delphi (por padrão, Courier New).&lt;br /&gt;
O resultado é:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9aesYpx78QbvkOpJ_Nc3S0wBsh8Sd322DKWpJLyWKLIBd9d87devHVbCPK-IvsivZBor8DeVFofTJvd4Jwtg6o02WZypplQZYYrFEg0rjaGLdA2LNnolh7m9SGGMbOeInSXyr3zbY_j23/s1600/HI_SC.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9aesYpx78QbvkOpJ_Nc3S0wBsh8Sd322DKWpJLyWKLIBd9d87devHVbCPK-IvsivZBor8DeVFofTJvd4Jwtg6o02WZypplQZYYrFEg0rjaGLdA2LNnolh7m9SGGMbOeInSXyr3zbY_j23/s400/HI_SC.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Convenhamos que se você está navegando pelo código, um help assim é muito, mas muito mais útil do que simplesmente visualizar a assinatura do identificador (padrão do Delphi), certo? Além do mais, você não precisa se deslocar até a definição/implementação/declaração do identificador para obter maiores detalhes, o que quase sempre resulta na interrupção da linha de raciocínio durante alguma investigação.&lt;br /&gt;
Uma outra vantagem que notei sobre a utilização do Help Insigh é poder ter dois tipos de &lt;i&gt;documentação&lt;/i&gt; a respeito de um método sobre dois pontos de vista.&lt;br /&gt;
Deixa eu exemplificar. Observe o código fonte abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;unit Unit1;&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Dialogs;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TForm1 = class(TForm)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{ Private declarations }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;protected&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;function FieldIsModified(var FieldComp: TFieldItem; const Index: Integer; out Modified: Boolean): Boolean; virtual;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Form1: TForm1;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{$R *.dfm}&lt;br /&gt;
&lt;br /&gt;
{ TForm1 }&lt;br /&gt;
&lt;br /&gt;
{_/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Definition.: Protected &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Strict [ ] &amp;nbsp; &amp;nbsp; Virtual/Override [X] &amp;nbsp; &amp;nbsp; Event [ ]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Ojective...:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Usefulness.:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Parameters.: [ I ] FieldComp =&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [ I ] Index &amp;nbsp; &amp;nbsp; =&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [ O ] Modified &amp;nbsp;=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result.....:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Comments...:&lt;br /&gt;
_/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\__/-\}&lt;br /&gt;
function TForm1.FieldIsModified(var FieldComp: TFieldItem; const Index: Integer; out Modified: Boolean): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end. &lt;/div&gt;&lt;br /&gt;
Creio que a prática mais comum de documentação de código seja a inclusão de&amp;nbsp;comentários imediatamente acima da implementação dos métodos/funções (como apresentando no exemplo acima), ficando a área de interface da unit com apenas as definições.&lt;br /&gt;
&lt;br /&gt;
O&amp;nbsp;código fonte acima contém a estrutura do bloco de comentário que costumo utilizar para documentar um método ou uma function (removi o texto para ficar mais fácil sua visualização). As informações que acrescento nesse bloco estão relacionadas principalmente com seu funcionamento, com sua dependência perante a solução como um todo e com cuidados que devem ser tomados na sua utilização.&lt;br /&gt;
Quando penso no Help Inside, penso em um ponto de vista onde saber como é o funcionamento interno de um método não é tão importante, naquele momento, quanto saber o que o método faz, suas entradas e suas saídas. Assim, quando digo que o Help Insight proporciona um segundo tipo de comentários é justamente a possibilidade de documentar o código fonte sob uma perspectiva mais focada no&amp;nbsp;&lt;i&gt;conceito&lt;/i&gt;&amp;nbsp;do que&amp;nbsp;em detalhes intrínsecos ao&amp;nbsp;funcionamento.&lt;br /&gt;
&lt;br /&gt;
Apesar de muito útil, fique um tanto desconfortável com relação a legibilidade (ou melhor, à falta de legibilidade) que a estrutura de definição das tags causa ao layout da classe.&lt;br /&gt;
Por exemplo, se você possui um classe com vários métodos e propriedades. Acrescentar um help insigh para cada definição irá dinimuir a visão do todo por exigir constante deslocamento entre as linhas para navegar pela classe (aqui o &lt;em&gt;layout struct&lt;/em&gt; do Delphi se mostrou ainda mais útil).&lt;br /&gt;
Fiz alguns testes e notei que o IDE aceita a utilização de REGIONS para delimitar a área do Help Insight, o que pareceu uma forma bem razoável para resolver ou, no mínimo, minimizar a área visível ocupada.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWkBeHQCC1sjwaBFpjP85hbXERfuKKVoRnqKYMQK4zRafH1w_7xEPsxt-XU-JvPnP0UOoxu04HDC_jd3LhmRu2B88hxCb6ms2bRTJUPiZbC_b_p35L9FBG4n3yk4cHjyZxntbsxJMUxen-/s1600/HI+-+Region.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWkBeHQCC1sjwaBFpjP85hbXERfuKKVoRnqKYMQK4zRafH1w_7xEPsxt-XU-JvPnP0UOoxu04HDC_jd3LhmRu2B88hxCb6ms2bRTJUPiZbC_b_p35L9FBG4n3yk4cHjyZxntbsxJMUxen-/s400/HI+-+Region.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Um segundo ponto com relação a legibilidade é que não há uma formatação específica para as tags.&lt;br /&gt;
&lt;imagem&gt; &amp;nbsp; a) É possível escrever a descrição de uma tag utilizando multi-linhas ou em apenas uma única linha que o conteúdo será apresentado igualmente no popup; &lt;br /&gt;
&amp;nbsp; b) Pode-se acrescentar espaços&amp;nbsp;vários espaços em&amp;nbsp;brancos, mas os excedentes serão ignorados (assim como em HTML);&lt;br /&gt;
&amp;nbsp; c) Qualquer quebra de linha será ignorada, o que dá margem para formatar melhor o texto na unit, mas na hora de exibir o popup, as frases serão concatenadas em um único parágrafo.&lt;br /&gt;
&amp;nbsp; Isso faz com que não seja possível escrever um pequeno trecho de código, por exemplo.&lt;br /&gt;
&lt;br /&gt;
Em outras palavras, fiquei com a impressão que é mais legível ler as descrições do popup do que diretamente do&amp;nbsp;código fonte.&lt;/imagem&gt;&lt;br /&gt;
&lt;imagem&gt;Caso deseje analisar o código fonte completo da unit criada durante a escrita desse artigo, faça o download nesse &lt;a href=&quot;http://rapidshare.com/files/396539263/Help_Insigh_-_Exemplo.7z&quot;&gt;link&lt;/a&gt;.&lt;/imagem&gt;&lt;br /&gt;
&lt;imagem&gt;&lt;br /&gt;
&lt;/imagem&gt;&lt;br /&gt;
&lt;imagem&gt;A última dica é para aqueles de desejam alterar a saída do popup para um layout mais adequado ou apenas queiram fazer pequenos incrementos. Nesse caso basta editar o arquivo&amp;nbsp;&lt;/imagem&gt;&lt;i&gt;HelpInsight.xsl&lt;/i&gt;&amp;nbsp;(sub-diretório&amp;nbsp;&lt;i&gt;ObjRepos&lt;/i&gt;&amp;nbsp;do&amp;nbsp;diretório de instalação do RAD Studio, para mim é&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;C:\Program Files\Embarcadero\RAD Studio\7.0\ObjRepos&lt;/span&gt;&lt;/span&gt;). Lá você encontrará também outras opções não descrita nesse artigo.&lt;br /&gt;
&lt;br /&gt;
Boa sorte.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/1235104601375276690/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/1235104601375276690?isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/1235104601375276690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/1235104601375276690'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/06/customizando-o-help-insight-no-delphi.html' title='Customizando o Help Insight no Delphi'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg8voJGwKap6dk8Y1v64Zd1amS5yD6IyMkxaDROVzFAbeIR17H8GmvJSImAtOXw_aKgW4hc754n-7C5eZBixCiiXK_7edAhyu5zN62wemR9xhgQoEnGPTOGEusHBI29-rCLCfskOZpplLT/s72-c/HIForm.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-6495158060322700170</id><published>2010-05-15T17:23:00.000-03:00</published><updated>2010-05-15T17:23:12.625-03:00</updated><title type='text'>Delphi strings (O que, quando e como) - Otimizações</title><content type='html'>As versões mais recentes do Delphi oferecem pelo menos 4 tipos de strings. Cada uma delas com características e&amp;nbsp;comportamentos próprios, tendo sua aplicabilidade&amp;nbsp;destinada a situações diferentes.&lt;br /&gt;
Esse artigo está dividido em duas partes. A primeira irá descrever esses quatro tipos de strings e suas características; a segunda etapa é composta por análises de situações comuns na programação e que constituem oportunidades para um otimizações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Breve Histórico&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ShortString&lt;/b&gt;&lt;br /&gt;
Este é um tipo de string oriundo das primeiras versões do Delphi e herdado do Turbo Pascal, que possuia este como o único tipo de string.&lt;br /&gt;
A menos que uma alocação manual seja feita, o tipo &lt;i&gt;ShortString&lt;/i&gt; reside na stack e não na heap e, do ponto de vista de alocação de memória, tem o mesmo comportameto que os tipos básicos alocados estaticamente (integer, boolean, char, recors, enum, ...).&lt;br /&gt;
Quando o tipo ShortString é utilizado o Delphi pré-aloca um bloco de 256 bytes e utiliza o primeiro byte (AStr[0]) para armazenar o tamanho &#39;utilizado&#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; AStr: ShortString;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJL5pp43bJLlHJz9OYdpUwVO1n5GSO8flaHe1FTUFvKV4S3lpvJImxjfDV3_aC47_97Iy8qCrwNG-HA2RiUB5k-cFuaISj-sfB3S3Lx8-zMgwhrk7pTrPvRm7Jr7aUY6JX6kioFheXX4j/s1600-h/shortString.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJL5pp43bJLlHJz9OYdpUwVO1n5GSO8flaHe1FTUFvKV4S3lpvJImxjfDV3_aC47_97Iy8qCrwNG-HA2RiUB5k-cFuaISj-sfB3S3Lx8-zMgwhrk7pTrPvRm7Jr7aUY6JX6kioFheXX4j/s640/shortString.PNG&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Você também pode especificar um tamanho máximo para as strings, mas esse valor não pode passar 255.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; s: string[50];&lt;br /&gt;
&amp;nbsp; e: string[256]; &lt;span style=&quot;color: #666666;&quot;&gt;// error&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;PChar&lt;/b&gt;&lt;br /&gt;
A limitação de 255 bytes para string representa um fator crítico para aplicações do mundo real.&lt;br /&gt;
No Delphi 1 foi introduzido o tipo &lt;i&gt;PChar&lt;/i&gt; que era um tipo semelhante ao &quot;char *&quot; da linguagem C. Entretanto, devido a segmentação da memória do Windows ser de 16-bits, o tipo PChar estava limitado a 65535 bytes (64 KB).&lt;br /&gt;
Diferentemente do tipo ShortString, PChar não possui um &quot;campo&quot; destinado a armazenar o tamanho da string, mas possui um terminador &quot;null&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmZ7xc2cDJWZRu1QOauxEAk5qq9gNS4pPyecLTWDyZUJi6ad-jCrdIAlVn4kp4bNKqX35BHSweyEi8jGcAL4xidz4jNIPlX5TEs3jMAFQmHWIcDJ0t6sG-C9DY7QitQr2kAXVY2MsshQ1n/s1600-h/PChar.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmZ7xc2cDJWZRu1QOauxEAk5qq9gNS4pPyecLTWDyZUJi6ad-jCrdIAlVn4kp4bNKqX35BHSweyEi8jGcAL4xidz4jNIPlX5TEs3jMAFQmHWIcDJ0t6sG-C9DY7QitQr2kAXVY2MsshQ1n/s640/PChar.png&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Long String (AnsiString)&lt;/b&gt;&lt;br /&gt;
No Delphi 2 foi introduzido o tipo &lt;i&gt;AnsiString&lt;/i&gt; com a finalidade de prover uma forma eficiente e rápida de trabalhar com strings grandes (32-bits). Agora era possível manipular strings com até 2 GB.&lt;br /&gt;
Comparando a estrutura do tipo AnsiString podemos dizer que ele é uma &quot;forma híbrida&quot; dos tipos PChar e ShortString. Uma porque ele utiliza um terminador &quot;null&quot; para indicar o final da string (igual ao PChar) e, segundo, porque adota um campo para armazenar o tamanho da string e o primeiro caracter inicia na posição 1.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; s: AnsiString;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinCXCxtpBuIiaCNOoAjVloSSxLC2wom0VBOoTSJdVlaDf5PMrXjwY0oRWyFfmAdrzngnu2k8viYWxKi5e2ZQxRbMIudciV05MvZ1v1fvw8w5uGl8GGPUGPtiNWGuajVf0tUUmudmsOC4-e/s1600-h/ansiString2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinCXCxtpBuIiaCNOoAjVloSSxLC2wom0VBOoTSJdVlaDf5PMrXjwY0oRWyFfmAdrzngnu2k8viYWxKi5e2ZQxRbMIudciV05MvZ1v1fvw8w5uGl8GGPUGPtiNWGuajVf0tUUmudmsOC4-e/s640/ansiString2.png&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Observe o mapa de memória da variável &lt;i&gt;&lt;b&gt;s&lt;/b&gt;&lt;/i&gt;, além do campo &quot;&lt;em&gt;Lenght&lt;/em&gt;&quot; esse tipo de sring mantém um outro campo, &quot;&lt;em&gt;RefCount&lt;/em&gt;&quot;. Resumidamente, esse campo é incrementado sempre que a variável é referencida. Isso permite ao Delphi gerenciar o tempo de vida da string, liberando a memória quando a string não mais é utilizada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;WideString&lt;/b&gt;&lt;br /&gt;
WideString foi o último tipo de string adicionado à famíla Delphi, mais precisamente, introduzido na versão 6. No entanto, somente a partir da versão 2009 é que se tornou o tipo padrão de string.&lt;br /&gt;
A finalidade do tipo WideString é o suporte a caracteres Unicode e a diferença reside no fato de que cada caracter WideString é representado por 2 bytes e não 1, como em AnsiString.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp; s: WideString;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvMXVrjpRZAuUTzIduBUXmpk6hwsOzy0TWW66P4FWrRlFeAFjpziwl8aFBE6liyePZNogBYucvIeFe_ej4BVT4qCx13ay5cFrV5tUR8Z0G4VIMnWKexqGFHXvVRVYW5w2JY5yA0R_uDl0z/s1600-h/Widechar2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvMXVrjpRZAuUTzIduBUXmpk6hwsOzy0TWW66P4FWrRlFeAFjpziwl8aFBE6liyePZNogBYucvIeFe_ej4BVT4qCx13ay5cFrV5tUR8Z0G4VIMnWKexqGFHXvVRVYW5w2JY5yA0R_uDl0z/s640/Widechar2.png&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;O tipo String&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
No Delphi, o tipo &lt;b&gt;string&lt;/b&gt; não é nada mais do que um alias para ShortString, PChar, AnsiString ou WideString, dependendo da versão do Delphi que for utilizado.&lt;br /&gt;
Por exemplo, no Delphi 7 o tipo &lt;i&gt;string&lt;/i&gt; é equivalente a AnsiString; já no Delphi 2009 e, mas recentemente, no Delphi 2010, &lt;i&gt;string&lt;/i&gt; é equivalente a WideString.&lt;br /&gt;
O uso do tipo string deve ser aplicado com um pouco de cautela, principalmente se retro-compatibilidade ou portabilidade for uma das necessidades do código fonte produzido. &lt;br /&gt;
Tomamos por exemplo o lançamento do Delphi 2009, que trouxe aos usuários o desafio da migração do código fonte de manipulação de strings para o formato wide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Semântica e comportamento&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Para o correto uso das string é necessário entender sua semântica e seu comportamento.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;a) Exemplo 1&lt;/strong&gt;&lt;br /&gt;
Lembre-se, o tipo ShortString pre-aloca 256 bytes e operações de atribuição resultarão em cópia do conteúdo fonte.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; s: ShortString;&lt;br /&gt;
&amp;nbsp; b: ShortString;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; s := &lt;span style=&quot;color: blue;&quot;&gt;&#39;Teste&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; b := s;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// O conteúdo de &#39;s&#39; é copiado para &#39;b&#39;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; s[1] := &#39;X&#39; &lt;span style=&quot;color: #666666;&quot;&gt;// A variável &#39;b&#39; ainda contém &#39;Teste&#39;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;b) Exemplo 2&lt;/strong&gt;&lt;br /&gt;
O tipo PChar está frequentemente associado a alocação dinânimica e atribuições somente copiam o ponteiro do destino, não o conteúdo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; s: PChar;&lt;br /&gt;
&amp;nbsp; b: PChar;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; s := &lt;span style=&quot;color: blue;&quot;&gt;&#39;Teste&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; b := s;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// A variável &#39;b&#39; aponta para &#39;s&#39;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; s[0] := &#39;X&#39; &lt;span style=&quot;color: #666666;&quot;&gt;// Tanto &#39;s&#39; quanto &#39;b&#39; contém &#39;Xeste&#39;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;c) Exemplo 3&lt;/strong&gt;&lt;br /&gt;
Tanto o tipo AnsiString quanto WideString são semelhantes ao tipo PChar quando uma atribuição direta é feita, ou seja, somente é copiado o ponteiro do destino. Além disso, AnsiString e WideString possuem um campo &lt;em&gt;RefCount&lt;/em&gt; (usado para saber quando a string não é mais utilizada) que, na atribuição direta, é incrementado..&lt;br /&gt;
Observe o exemplo baixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; s: AnsiString;&lt;br /&gt;
&amp;nbsp; b: AnsiString;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; s := &lt;span style=&quot;color: blue;&quot;&gt;&#39;Teste&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; b := s;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// Ambas apontam para a mesma área de memória e&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //o campo &quot;RefCount&#39; é incrementado.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;d) Exemplo 4&lt;/strong&gt;&lt;br /&gt;
Vamos tomar o mesmo exemplo anterior, mas com uma linha a mais de código.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; s: AnsiString;&lt;br /&gt;
&amp;nbsp; b: AnsiString;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; s := &lt;span style=&quot;color: blue;&quot;&gt;&#39;Teste&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; b := s;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// b recebe o ponteiro de &#39;s&#39;e o RefCount é incrementado.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; s[1] := &lt;span style=&quot;color: blue;&quot;&gt;&#39;X&#39;&lt;/span&gt;; &lt;span style=&quot;color: #666666;&quot;&gt;// Faz uma cópia de &#39;b&#39; com o primeiro byte modificado e&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //decrementa o RefCount de &#39;b&#39;.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
Vamos&amp;nbsp;detalhar o trabalho realizado pelo Delphi em cada uma das linhas ilustrando as estruturas em memória.&lt;br /&gt;
&lt;br /&gt;
Step 1)&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;nbsp; s := &lt;span style=&quot;color: blue;&quot;&gt;&#39;Teste&#39;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl5D7lUh4HHrc1meQIMQ6ACdngWen12TwyXHcjNtJG4HmOWn3VwhTLmi4Q2BILOfePQ7ncz87A4JxStjGYj_HKKxRWYW1E6wRZ7h95kw8hD0PIdS33El8icT_40XiAxlRH-dE0zRF6QcpD/s1600-h/S1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl5D7lUh4HHrc1meQIMQ6ACdngWen12TwyXHcjNtJG4HmOWn3VwhTLmi4Q2BILOfePQ7ncz87A4JxStjGYj_HKKxRWYW1E6wRZ7h95kw8hD0PIdS33El8icT_40XiAxlRH-dE0zRF6QcpD/s640/S1.png&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
É feito a alocação de memória para armazena a string. O campo &quot;&lt;i&gt;Lenght&lt;/i&gt;&quot; é setado para &lt;b&gt;5&lt;/b&gt; (que é&amp;nbsp;o número de caracteres da string) e o campo &quot;&lt;i&gt;RefCount&lt;/i&gt;&quot; é setado para &lt;b&gt;1&lt;/b&gt;.&lt;br /&gt;
A variável &#39;&lt;b&gt;s&lt;/b&gt;&#39; passa a apontar para o início da string.&lt;br /&gt;
&lt;br /&gt;
Step 2)&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;nbsp; b := s;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLrhWCLhEmVLF1RR7cepneTUVKVNmrKG0cq44pHTP7tIVyA9CQeqajhlNSDl8LzCC3i6zhHcu7Zzv8IJYB8NLpmczYeoih2Gncgrx-ZyhAfzYM7ypBxvO40xAiVffY-aQsJE1gTqo1mqMw/s1600-h/s2.pg.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLrhWCLhEmVLF1RR7cepneTUVKVNmrKG0cq44pHTP7tIVyA9CQeqajhlNSDl8LzCC3i6zhHcu7Zzv8IJYB8NLpmczYeoih2Gncgrx-ZyhAfzYM7ypBxvO40xAiVffY-aQsJE1gTqo1mqMw/s640/s2.pg.PNG&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Observe que a linha de código acima simplesmente copiou o ponteiro da variável &#39;&lt;b&gt;s&lt;/b&gt;&#39; para a variável &#39;&lt;b&gt;b&lt;/b&gt;&#39; e incrementou o campo &#39;&lt;i&gt;RefCount&lt;/i&gt;&#39;, ou seja, abas as variáveis estão apontando para a mesma área de memória.&lt;br /&gt;
&lt;br /&gt;
Step 3)&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;nbsp; s[1] := &lt;span style=&quot;color: blue;&quot;&gt;&#39;X&#39;&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaREodxgECV0413Dm6wcKdr-vohgto0F6S4KAF9RBGUut1Yiy1yVsIJN5prnINJyYglm7VI3OtT6AnXNfJQn6JBH-LO78ZvDDVstkts2-x1t_8MRZavAZZArHsimxCk_Y15M2phNdtRlKp/s1600-h/s3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaREodxgECV0413Dm6wcKdr-vohgto0F6S4KAF9RBGUut1Yiy1yVsIJN5prnINJyYglm7VI3OtT6AnXNfJQn6JBH-LO78ZvDDVstkts2-x1t_8MRZavAZZArHsimxCk_Y15M2phNdtRlKp/s640/s3.png&quot; vr=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aqui a alteração de um simples byte resultou e várias instruções.&lt;br /&gt;
Pelo fato do &quot;&lt;i&gt;RefCount&lt;/i&gt;&quot; ser superior a 1, ou seja, por haver mais do que uma referência, foi&amp;nbsp;realizada&amp;nbsp;a alocação de uma nova string; copiado o conteúdo da string original; setado 1 para o &quot;&lt;i&gt;RefCount&lt;/i&gt;&quot;; alterado o primeiro byte para &#39;&lt;b&gt;X&lt;/b&gt;&#39;;&amp;nbsp;atribuído&amp;nbsp;o ponteiro da nova string para a variável &#39;&lt;b&gt;s&lt;/b&gt;&#39;.&lt;br /&gt;
Por último, o &#39;&lt;i&gt;RefCount&lt;/i&gt;&#39; da string original é&amp;nbsp;decrementado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Otimizações no uso de strings&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Uso de parâmetros do tipo const&lt;/b&gt;&lt;br /&gt;
A plavrava reservada &quot;&lt;b&gt;const&lt;/b&gt;&quot; é um modificador usado para definir algo como estático, que não muda. E quando associadas com parâmetros do tipo string, há um incremento no desempenho que pode ser perceptível, dependendo da intensidade de uso.&lt;br /&gt;
Vamos tomar como base uma função simples.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;function GetStrSize(s: string): Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := Length(s);&lt;br /&gt;
end;;&lt;/div&gt;&lt;br /&gt;
Aqui o parâmetro &quot;&lt;b&gt;s&lt;/b&gt;&quot; irá incondicionalmente incrementar o campo &quot;&lt;i&gt;RefCount&lt;/i&gt;&quot; da string a qual ele está referenciando antes de iniciar a execução da primeira linha de código da função.&lt;br /&gt;
Pode parecer um tarefa simples e pouco honerosa para o sistema, mas é totalmente desnecessária porque o parâmetro é somente utilizado para leitura e nunca para escrita.&lt;br /&gt;
Uma código fonte mais eficiente, nesse caso, é facilmente obtido apenas especificando o parâmetro como &quot;constante&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;function GetStrSize2(&lt;b&gt;const &lt;/b&gt;s: string): Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := Length(s);&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
A boa notícia é que as otimizações implementada nos compiladores mais recentes já detectam esse tipo de situação e geram um código final mais eficiente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Evitando retorno do tipo string&lt;/b&gt;&lt;br /&gt;
Quando você for codificar uma função na qual é pretendido retornar uma string modificada da que é passada por parâmetro, é aconselhado que seja feito através do próprio parâmetro. A menos, é claro, que você necessite do valor original.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;function AddChar(const s: string): string;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Result := s + &#39;*&#39;;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
O exemplo acima, como pode ser notado, apenas acrescenta um caracter no final da string passa por parâmetro.&lt;br /&gt;
Já a função abaixo faz a mesma coisa, mas retorna a nova string através do próprio parâmetro.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;procedure AddChar2(var s: string);&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;s := s + &#39;*&#39;;&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
Tanto o modificador &quot;&lt;b&gt;const&lt;/b&gt;&quot; da primeira função quanto o modificador &quot;&lt;b&gt;var&lt;/b&gt;&quot; da segunda função fazem com que não seja necessário o incremento do &quot;&lt;i&gt;RefCount&lt;/i&gt;&quot;. Entretanto a segunda função é mais eficiente porque não requer que a string do parâmetro seja duplicada, porque a concatenação é feita diretamente na string original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Postergando condicionais de comparação de string&lt;/strong&gt;&lt;br /&gt;
Uma&amp;nbsp;situação bem corriqueira no dia-a-dia, principalmente quando se está trabalhando com algum tipo de parser, é codificar testes condicionais com mais do que uma validação onde há comparações string.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lFailed: Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lText: string;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (lText = &lt;span style=&quot;color: blue;&quot;&gt;&#39;&lt;tag&gt;&#39;&lt;/tag&gt;&lt;/span&gt;) and (not lFailed) then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
end;&lt;/div&gt;&lt;br /&gt;
No exemplo acima o primeiro teste do &quot;&lt;em&gt;if&lt;/em&gt;&quot; faz uma comparação entre string e o segundo é uma comparação que envolve uma variável booleana.&lt;br /&gt;
Sabendo que uma comparação entre string é uma tarefa &quot;onerosa&quot; para o processador, o mais sensato é alterarmos a ordem das condições de forma que os testes mais simples sejam atendidos primeiros. Isso evita, nesse nosso exemplo, uma comparação de string desnecessária quando a variável &lt;em&gt;lFailed&lt;/em&gt; for &lt;em&gt;False&lt;/em&gt;.&lt;br /&gt;
Esse é um tipo de Boas Práticas de Programação pode ser extentido para casos de forma geral que exigam um processamento extra.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Redundância de chamadas&lt;/strong&gt;&lt;br /&gt;
Por mais otimizado que a biblioteca do Delphi esteja, a chamada a uma função de manipulação de string sempre impõem alguma penalidade se comparado com operações simples, e evitar chamadas desnecessárias ou redundantes certamente é um cuidado bem vindo.&lt;br /&gt;
&lt;br /&gt;
O código abaixo é um pequeno trecho retirado de uma método de validação de email. Podemos notar o uso repetido e redundante da função &quot;&lt;i&gt;Pos&lt;/i&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;function IsValidEmail(const EMail: string): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (Pos(&#39;@&#39;, EMail) &amp;lt;&amp;gt; 0) and (Pos(&#39;.&#39;, EMail) &amp;lt;&amp;gt; 0) then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (Pos(&#39;@&#39;, EMail) = 1) or (Pos(&#39;@&#39;, EMail) = Length(EMail)) or&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; (Pos(&#39;.&#39;, EMail) = 1) or (Pos(&#39;.&#39;, EMail) = Length(EMail)) or (Pos(&#39; &#39;, EMail) = 0) then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Result := False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;...&lt;/div&gt;&lt;br /&gt;
Esse é um exemplo simples que utiliza funções específicas para tratamento de strings, mas o problema não é exclusivo e&amp;nbsp;estende-se para qualquer outro tipo de redundância.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;function IsValidEmail(const EMail: string): Boolean;&lt;br /&gt;
var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lPos_Dot: Integer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lPos_Arroba: Integer;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lPos_Dot := Pos(&#39;.&#39;, EMail);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lPos_Arroba := Pos(&#39;@&#39;, EMail);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (lPos_Arroba &amp;lt;&amp;gt; 0) and (lPos_Dot &amp;lt;&amp;gt; 0) then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (lPos_Arroba = 1) or (lPos_Arroba = Length(EMail)) or&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; (lPos_Dot = 1) or (lPos_Dot = Length(EMail)) or (Pos(&#39; &#39;, EMail) = 0) then &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Result := False &lt;br /&gt;
&amp;nbsp;&amp;nbsp;...&lt;/div&gt;&lt;br /&gt;
A simples adição de duas variáveis locais evitou quatro chamadas desnecessárias à função &quot;Pos&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Verificando se uma string está vazia&lt;/b&gt;&lt;br /&gt;
Existem muitas maneiras de conferir se uma string é ou não vazia, mas você sabe qual delas é a mais eficiente?&lt;br /&gt;
Abaixo eu apresento três das formas mais&amp;nbsp;freqüentemente&amp;nbsp;empregadas.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lMyStr: string;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;lMyStr := Caption;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if lMyStr = &#39;&#39; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;lMyStr := &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&#39;Maneira mais eficiente&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if Length(lMyStr) = 0 then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;lMyStr := &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&#39;Maneira menos eficiente&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if lMyStr[1] = &#39;&#39; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;lMyStr := &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&#39;Forma desaconselhada&lt;/span&gt;&#39;;&lt;/div&gt;&lt;br /&gt;
Para entender melhor a verdadeira razão do primeiro &lt;i&gt;if&lt;/i&gt;&amp;nbsp;conter a forma mais adequada de verificar se um string está ou não vazia, vou postar o código assemble gerado pelo compilador. Mesmo você não estando familiarizado com a linguagem assembly, tenho certeza que será fácil o entendimento.&lt;br /&gt;
&lt;br /&gt;
O código gerado pelo compilador é apresentado logo abaixo da linha do código fonte respectiva e cada um dos &amp;nbsp;&lt;i&gt;if&lt;/i&gt;&amp;nbsp;acima está destacado em uma cor diferente.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;; font-size: 9pt; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: white;&quot;&gt;fuStrTest.pas.127: &lt;b&gt;if lMyStr = &#39;&#39; then&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: lime;&quot;&gt;07992023 837DFC00 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmp dword ptr [ebp-$04],$00&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: lime;&quot;&gt;07992027 750D &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jnz $07992036&lt;/span&gt;&lt;br /&gt;
fuStrTest.pas.128: lMyStr := &#39;Maneira mais eficiente&#39;;&lt;br /&gt;
07992029 8D45FC &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lea eax,[ebp-$04]&lt;br /&gt;
0799202C BADC209907 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov edx,$079920dc&lt;br /&gt;
07992031 E842F0FFFF &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call $07991078&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: white;&quot;&gt;fuStrTest.pas.129: &lt;b&gt;if Length(lMyStr) = 0 then&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow;&quot;&gt;07992036 8D45FC &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lea eax,[ebp-$04]&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow;&quot;&gt;&lt;b&gt;07992039 E822F0FFFF &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call $07991060&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow;&quot;&gt;&lt;b&gt;0799203E E83DF0FFFF &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call $07991080&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow;&quot;&gt;07992043 85C0 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;test eax,eax&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow;&quot;&gt;07992045 750D &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jnz $07992054&lt;/span&gt;&lt;br /&gt;
fuStrTest.pas.130: lMyStr := &#39;Maneira menos eficiente&#39;;&lt;br /&gt;
07992047 8D45FC &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lea eax,[ebp-$04]&lt;br /&gt;
0799204A BA18219907 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov edx,$07992118&lt;br /&gt;
0799204F E824F0FFFF &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call $07991078&lt;br /&gt;
fuStrTest.pas.131: &lt;b&gt;if lMyStr[1] = &#39;&#39; then&lt;/b&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #f4cccc;&quot;&gt;07992054 8B45FC &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov eax,[ebp-$04]&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #f4cccc;&quot;&gt;07992057 66833800 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmp word ptr [eax],$00&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #f4cccc;&quot;&gt;0799205B 750D &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jnz $0799206a&lt;/span&gt;&lt;br /&gt;
fuStrTest.pas.132: lMyStr := &#39;Forma desaconselhada&#39;;&lt;br /&gt;
0799205D 8D45FC &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lea eax,[ebp-$04]&lt;br /&gt;
07992060 BA54219907 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov edx,$07992154&lt;br /&gt;
07992065 E80EF0FFFF &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call $07991078&lt;/div&gt;&lt;br /&gt;
Somente observando o número de instruções necessárias para cada uma das três situações já é suficiente para comprovar que o primeiro &lt;i&gt;if&lt;/i&gt;&amp;nbsp;é o mais eficiente. Entretanto o segundo &lt;i&gt;if&lt;/i&gt;, que utiliza a função &lt;i&gt;Length&lt;/i&gt;, merece alguns comentários.&lt;br /&gt;
Observe que há duas instruções &lt;i&gt;call&lt;/i&gt;&amp;nbsp;(call $07991060 e&amp;nbsp;call $07991080) que são, na verdade, chamadas para as funções&amp;nbsp;EnsureUnicodeString e&amp;nbsp;UStrLen, respectivamente. Essas funções são compostas por diversas instruções e, do ponto de vista de micro otimizações, impõem uma penalidade de performance bastante grande.&lt;br /&gt;
Mesmo não tento realizados testes estatísticos mais precisos, posso afirmar que um simples &lt;i&gt;if lMyStr = &#39;&#39; then&lt;/i&gt;&amp;nbsp;é incontáveis vezes mais rápido que o uso da função &lt;i&gt;Length&lt;/i&gt;.&lt;br /&gt;
Novamente ressaltando que isso é do ponto de vista de micro otimizações e para a maioria dos desenvolvedores o ganho de desempenho seria imperceptível.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/6495158060322700170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/6495158060322700170?isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/6495158060322700170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/6495158060322700170'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/05/delphi-strings-o-que-quando-e-como.html' title='Delphi strings (O que, quando e como) - Otimizações'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJL5pp43bJLlHJz9OYdpUwVO1n5GSO8flaHe1FTUFvKV4S3lpvJImxjfDV3_aC47_97Iy8qCrwNG-HA2RiUB5k-cFuaISj-sfB3S3Lx8-zMgwhrk7pTrPvRm7Jr7aUY6JX6kioFheXX4j/s72-c/shortString.PNG" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-7230739879598879378</id><published>2010-01-15T23:31:00.002-02:00</published><updated>2011-02-16T13:02:48.029-02:00</updated><title type='text'>Remote Debugging no Delphi 2010</title><content type='html'>Esse não é um assunto nada novo, mas sempre que preciso utilizar essa técnica de depuração muitos pequenos detalhes surgem&amp;nbsp;e insistem em tomar um tempo precioso que, quase sempre, não foi previsto ou ultrapassa em muito o esperado.&lt;br /&gt;
&lt;br /&gt;
Assim, dedico esse post para a descrição detalhada do passo-a-passo necessário para a depuração remota sobre o Windows Seven (32 bits)&amp;nbsp;utilizando o Delphi 2010.&lt;br /&gt;
&lt;br /&gt;
Apesar de acreditar que os procedimentos aqui descritos são válidos para versões anteriores e/ou posteriores, as configurações e testes foram realizadas&amp;nbsp;utilizando apenas o&amp;nbsp;Delphi 2010.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Configurações Básicas&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Na Máquina Remota&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Na máquina&amp;nbsp;remota, ou seja,&amp;nbsp;onde encontra-se o software a ser depurado, é preciso ter o &quot;Remote Debugger&quot; instalado.&lt;br /&gt;
A&amp;nbsp;instalação&amp;nbsp;vem inclusa no CD de instalação do RAD Studio 2010&amp;nbsp;que pode ser acessado através do&amp;nbsp;path&amp;nbsp;&quot;&lt;b&gt;\RemoteDebugger\RemoteDebugger.exe&lt;/b&gt;&quot; ou então através do Launcher&amp;nbsp;do RAD Studio (imagem abaixo).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnQK1oQU-lYFKrqseU_zrohbabzfozyoGZVlqKwH713MkbniUTZoGU0-kCj6unJ1M25rSHvCIOqT4XPC5QA3v4TkHjKjhn8BOOZfqJPaU6Qmhfv4VYqLIdYcyHweLAoX39QMFHXOwnSv6Y/s400/Remote_Debug.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;
Após a instalação, o remote debugger deverá ser inicializado. Esse é um procedimento que sempre deverá ser feito, caso contrário o IDE do Delphi/RAD Studio não conseguirá conectar-se à máquina remota.&lt;br /&gt;
&lt;br /&gt;
No diretório &lt;b&gt;C:\Program Files\RemoteDebugger&lt;/b&gt; (use &lt;i&gt;%ProgramFiles%\RemoteDebugger&lt;/i&gt; como path, já que o nome do diretório &quot;Program Files&quot; depende do idioma e da plataforma do sistema opearcional -- 32 ou 64 bits) rode o aplicativo &lt;b&gt;rmtdbg140.exe&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
O número &lt;strong&gt;140&lt;/strong&gt; no nome do aplicativo refere-se à versão do Delphi, no caso Delphi 2010. Se você tiver utilizando uma outra versão, esse&amp;nbsp;número será diferente (ex: rmtdbt&lt;strong&gt;105&lt;/strong&gt;.exe no Delphi 2007; rmtdbg&lt;strong&gt;120&lt;/strong&gt;.exe no Delphi 2009). &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZTo8pdxDfiWpRzDIYwxOvQ165ZzrEh2s12j5GJsKHtz0IZl9Y99JkYRFUPoRW1rW6XEkqC-kepQ-vQ-dOcnW4DrTjqEM9yVJkzY_nxCyw_CiVYMxmJbYmv7Bwvjq124bY49OzLs7P8_vX/s1600-h/Remote_Debugger_-_Tray_icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZTo8pdxDfiWpRzDIYwxOvQ165ZzrEh2s12j5GJsKHtz0IZl9Y99JkYRFUPoRW1rW6XEkqC-kepQ-vQ-dOcnW4DrTjqEM9yVJkzY_nxCyw_CiVYMxmJbYmv7Bwvjq124bY49OzLs7P8_vX/s640/Remote_Debugger_-_Tray_icon.png&quot; /&gt;&lt;/a&gt;O Tray ico, como mostra a imagem ao lado, informa que o remote debugger está rodando.&lt;/div&gt;&lt;br /&gt;
Na primeira vez que o aplicativo é executado o Windows Vista/Seven irá apresentar um alerta do Firewall.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnymeE5LxmDZUuQ51gF__BffIeiaXxPJJBFcwvYAL9utKBncd29lOYnKhBBi5pa8eyokLoNytSBmWhXo8FZtE7Id91J5x3-xZK2XKWHBrPEXLEpop_UZC1Ts36aEuvUDHQTpDW-DC-I_YZ/s400/Remote_Debugger_-_Alerta.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;
Confirme a permissão. Caso contrário o IDE não conseguirá conectar-se na máquina remota.&lt;br /&gt;
&lt;br /&gt;
Uma recomendação é que o aplicativo seja executado com permissões de administrador e com o parâmetro &quot;&lt;b&gt;-listen&lt;/b&gt;&quot;.&lt;br /&gt;
No caso da instalação do remote debugger não for possível ou desaconselhada por se tratar de uma máquina de cliente ou por qualquer outro motivo, há a possibilidade de distribuir apenas os arquivos necessário do remote debugger e fazer a inicialização manualmente.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;a)&lt;/strong&gt; Copiar arquivos&lt;/em&gt;&lt;br /&gt;
Copie os arquivos listados abaixo, encontrados no diretório de instalação do D2010, de para um diretório qualquer na máquina do cliente (máquina remota).&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;bccide.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;bordbk140.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;bordbk140N.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;comp32x.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;dcc140.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;rmtdbg140.exe&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
OBS: Se a versão do Delphi que você está utilizando não é a 2010 então o nome dos arquivos podem ser ligueiramente diferentes.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;b) &lt;/strong&gt;Registro das DLLs relevantes:&lt;/em&gt;&lt;br /&gt;
Em um prompt de comandos, faça o registro das DLLs &lt;b&gt;bordbk140.dl&lt;/b&gt;l e &lt;b&gt;bordbk124N.dll&lt;/b&gt; através dos comados:&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;regsvr32 /s bordbk140.dll&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;regsvr32 /s bordbk140N.dll&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;c)&lt;/strong&gt; Inicialização:&lt;/em&gt;&lt;br /&gt;
Ainda no prompt de comandos inicialize o aplicativo:&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; rmtdbg140 -listen 8000&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0KmhfjgZZR4dyA7FEMxmNkNpE5MZWkvr4L-oCCBRCL8FTDnqOmkpx25UYiJ6d4Nz4X_qgn72ydcaaYjUVFgykY_qIA0HCcK_mqs23YOF9a1r2U0ldmjP7XVu0QAXw_UacP6KhKExnzJXE/s1600-h/Remote_Debugger_-_Console.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0KmhfjgZZR4dyA7FEMxmNkNpE5MZWkvr4L-oCCBRCL8FTDnqOmkpx25UYiJ6d4Nz4X_qgn72ydcaaYjUVFgykY_qIA0HCcK_mqs23YOF9a1r2U0ldmjP7XVu0QAXw_UacP6KhKExnzJXE/s400/Remote_Debugger_-_Console.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Na Máquina Local&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
O projeto do sistema (que gera o arquivo executável) deve ter algumas opções de compilação/link setadas para que a conexão remota posso ocorrer.&lt;br /&gt;
&lt;br /&gt;
Primeiro altere, caso já não esteja setado, o perfil de build (opção &lt;em&gt;Build Configuration&lt;/em&gt;) para &lt;strong&gt;Debug&lt;/strong&gt;. Isso habilitará opções padrões específicas e necessárias para depuração.&lt;br /&gt;
&lt;br /&gt;
Além disso habilite a opção &quot;&lt;em&gt;Include remote debug symbols&lt;/em&gt;&quot; nas opções de &lt;em&gt;linker&lt;/em&gt;, como mostra a image abaixo.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVWSs1WoBh6rFCfofzNkBVR7XSxL4VBH2CbKRaIW8hToiusmYSgCRKlP0IzzC9G3eZ1Q0WOHzimHmk2SP7oJm9lquNBt9wh8TUSh7JEng9hecti1p2fV2zgHotaS-Z54aErCCHeoadEwhY/s1600-h/Remote+Debug+-+Config.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVWSs1WoBh6rFCfofzNkBVR7XSxL4VBH2CbKRaIW8hToiusmYSgCRKlP0IzzC9G3eZ1Q0WOHzimHmk2SP7oJm9lquNBt9wh8TUSh7JEng9hecti1p2fV2zgHotaS-Z54aErCCHeoadEwhY/s400/Remote+Debug+-+Config.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
No caso da sua aplicação possuir outros packages (BPLs) ou DLLs sob a forma de projetos, não esqueça de habilitar essas mesmas opções nesses projetos. A menos, é claro, que a depuração não deva ou não necessite abranger desses pacotes/blibliotecas.&lt;br /&gt;
&lt;br /&gt;
Após modificar essas opções no ou nos projetos, rebuild-o(s).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD_xL5Fn22gzk8H7a8MRJ96AQA2B8-7LTj-9UM5-z1T3mSz1t4cTVOe5ZSe5pvHw3t1U89U_MgwS-LG6MYPmIi1cTapJZgsiCqjIngP9p6heZSSqP1XofUWZMWCC2jkoJJt5Cx3KD8n91u/s1600-h/Remote_Debug_-_Menu.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD_xL5Fn22gzk8H7a8MRJ96AQA2B8-7LTj-9UM5-z1T3mSz1t4cTVOe5ZSe5pvHw3t1U89U_MgwS-LG6MYPmIi1cTapJZgsiCqjIngP9p6heZSSqP1XofUWZMWCC2jkoJJt5Cx3KD8n91u/s640/Remote_Debug_-_Menu.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Por padrão, o Delphi sempre inicita a execução/depuração de um &lt;em&gt;processo &lt;/em&gt;local. Para iniciar a depuração remota do aplicativo é necessário solicitar explicitamente a intenção. Para isso,&amp;nbsp;vá ao menu &lt;strong&gt;Run&lt;/strong&gt; e selecione a opção &quot;&lt;strong&gt;Load Process...&lt;/strong&gt;&quot;.&lt;br /&gt;
No lado esquerdo do dialog click na opção &quot;&lt;strong&gt;Remote&lt;/strong&gt;&quot;, que indica que o processo é remoto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvtgkXeuRTUlY7_X52IyXk7qgolc1jFow9Ob99MIhKF5OoYYDzkbNIyDFdpDjQPMugZCuMm8RcYdlXG53HMDzUelION0Ec6bBS6fpUQ0L62Z72JAR5rf4sOWqOOlXBmB0b5rIDGvYsaMeG/s1600-h/Remote_Debug_-_Load.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ps=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvtgkXeuRTUlY7_X52IyXk7qgolc1jFow9Ob99MIhKF5OoYYDzkbNIyDFdpDjQPMugZCuMm8RcYdlXG53HMDzUelION0Ec6bBS6fpUQ0L62Z72JAR5rf4sOWqOOlXBmB0b5rIDGvYsaMeG/s400/Remote_Debug_-_Load.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Ao clicar na opção, serão apresentados no lado direito da tela quatro opções de configuração.&lt;br /&gt;
&lt;strong&gt;1)&lt;/strong&gt; &lt;em&gt;Remote path&lt;/em&gt;: Caminho completo onde o executável a ser depurado encontra-se. Não esqueça que esse caminho é relativo à máquina remota;&lt;br /&gt;
&lt;strong&gt;2)&lt;/strong&gt; &lt;em&gt;Remote host&lt;/em&gt;: Endereço IP da máquina remota;&lt;br /&gt;
&lt;strong&gt;3)&lt;/strong&gt; &lt;em&gt;Parameters&lt;/em&gt;: Pode ser utilizado para especificar os parâmetros de execução. Caso não haja parâmetros, deixe o campo em branco;&lt;br /&gt;
&lt;strong&gt;4)&lt;/strong&gt; &lt;em&gt;Working directory&lt;/em&gt;: O diretório de trabalho é opcional e por padrão é sugerido informar o mesmo diretório de localização do aplicativo;&lt;br /&gt;
&lt;br /&gt;
Após isso basta pressionar o botão &quot;&lt;strong&gt;Load&lt;/strong&gt;&quot; e pronto, a depuração será inicializada.&lt;br /&gt;
&lt;br /&gt;
OBS: Na máquina local somente a depuração será realizada. A interação do o aplicativo (clicks com o mouse e entrada de informações) é independente e só pode ser feita na máquina remota. A sugestão aqui é o uso de um aplicativo remote-deskopt (exemplo VNC Client e VNC Server) para a interação remota com o software a ser depurado.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/7230739879598879378/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/7230739879598879378?isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/7230739879598879378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/7230739879598879378'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2010/01/remote-debugging-no-delphi-2010.html' title='Remote Debugging no Delphi 2010'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnQK1oQU-lYFKrqseU_zrohbabzfozyoGZVlqKwH713MkbniUTZoGU0-kCj6unJ1M25rSHvCIOqT4XPC5QA3v4TkHjKjhn8BOOZfqJPaU6Qmhfv4VYqLIdYcyHweLAoX39QMFHXOwnSv6Y/s72-c/Remote_Debug.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-7759304284306659992</id><published>2009-11-11T19:03:00.002-02:00</published><updated>2009-11-16T15:18:58.314-02:00</updated><title type='text'>Uso de hash (MD5) em banco de Dados é seguro?</title><content type='html'>Vou começar esse documento perguntado:&lt;br /&gt;
Se você necessitasse desenvolver um software que exigisse manter um controle de usuários (login, permissões, ...), como você garantiria a segurança da senha armazenada no banco de dados?&lt;br /&gt;
&lt;br /&gt;
Não tenho a menor dúvida que há uma infinidade de soluções para essa pergunta. Mas o que eu gostaria de tratar nesse post é uma das possíveis soluções bastante difundida e utilizada.&lt;br /&gt;
Estou referindo-me ao uso de algoritmos hash, mais especificamente o MD5. Nesse caso,&amp;nbsp;em vez de gravar a senha tal como ela é, grava-se o respectivo hash.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos pensar na estrtura de uma tabela para&amp;nbsp;armazenar a lista de usuários desse&amp;nbsp;sistema.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;CREATE TABLE &quot;usuario&quot;&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;fullname&quot;&amp;nbsp; VARCHAR(85) NOT NULL,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;username&quot;&amp;nbsp; VARCHAR(20) NOT NULL,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;passwd&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHAR(32)&lt;br /&gt;
);&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
OBS: Eu estipulei o tamanho de 32 bytes para o field &quot;passwd&quot; porque o código hash retornado pelo algoritmo MD5 costuma ser uma string&amp;nbsp;com&amp;nbsp;32&amp;nbsp;caracteres hexadecimais.&lt;br /&gt;
&lt;br /&gt;
Agora, quando em seu sistema você for cadastrando novos usuários, provavelmente utilizaria um SQL&amp;nbsp;semelhante a este:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;INSERT INTO &quot;usuario&quot; (fullname, username, passwd) VALUES (&#39;...&#39;, &#39;mylogin&#39;, MD5(&#39;minha senha&#39;));&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
ou talvez calcularia o hash da senha na própria aplicação, persistindo o valor final:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;INSERT INTO &quot;usuario&quot; (fullname, username, passwd) VALUES (&#39;Fabius Lovato&#39;, &#39;lovato&#39;, &#39;e10adc3949ba59abbe56e057f20f883e&#39;);&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Então você faz uma consulta em sua tabela &quot;usuarios&quot; e observa que os registros não exibem uma senha &quot;entendível&quot; e, logo, conclui que mesmo que alguém conseguisse obter esses códigos hash não seria nada fácil convertê-los nas senhas originais.&lt;br /&gt;
Aí, acreditando estar seguro, você passa a utilizar esse código como identificador de determinadas transações trafegadas por meios não seguros ou, pior ainda, persiste esse valor em um arquivo texto qualquer.&lt;br /&gt;
&lt;br /&gt;
Talvez não seja novidade para você, mas há grandes bases de dados dedicados que&amp;nbsp;mantém&amp;nbsp;códigos hash para palavras simples e compostas que são usualmente utilizadas. E além disso, essas bases de dados estão disponíveis para o acesso público.&lt;br /&gt;
Duvida? Então faça um teste muito simples: Vá até o site de busca do google (&lt;a href=&quot;http://www.google.com.br/&quot;&gt;http://www.google.com.br/&lt;/a&gt;) e&amp;nbsp;cole o código hash do nosso exemplo acima (e10adc3949ba59abbe56e057f20f883e).&lt;br /&gt;
Provavelmente você encontrará a resposta estampada&amp;nbsp;nos primeiros links da pesquisa.&lt;br /&gt;
&lt;br /&gt;
Bom, possivelmente&amp;nbsp;você deve estar argumentando que essa é uma senha muito comum e muitos outros artigos a utilizariam com exemplo. Então vamos tentar novamente, mas com o hash a8832562d37247d41a7679612a104997.&lt;br /&gt;
&lt;br /&gt;
Entendeu agora porque o uso de algoritmos de hash não é tão seguros assim?&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Links interessantes&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Um site muito interessante&amp;nbsp;onde você&amp;nbsp;tem a disposição uma&amp;nbsp;gigantesca base de códigos hash é o &lt;strong&gt;md5();&lt;/strong&gt; que pode ser acessado pelo link &lt;a href=&quot;http://md5.rednoize.com/&quot;&gt;http://md5.rednoize.com/&lt;/a&gt;&lt;br /&gt;
Na data de publicação desse post, uma nota no rodapé do site informava &quot;&lt;em&gt;Search in 57,035,795 md5/sha1 hashes. 20,612,544 searches answered since feb 2005&lt;/em&gt;&quot;.&lt;br /&gt;
Certamente esses valores são superiores hoje. Inclusive se você esperar alguns segundos e fizer um refresh no site (CTRL + F5), notará que o número de registros dessa base está&amp;nbsp;continuamente crescendo.&lt;br /&gt;
Esse site também permite que você gere o código hash de um texto qualquer. Para isso basta digitar um texto que não caracterize um hash md5 válido (32 caracteres hexadecimais).&lt;br /&gt;
&lt;br /&gt;
Se você for web design ou trabalham com aplicações com comunicação/acesso remoto, sugiro a leitura do artigo &quot;&lt;a href=&quot;http://mndti.com/artigos/32-cuidado-com-sua-senha-saiba-como-funciona-a-autenticacao-em-sites-na-web&quot;&gt;Cuidado com sua senha - saiba como funciona a autenticação em sites na web&lt;/a&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
Se tiver interesse em saber mais sobre criptografia MD5, um bom artigo está disponível no link &lt;a href=&quot;http://www.devmedia.com.br/articles/viewcomp.asp?comp=2944&quot;&gt;http://www.devmedia.com.br/articles/viewcomp.asp?comp=2944&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Se você acha que é só, a lista abaixo ainda não são todos os links que você tem a disposição para localizar um código hash md5. Além disso, alguns desses sites trabalham também com códigos hash de outros algoritmos (sha1, lm e ntlm) &lt;br /&gt;
&lt;a href=&quot;http://tools.benramsey.com/md5/&quot;&gt;http://tools.benramsey.com/md5/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://md5.gromweb.com/&quot;&gt;http://md5.gromweb.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.thepanicroom.org/index.php?view=md5&quot;&gt;http://www.thepanicroom.org/index.php?view=md5&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://shm.hard-core.pl/md5/&quot;&gt;http://shm.hard-core.pl/md5/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.mmkey.com/md5/home.php&quot;&gt;http://www.mmkey.com/md5/home.php&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://md5.overclock.ch/&quot;&gt;http://md5.overclock.ch/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cmd5.org/&quot;&gt;http://www.cmd5.org/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.md5encryption.com/&quot;&gt;http://www.md5encryption.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.md5decrypt.com/&quot;&gt;http://www.md5decrypt.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.md5decrypter.com/&quot;&gt;http://www.md5decrypter.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.milw0rm.com/md5/&quot;&gt;http://www.milw0rm.com/md5/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://plain-text.info/&quot;&gt;http://plain-text.info/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://schwett.com/md5/&quot;&gt;http://schwett.com/md5/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.tmto.org/&quot;&gt;http://www.tmto.org/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.xmd5.org/&quot;&gt;http://www.xmd5.org/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://passcracking.ru/&quot;&gt;http://passcracking.ru/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.hashchecker.com/&quot;&gt;http://www.hashchecker.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://gdataonline.com/&quot;&gt;http://gdataonline.com/&lt;/a&gt;&lt;br /&gt;
Esse último tem uma base de mais de 1 bilhão de hash!&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/span&gt; &lt;br /&gt;
Não importa quão seguro é o algoritmo de hash utilizado, se a senha que você utiliza é intuitiva, fácil e/ou possui poucos caracteres, então temo que ela não seja tão segura quanto você imagina.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/7759304284306659992/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/7759304284306659992?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/7759304284306659992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/7759304284306659992'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/11/uso-de-hash-md5-em-banco-de-dados-e.html' title='Uso de hash (MD5) em banco de Dados é seguro?'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-1368754290147645604</id><published>2009-10-31T23:51:00.001-02:00</published><updated>2009-10-31T23:52:33.560-02:00</updated><title type='text'>ZeosLib for Delphi 2010</title><content type='html'>Este sem dúvida é um dos projetos open source e freeware destinado aos desenvolvedores Delphi que mais eu respeito.&lt;br /&gt;
&lt;a href=&quot;http://sourceforge.net/projects/zeoslib/&quot;&gt;ZeosLib &lt;/a&gt;é uma biblioteca com um conjunto de ferramentas que oferece conexão nativa com vários de tipos de banco de dados (MySQL, ADO, PostgresSQL, Oracle, SQLite, Firebird, Interbase, MSSQL, Sybase).&lt;br /&gt;
Além de ser open source e freeware, uma das grandes vantagens em utilizar o ZeosLib é a flexibilidade e facilidade durante a migração de um banco de dados para outro, justamente pelos mesmos componentes serem utilizados para todos os tipos banco de dados que são suportados.&lt;br /&gt;
&lt;br /&gt;
O objetivo desse artigo não é descrever sobre os recursos e funcionalidades do ZeosLib, mas sim anunciar que hoje essa biblioteca é compatível com o Delphi 2010. Para ser mais específico, já faz alguns meses que essa versão já é suportada pelo Delphi 2010, mas há pouco tempo alcançou um grau de estabilidade aceitável.&lt;br /&gt;
A última release estável é a versão 6.6.5 que foi publicada em 25/maio/2009 e oferece suporte até o Delphi 2007.&lt;br /&gt;
Apesar de algumas versões não oficiais serem lançadas posteriormente, usuário do Delphi 2009 e, hoje, Delphi 2010 têm&amp;nbsp;ansiosamente&amp;nbsp;aguardado por atualizações dessa biblioteca.&lt;br /&gt;
O suporte oficial da biblioteca ao Delphi 2009/2010 só está previsto para a versão 7.0 do ZeosLib que não tem um data definida para ser lançado e, acredito, ainda deve demorar um pouco.&amp;nbsp;Entretanto já está disponível uma versão beta que, apesar de ainda requerer um bom trabalho, é suportado pelo Delphi 2010 e está em fase de teste (svn://zeos.firmos.at/zeos/branches/testing), mas totalmente funcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMCNqKbHfWLe4NHPXJz8mUO52TWoKofEV42r4ujGmWtogw9HCIBvbkvIYM0ETZM0JpZuGyjDxwnfQHedkKELkusQ9vWj1bFM4DBRgdQwaQkyKg53xpoR9O0uzyrWlMp9-6yAIpNIAkkSvH/s1600-h/ZeosLib+Directory.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMCNqKbHfWLe4NHPXJz8mUO52TWoKofEV42r4ujGmWtogw9HCIBvbkvIYM0ETZM0JpZuGyjDxwnfQHedkKELkusQ9vWj1bFM4DBRgdQwaQkyKg53xpoR9O0uzyrWlMp9-6yAIpNIAkkSvH/s640/ZeosLib+Directory.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;A comunidade ZeosLib mantém o repositório svn (&lt;a href=&quot;svn://zeos.firmos.at/zeos&quot;&gt;svn://zeos.firmos.at/zeos&lt;/a&gt;) onde você pode encontrar todas as versões já lançadas e as versões que estão em desenvolvimento.&lt;br /&gt;
Como alguma ferramenta svn client (ex. Tortoise) faça checkout do link&amp;nbsp;&lt;a href=&quot;svn://zeos.firmos.at/zeos/branches/testing&quot;&gt;svn://zeos.firmos.at/zeos/branches/testing&lt;/a&gt;&amp;nbsp;para um pasta qualquer.&lt;br /&gt;
&lt;br /&gt;
No final você deverá ter uma estrutura de diretórios igual ao da imagem ao lado.&lt;br /&gt;
Apesar de úteis (não sei se essa é a melhor classificação), apenas os diretórios &lt;b&gt;packages &lt;/b&gt;e &lt;b&gt;src &lt;/b&gt;são realmente relevantes (considerando que o objetivo é a instalação do pacote no RAD Studio 2010). Sendo assim, manter os demais diretórios é opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-large;&quot;&gt;&lt;b&gt;Instalando o ZeosLib&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
A biblioteca ZeosLib é muito organizada e o&amp;nbsp;processo de instalação é simples.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1uFY2QqtNw8c_WDzonIIc6UpEuzNv63zVZdtrN8aMzFhdPv82QMIyZq03no_JjseFcfmAt9Msp5XE3DIbwwl61bUvQ6hVBPePEqWemILR3ewPnkT9hhwkI3fdEizxBxRke1NmSEOCzF6t/s1600-h/ZeosLib+Project.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1uFY2QqtNw8c_WDzonIIc6UpEuzNv63zVZdtrN8aMzFhdPv82QMIyZq03no_JjseFcfmAt9Msp5XE3DIbwwl61bUvQ6hVBPePEqWemILR3ewPnkT9hhwkI3fdEizxBxRke1NmSEOCzF6t/s640/ZeosLib+Project.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;1. No IDE do Delphi, abra o projeto ZeosDbo.groupproj;&lt;br /&gt;
2. Compile todos os projetos (menu &lt;i&gt;Project &lt;/i&gt;-&amp;gt; &lt;i&gt;Build All Projects&lt;/i&gt;);&lt;br /&gt;
3. Instale o pacote de componentes selecionando a opção &quot;&lt;i&gt;Install&lt;/i&gt;&quot; (no menu de contexto) do pacote &quot;&lt;i&gt;ZComponentDesign140.bpl&lt;/i&gt;&quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dependendo de como o RAD Studio está configurado, é possível que o IDE apresente uma mensagem de erro quando o segundo pacote (&lt;i&gt;ZPlain140.bpl&lt;/i&gt;) for buildado;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;[DCC Fatal Error] ZPlain.dpk(30): E2202 Required package &#39;ZCore&#39; not found&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Essa mensagem informa que o pacote ZCore (ZCore140.bpl) não foi encontrado.&lt;br /&gt;
Apesar ser clara, a mensagem não é muito intuitiva principalmente depois de ter sido buildado o primeiro pacote (&lt;i&gt;ZCore140.bpl&lt;/i&gt;) e, consequentemente, o arquivo existir.&lt;br /&gt;
Na verdade o arquivo foi criado e está localizado em&amp;nbsp;&lt;i&gt;C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Bpl&lt;/i&gt; (o diretório depende da versão do sistema operacional e o idioma do mesmo), apenas não está sendo visível pelo RAD Studio.&lt;br /&gt;
Para corrigir, basta incluir&amp;nbsp;&lt;b&gt;$(BDSCOMMONDIR)\Bpl&lt;/b&gt; no &quot;&lt;i&gt;Library path&lt;/i&gt;&quot;, como mostra a imagem abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwgqiS-yDxSqZap79iSMeniHDvLqTN6TJjvlE5SAN5BDElwFcz1CEedmMWaVMl4o6hYwVMFDDob9MPNXj9rYQofCluAhETsh7Z0PaT-XILen-nFbWT0yTAPtBSC1B3eDhgik-AE62vYWqp/s1600-h/ZeosLib+Library+path.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwgqiS-yDxSqZap79iSMeniHDvLqTN6TJjvlE5SAN5BDElwFcz1CEedmMWaVMl4o6hYwVMFDDob9MPNXj9rYQofCluAhETsh7Z0PaT-XILen-nFbWT0yTAPtBSC1B3eDhgik-AE62vYWqp/s400/ZeosLib+Library+path.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Após isso você poderá observar a aba &quot;&lt;i&gt;Zeos Access&lt;/i&gt;&quot; na Tool Palette.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Usando o Zeos DBO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Quando ainda usava o Delphi 2009, baixei uma versão super-mega-alfa, baseada na release 6.6.5, que dizia ser suportada pelo Delphi 2009. No entanto, não consegui nem mesmo realizar uma conexão com o PostgresSQL.&lt;br /&gt;
Com o objetivo de validar o quão estável está essa versão, resolvi fazer alguns testes com os componentes usando uma base de dados no PostgresSQL 8.4.1.&lt;br /&gt;
&lt;br /&gt;
Após configurar o componente de conexão (&lt;i&gt;TZConnection&lt;/i&gt;) com os dados para acessar uma base de dados no PostgresSQL, tentei ativar a conexão.&lt;br /&gt;
Nesse momento o componente apresentou a mensagem de erro abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGDGBsb7cUtTJmlaHSnhtCp73zrGWp67JZOn-7aTAi1xNpLjMvnCH0CJSQFTreO62kFAU-XpCBt693t22iy1LawFoUzNpxGLeuZq-fTSUHsvO29nI6c02eYZC6pawa13PuMSGERH7-Y6M-/s1600-h/ZeosLib+Postgre+Connection.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGDGBsb7cUtTJmlaHSnhtCp73zrGWp67JZOn-7aTAi1xNpLjMvnCH0CJSQFTreO62kFAU-XpCBt693t22iy1LawFoUzNpxGLeuZq-fTSUHsvO29nI6c02eYZC6pawa13PuMSGERH7-Y6M-/s640/ZeosLib+Postgre+Connection.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Um detalhe que pode ser corrigido facilmente apenas acrescentando o diretório &lt;i&gt;bin&lt;/i&gt;&amp;nbsp;da instalação do postgres (provavelmente C:\Program Files\PostgreSQL\8.4\bin) no system path. Você pode também copiar os arquivos: &lt;i&gt;Comerr32.dll&lt;/i&gt;; &lt;i&gt;krb5_32.dll&lt;/i&gt;; &lt;i&gt;libconv-2.dll&lt;/i&gt;; &lt;i&gt;libeay32.dll&lt;/i&gt;; &lt;i&gt;libintl-2.dll&lt;/i&gt;; &lt;i&gt;ssleay32.dll&lt;/i&gt; para a pasta &lt;i&gt;system32 &lt;/i&gt;do Windows!&lt;br /&gt;
&lt;br /&gt;
Acrescentado o diretório no system path, só foi necessário reiniciar o Delphi e tudo correu muito bem.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxOsfqVMQeJTk6pe6VAfBNfFMZd1-Lj44Yzc0JEEFOTsZLTNOwimAGzBHM8v8ga8-PNWstYzdFNybsJFC2hPp4rnpLvgqHTnQ4b2KniogiHcEzdmurvppvJ6G2oDPwMMiWLQwfUNmfswpn/s1600-h/ZeosLib+Success.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxOsfqVMQeJTk6pe6VAfBNfFMZd1-Lj44Yzc0JEEFOTsZLTNOwimAGzBHM8v8ga8-PNWstYzdFNybsJFC2hPp4rnpLvgqHTnQ4b2KniogiHcEzdmurvppvJ6G2oDPwMMiWLQwfUNmfswpn/s400/ZeosLib+Success.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
E por falar em open source, o que acha de ajudar essa versão do ZeosLib a deixar de ser beta?</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/1368754290147645604/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/1368754290147645604?isPopup=true' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/1368754290147645604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/1368754290147645604'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/10/zeoslib-for-delphi-2010.html' title='ZeosLib for Delphi 2010'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMCNqKbHfWLe4NHPXJz8mUO52TWoKofEV42r4ujGmWtogw9HCIBvbkvIYM0ETZM0JpZuGyjDxwnfQHedkKELkusQ9vWj1bFM4DBRgdQwaQkyKg53xpoR9O0uzyrWlMp9-6yAIpNIAkkSvH/s72-c/ZeosLib+Directory.png" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-4878166555470643572</id><published>2009-10-14T16:16:00.059-03:00</published><updated>2009-10-14T21:02:32.785-03:00</updated><title type='text'>Alternativas freeware</title><content type='html'>Até não muito tempo atrás o mundo open source não era tão expressivo quanto hoje e, muitas vezes, associado a baixa qualidade. No entanto, hoje podemos vislumbrar projetos open source que competem de igual para igual com soluções pagas.&lt;br /&gt;
Dedico esse artigo para citar e descrever sobre alguns pacotes de componentes open source e freeware que são excelentes alternativas para produtos comerciais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;The Fastcode Challanges&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://fastcode.sourceforge.net/&quot;&gt;The Fastcode Challanges&lt;/a&gt; é um projeto, ou melhor, é um desafio público de quem escreve o código mais&amp;nbsp;eficiente&amp;nbsp;para substituir funções e procedimentos da RTL e VCL&amp;nbsp;do Delphi. Atualmente&amp;nbsp;a biblioteca conta com mais de 300 funções publicadas para download e&amp;nbsp;geralmente implementadas em assembly inline.&lt;br /&gt;
O projeto é realmente sério, tanto que&amp;nbsp;algumas funções foram adotadas&amp;nbsp;pela Borland substituindo as versões originais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;strong&gt;Synapse TCP/IP Library&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://synapse.ararat.cz/doku.php/start&quot;&gt;Synapse&lt;/a&gt;&amp;nbsp;é uma&amp;nbsp;biblioteca de comunicação TCP/IP&amp;nbsp;muito light que preza a simplicidade e é um excelente alternativa para o pessado Indy.&lt;br /&gt;
Sua abordagem é um pouco diferente, utiliza comunicação síncrona (blocking). Também oferece comunicação assíncrona, mas de forma limitada.&lt;br /&gt;
Uma característica curiosa é a retrocompatibilidade com o Delphi 3. A versão atual (&lt;a href=&quot;http://synapse.ararat.cz/lib/exe/fetch.php/file:synapse39.zip&quot;&gt;release .39&lt;/a&gt;) tem suporte até o Delphi 2009, sendo esse último experimental.&lt;br /&gt;
Observando a frequência de atualização dessa biblioteca, pressumo que muito em breve será lançado uma release com suporte ao Delphi 2010.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;DCPCrypt&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cityinthesky.co.uk/cryptography.html&quot;&gt;DCPCrypt&lt;/a&gt; é um bliblioteca open source que trás vários componentes que implementam algortimos de criptografia e hash.&lt;br /&gt;
É compatível com o Delphi 4, 5, 6, 7, 2005, 2006, 2007, 2009. Apesar de não possuir pacotes de instalação exclusivos, também é compatível com a versão 2010 do Delphi.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Algorimos de Criptografia&lt;/em&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Blowfish &lt;/li&gt;
&lt;li&gt;Cast 128 &lt;/li&gt;
&lt;li&gt;Cast 256 &lt;/li&gt;
&lt;li&gt;DES, 3DES &lt;/li&gt;
&lt;li&gt;Ice, Thin Ice, Ice2 &lt;/li&gt;
&lt;li&gt;IDEA &lt;/li&gt;
&lt;li&gt;Mars &lt;/li&gt;
&lt;li&gt;Misty1 &lt;/li&gt;
&lt;li&gt;RC2, RC4, RC5, RC6 &lt;/li&gt;
&lt;li&gt;Rijndael (the new AES) &lt;/li&gt;
&lt;li&gt;Serpent &lt;/li&gt;
&lt;li&gt;Tea &lt;/li&gt;
&lt;li&gt;Twofish &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;em&gt;Algoritmos de Hash&lt;/em&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Haval &lt;/li&gt;
&lt;li&gt;MD4 &lt;/li&gt;
&lt;li&gt;MD5 &lt;/li&gt;
&lt;li&gt;RipeMD-128 &lt;/li&gt;
&lt;li&gt;RipeMD-160 &lt;/li&gt;
&lt;li&gt;SHA-1 &lt;/li&gt;
&lt;li&gt;SHA-256, SHA-384, SHA-512 &lt;/li&gt;
&lt;li&gt;Tiger &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Se você usa o Delphi 2010, pode utilizar os pacotes de instalação do 2009 ou, então, baixar uma versão customizada do DCPCrypt 2.0 b3 (&lt;span class=&quot;Apple-style-span&quot; style=&quot;-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: arial, sans-serif; font-size: 12px;&quot;&gt;&lt;a href=&quot;http://rapidshare.com/files/293117004/DCPCrypt_2b2_D2010.7z&quot;&gt;http://rapidshare.com/files/293117004/DCPCrypt_2b2_D2010.7z&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-family: &#39;Times New Roman&#39;; font-size: medium;&quot;&gt;).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Eu particularmente já tive a oportunidade de usa essa fantástica biblioteca e recomendo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Delphi Fast ZLib&lt;/strong&gt;&lt;br /&gt;
Uma biblioteca para compressão e descompressão de arquivos no formato zib muito mais rápida do que a que é fornecida pelo Delphi&amp;nbsp;e, além disso, não requer DLL externa.&lt;br /&gt;
Esse bliblioteca possui várias otimizações, incluindo&amp;nbsp;código para processadores P6 e&amp;nbsp;alinhamento de 64 bits. Tais otimizações são automaticamente utilizadas conforme as características do hardware.&lt;br /&gt;
&lt;br /&gt;
O exemplo abaixo foi extraído do site official (&lt;a href=&quot;http://www.dellapasqua.com/delphizlib/&quot;&gt;http://www.dellapasqua.com/delphizlib/&lt;/a&gt;) e demonstra como utilizar a biblioteca.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TForm1.Button1Click(Sender: TObject);&lt;br /&gt;
&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; InputStream, OutputStream: TFileStream;&lt;br /&gt;
&amp;nbsp; DeCompressionStream: TZDecompressionStream;&lt;br /&gt;
&amp;nbsp; CompressionStream: TZCompressionStream;&lt;br /&gt;
&amp;nbsp; InputFileName, OutputFileName: string;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;//compress&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; InputFileName := &lt;span style=&quot;color: blue;&quot;&gt;&#39;c:\image.png&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; OutputFilename := &lt;span style=&quot;color: blue;&quot;&gt;&#39;c:\image.png.bzip&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; InputStream := TFileStream.Create(InputFileName, fmOpenRead);&lt;br /&gt;
&amp;nbsp; OutputStream := TFileStream.Create(OutputFileName, fmCreate);&lt;br /&gt;
&amp;nbsp; CompressionStream := TZCompressionStream.Create(OutputStream, zcFastest);&lt;br /&gt;
&amp;nbsp; CompressionStream.CopyFrom(InputStream, InputStream.Size);&lt;br /&gt;
&amp;nbsp; CompressionStream.Free;&lt;br /&gt;
&amp;nbsp; OutputStream.Free;&lt;br /&gt;
&amp;nbsp; InputStream.Free;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// decompress&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; InputFileName := &lt;span style=&quot;color: blue;&quot;&gt;&#39;c:\image.png.bzip&#39;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; OutputFilename := &lt;span style=&quot;color: blue;&quot;&gt;&#39;c:\image2.png&#39;&lt;/span&gt;; &lt;span style=&quot;color: #666666;&quot;&gt;//rename to original into final code&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; InputStream := TFileStream.Create(InputFileName, fmOpenRead);&lt;br /&gt;
&amp;nbsp; OutputStream := TFileStream.Create(OutputFileName, fmCreate);&lt;br /&gt;
&amp;nbsp; DecompressionStream := TZDecompressionStream.Create(InputStream);&lt;br /&gt;
&amp;nbsp; OutputStream.CopyFrom(DecompressionStream, 0);&lt;br /&gt;
&amp;nbsp; DecompressionStream.Free;&lt;br /&gt;
&amp;nbsp; OutputStream.Free;&lt;br /&gt;
&amp;nbsp; InputStream.Free;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;NewAC Delphi Components&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://symmetrica.net/newac/&quot;&gt;NewAC&lt;/a&gt; é um pacote de componente destinados a tarefas de processamento de áudio.&lt;br /&gt;
Oferece suporte a vários tipos de arquivos de áudio (wav, Ogg Vorbis, FLAC, Monkey Audio, WavPack, MP3, Windows WMA, True Audio (TTA), OptimFROG, TAK, Musepack, DTS 5.1, AC-3).&lt;br /&gt;
&lt;br /&gt;
Uma rápida descrição das caractrísticas desse pacote são:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Audio recording and playback using DirectSound &lt;/li&gt;
&lt;li&gt;Audio recording and playback using low latency ASIO drivers &lt;/li&gt;
&lt;li&gt;CD-ripping &lt;/li&gt;
&lt;li&gt;Supported formats: wav, Ogg Vorbis, FLAC, Monkey Audio, WavPack, MP3, Windows WMA, DTS, AC-3, TTA, OptimFROG, TAK, Musepack &lt;/li&gt;
&lt;li&gt;Sound mixing, concatenation, cutting and insertion of audio fragments. &lt;/li&gt;
&lt;li&gt;Audio resampling &lt;/li&gt;
&lt;li&gt;8, 16, 24, 32 bit sound support &lt;/li&gt;
&lt;li&gt;Multi-channel sound &lt;/li&gt;
&lt;li&gt;Id3v*, Ape, Vorbis tags support &lt;/li&gt;
&lt;li&gt;Ready for Delphi 2009 &lt;/li&gt;
&lt;li&gt;License: NewAC is free for both open source and commercial use&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
No link &lt;a href=&quot;http://symmetrica.net/newac/formats.htm&quot;&gt;http://symmetrica.net/newac/formats.htm&lt;/a&gt; você pode ter uma noção melhor dos formatos de arquivos em comparação com as funcionalidades suportadas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Professional Screen Camera Component&lt;/strong&gt;&lt;br /&gt;
Como o próprio nome sugere, esse é um excelente componente para que deseja fazer captura do desktop em gravar em avi.&lt;br /&gt;
Algumas das suas características são:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Save desktop screen to avi file by arbitrary region. &lt;/li&gt;
&lt;li&gt;Select region from 5 way. (SelObject, FreeHand, FixedMoving, FixedStable, FullScreen). &lt;/li&gt;
&lt;li&gt;Auto selecting best video codecs in your system. (DivX, XviD, MP4, WMV and Standard AVIs). &lt;/li&gt;
&lt;li&gt;Capability recording audio from selected input device. &lt;/li&gt;
&lt;li&gt;Full support recording from single monitor and/or multi monitor. &lt;/li&gt;
&lt;li&gt;Change arbitrary recording frame rate. (Up to 1000 fps — super fast machines). &lt;/li&gt;
&lt;li&gt;Capability recording with set timer. &lt;/li&gt;
&lt;li&gt;Change on time video priority at recording mode. &lt;/li&gt;
&lt;li&gt;Capability preview before recording or with recording. &lt;/li&gt;
&lt;li&gt;On time show recording status. &lt;/li&gt;
&lt;li&gt;On time drawing objects, texts, images and… over video canvas. (Overlay option). &lt;/li&gt;
&lt;li&gt;On time filter effective (GrayScale Drawing, Reverse Color, Rotation, Brightness, Contrast, Color Adjusting, Saturation, Noise). &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&amp;nbsp;Link para acesso: &lt;a href=&quot;http://delphitutorial.info/professional-screen-camera-component-v4710.html&quot;&gt;http://delphitutorial.info/professional-screen-camera-component-v4710.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/4878166555470643572/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/4878166555470643572?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4878166555470643572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4878166555470643572'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/10/ate-nao-muito-tempo-atras-o-mundo-open.html' title='Alternativas freeware'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-8474775876760142005</id><published>2009-10-07T22:36:00.003-03:00</published><updated>2009-10-09T08:36:04.931-03:00</updated><title type='text'>SafeMM - Debug Memory Manager para Delphi e C++</title><content type='html'>&lt;span style=&quot;font-family: Calibri;&quot;&gt;Já faz um tempinho que a Embarcadero publicou o SafeMM. De lá para cá eu posterguei inúmeras vezes a realização de testes para entender melhor a proposta desse gerenciador de memória.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Definição&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
O &lt;strong&gt;SafeMM&lt;/strong&gt; é um gerenciador de memória &quot;prova de conceito&quot; que tem a finalidade de identificar alguns tipos de AV (Access Violation) que normalmente não são caputrados pelo gerenciador de memória padrão do Delphi.&lt;br /&gt;
&lt;br /&gt;
Vamos para um exemplo.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TForm1.Create(Sender: TObject);&lt;br /&gt;
&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; DEFAULT_OPTIONS: array[0..2] of &lt;strong&gt;string&lt;/strong&gt; = (&lt;span style=&quot;color: blue;&quot;&gt;&#39;Opção 1&#39;&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;&#39;Opção 2&#39;&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;&#39;Opção 3&#39;&lt;/span&gt;);&lt;br /&gt;
&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; i: integer;&lt;br /&gt;
&amp;nbsp; lMyStrList: TStringList;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; lMyStrList := TStringList.Create;&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;try&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;for&lt;/strong&gt; i := low(DEFAULT_OPTIONS) &lt;strong&gt;to&lt;/strong&gt; high(DEFAULT_OPTIONS) do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lMyStrList.Add(DEFAULT_OPTIONS[i]);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// ... outras instruções&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Self.cbbAction.Items.Assign(lMyStrList);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// ... outras instruções&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: #b6d7a8; color: black;&quot;&gt;{$IFDEF DEBUG}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ShowMessage(&lt;span style=&quot;color: blue;&quot;&gt;&#39;String list count: &#39;&lt;/span&gt; + IntToStr(lMyStrList.Count));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: #b6d7a8;&quot;&gt;{$ENDIF}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;finally&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lMyStrList.Free;&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;Self.cbbAction.ItemIndex := lMyStrList.Count - 1;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;nbsp;ShowMessage(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&#39;String list count: &#39;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;+ IntToStr(lMyStrList.Count));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;margin: 0px;&quot;&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
No exemplo acima uma lista de strings é criada e preenchida com as entradas de um array constante; essa lista&amp;nbsp;é, então,&amp;nbsp;atribuída para o componente &quot;&lt;b&gt;cbbAction&lt;/b&gt;&quot;; por último, é posto em seleção o último item da lista.&lt;br /&gt;
Um trecho de código bastante comum, mas há uma falha nas duas últimas linhas. A variável &quot;&lt;strong&gt;lMyStrList&lt;/strong&gt;&quot;, naquele ponto do código, já&amp;nbsp;está com&amp;nbsp;sua área de memória liberada.&lt;br /&gt;
&lt;br /&gt;
Se você compilar esse exemplo no Delphi (não sei se o comportamento é idêntico para todas as versões - utilizei o Delphi 2010), o segundo &lt;i&gt;ShowMessage &lt;/i&gt;retorna o valor 0 (zero) quando tenta acessar o método &lt;b&gt;Count &lt;/b&gt;do objeto &lt;b&gt;lMyStrList&lt;/b&gt;, mas nenhuma exceção ou falha ocorre. No entanto prever o comportamento da instrução &quot;&lt;strong&gt;lMyStrList.Count - 1&lt;/strong&gt;;&quot; é classe impossível, já que a memória foi liberada e não há qualquer garantia de que os dados anteriormente pertencentes ao objeto ainda estejam intactos na memória.&lt;br /&gt;
&lt;br /&gt;
Apesar do exemplo aqui ser simples, essa falha na lógica de programação pode resultar em um bug complicado e consumir um tempo razoável para rastreá-lo.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Usando o SafeMM&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
É justamente para situações como essa que o SafeMM se propõem.&lt;br /&gt;
Se você utilizar esse gerenciador de memória qualquer instrução de leitura ou escrita à uma área de memória que não deveria estar acessível resultará em um AV (Access Violation).&lt;br /&gt;
&lt;br /&gt;
A sua instalação é muito simples:&lt;br /&gt;
&lt;strong&gt;Step 1&lt;/strong&gt;. Acesso o site da Embarcadero (&lt;a href=&quot;http://cc.embarcadero.com/Item/27241&quot;&gt;http://cc.embarcadero.com/Item/27241&lt;/a&gt;) e faça o download do SafeMM.&lt;br /&gt;
Apesar de o código fonte ser &lt;em&gt;livre&lt;/em&gt;, é necessário que você seja um usuário registrado. Caso não seja, registre-se e faça o download (a Embarcadero agradece);&lt;br /&gt;
&lt;strong&gt;Step 2&lt;/strong&gt;. Descompacte o arquivo em uma pasta qualquer (apenas os arquivos&amp;nbsp;&#39;&lt;strong&gt;SafeMM.pas&lt;/strong&gt;&#39; e &#39;&lt;strong&gt;SafeMMInstall.pas&lt;/strong&gt;&#39;&amp;nbsp;são serão utilizados, os demais pode se apagados se assim você desejar);&lt;br /&gt;
&lt;strong&gt;Step 3&lt;/strong&gt;. No Delphi, abra o seu projeto e adicione os arquivos &#39;&lt;strong&gt;SafeMM.pas&lt;/strong&gt;&#39; e &#39;&lt;strong&gt;SafeMMInstall.pas&lt;/strong&gt;&#39;; build e já está pronto para depurar;&lt;br /&gt;
&lt;br /&gt;
OBS: Eu testei em um projeto relativamente grande, com um executável principal de muitos módulos (.bpl). Só foi necessário acrescentar a referência desses dois arquivos no projeto principal.&lt;br /&gt;
&lt;br /&gt;
Exemplo de um projeto incluindo o SafeMM.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;b&gt;program &lt;/b&gt;Project2;&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: #b6d7a8;&quot;&gt;{$IFDEF DEBUG}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;SafeMM&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;SafeMMInstall&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: #b6d7a8;&quot;&gt;{$ENDIF}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Forms,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;fuPrincipal in &#39;fuPrincipal.pas&#39; {Form1};&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #b6d7a8;&quot;&gt;{$R *.res}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Application.Initialize;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Application.MainFormOnTaskbar := True;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Application.CreateForm(TForm1, Form1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Application.Run;&lt;br /&gt;
&lt;b&gt;end&lt;/b&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;Eu utilizei um a diretiva {$IFDEF DEBUG} para garantir que o SafeMM não fosse incluído quando o projeto for buildado para &lt;i&gt;release&lt;/i&gt;, ou seja, para a versão final.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Como funciona&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
O código fonte desse gerenciador de memória é bem pequeno e recomendo&amp;nbsp;dedicar um tempinho para compreender seu funcionamento mais detalhado.&lt;br /&gt;
Vou explanar num alto nível como funciona e como é feito para detectar esse tipo de acesso indevido.&lt;br /&gt;
&lt;br /&gt;
O SafeMM substitui as rotinas de gerenciamento de memória (GetMem, FreeMem, ReallocMem e&amp;nbsp;AllocMem) por rotinas próprias (SafeGetMem, SafeFreeMem, SafeAllocMem e SafeReallocMem, respectivamente). Essas rotinas utilizaram&amp;nbsp;listas auxiliares para armazenar registros com informações&amp;nbsp;extras para cada&amp;nbsp;bloco de memória que você for alocado&amp;nbsp;durante a execução do código fonte.&lt;br /&gt;
Por exemplo,&amp;nbsp;a linha de código do exemplo acima&amp;nbsp;&quot;&lt;strong&gt;lMyStrList := TStrings.Create&lt;/strong&gt;&quot; necessita alocar memória (que é feito pelo internamente pela rotina &lt;i&gt;SafeGetMem&lt;/i&gt;). Nesse momento, uma entrada nessa lista auxiliar é adicionada com diversas informações sobre esse bloco de memória e, entre elas, uma se destaca: &quot;&lt;strong&gt;Magic&lt;/strong&gt;&quot;.&lt;br /&gt;
A propriedade &quot;Magic&quot;, como o&amp;nbsp;próprio nome sugere,&amp;nbsp;é usada para armazenar um &lt;em&gt;código mágico&lt;/em&gt; (123123 - decimal). E é utilizada, juntamente com outras variáveis, para manter a integridade desses blocos de informações.&lt;br /&gt;
Quando o objeto local&amp;nbsp;&lt;strong&gt;lMyStrList&lt;span style=&quot;font-weight: normal;&quot;&gt;&amp;nbsp;é desalocado, o SafeMM realiza várias operações internas e, por último, bloqueia o acesso à região de memória onde o TStringList estava alocado (através da rotina &lt;/span&gt;VirtualProtect&lt;span style=&quot;font-weight: normal;&quot;&gt;). Assim, quando você tentar acessar novamente a variável &lt;strong&gt;lMyStrList&lt;/strong&gt;, um AV (Access Violation) é levantado fazendo com que a depuração seja interrompida na linha exata onde ocorreu o acesso indevido.&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;Simples e funcional!&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Considerações&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
O SafeMM não tem o propósito de substituir o gerenciador de memória padrão do Delphi, ele foi concebido para o processo de depuração.&lt;br /&gt;
Um aplicativo normal pode chegar a ter a quantidade memória alocada multiplicada em até 4 vezes. A versão atual é 0.3 e é a mesma desde 29 de março de 2007.&lt;br /&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/8474775876760142005/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/8474775876760142005?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8474775876760142005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8474775876760142005'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/10/safemm-debug-memory-manager-para-delphi.html' title='SafeMM - Debug Memory Manager para Delphi e C++'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-4241830761992799765</id><published>2009-10-05T23:30:00.002-03:00</published><updated>2009-10-07T13:21:38.164-03:00</updated><title type='text'>Assertivas - Boas práticas de programação</title><content type='html'>Olá a todos.&lt;br /&gt;
&lt;br /&gt;
Há alguns dias atrás eu estava corrigindo um daqueles bugs que só ocorrem muito esporadicamente e que você mal sabe como reproduzi-lo, menos ainda o motivo dele estar ocorrendo.&lt;br /&gt;
Provavelmente vocês concordarão que na maioria das vezes esse tipo de bug é ocasionado por um descuido durante a programação. E que a correção desse tipo de falha costuma ser um detalhe em uma única linha de código.&lt;br /&gt;
Quem nunca gastou horas de depuração para descobrir que usou a variável errada ou o teste errado dentro de, por exemplo, uma condição &quot;&lt;strong&gt;if&lt;/strong&gt;&quot;?&lt;br /&gt;
Por essa razão resolvi revisar muitas daquelas boas práticas de programação que costumamos aprender, mas que deixamos de utilizá-las por achar que somos super-programadores ou por qualquer outro motivo.&lt;br /&gt;
O uso de assertivas é um assunto bastante velho e não é um recurso exclusivo do Delphi, muito pelo contrário, quase todas as linguagens que tive a oportunidade de aprender oferecem suporte a esse recurso tão simples e útil.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Definição&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
As assertivas são validações lógicas de uma condição julgada necessária para o correto funcionamento do algoritmo no momento em que são verificadas. A condição testada pela assertiva representa uma pressuposição assumida e instrui o sistema a notificar sempre que essa condição não for satisfeita, garantindo que não haja um comportamento imprevisto.&lt;br /&gt;
Asserções no Delphi são implementadas através da rotina &lt;strong&gt;Assert&lt;/strong&gt;. Apesar do IDE informar que esse procedimento faz parte da unit System, você não encontrará seu código fonte porque é uma função interna do compilador.&lt;br /&gt;
A sintaxe de uma assertiva, em Delphi, é a seguinte:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;Assert(Condition: Boolean; [Message: string]);&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O parâmetro &quot;&lt;strong&gt;Condition&lt;/strong&gt;&quot; é uma expressão booleana que representa a condição a ser satisfeita. O parâmetro &quot;&lt;strong&gt;Message&lt;/strong&gt;&quot; é opcional e pode ser utilizado para especificar uma mensagem customizada exibida quando a condição não for satisfeita.&lt;br /&gt;
O funcionamento do &lt;strong&gt;Assert&lt;/strong&gt; é bastante simples. A condição especificada pelo parâmetro &lt;em&gt;Condition&lt;/em&gt; é validado e, se o resultado for &lt;em&gt;True&lt;/em&gt;, o fluxo de execução continua normalmente. Caso contrário, se a condição resultar em &lt;em&gt;False&lt;/em&gt;, uma exceção do tipo &lt;strong&gt;EAssertFailed&lt;/strong&gt; será levantada apresentando a mensagem de texto especificada pelo parâmetro &quot;&lt;em&gt;Message&lt;/em&gt;&quot;.&lt;br /&gt;
Caso você não especifique o parâmetro &lt;em&gt;Message&lt;/em&gt;, o Delphi irá utilizar por padrão o texto ‘&lt;em&gt;Assertion failure&lt;/em&gt;&#39;.&lt;br /&gt;
Um exemplo pode ser observado na imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDwkQxWjhaesuPjKdheXuB1MRMvlFJyYkv4J9wenT4Ixm7SG-3cgZjM623_3gR25h1DLL16HA9j4gzsAurkfG1JpxhT5hLJKzcU-5iRsMHoZ936ZPJ4ZzCdbcYpF-fVeFCbw49W-g1FuR5/s1600-h/Assert01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img $r=&quot;true&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDwkQxWjhaesuPjKdheXuB1MRMvlFJyYkv4J9wenT4Ixm7SG-3cgZjM623_3gR25h1DLL16HA9j4gzsAurkfG1JpxhT5hLJKzcU-5iRsMHoZ936ZPJ4ZzCdbcYpF-fVeFCbw49W-g1FuR5/s400/Assert01.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Por si só a mensagem padrão exibida já é suficientemente útil. Para a maioria das falhas detectada com as assertivas, sabendo-se o local exato no código fonte onde a assertiva encontra-se e obtendo a stack tracing do depurador, é possível identificar e corrigir o bug.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Relevância&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Mesmo sendo seu uso muito simples é importante ficar atendo para a finalidade na qual as assertivas se propõem e, assim, evitar que sejam usadas erroneamente.&lt;br /&gt;
Tenha em mente que o Assert é uma prática de programação defensiva que instrumenta o código fonte e o instrui a identificar falhas e comportamentos não originalmente previstos e, assim, detectar bugs em seus estágios iniciais.&lt;br /&gt;
Apesar de ser na prática bastante usada para validar as entradas de métodos/rotinas, sua proposta não é essa e sim validar condições consideradas obrigatórias e que, quando não satisfeitas, identifica uma falha no sistema.&lt;br /&gt;
Muitas vezes a validação de entradas e/ou saídas das rotinas carrega uma pressuposição e, conseqüentemente, passível de uso de assertivas (e recomendável). No entanto, essa sutil diferença de conceito pode fazer a diferença entre incrementar o grau de corretude do seu código fonte ou acrescentar mais bugs.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Versão Interna x Versão de Produção&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Uma característica peculiar das assertivas é a possibilidade de &quot;anular&quot; a geração de código binário.&lt;br /&gt;
Essa característica é muito útil quando o sistema é buildado e posto em produção, ou seja, quando a intenção é distribuir o software.&lt;br /&gt;
Considerando que a finalidade das assertivas é identificar pressuposições não satisfeitas, quando a versão de sistema é considerada estável e, portanto, passível de ser distribuída, a validação dessas condições não são mais relevantes do ponto de vista dos usuários (clientes) e, portanto, não há necessidade que seja gerado código binário.&lt;br /&gt;
O Delphi possui um item de configuração específico que permite habilita/desabilita a compilação das assertivas. &lt;br /&gt;
Acesso o menu &lt;strong&gt;Projet&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Options&lt;/strong&gt; -&amp;gt; aba &lt;strong&gt;Compiler&lt;/strong&gt; -&amp;gt; grupo &lt;strong&gt;Debugging&lt;/strong&gt; -&amp;gt; opção &quot;&lt;strong&gt;Assertions&lt;/strong&gt;&quot;, conforme mostra a imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHbGLlaHLQKJHp9U6IZyS0wVnb-VB5HiMNdgKmoD2Zzy8Wqhkzx2Or_ZyKIqilkV_7dfkQKvnyIer-2acnEce72TU3W8FnHY_nKYdCbZ0oQF6NEVBpWtyhQmd8H3kst6LsEYwhPAZSUjtj/s1600-h/Assert02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img $r=&quot;true&quot; border=&quot;0&quot; height=&quot;234&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHbGLlaHLQKJHp9U6IZyS0wVnb-VB5HiMNdgKmoD2Zzy8Wqhkzx2Or_ZyKIqilkV_7dfkQKvnyIer-2acnEce72TU3W8FnHY_nKYdCbZ0oQF6NEVBpWtyhQmd8H3kst6LsEYwhPAZSUjtj/s320/Assert02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Também existe uma alternativa que pode ser utilizada para forçar a compilação das assertivas ou, então, para desabilitá-las em trechos específicos de código fonte.&lt;br /&gt;
Nesse caso há as diretivas de compilação {&lt;strong&gt;$ASSERTIONS ON / OFF&lt;/strong&gt;} e {&lt;strong&gt;$C + / -&lt;/strong&gt;}. Com elas você pode delimitar uma região do código fonte que habilitarão ou não a geração de código para as assertivas.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Use Case 1:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Esse é um exemplo muito simples e não tem uma funcionalidade prática, mas servirá para demonstrar o uso desse recurso fantástico.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;function&lt;/strong&gt; TfrmPrincipal.GetCount: Integer; &lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; Assert(Self.FItems &amp;lt;&amp;gt; &lt;strong&gt;nil&lt;/strong&gt;); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Result := Self.FItems.Count; &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Observe que nossa assertiva está pressupondo que a propriedade &lt;strong&gt;FItems&lt;/strong&gt; não pode ser &lt;strong&gt;nil&lt;/strong&gt;.&lt;br /&gt;
É fácil prever que se não houvesse essa assertiva e a propriedade &lt;em&gt;FItems&lt;/em&gt; não fosse inicializada, quando tal método fosse chamado o sistema certamente falharia. O que caracteriza uma brecha para um bug se instalar e que pode ser facilmente detectado com o acréscimo do Assert.&lt;br /&gt;
Entretanto dizer se essa assertiva está ou não empregada corretamente irá depender da finalidade do método e da sua visibilidade (private, protected, public).&lt;br /&gt;
Nos próximos exemplos essa questão será abordada.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Use Case 2:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Vamos imaginar um programa simples que disponibiliza ao cliente dois campos de edição para valores numéricos e, ao pressionar um botão, é apresentado um dialog com o valor da divisão entre os valores desses dois campos.&lt;br /&gt;
Sabemos que a divisão por zero ocasiona uma exceção (&lt;strong&gt;EDivByZero&lt;/strong&gt;) e necessita ser tratado.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;function&lt;/strong&gt; Dividir(&lt;strong&gt;const&lt;/strong&gt; Dividento, Divisor: Integer): Double; &lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;&amp;nbsp; Assert(Divisor &amp;lt;&amp;gt; 0);&lt;/strong&gt;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp; Result&lt;/strong&gt; := Dividento / Divisor;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.btnResultadoClick(Sender: TObject); &lt;br /&gt;
&lt;strong&gt;var&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; lResultado: Double; &lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; lResultado := Dividir(sedtDividento.Value, sedtDivisor.Value); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; ShowMessage(&#39;&lt;span style=&quot;color: blue;&quot;&gt;Resultado da divisão: &lt;/span&gt;&#39; + FloatToStr(lResultado)); &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Quando o botão é pressionado, o evento “&lt;strong&gt;btnResultadoClick&lt;/strong&gt;” é gerado. Este chama a rotina “&lt;strong&gt;Dividir&lt;/strong&gt;” repassando os valores dos dois campos e apresentando um resultado em um dialog.&lt;br /&gt;
No método &lt;em&gt;Dividir&lt;/em&gt; há uma assertiva que pressupõem que o valor do parâmetro &lt;em&gt;Divisor&lt;/em&gt; não seja 0 (zero).&lt;br /&gt;
Esse é um exemplo do emprego incorreto do Assert.&lt;br /&gt;
No momento em que a compilação de assertivas for desabilitada, a possibilidade de falha seria alta, principalmente porque os valores da divisão são fornecidos diretamente pelo cliente.&lt;br /&gt;
A visibilidade da rotina “Dividir” vai além de simplesmente ser usada internamente. Além disso, as assertivas não devem ser utilizadas para validar regras de negócio e, portanto, seu emprego no exemplo acima deve ser revisto.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Use Case 3:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
O exemplo abaixo apresenta uma situação bastante problemática e que certamente resultará em dores de cabeça no momento em que o sistema for posto em produção.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.AddItem(Item: TObject); &lt;br /&gt;
begin &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;Assert&lt;/strong&gt;(Self.FItems.Add(Item) &amp;gt;= 0); &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O método “&lt;strong&gt;AddItem&lt;/strong&gt;” tem a finalidade de acrescentar um objeto, passado por parâmetro, a uma lista interna. E há uma pressuposição de que esse item sempre será acrescentado à lista.&lt;br /&gt;
Mas aí eu questiono: O que acontecerá se a compilação dos Assertions for desabilitada?&lt;br /&gt;
A resposta é muito simples, o sistema falhará. E pior, a falha pode ocorrer em um ponto do código que aparentemente não apresenta relação com o verdadeiro causador do bug.&lt;br /&gt;
Então você houve aquela famosa frase: “Sim, mas eu testei e estava funcionando perfeitamente!”&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Use Case 4:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Na maioria das vezes o &lt;em&gt;Assert&lt;/em&gt; é utilizado no início de métodos/rotinas que exigem a obrigatoriedade de parâmetros, faixa de valores específicos, recursos alocados, variáveis ou objetos inicializados ou qualquer outra condição necessária para o correto funcionamento desse método/rotina. Mas como dito no início desse artigo, o uso de Assert é uma prática de programação defensiva.&lt;br /&gt;
Imaginemos uma situação onde o sistema realize um cálculo relativamente complexo e que, baseando-se nos parâmetros fornecidos, o resultado nunca deverá ultrapassar uma faixa de valores específica.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.btnResultadoClick(Sender: TObject); &lt;br /&gt;
&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; lResultado: Integer;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; lResultado := Calcular(Param1, Param2, Param3, Param4);&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;Assert&lt;/strong&gt;(lResultado &amp;lt;= 80, &lt;span style=&quot;color: blue;&quot;&gt;&#39;Resultado fora da faixa permitida.&lt;/span&gt;&#39;); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// ...&lt;/span&gt; &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;; &lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
A assertiva aqui é de grande valia e possibilita identificar uma situação falha, seja ela porque os valores dos parâmetros fornecidos não estavam corretos ou porque a função “&lt;strong&gt;Calcular&lt;/strong&gt;” não está realizando o cálculo de forma correta. Independente do motivo, o Assert garante que a inconsistência não seja levada adiante na execução do sistema. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Use Case 5: &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Esse próximo exemplo é um pouco semelhante ao caso acima, mas é uma situação comum.&lt;br /&gt;
Imagine que o sistema mantenha uma lista dos componentes relacionados com uma funcionalidade qualquer. A referência desses componentes são armazenadas em um objeto TList e em um dado momento é necessário obter o índice de um desses componente dentro da lista. &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.btnResultadoClick(Sender: TObject);&lt;br /&gt;
&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; lResultado: Integer;&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; lResultado := Self.FItems.IndexOf(Self.FSelected);&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;Assert&lt;/strong&gt;(lResultado &amp;gt;= 0, &lt;span style=&quot;color: blue;&quot;&gt;&#39;Componente não encontrado.&lt;/span&gt;&#39;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Aqui há a pressuposição de que o componente selecionado deve obrigatoriamente ter usa referência armazenada em um dos itens da lista. Caso isso não ocorra, há o indício de um bug.&lt;br /&gt;
Novamente temos um exemplo de programação defensiva que pode evitar dores de cabeça.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Use Case 6:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
A situação abaixo não é muito comum e, particularmente, nunca li qualquer relato, mas é uma prática que costumo utilizar quando estou implementando eventos de um formulário.&lt;br /&gt;
Vamos supor que um dado sistema deva possuir uma tela de cadastro de clientes, e uma das informações requeridas pelo cadastro é o estado civil.&lt;br /&gt;
Então, durante a fase de construção do formulário, você acrescente dois componentes TRadioButtom. Um para representar o estado civil ‘Solteiro’ e o outro para representar o estado civil ‘Casado’.&lt;br /&gt;
O sistema determina que se o cliente não for solteiro, alguns campos devem ser habilitados e preenchidos durante o cadastro.&lt;br /&gt;
Então você resolve implementar essa regra de negócio da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.rdbEstadoCivilClick(Sender: TObject); &lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;if&lt;/strong&gt; Sender = rdbCasado then &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tabConjugue.Visible := &lt;strong&gt;True&lt;/strong&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// Outras tarefas&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;end&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;else&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tabConjugue.Visible := &lt;strong&gt;False&lt;/strong&gt;; &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Ou seja, você compartilha o mesmo evento &lt;em&gt;OnClick&lt;/em&gt; com os dois componentes &lt;em&gt;TRadioButtom&lt;/em&gt;, tornando visível uma parte do formulário caso o componente &lt;em&gt;rdbCasado&lt;/em&gt; esteja marcado.&lt;br /&gt;
Depois de um tempo você julga necessário acrescentar outro estado civil (Viúvo) e, então, insere um novo TRadioButtom e associa o mesmo método ao evento OnClick deste novo componente.&lt;br /&gt;
Se você esquecer-se de modificar o código prevendo essa nova condição, o sistema não irá falhar e, dependendo do caso, pode ser facilmente detectado em testes funcionais. Entretanto, o uso de assertivas aqui pode economizar um tempo considerável e tornar a vida da equipe de testes mais tranqüila.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; TfrmPrincipal.rdbEstadoCivilClick(Sender: TObject); &lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;Assert((Sender = rdbCasado) &lt;strong&gt;or&lt;/strong&gt; (Sender = rdbSolteiro));&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;if&lt;/strong&gt; Sender = rdbCasado then &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;begin&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tabConjugue.Visible := True; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// Outras tarefas&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;end&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;strong&gt;else&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tabConjugue.Visible := False; &lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Aqui o Assert está pressupondo que esse evento só será gerado pelos componentes “&lt;em&gt;rdbCasado&lt;/em&gt;” e “&lt;em&gt;rdbSolteiro&lt;/em&gt;”.&lt;br /&gt;
Assim, se outro componente fosse associado com esse método, a assertiva irá lembrar-te de que algo está faltando.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Use Case 7:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
A criação de componentes ou de classes persistentes (que herdam de TPersistent) exige a implementação do método &lt;em&gt;Assign&lt;/em&gt;, cuja finalidade é copiar os dados de um outro objeto de mesmo tipo (ou não) para as respectivas propriedades.&lt;br /&gt;
Durante a fase de criação dessas classes é muito comum ocorrer constantes modificações na lista de propriedades, o que exige a atualização do método Assign. No entanto, muitas vezes você não atualiza o método Assign imediatamente após ter acrescentado novas propriedades, deixando para um momento mais apropriado.&lt;br /&gt;
Então outras tarefas surgem e os métodos de importação/exportação ficam desatualizados.&lt;br /&gt;
Vamos analisar o exemplo abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;TTeste = &lt;strong&gt;class&lt;/strong&gt;(TPersistent) &amp;nbsp; &lt;strong&gt;private&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FID: integer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FNome: string;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;strong&gt;public&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;property&lt;/strong&gt; ID:&amp;nbsp;&amp;nbsp; integer read FID;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;property&lt;/strong&gt; Nome: string&amp;nbsp; read FNome write FNome;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;procedure&lt;/strong&gt; AssignTo(Dest: TPersistent); override;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;implementation&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;procedure&lt;/strong&gt; TTeste.AssignTo(Dest: TPersistent);&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp; Assert(Dest &amp;lt;&amp;gt; nil);&lt;br /&gt;
&amp;nbsp; Assert(Dest.inheritsFrom(TTeste));&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;Assert(Dest.InstanceSize = 16, ‘A classe TTeste foi modificada, revise o método Tteste.AssignTo()!’);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; TTeste(Dest).FID&amp;nbsp;&amp;nbsp; :=&amp;nbsp;Self.FID;&lt;br /&gt;
&amp;nbsp; TTeste(Dest).FNome := Self.FNome;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Observe o Assert que está em cor vermelha. Se uma nova propriedade fosse acrescentada à classe, o Assert notificaria que o método &lt;strong&gt;Assign&lt;/strong&gt; está desatualizado (logicamente quando ele fosse chamado).&lt;br /&gt;
É claro que fazer uma validação utilizando o &lt;strong&gt;InstanceSize&lt;/strong&gt; da classe não irá identificar todos os tipos de mudanças. Você poderia, por exemplo, modificar o tipo da propriedade “&lt;strong&gt;FID&lt;/strong&gt;” para ShortInt e acrescentar outra propriedade, também ShortInt, que e o tamanho da classe permaneceria os mesmos 16 bytes.&lt;br /&gt;
Mesmo assim, a assertiva é de grande ajuda. Principalmente em caso onde há dependência de classes.&lt;br /&gt;
Métodos de exportação e importação também são exemplos semelhantes onde esse mesmo caso se aplica.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Customizando o Assert&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
Até agora vimos diversas situações que podemos empregar o uso do Assert para identificar falhas ou nos ajudar a revisar trechos de código fonte que são dependentes de alguma recurso (classe, record, ...).&lt;br /&gt;
Para a maioria das necessidades dos desenvolvedores/testers, o uso padrão do comado Assert já é suficiente, mas este comando ainda guarda um recurso muito interessante, que é a sua customização.&lt;br /&gt;
Sempre que um asserção é levantada, o Delphi executa a rotina referenciada pela variável &lt;strong&gt;&lt;em&gt;AssertErrorProc&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;
A variável &lt;em&gt;AssertErrorProc&lt;/em&gt; está localizada na unit &lt;em&gt;System&lt;/em&gt; e é, na verdade, um ponteiro para uma função com a seguinte assinatura:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure (const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);&lt;/strong&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Isso significa que você pode escrever o seu próprio tratador de Assertivas bastando. escrever uma rotina com a mesma assinatura e atribui-la para a variável global &lt;em&gt;AssertErrorProc&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&lt;strong&gt;procedure&lt;/strong&gt; MeuTratador(const Message, Filename: string; LineNumber: integer; ErrorAddr: Pointer);&lt;br /&gt;
&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;// Seu código fonte.&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;AssertErrorProc&lt;/strong&gt; := MeuTratador;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Talvez você se pergunte: “Mas para que eu necessitaria implementar um tratador de assertiva?”&lt;br /&gt;
Há algumas situações que podem ser muito úteis como por exemplo o envio de um email de notificação para o time desenvolvimento; manter um log de falhas em arquivo; automatizar alguma ação relacionada a testes; abrir um ocorrência de falhas em um sistema externo;...</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/4241830761992799765/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/4241830761992799765?isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4241830761992799765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/4241830761992799765'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/10/assertivas-boas-praticas-de-programacao.html' title='Assertivas - Boas práticas de programação'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDwkQxWjhaesuPjKdheXuB1MRMvlFJyYkv4J9wenT4Ixm7SG-3cgZjM623_3gR25h1DLL16HA9j4gzsAurkfG1JpxhT5hLJKzcU-5iRsMHoZ936ZPJ4ZzCdbcYpF-fVeFCbw49W-g1FuR5/s72-c/Assert01.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5705369278220614252</id><published>2009-09-24T12:39:00.001-03:00</published><updated>2009-09-24T12:42:40.307-03:00</updated><title type='text'>Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 4)</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;1. Overview&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Trac é uma simples ferramenta, open source e de interface web para controle de mudanças em projetos de desenvolvimento de software. O objetivo do software é ajudar o desenvolvedor a rastrear essas mudanças, entender o porquê de cada uma e qual o seu impacto no projeto como um todo.&lt;br /&gt;
&lt;br /&gt;
A finalidade desse documento não é falar sobre os recursos e funcionalidades da ferramenta (onde maiores detalhes podem ser encontrados no link &lt;a href=&quot;http://pt.wikipedia.org/wiki/Trac&quot;&gt;http://pt.wikipedia.org/wiki/Trac&lt;/a&gt;), mas descrever o passo-a-passo necessário para instalar essa magnífica ferramenta e integrá-la com o repositório do subversion e ao VisualSVN Server.&lt;br /&gt;
&lt;br /&gt;
No site official do VisualSVN (&lt;a href=&quot;http://www.visualsvn.com/server/trac&quot;&gt;http://www.visualsvn.com/server/trac&lt;/a&gt;) é disponibilizado uma versão pré-configurada do Trac juntamente como o passo-a-passo necessário para integrá-lo ao VisualSVN Server. No entanto, apesar desse caminho ser relativamente mais simples, é provável haver situações que você necessite realizar upgrades, acréscimo/remoção de plugins, migração de banco de dados e outras tarefas que exigirá um conhecimento maior sobre o processo, os componentes instalados e suas funcionalidades.&lt;br /&gt;
&lt;br /&gt;
Pensando nisso, esse documento não usará de atalhos ou simplificações e o passo-a-passo da instalação e integração da ferramenta Trac será detalhado de uma forma completa, descrevendo as razões para as respectivas escolhas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;2. Considerações&lt;/span&gt;&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
A ferramenta Trac foi desenvolvida na linguagem de programação Python e conta com uma gama variada de plugins. Os plugins também são desenvolvidos em Python. No entanto, é comum um determinado plugin suportar uma ou outra versão do Python, limitando seu uso. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Além disso, muitos plugins também só podem ser integrados a versões específicas do Trac.&lt;br /&gt;
&lt;br /&gt;
Antes de iniciar a instalação dos softwares requisitos, é importante avaliar quais os plugins deseja instalar ao Trac de forma a escolher adequadamente a versão do Python e de outros softwares requisitos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Passo 1 – Instalação do Python&lt;/strong&gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
A versão atual do Trac (0.11.5) requer a versão 2.3 até 2.6 do Python. A recomendação aqui é utilizar a versão 2.5 devido à maior compatibilidade e suporte por parte dos plugins e drivers.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Apesar de esse documento utilizar tal versão, novamente destaco a importância de avaliar a compatibilidade exigida pelos demais softwares/plugins que serão integrados.&lt;br /&gt;
&lt;br /&gt;
Mais especificamente falando, será usado a versão 2.5 em vez da 2.5.&lt;strong&gt;4&lt;/strong&gt; (mais recente) porque um dos drivers necessários (mod_python 3.3.1) está, atualmente,&amp;nbsp;disponível para tal release. Essa questão será novamente abordada em outro tópico.&lt;br /&gt;
&lt;br /&gt;
A instalação pode ser baixada através do link: &lt;a href=&quot;http://www.python.org/ftp/python/2.5/python-2.5.msi&quot;&gt;http://www.python.org/ftp/python/2.5/python-2.5.msi&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Por padrão, a instalação assume o diretório C:\Python25 como o local onde serão descompactados os arquivos. No entanto usaremos o path &lt;strong&gt;C:\Program Files\Python\&lt;/strong&gt;.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;O processo é simples bastando apenas avançar as abas da instalação (Next, Next, Finish).&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;Passo 1.1 – System Path&lt;/strong&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Nas variáveis de ambiente do Windows, acrescente o caminho da instalação do Python no &lt;em&gt;System Path&lt;/em&gt;. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Também será necessário adicionar uma variável de ambiente “&lt;strong&gt;PYTHONHOME&lt;/strong&gt;” com o caminho da instalação do Python.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqP4d3M7rVqLZg4yoonocggaeiWuFfb4EdPOADD6DY60pwzEBqoQO1fzCgjlTjxF35F4-HHo_kKrgVMsRDb7X4_zQUNUwnQmtSCdyQxx3SU6cGGOzC3gvZhh6VewEky2l2HuFdJzPigJwc/s1600-h/System+path.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqP4d3M7rVqLZg4yoonocggaeiWuFfb4EdPOADD6DY60pwzEBqoQO1fzCgjlTjxF35F4-HHo_kKrgVMsRDb7X4_zQUNUwnQmtSCdyQxx3SU6cGGOzC3gvZhh6VewEky2l2HuFdJzPigJwc/s400/System+path.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;Passo 2 – Instalação do SetupTools&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O SetupTools é um coleção de ferramentas para o &lt;em&gt;Python distutils&lt;/em&gt; que permite a criação e distribuição de pacotes Python mais facilmente.&lt;br /&gt;
&lt;br /&gt;
Necessitaremos desse pacote para a instalação de plugins e, inclusive, a própria ferramenta Trac.&lt;br /&gt;
&lt;br /&gt;
A instalação pode ser feita através de forma automática, utilizando a instalação binária, ou de forma manual.&lt;br /&gt;
&lt;br /&gt;
Particularmente eu recomendo a instalação manual porque essa opção elimina a possibilidade de você instalar uma versão inadequada ou não suportada pela versão do Python. Nesse caso, será necessário baixar o &lt;a href=&quot;http://peak.telecommunity.com/dist/ez_setup.py&quot;&gt;bootstrap module&lt;/a&gt; e copia-lo para a pasta &lt;strong&gt;scripts&lt;/strong&gt;, no diretório de instalação do Python (C:\Program Files\Python\Scripts).&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ cd c:\Program Files\Python&lt;br /&gt;
$ md Scripts&lt;br /&gt;
$ cd Scripts&lt;br /&gt;
$ ez_setup.py&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O script ez_setup.py irá fazer o download e instalar a versão adequada do SetupTools.&lt;br /&gt;
O resultado da execução desse script deve ser semelhante à apresentada abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;C:\Program Files\Python\scripts&amp;gt;ez_setup.py&lt;br /&gt;
Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9-py&lt;br /&gt;
2.5.egg&lt;br /&gt;
Processing setuptools-0.6c9-py2.5.egg&lt;br /&gt;
Copying setuptools-0.6c9-py2.5.egg to c:\program files\python\lib\site-packages&lt;br /&gt;
Adding setuptools 0.6c9 to easy-install.pth file&lt;br /&gt;
Installing easy_install-script.py script to C:\Program Files\Python\Scripts&lt;br /&gt;
Installing easy_install.exe script to C:\Program Files\Python\Scripts&lt;br /&gt;
Installing easy_install-2.5-script.py script to C:\Program Files\Python\Scripts&lt;br /&gt;
Installing easy_install-2.5.exe script to C:\Program Files\Python\Scripts&lt;br /&gt;
&lt;br /&gt;
Installed c:\program files\python\lib\site-packages\setuptools-0.6c9-py2.5.egg&lt;br /&gt;
Processing dependencies for setuptools==0.6c9&lt;br /&gt;
Finished processing dependencies for setuptools==0.6c9&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Como dito acima, pode-se optar pela instalação binária. Nesse caso, será necessário baixar a versão do SetupTools compatível com a versão do Python.&lt;br /&gt;
&lt;br /&gt;
No link &lt;a href=&quot;http://pypi.python.org/pypi/setuptools&quot;&gt;http://pypi.python.org/pypi/setuptools&lt;/a&gt; é possível encontrar a instalação binária for MS Windows.&lt;br /&gt;
Concluído o download, o processo de instalação é igualmente simples (Next, Next, Finish). A versão utilizada na criação desse tutorial é a 0.6c9 e foi baixada desse &lt;a href=&quot;http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9.win32-py2.5.exe&quot;&gt;link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrFPjBl0e7EP0EvDJq5yhxMLR0nQY60UDR6kd13ggywVFQitqhtPVNPJhaZomXhZX-zGgXzjhNsrCGN1w1nLjCRb1NlPv_F8ObHk2kxTR8auoSkmwo-p5rI3_OeEkTlD7TqzwGLoqTCpo6/s1600-h/SetupTools.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrFPjBl0e7EP0EvDJq5yhxMLR0nQY60UDR6kd13ggywVFQitqhtPVNPJhaZomXhZX-zGgXzjhNsrCGN1w1nLjCRb1NlPv_F8ObHk2kxTR8auoSkmwo-p5rI3_OeEkTlD7TqzwGLoqTCpo6/s400/SetupTools.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Após a instalação, confirme a existência do subdiretório Scripts e, dentro dele, o arquivo &lt;strong&gt;easy_install.exe&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
OBS: É necessário que seja dado permissão de administrador para a instalação (&lt;em&gt;Run as Administrator&lt;/em&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 2.1 – Path&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Acrescente o subdiretório Scripts (C:\Program Files\Python\Scripts) no system path, igualmente como feito no passo 1.1.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 3 – Instalação do Genshi&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
A instalação pode ser feita através do SetupTools ou através da instalação binária.&lt;br /&gt;
Em caso de ser feita através do SetupTools, basta abrir um prompt de comandos (aberto com privilégio de Administrador) e digitar:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install Genshi&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFarVYApxTjdNr1ZCL1HF-7BeWHxndeIkwKJSVsz1xZL03f8QdEDoMG1Rhho7Kig8LNJ2r8eqloTpk_3mIKmQdHCNHNBQhafB_L6AUDPa6vTbWRij4VBKojze_uFx_i95UQrr8_5CXUuPX/s1600-h/Genshi.phg.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFarVYApxTjdNr1ZCL1HF-7BeWHxndeIkwKJSVsz1xZL03f8QdEDoMG1Rhho7Kig8LNJ2r8eqloTpk_3mIKmQdHCNHNBQhafB_L6AUDPa6vTbWRij4VBKojze_uFx_i95UQrr8_5CXUuPX/s400/Genshi.phg.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Se desejar a instalação binária, faça o download pelo &lt;a href=&quot;http://ftp.edgewall.com/pub/genshi/Genshi-0.5.1.win32-py2.5.exe&quot;&gt;link&lt;/a&gt; e instale-o normalmente (com privilégio de Administrador).&lt;br /&gt;
&lt;br /&gt;
Também há outras formas. Se achar necessário, consulte esse &lt;a href=&quot;http://genshi.edgewall.org/wiki/Documentation/install.html&quot;&gt;site&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
OBS: A imagem acima mostra a instação bem sucedida do Genshi utilizando o SetupTools. No entanto, após concluir toda as etapas de instalação e acessar o Trac via web browser, o módulo de interpretação do python (mod_python) notificou erro informando que o Genshi não estava instalado. O problema só foi solucionado utilizando a instalação binária.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 4 – ClearSilver&lt;/span&gt;&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
O ClearSilver é uma linguagem neutra para system de template HTML. Sua instalação é opcional, mas é requerida para alguns plugins.&lt;br /&gt;
&lt;br /&gt;
Durante a criação desse tutorial, tentou-se realizar a instalação através do comando “&lt;em&gt;easy_install ClearSilver&lt;/em&gt;”. O SetupTools fez o download da versão 0.10.1, mas falhou ao instalar o pacote. A solução foi utilizar a url completa para o pacote de versão 0.10.4 para python 2.5.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install &lt;a href=&quot;http://www.clearsilver.net/downloads/win32/clearsilver-0.10.4-py2.5-win32.egg&quot;&gt;http://www.clearsilver.net/downloads/win32/clearsilver-0.10.4-py2.5-win32.egg&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 5 – Instalando Banco de Dados&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Será necessária a instalação de um banco de dados na qual o Trac usará para seu funcionamento. Atualmente é oferecido suporte ao &lt;a href=&quot;http://sqlite.org/&quot;&gt;SQLite&lt;/a&gt;, &lt;a href=&quot;http://www.postgresql.org/&quot;&gt;PostgresSQL&lt;/a&gt; e &lt;a href=&quot;http://mysql.com/&quot;&gt;MySQL&lt;/a&gt;. Isso porque o Python possui drives para apenas esses três banco de dados, sendo o driver para MySQL ainda experimental.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.1 – Drive para PostgresSQL&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizar o PostgresSQL como gerenciador de banco de dados no Track, é necessário a instalação do driver &lt;strong&gt;pyPgSQL&lt;/strong&gt; e do pacote &lt;strong&gt;mxDataTime&lt;/strong&gt; e são detalhados nos sub-tópicos abaixo.&lt;br /&gt;
&lt;br /&gt;
Apesar dos procedimentos de instalação ser simples, em diversos outros momentos onde optei por utilizar o PostgreSQL, enfrentei diversos problemas e conflitos. Por isso, sugiro o uso do SQLite que é bem mais flexível, principalmente em caso de migração.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.1.1 – O gerenciador de banco de dados&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Se você já possui o PostgreSQL instalado, pule essa etapa. Caso contrário acesse o link &lt;a href=&quot;http://www.postgres.org/&quot;&gt;http://www.postgres.org/&lt;/a&gt; e baixe a versão desejada.&lt;br /&gt;
Mas antes de fazer o download, leia o próximo tópico.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.1.2 – Driver pyPgSQL&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
A versão do drive pyPgSQL a ser instada depende da versão do gerenciador de banco de dados e da versão do Python.&lt;br /&gt;
No link &lt;a href=&quot;http://www.stickpeople.com/projects/python/win-psycopg/&quot;&gt;http://www.stickpeople.com/projects/python/win-psycopg/&lt;/a&gt; você encontra uma tabela de downloads que, atualmente, disponibiliza a versão 2.0.12 para o Python 2.5 (usado nesse documento) e para o PostgreSQL 8.4.0 (&lt;a href=&quot;http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.0.12.win32-py2.5-pg8.4.0-release.exe&quot;&gt;link direto&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
OBS.: A instalação binária deve ser executada com permissões de administrador.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.1.3 – Instalando mxDateTime&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
O mxDateTime implementa novos tipos de objetos: DateTime, DateTimeDelta e RelativeDateTime e varias outras ferramentas destas for tornar fácil a conversar em formatos date/time. Esse pacote é uma exigência do drive pyPgSQL.&lt;br /&gt;
Com a instalação do SetupTools, basta executar o seguinte comando no prompt:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;easy_install egenix-mx-base&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Em caso de falha, é possível fazer o download da instalação binária (para download link &lt;a href=&quot;http://www.egenix.com/products/python/mxBase/&quot;&gt;aqui&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
OBS.: Mais uma vez lembrando de que é requerida permissão de administrador para a instalação binária.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.2 – Drive para SQLite&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
No caso de você optar pelo SQLite, o processo é mais simples.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Passo 5.2.1 – O gerenciador de banco de dados&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Esse gerenciador de banco de dados é muito simples (nem mesmo requer um instalador).&lt;br /&gt;
&lt;strong&gt;a)&lt;/strong&gt; Acesse o site oficial (&lt;a href=&quot;http://www.sqlite.org/&quot;&gt;http://www.sqlite.org/&lt;/a&gt;) e faça o download da versão for Windows mais recente. Atualmente a versão disponível é a 3.6.17 (&lt;a href=&quot;http://www.sqlite.org/sqlite-3_6_17.zip&quot;&gt;link direto&lt;/a&gt;);&lt;br /&gt;
&lt;strong&gt;b)&lt;/strong&gt; Crie uma pasta chamada “SQLite” em “C:\Program Files” e descompacte o arquivo dentro dessa pasta;&lt;br /&gt;
&lt;strong&gt;c)&lt;/strong&gt; Por último, acrescente &lt;strong&gt;C:\Program Files\SQLite&lt;/strong&gt; no path do sistema (semelhante ao tópico 1.1)&lt;br /&gt;
Uma outra sugestão, em vez de criar um diretório específico para o SQLite, você pode copia-lo para, por exemplo, o diretório de instalação do Python (que já está referenciado no system path).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 5.2.2 – Drive pySQLite&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
É necessário instalar o drive pySQLite no Python. Essa instalação pode ser feita manualmente (recomendável) ou automática, através de uma instalação binária.&lt;br /&gt;
Se optar por fazer manualmente (processo mais simples) abra um prompt de comandos com privilégio de administrador e simplesmente digite o comando abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install pysqlite&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Além de mais simples e rápido, e modo remove a possibilidade de você instalar uma versão incompatível com a do Python.&lt;br /&gt;
&lt;br /&gt;
A instalação binária pode ser encontrada nesse &lt;a href=&quot;http://oss.itsystementwicklung.de/trac/pysqlite/&quot;&gt;link&lt;/a&gt;. Deve observar que é necessário a instalar o drive correspondente à versão do Python que foi instalado, que nesse caso é a 2.5 (&lt;a href=&quot;http://oss.itsystementwicklung.de/download/pysqlite/2.5/2.5.5/pysqlite-2.5.5.win32-py2.5.exe&quot;&gt;link direto&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePK6AaU3ncaMn1AUQL9j_tRvKJmRpWHkj93jquPQ84ehkt25o-6_VH17pKghP8jh3A86cW_NXH9WGjOwybJKNxWW5ATRFVasW29NU-m6TRqowrp7_MFtpu9bw2rzBZ4q8kAszB6GeVNqM/s1600-h/SQLite.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePK6AaU3ncaMn1AUQL9j_tRvKJmRpWHkj93jquPQ84ehkt25o-6_VH17pKghP8jh3A86cW_NXH9WGjOwybJKNxWW5ATRFVasW29NU-m6TRqowrp7_MFtpu9bw2rzBZ4q8kAszB6GeVNqM/s400/SQLite.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 6 – SVN Python&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
A instalação dos pacotes de acesso e gerenciamento do repositório svn no python é um dos requisitos obrigatórios e deve considerar a versão do servidor Apache que está instalado e também a versão do Python. E como esse tutorial é destinado a integrar o Trac no VisualSVN Server (mas especificamente a versão 2.0.6 do VisualSVN Server), então você deverá optar por uma instalação com suporte ao Apache 2.2.x.&lt;br /&gt;
&lt;br /&gt;
Isso porque o VisualSVN Server (versão 2.0.6) é composto pelo Apache/2.2.13 (Win32) DAV/2 SVN/1.6.5 mod_ssl/2.2.13 OpenSSL/0.9.8k.&lt;br /&gt;
&lt;br /&gt;
Esse pacote pode ser acrescentado ao Python através de uma instalação binária ou de forma manual (usando o SetupTools), mas deve-se adotar uma instalação compatível com a versão do Subversion (que nesse caso é a 1.6.5) e a versão do Python (2.5).&lt;br /&gt;
&lt;br /&gt;
O instalador é encontrado no mesmo site do Subversion, descrito no tópico acima (&lt;a href=&quot;http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&quot;&gt;http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&lt;/a&gt;) ou pelo &lt;a href=&quot;http://subversion.tigris.org/files/documents/15/46527/svn-python-1.6.5.win32-py2.5.exe&quot;&gt;link direto&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
OBS: É requerido “&lt;em&gt;Run as administrator&lt;/em&gt;”.&lt;br /&gt;
&lt;br /&gt;
Se preferir, pode fazer a instalação através do SetupTools:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install -Z http://subversion.tigris.org/files/documents/15/46527/svn-python-1.6.5.win32-py2.5.exe&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 7 - Módulo mod_python&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Esse módulo é particularmente necessário para o Apache HTTP Server e deve ser compatível com a versão do python e do próprio Apache instalado (v2.2.13 – VisualSVN Server).&lt;br /&gt;
&lt;br /&gt;
O site oficial (&lt;a href=&quot;http://www.modpython.org/&quot;&gt;http://www.modpython.org/&lt;/a&gt;) redireciona para a página de download de módulos do Apache (&lt;a href=&quot;http://httpd.apache.org/modules/python-download.cgi&quot;&gt;http://httpd.apache.org/modules/python-download.cgi&lt;/a&gt;). A versão atual 3.3.1 é destinada ao Apache HTTP Server 2.0 e 2.2 (que é o nosso caso). &lt;a href=&quot;http://linorg.usp.br/apache/httpd/modpython/win/3.3.1/mod_python-3.3.1.win32-py2.5-Apache2.2.exe&quot;&gt;Link direto&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Antes de fazer a instalação é recomendável criar uma pasta chamada “modules” no diretório de instalação do VisualSVN Server. Isso porque o instalador do mod_python irá solicitar, em um dado momento, que informe o diretório de instalação do Apache. No entanto, o VisualSVN Server tem uma estrutura de diretório levemente diferente da do Apache, e isso inclui não possuir a pasta “modules” para onde o instalador irá copiar o módulo &lt;strong&gt;mod_python.so&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ cd c:\Program Files\VisualSVN Server\&lt;br /&gt;
$ md modules&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI-bzFj7BiYY9OEimZ1jHo4Zb1Z6mA7bjpXEegXTK5XK2gRCX4u1CU7eLnTVip6gXirncOYL83ZFKvjxdlEKMkrP-CkMMNMXkms-tTbt1WO02duqfK5p7yxuwtF8cibnCcWdouxp_LckuA/s1600-h/mod_python.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI-bzFj7BiYY9OEimZ1jHo4Zb1Z6mA7bjpXEegXTK5XK2gRCX4u1CU7eLnTVip6gXirncOYL83ZFKvjxdlEKMkrP-CkMMNMXkms-tTbt1WO02duqfK5p7yxuwtF8cibnCcWdouxp_LckuA/s400/mod_python.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
OBS: Se após concluída todas as etapas de instalação do Trac ou em um upgrade for exibida a mensagem abaixo no web browser, isso é um forte indicativo de que necessite instalar/reinstalar o mod_python.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;Warning: Can&#39;t synchronize with the repository (Unsupported version control system &quot;svn&quot;: &quot;No module named svn&quot;). Look in the Trac log for more information.&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 8 – Trac&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 8.1 – Instalando o Track&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Para instalar o Track você pode fazer através da instalação binária (), ou então através do SetupTools.&lt;br /&gt;
Através do SetupTools basta executar o comando abaixo no prompt de comandos.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install Trac&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Também pode-se utilizar o link do repositório subversion.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ easy_install http://svn.edgewall.org/repos/trac/tags/trac-0.11&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC9wFmbFRq7vE53f9kS98jNPnhxX1r6Ge88SQ1hqgmAGdeWyNel-cgRRG7XNDzyiJL93lwmZPf1JnmYicNvHeaMKqL5zYpA5gkmNuXU-3BMZtkcEy6waDZ1LjPZubmPEOLgZzxHkNvDGmF/s1600-h/Trac.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;180&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC9wFmbFRq7vE53f9kS98jNPnhxX1r6Ge88SQ1hqgmAGdeWyNel-cgRRG7XNDzyiJL93lwmZPf1JnmYicNvHeaMKqL5zYpA5gkmNuXU-3BMZtkcEy6waDZ1LjPZubmPEOLgZzxHkNvDGmF/s320/Trac.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
OBS: O prompt de comandos deve ser aberto com privilégios de administrador.&lt;br /&gt;
&lt;br /&gt;
Vá até o diretório C:\Program Files\Python\Tools\Scripts e execute o comando:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ cd C:\Program Files\Python\Tools\Scripts&lt;br /&gt;
$ python setup.py install&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 8.2 – Trac-Admin&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
O Trac environment é onde serão armazenadas as informações sobre Wiki pages, Tickets, Reports, Settings, etc. Um environment é basicamente um diretório que contém um arquivo de configuração específico juntamente com vários outros arquivos e diretórios.&lt;br /&gt;
&lt;br /&gt;
Para exemplificação, nosso &lt;em&gt;projeto&lt;/em&gt; será criado no caminho “D:\Repositories\Trac”. Esse diretório deve ser manualmente criado.&lt;br /&gt;
&lt;br /&gt;
Criado o diretório, vamos criar um novo ambiente usando &lt;strong&gt;trac-admin&lt;/strong&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ trac-admin D:\Repositories\Trac\MyProject initenv&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
O trac-admin irá solicitar informações necessárias para criar o ambiente, tal como nome do projeto, string de conexão com a base de dados, repositório, ...&lt;br /&gt;
&lt;br /&gt;
Para exemplificar usaremos o projeto “&lt;strong&gt;MyProject&lt;/strong&gt;”. Assim, quando solicitado informe:&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Passo 8.2.1 – Se estiver usando PostgresSQL&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Project Name[My Project]: &lt;strong&gt;MyProject&lt;/strong&gt;&lt;br /&gt;
Database connection string [sqlite:db/trac.db]: &lt;strong&gt;postgres://tracuser:tracpass@localhost:5432/trac&lt;/strong&gt;&lt;br /&gt;
Repository type [svn]: &lt;strong&gt;svn&lt;/strong&gt;&lt;br /&gt;
Path to repository [/path/to/repos]: &lt;strong&gt;D:\Repositories\SVN\MyProject&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJsFD7i8jHUP7kUor6yinuzMu6429BrA5w0fIGT4hf3dUEps-9PLBPiic_eQC4BarbebYhL5hidy8ot86JIy2VGF_z2l_E3Y5iTHRKRoBqqyO2wicO9q7eyb8QODYVNyAI8wrJ5HhT1E8j/s1600-h/Trac+initenv.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJsFD7i8jHUP7kUor6yinuzMu6429BrA5w0fIGT4hf3dUEps-9PLBPiic_eQC4BarbebYhL5hidy8ot86JIy2VGF_z2l_E3Y5iTHRKRoBqqyO2wicO9q7eyb8QODYVNyAI8wrJ5HhT1E8j/s400/Trac+initenv.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
OBS: A string de conexão com o banco de dados especifica: O usuário &lt;strong&gt;tracuser&lt;/strong&gt;, cuja senha é &lt;strong&gt;tracpass&lt;/strong&gt;, tem acesso à base de dados &lt;strong&gt;trac&lt;/strong&gt; cuja conexão é feita através o hostname &lt;strong&gt;localhost&lt;/strong&gt; e porta &lt;strong&gt;5432&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Tanto o usuário quanto a base de dados devem ser previamente criados pela ferramenta DB administrativa de sua preferência.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Passo 8.2.2 – Se estiver usando SQLite&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Project Name[My Project]: &lt;strong&gt;MyProject&lt;/strong&gt;&lt;br /&gt;
Database connection string [sqlite:db/trac.db]: &lt;strong&gt;sqlite:db/myproject.db&lt;/strong&gt;&lt;br /&gt;
Repository type [svn]: &lt;strong&gt;svn&lt;/strong&gt;&lt;br /&gt;
Path to repository [/path/to/repos]: &lt;strong&gt;D:\Repositories\SVN\MyProject&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlDPNur4pPr7pXvy1B01WS2KOs07iV3mBJlqA2_fdGsS7odP8OrR9K1uvVTqNo0cUuoRYEPHOTS7fUPE484vEqfM6UZ64EYxT_He7vmfe7aUUKWaxdeOv0WvydasxZlS0nnlZkukmwoP8J/s1600-h/Trac+finished.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlDPNur4pPr7pXvy1B01WS2KOs07iV3mBJlqA2_fdGsS7odP8OrR9K1uvVTqNo0cUuoRYEPHOTS7fUPE484vEqfM6UZ64EYxT_He7vmfe7aUUKWaxdeOv0WvydasxZlS0nnlZkukmwoP8J/s320/Trac+finished.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;Passo 8.3 – Execução do Servidor Standalone&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Após a criação do ambiente trac, você pode facilmente acessar a interface web através da execução do standalone server &lt;strong&gt;tracd&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ tracd --port 8000 D:\Repositories\Trac\MyProject&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
No browser digite: &lt;strong&gt;http://127.0.0.1:8000/&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 8.4 – Firewall / Permissões para o Python&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Quando você inicializar o servidor em modelo standalone pela primeira vez, o firewall do Windows 7 irá questiolá-lo sobre o tipo de permissão que o Python deverá receber.&lt;br /&gt;
&lt;br /&gt;
Uma tela semelhante à imagem abaixo será exibida.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivtfWkvAL-ki-mGSDfvIILiaKLRxiL1D2Q3z1zmH-A5BekQ-628Zhfk5KyyGezC7hxRuxAXyl_2lDO40MObQ6_EXN8N2ffpSJ0Emh3_slx_ODNrYqj_JkNlJC9EdLmKjUoK-2J-0ssKsiy/s1600-h/Firewall.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivtfWkvAL-ki-mGSDfvIILiaKLRxiL1D2Q3z1zmH-A5BekQ-628Zhfk5KyyGezC7hxRuxAXyl_2lDO40MObQ6_EXN8N2ffpSJ0Emh3_slx_ODNrYqj_JkNlJC9EdLmKjUoK-2J-0ssKsiy/s320/Firewall.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Marque das duas opções (como é mostrado na imagem) e clique no botão “&lt;strong&gt;Allow access&lt;/strong&gt;”.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 8.5 – Criando repositório svn&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ao acessar &lt;a href=&quot;http://127.0.0.1:8000/MyProject/&quot;&gt;http://127.0.0.1:8000/MyProject/&lt;/a&gt; pelo browser, provavelmente será exibida a seguinte mensagem:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;Warning: Can&#39;t synchronize with the repository (D:/Repositories/SVN/MyProject does not appear to be a Subversion repository.). Look in the Trac log for more information.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Essa mensagem é porque o repositório svn (&lt;em&gt;MyProject&lt;/em&gt;) não foi criado.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;$ cd c:\Repositories&lt;br /&gt;
$ &lt;strong&gt;svnadmin&lt;/strong&gt; create c:\Repositories\MyProject&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Passo 9 – Configurando o VisualSVN Server&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Esse capítulo é dedicado a configuração do VisualSVN Server para integrar a ferramenta Trac. E os passos abaixo foram descritos considerando a versão 2.0.7 do VisualSVN Server.&lt;br /&gt;
Essa versão utiliza o Apache 2.2.13 e o Subversion 1.6.5.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Passo 9.1 - Arquivo vsvnvars.bat&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
No arquivo &lt;strong&gt;vsvnvars.bat&lt;/strong&gt;, localizado em C:\Program Files\VisualSVN Server\, acrescente uma linha contendo: set &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;PYTHONHOME=c:\Program Files\Python&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;@echo off&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;set PYTHONHOME=c:\Program Files\Python&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
set PATH=%~dp0bin;%PATH%&lt;br /&gt;
&lt;br /&gt;
IF &quot;%1&quot; == &quot;&quot; GOTO welcome&lt;br /&gt;
%*&lt;br /&gt;
&lt;br /&gt;
GOTO end&lt;br /&gt;
&lt;br /&gt;
:welcome&lt;br /&gt;
echo Welcome to VisualSVN Server command prompt!&lt;br /&gt;
echo Use &#39;svn help&#39;, &#39;svnadmin help&#39; and &#39;svnlook help&#39; for more information.&lt;br /&gt;
echo Type &#39;exit&#39; to exit.&lt;br /&gt;
GOTO end&lt;br /&gt;
&lt;br /&gt;
:end&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;Passo 9.2 - Configurando httpd-custom.conf&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Em C:\Program Files\VisualSVN Server\conf, abra o arquivo httpd-custom.conf e acrescente no final as seguintes linhas:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;LoadModule python_module modules/mod_python.so&lt;br /&gt;
LoadModule authz_user_module bin/mod_authz_user.so&lt;br /&gt;
&amp;lt;Location /trac&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;SetHandler&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mod_python&lt;br /&gt;
&amp;nbsp;&amp;nbsp;PythonInterpreter main_interpreter&lt;br /&gt;
&amp;nbsp; PythonHandler&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trac.web.modpython_frontend&lt;br /&gt;
&amp;nbsp; PythonOption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TracEnvParentDir D:\Repositories\Trac&lt;br /&gt;
&amp;nbsp; PythonOption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TracUriRoot /trac&lt;br /&gt;
&amp;nbsp; PythonDebug&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; AuthName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;Trac&quot;&lt;br /&gt;
&amp;nbsp; AuthType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Basic&lt;br /&gt;
&amp;nbsp; AuthBasicProvider file&lt;br /&gt;
&amp;nbsp; AuthUserFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;D:/Repositories/SVN/htpasswd&quot;&lt;br /&gt;
&amp;nbsp; Require valid-user&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Agora basta resetar o VisualSVN Server.</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5705369278220614252/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5705369278220614252?isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5705369278220614252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5705369278220614252'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/09/windows-7-visualsvn-server-openssl_24.html' title='Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 4)'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqP4d3M7rVqLZg4yoonocggaeiWuFfb4EdPOADD6DY60pwzEBqoQO1fzCgjlTjxF35F4-HHo_kKrgVMsRDb7X4_zQUNUwnQmtSCdyQxx3SU6cGGOzC3gvZhh6VewEky2l2HuFdJzPigJwc/s72-c/System+path.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-8593409811418829755</id><published>2009-09-23T09:15:00.000-03:00</published><updated>2009-09-23T09:15:07.664-03:00</updated><title type='text'>Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;1. SVN Client / Tourtoise&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwy4IL4T4TPJI3dFLG5skCE2wagaXJTjWB3WbqKt424XaICBoLDojZg4bFDp1cdfUuU-r8QsgU52CtpygtYPIo0C8U6rX6Ag6fxFAymObWIG8DzgLlzVrINcpNG-ygJq6FkrGVMxXN3zAD/s1600-h/Tortoise+-+Menu.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwy4IL4T4TPJI3dFLG5skCE2wagaXJTjWB3WbqKt424XaICBoLDojZg4bFDp1cdfUuU-r8QsgU52CtpygtYPIo0C8U6rX6Ag6fxFAymObWIG8DzgLlzVrINcpNG-ygJq6FkrGVMxXN3zAD/s400/Tortoise+-+Menu.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;O TortoiseSVN é desenvolvido pela Tigris.org, um consórcio que desenvolve soluções open source. Este software é classificado como &quot;Windows Explorer Shell Extension&quot;, e uma vez instalado, acrescenta uma opção do menu contextual do Windows Explorer (menu exibido com o clique do botão direito do mouse) apresentando todas as tarefas de controle de versão poderá executar.&lt;br /&gt;
&lt;br /&gt;
Essa ferramenta é muito prática, devido sua integração com o Windows Explorer. Se preferir, pode utilizar um client de linha de comando.&lt;br /&gt;
&lt;br /&gt;
Esse documento não irá detalhar os recursos e funcionalidades do Tortoise, mas sim como configurar o sistema para utilizar o certificado client automaticamente.&lt;br /&gt;
&lt;br /&gt;
Devido ao VisualSVN Server estar configurado para exigir uma conexão SSL e, consequentemente, solicitar um certificado de cliente, em toda operação que exigir leitura ou escrita no repositório svn, o tortoise irá apresentar um dialog solicitando que você informe o caminho onde o certificado client (arquivo .pfx) encontra-se e, posteriormente, a senha de proteção deste certificado.&lt;br /&gt;
&lt;br /&gt;
Para evitar que tortoise sempre solicite o certificado será necessário modificar o arquivo de configuração do subversion (servers). Esse arquivo está localizado em &lt;b&gt;%APPDATA%\Subversion&lt;/b&gt; sob o nome “&lt;b&gt;servers&lt;/b&gt;” (não possui extenção).&lt;br /&gt;
&lt;br /&gt;
O diretório &lt;b&gt;%APPDATA%&lt;/b&gt; é relativo ao sistema operacional, ao idioma do sistema operacional e ao usuário logado. Por exemplo, se você estiver usando Windows XP, uma possível de localização é: &lt;i&gt;C:\Documents and Settings\lovatof\Application Data\Subversion&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Em caso de dúvida, basta digitar &lt;b&gt;%APPDATA%&lt;/b&gt; [ENTER] no Windows Explorer e ele expandirá essa variável de ambiente para o correspondente valor.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo “&lt;b&gt;servers&lt;/b&gt;” e localize a linha onde aparece “&lt;b&gt;[groups]&lt;/b&gt;”.&lt;br /&gt;
&lt;br /&gt;
O trecho abaixo é um exemplo de configuração que você pode utilizar como base.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;[groups] &lt;br /&gt;
flovatosvn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = flovatosvn.myserver.com.br&lt;br /&gt;
local &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= localhost &lt;br /&gt;
&lt;br /&gt;
[flovatosvn] &lt;br /&gt;
ssl-client-cert-file &amp;nbsp; &amp;nbsp; = C:\Program Files\VisualSVN Server\bin\Cert\Fabius.pfx &lt;br /&gt;
ssl-client-cert-password = [minha senha]&lt;br /&gt;
ssl-trust-default-ca &amp;nbsp; &amp;nbsp; = yes &lt;br /&gt;
http-compression &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = yes &lt;br /&gt;
http-timeout &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 300 &lt;br /&gt;
&lt;br /&gt;
[local] &lt;br /&gt;
ssl-client-cert-file &amp;nbsp; &amp;nbsp; = C:\Program Files\VisualSVN Server\bin\Cert\Fabius.pfx &lt;br /&gt;
ssl-client-cert-password = [Minha Senha]&lt;br /&gt;
ssl-trust-default-ca &amp;nbsp; &amp;nbsp; = yes &lt;br /&gt;
http-compression &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = yes &lt;br /&gt;
http-timeout &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 300&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Em “&lt;b&gt;[groups]&lt;/b&gt;” foi acrescentado a definição de dois grupos (&lt;i&gt;flovatosvn &lt;/i&gt;e &lt;i&gt;local&lt;/i&gt;). Isso significa que quando o svn client (no caso o tortoise) for acessar um repositório svn utilizando o endereço localhost (por exemplo: &lt;a href=&quot;https://localhost:8443/svn&quot;&gt;https://localhost:8443/svn&lt;/a&gt;) deverá ser utilizado as configurações do grupo “&lt;b&gt;local&lt;/b&gt;”. O mesmo vale para o grupo “&lt;b&gt;flovatosvn&lt;/b&gt;”. &lt;br /&gt;
&lt;br /&gt;
O item “&lt;b&gt;ssl-client-cert-file&lt;/b&gt;” define a localização completa do certificado de cliente que deve ser utilizado para a autenticação. Nesse caso, modifique esse parâmetro para refletir a condição definida em seu ambiente de trabalho.&lt;br /&gt;
&lt;br /&gt;
O item “&lt;b&gt;ssl-client-cert-password&lt;/b&gt;” é utilizado para armazenar a senha de proteção do certificado. Particularmente eu não recomendo ignorar esse item de configuração por questões de segurança. No entanto, se não for especificado o tortoise irá solicitar tal senha sempre que um acesso ao repositório for realizado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;2. PHP&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O suporte ao PHP é um requisito para o funcionamento do WebSVN que será abordado no capítulo abaixo. Além disso, o uso do&amp;nbsp;PHP pode estender à outros frameworks ou mesmo implementações internas.&lt;br /&gt;
&lt;br /&gt;
As etapas abaixos descreve o que deve ser feito a instalação/configuração do PHP5 no Windows&amp;nbsp;7 com foco ao VisualSVN Server, no entanto esse mesmo passo-a-passo pode ser utilizado (como uma ou outra diferença) para a instalação em outra versão do MS Windows e/ou com foco no Apache.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;2.1 Instalação&lt;/strong&gt;&lt;br /&gt;
No site &lt;a href=&quot;http://br.php.net/&quot;&gt;http://br.php.net/&lt;/a&gt; você encontra informações mais detalhadas sobre o PHP. No nosso tutorial utilizaremos a versão mais recente e estável disponível (verão 5.2.11). Se desejar, faça o download pelo &lt;a href=&quot;http://br.php.net/get/php-5.2.11-Win32.zip/from/a/mirror&quot;&gt;link direto&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Crie uma pasta chamada “PHP” em &lt;em&gt;%ProgramFiles%&lt;/em&gt; (C:\Program Files\PHP) e descompacte a instalação para essa pasta.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;2.2 Configurando o PHP&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;a)&lt;/strong&gt; No diretório de instalação do PHP (&lt;em&gt;%ProgramFiles%\PHP&lt;/em&gt;), copie o arquivo &lt;strong&gt;php5ts.dll&lt;/strong&gt; para a pasta bin do diretório de instalação do VisualSVN Server (&lt;em&gt;%ProgramFiles%\VisualSVN Server\bin&lt;/em&gt;). Se você preferir pode copiá-lo para a pasta system32 do Windows (&lt;em&gt;%WINDIR%\system32&lt;/em&gt;) como a maioria dos tutoriais recomendam.&lt;br /&gt;
A finalidade é tornar acessível tal arquivo acrescentando-o em um local “visível” ao servidor http(s). Não cheguei a testar, mas acredito que simplesmente acrescentando a pasta C:\Program Files\PHP no &lt;em&gt;system path&lt;/em&gt; tenha o mesmo efeito.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;b)&lt;/strong&gt; Também no diretório de instalação do PHP você encontra o arquivo “&lt;strong&gt;php.ini&lt;/strong&gt;”. Abra-o e localize a linha onde aparece &lt;strong&gt;extension_dir = “./”&lt;/strong&gt; e modifique para &lt;strong&gt;extension_dir = “c:/Program Files/PHP/ext/”&lt;/strong&gt;, que é o caminho complato do diretório onde ficam as extensões do php (GD, MySQL, Postgres, ...).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;c)&lt;/strong&gt; Caso você tenha instalado MySQL, PostgresSQL, ou outro banco de dados e deseje acessá-los) via PHP, localize, por exemplo, a linha onde aparece &lt;strong&gt;;extension=php_mysql.dll&lt;/strong&gt; e remova o caracter ponto-e-vírgula (&lt;strong&gt;;&lt;/strong&gt;). Esse caracter tem funcionalidade de comentário (assim como &lt;strong&gt;//&lt;/strong&gt; ou &lt;strong&gt;/* */&lt;/strong&gt; em C/C++ ou &lt;strong&gt;{ }&lt;/strong&gt; em Delphi, ...).&lt;br /&gt;
Nesse exemplo, é acrescentado suporte ao MySQL, mas há diversas outras extensões que também estão comentadas, bastando remover o caracter de comentário (&lt;strong&gt;;&lt;/strong&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;d)&lt;/strong&gt; Seguindo o passo anterior, habilite suporte ao módulo “&lt;strong&gt;php_openssl.dll&lt;/strong&gt;”.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;e)&lt;/strong&gt; O arquivo de configuração do PHP (php.ini) possui muitos parâmetros que permite a customização. Assim, depois de feitas as devidas alterações, salve o arquivo e mova-o para a pasta &quot;&lt;strong&gt;conf&lt;/strong&gt;&quot; do diretório de instalação do VisualSVN (C:\Program Files\VisualSVN\conf).&lt;br /&gt;
Aqui a situação é a mesma, o objetivo é tornar o arquivo &quot;visível&quot; ao servidor web. Se preferir, pode mover o php.ini para o diretório de instalação do Windows (&lt;em&gt;%WINDIR%&lt;/em&gt;), como é recomendado pela maioria dos guias de instalação.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;2.3. Suporte ao PHP no VisualSVN Server&lt;/strong&gt;&lt;br /&gt;
No arquivo &lt;strong&gt;httpd-custom.conf&lt;/strong&gt;, acrescente as seguintes linhas:&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;LoadModule php5_module &quot;C:/Program Files/PHP/php5apache2_2.dll&quot;&lt;br /&gt;
AddType application/x-httpd-php .php&lt;br /&gt;
AddType application/x-httpd-php-source .phps&lt;br /&gt;
&lt;br /&gt;
# configure the path to php.ini&lt;br /&gt;
PHPIniDir &quot;C:/Program Files/PHP&quot;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
No arquivo &lt;strong&gt;httpd.conf&lt;/strong&gt;, localize a linha onde aparece “&amp;lt;&lt;strong&gt;ifmodule dir_module&amp;gt;&lt;/strong&gt;” e modifique a instrução &lt;strong&gt;Directoryindex&lt;/strong&gt; como aparece abaixo. &lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;lt;ifmodule dir_module&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectoryIndex index.html &lt;span style=&quot;color: red;&quot;&gt;index.php default.php main.php&lt;/span&gt;&lt;br /&gt;
&amp;lt;/ifmodule&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Isso fará com que o servidor reconheça os arquivos &lt;em&gt;index.php&lt;/em&gt;, &lt;em&gt;default.php&lt;/em&gt; e &lt;em&gt;main.php&lt;/em&gt; a um diretório aberto. Apesar desses nomes de arquivos serem largamente utilizado, não é obrigatório que utilize-os, você pode incluir &lt;em&gt;inicio.php&lt;/em&gt; ou qualquer outro nome de sua escolha.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;2.4 Testando o PHP no browser&lt;/strong&gt;&lt;br /&gt;
Acrescentado a configuração acima listada, é necessório um reset o VisualSVN Server para que este inicialize o PHP.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;a)&lt;/strong&gt; Para verificar se o PHP está sendo carregado e funcionando corretamente, crie um arquivo com extensão &lt;strong&gt;.php&lt;/strong&gt; (exemp: &lt;strong&gt;info.php&lt;/strong&gt;) com o seguinte conteúdo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;lt;? phpinfo(); ?&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;b)&lt;/strong&gt; Salve esse arquivo na pasta &quot;&lt;strong&gt;htdocs&lt;/strong&gt;&quot; do VisualSVN &lt;em&gt;(%ProgramFiles\VisualSVN Server\htdocs&lt;/em&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;c)&lt;/strong&gt; Em seguida, abra um webbrowser e digite: &lt;a href=&quot;https://localhost:8443/info.php&quot;&gt;https://localhost:8443/info.php&lt;/a&gt;. Se tudo correr bem, deve se exibido uma tela com as informações sobre a configuração do PHP:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;3. WebSVN&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O WebSVN, como o próprio nome sugere, é um solução open source que permite a navegação no repositório svn através de uma interface web.&lt;br /&gt;
&lt;br /&gt;
É uma solução cuja proposta se assemelha em muito com ao do VisualSVN Server (no quesito web browser), mas possui uma interface melhorada e com vários recursos.&lt;br /&gt;
&lt;br /&gt;
Acesse o site oficial (&lt;a href=&quot;http://www.websvn.info/&quot;&gt;http://www.websvn.info/&lt;/a&gt;) para obter maiores detalhes. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;3.1 Instalação&lt;/strong&gt; &lt;br /&gt;
O processo de instalação é muito simples. &lt;br /&gt;
&lt;br /&gt;
Faça o download a versão mais recente (&lt;a href=&quot;http://www.websvn.info/download/&quot;&gt;http://www.websvn.info/download/&lt;/a&gt; ) e descompacte o arquivo para uma pasta qualquer dentro de &lt;strong&gt;htdocs&lt;/strong&gt; do VisualSVN &lt;em&gt;(%ProgramFiles\VisualSVN Server\htdocs&lt;/em&gt;).&lt;br /&gt;
&lt;br /&gt;
Se preferir pode deixar o diretório com o nome da pasta contida no arquivo de instalação (websvn-2.2.1), mas sugiro renomeá-lo para &lt;strong&gt;websvn&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;3.2. Configurando o acesso ao WebSVN&lt;/strong&gt;&lt;br /&gt;
Caso deseje posteriormente utilizar o WebSVN acrescente o trecho abaixo no final do arquivo (&lt;strong&gt;https.conf&lt;/strong&gt;) ou, o mais recomendado, acrescente as linhas abaixo no arquivo &lt;strong&gt;httpd-custom.conf&lt;/strong&gt;.&lt;br /&gt;
&lt;div style=&quot;background: #dbe5f1; border-bottom: windowtext 1pt dotted; border-left: windowtext 1pt dotted; border-right: windowtext 1pt dotted; border-top: windowtext 1pt dotted; font-family: &#39;Courier New&#39;; font-size: 9pt; mso-background-themecolor: accent1; mso-background-themetint: 51; mso-border-alt: dotted windowtext .5pt; mso-element: para-border-div; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; padding-top: 1pt;&quot;&gt;&amp;lt;location /websvn/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNListParentPath&amp;nbsp; on&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNParentPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;D:/Repositories/SVN/&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNIndexXSLT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;/svnindex.xsl&quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;Subversion Web Browsing&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Basic&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthBasicProvider&amp;nbsp; file&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthUserFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;D:/Repositories/SVN/htpasswd&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthzSVNAccessFile &quot;D:/Repositories/SVN/authz&quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Require valid-user&lt;br /&gt;
&amp;lt;/location&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
OBS: O WebSVN faz uso do php para o sincronismo com o svn, além da construção dinâmica das próprias páginas. Sendo assim, é necessário que o PHP esteja instalado, conforme descrito no capítulo anterior.&lt;br /&gt;
&lt;br /&gt;
Agora, resete o VisualSVN Server (ou Apache) e digite no browser: &lt;a href=&quot;https://localhost:8443/websvn/&quot;&gt;https://localhost:8443/websvn/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Provavelmente irá aparecer a seguinte mensagem: &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;File &quot;includes\config.php&quot; does not exists, please create one. The example is located under &quot;includes\distconfig.php&quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Em &lt;em&gt;%ProgramFiles%\VisualSVN Server\htdocs\websvn\include&lt;/em&gt;, você encontrará um arquivo chamado “&lt;strong&gt;distconfig.php&lt;/strong&gt;”, faça uma cópia desse arquivo com o nome “&lt;strong&gt;config.php&lt;/strong&gt;”.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo config.php e acrescente a linha “&lt;strong&gt;$config-&amp;gt;parentPath(&#39;D:\\Repositories\\svn&#39;);&lt;/strong&gt;”. Logicamente, se o repositório svn em sua máquina não está localizado em D:\Repositories\svn, altere para refletir o caminho correto.&lt;br /&gt;
&lt;br /&gt;
Salve o arquivo; volte ao browser e tente novamente. Voai lá.&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/8593409811418829755/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/8593409811418829755?isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8593409811418829755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8593409811418829755'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/09/windows-7-visualsvn-server-openssl_23.html' title='Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 3)'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwy4IL4T4TPJI3dFLG5skCE2wagaXJTjWB3WbqKt424XaICBoLDojZg4bFDp1cdfUuU-r8QsgU52CtpygtYPIo0C8U6rX6Ag6fxFAymObWIG8DzgLlzVrINcpNG-ygJq6FkrGVMxXN3zAD/s72-c/Tortoise+-+Menu.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-8094269726843119229</id><published>2009-09-14T14:53:00.000-03:00</published><updated>2009-09-14T14:53:22.850-03:00</updated><title type='text'>Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 2)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style=&quot;font-size: large;&quot;&gt;1. Certificado Digital – OpenSSL&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Esse tutorial descreverá como configurar o VisualSVN Server para utilizar certificados digitais e assegurar que não haja acessos indevidos.&lt;br /&gt;
&lt;br /&gt;
O objetivo é ter um certificado digital para cada usuário possibilitando o acesso dos mesmos ao repositório svn.&lt;br /&gt;
&lt;br /&gt;
Para a criação desses certificados digitais será utilizado a ferramenta OpenSSL que já vem incluso na instalação do VisualSVN Server.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;1.1. Preparando o Ambiente&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Antes de iniciar a criação dos certificados será necessário preparar um ambiente configurando-o adequadamente.&lt;br /&gt;
&lt;br /&gt;
Como o openssl será utilizado e é uma ferramenta de linha de comandos, utilizaremos o prompt de comandos para a execução dos scripts necessários.&lt;br /&gt;
&lt;br /&gt;
Para isso, abra um prompt de comandos com permissões de administrador (necessário no Windows Vista/7) e vá até o diretório &lt;strong&gt;bin&lt;/strong&gt; da instalação do VisualSVN (provavelmente em C:\Program Files\VisualSVN Server\bin).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;em&gt; 1.1.1. Estrutura de Diretórios/Arquivos&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Dentro do diretório bin deve-ser criar a seguinte estrutura de diretórios:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ-zBl0mPBfasDLB5OiAfo8Eb4VZm1AIVgUDXoHJaCUP4K0cxTmvZ-rxr96bhlF100ZXXqIquoYefQfXbS8-x1lXGavGVK2Lg4CWzRSTu_8ti2gUMK73wMia64Weyz9PVGoYaLT7HXlfIB/s1600-h/OpenSSL+1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ-zBl0mPBfasDLB5OiAfo8Eb4VZm1AIVgUDXoHJaCUP4K0cxTmvZ-rxr96bhlF100ZXXqIquoYefQfXbS8-x1lXGavGVK2Lg4CWzRSTu_8ti2gUMK73wMia64Weyz9PVGoYaLT7HXlfIB/s320/OpenSSL+1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Você pode criar essa estrutura de diretórios com o Windows Explorer ou com o próprio prompt de comandos.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Crie um arquivo chamado &lt;strong&gt;Serial&lt;/strong&gt; (sem extensão) com o conteúdo “&lt;strong&gt;01&lt;/strong&gt;” (sem as aspas duplas) e grave-o no diretório &lt;strong&gt;.\Cert\demoCA\&lt;/strong&gt;.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Crie um arquivo chamado &lt;strong&gt;Index.txt&lt;/strong&gt; (vazio) gravando-o no diretório &lt;strong&gt;.\Cert\demoCA\&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
O script MS-DOS Batch abaixo cria a estrutura de diretórios.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;@&lt;/span&gt;ECHO OFF&lt;br /&gt;
&lt;br /&gt;
IF NOT EXIST &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%ProgramFiles%&lt;/span&gt;\VisualSVN Server\bin&quot; GOTO VSVN_NO_EXIT&lt;br /&gt;
&lt;br /&gt;
SET VSVN&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #7030a0;&quot;&gt;%ProgramFiles%&lt;/span&gt;\VisualSVN Server\bin&lt;br /&gt;
&lt;br /&gt;
IF NOT EXIST &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot; GOTO BIN_CLEAR&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DEL /S /Q /F &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\*.*&quot; &amp;gt; .\Log.txt&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHOICE /N /C:Y /T:1 /D:Y &amp;gt; .\Log.txt&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RD /S /Q &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:BIN_CLEAR&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot;&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA&quot;&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\certs&quot;&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\crt&quot;&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\newcerts&quot;&lt;br /&gt;
MD &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\private&quot;&lt;br /&gt;
ECHO 01&amp;gt;&quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\serial&quot;&lt;br /&gt;
@ECHO OFF&amp;gt;&quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert\demoCA\index.txt&quot;&lt;br /&gt;
&lt;br /&gt;
COPY .\openssl.config &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot; &amp;gt; .\Log.txt&lt;br /&gt;
COPY .\genCA.bat &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot; &amp;gt; .\Log.txt&lt;br /&gt;
COPY .\genClient.bat &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot; &amp;gt; .\Log.txt&lt;br /&gt;
COPY .\genServer.bat &quot;&lt;span style=&quot;color: #7030a0;&quot;&gt;%VSVN%&lt;/span&gt;\Cert&quot; &amp;gt; .\Log.txt&lt;br /&gt;
&lt;br /&gt;
DEL /Q .\Log.txt&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%&lt;br /&gt;
CD &quot;%ProgramFiles%\VisualSVN Server\bin\Cert&quot;&lt;br /&gt;
GOTO FIM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:VSVN_NO_EXIT&lt;/span&gt;&lt;br /&gt;
ECHO Diretório &quot;%ProgramFiles%\VisualSVN Server\bin&quot; não existente.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:FIM&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.1.2. Script de configuração&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Crie um arquivo chamado &lt;strong&gt;openssl.config&lt;/strong&gt; no diretório &lt;strong&gt;.\Cert\&lt;/strong&gt; com o conteúdo abaixo:&lt;br /&gt;
&lt;br /&gt;
File: &lt;strong&gt;openssl.config&lt;/strong&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#EXTENSION SYNTAX.&lt;br /&gt;
#ver arquivo openssl-extensions-sintaxe.txt&lt;br /&gt;
#&lt;br /&gt;
# OpenSSL example configuration file.&lt;br /&gt;
# This is mostly being used for generation of certificate requests.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# This definition stops the following lines choking if HOME isn&#39;t&lt;br /&gt;
# defined.&lt;/span&gt;&lt;br /&gt;
HOME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; .&lt;br /&gt;
RANDFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$ENV&lt;/span&gt;::HOME/.rnd&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Extra OBJECT IDENTIFIER info:&lt;br /&gt;
#oid_file&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = $ENV::HOME/.oid&lt;/span&gt;&lt;br /&gt;
oid_section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; new_oids&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# To use this configuration file with the &quot;-extfile&quot; option of the&lt;br /&gt;
# &quot;openssl x509&quot; utility, name here the section containing the&lt;br /&gt;
# X.509v3 extensions to use:&lt;br /&gt;
# extensions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&lt;br /&gt;
# (Alternatively, use a configuration file that has only&lt;br /&gt;
# X.509v3 extensions in its main [= default] section.)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ new_oids ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# We can add new OIDs in here for use by &#39;ca&#39; and &#39;req&#39;.&lt;br /&gt;
# Add a simple OID like this:&lt;br /&gt;
#testoid1=1.2.3.4&lt;br /&gt;
# FAKE OIDS CRIADOS A PARTIR DO OBJ_ID_KP DA PKIX (ver objects.h):&lt;/span&gt;&lt;br /&gt;
OBJ_id_kp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;= &lt;/span&gt;1.3.6.1.5.5.7.3&lt;br /&gt;
fake_oid_user_type1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;= &lt;/span&gt;${OBJ_id_kp}.999&lt;br /&gt;
fake_oid_user_type2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;= &lt;/span&gt;${OBJ_id_kp}.998&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Or use config file substitution like this:&lt;br /&gt;
# testoid2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ${testoid1}.5.6&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
####################################################################&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ ca ]&lt;/span&gt;&lt;br /&gt;
default_ca&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA_default &lt;span style=&quot;color: #999999;&quot;&gt;# The default ca section&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
####################################################################&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ CA_default ]&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
dir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; ./demoCA &lt;span style=&quot;color: #999999;&quot;&gt;# Where everything is kept&lt;/span&gt;&lt;br /&gt;
certs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/certs &lt;span style=&quot;color: #999999;&quot;&gt;# Where the issued certs are kept&lt;/span&gt;&lt;br /&gt;
crl_dir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/crl &lt;span style=&quot;color: #999999;&quot;&gt;# Where the issued crl are kept&lt;/span&gt;&lt;br /&gt;
database&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/index.txt &lt;span style=&quot;color: #999999;&quot;&gt;# database index file.&lt;/span&gt;&lt;br /&gt;
new_certs_dir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/newcerts &lt;span style=&quot;color: #999999;&quot;&gt;# default place for new certs.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
certificate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/cacert.pem &lt;span style=&quot;color: #999999;&quot;&gt;# The CA certificate&lt;/span&gt;&lt;br /&gt;
serial&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/serial &lt;span style=&quot;color: #999999;&quot;&gt;# The current serial number&lt;/span&gt;&lt;br /&gt;
crl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/crl.pem &lt;span style=&quot;color: #999999;&quot;&gt;# The current CRL&lt;/span&gt;&lt;br /&gt;
private_key&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/private/cakey.key &lt;span style=&quot;color: #999999;&quot;&gt;# The private key&lt;/span&gt;&lt;br /&gt;
RANDFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;$dir&lt;/span&gt;/private/.rand &lt;span style=&quot;color: #999999;&quot;&gt;# private random number file&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
x509_extensions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; serv_cert &lt;span style=&quot;color: #999999;&quot;&gt;# The extentions to add to the cert&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Comment out the following two lines for the &quot;traditional&quot;&lt;br /&gt;
# (and highly broken) format.&lt;/span&gt;&lt;br /&gt;
name_opt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; ca_default &lt;span style=&quot;color: #999999;&quot;&gt;# Subject Name options&lt;/span&gt;&lt;br /&gt;
cert_opt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; ca_default &lt;span style=&quot;color: #999999;&quot;&gt;# Certificate field options&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Extension copying option: use with caution.&lt;br /&gt;
# copy_extensions = copy&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs&lt;br /&gt;
# so this is commented out by default to leave a V1 CRL.&lt;br /&gt;
# (descomentei apesar do que esta dito acima):&lt;/span&gt;&lt;br /&gt;
crl_extensions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; crl_ext&lt;br /&gt;
&lt;br /&gt;
default_days&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 365 &lt;span style=&quot;color: #999999;&quot;&gt;# how long to certify for&lt;/span&gt;&lt;br /&gt;
default_crl_days&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt;&amp;nbsp; 30 &lt;span style=&quot;color: #999999;&quot;&gt;# how long before next CRL&lt;/span&gt;&lt;br /&gt;
default_md&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; md5 &lt;span style=&quot;color: #999999;&quot;&gt;# which md to use.&lt;/span&gt;&lt;br /&gt;
preserve&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt;&amp;nbsp; no &lt;span style=&quot;color: #999999;&quot;&gt;# keep passed DN ordering&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# A few difference way of specifying how similar the request should look&lt;br /&gt;
# For type CA, the listed attributes must be the same, and the optional&lt;br /&gt;
# and supplied fields are just that :-)&lt;/span&gt;&lt;br /&gt;
policy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; policy_match&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# For the CA policy&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ policy_match ]&lt;/span&gt;&lt;br /&gt;
countryName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; supplied&lt;br /&gt;
stateOrProvinceName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
organizationName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
organizationalUnitName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
commonName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; supplied&lt;br /&gt;
emailAddress&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# For the &#39;anything&#39; policy&lt;br /&gt;
# At this point in time, you must list all acceptable &#39;object&#39;&lt;br /&gt;
# types.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ policy_anything ]&lt;/span&gt;&lt;br /&gt;
countryName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
stateOrProvinceName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
localityName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
organizationName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
organizationalUnitName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt;&amp;nbsp;optional&lt;br /&gt;
commonName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; supplied&lt;br /&gt;
emailAddress&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; optional&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
####################################################################&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ req ]&lt;/span&gt;&lt;br /&gt;
default_bits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 1024&lt;br /&gt;
default_keyfile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; privkey.key&lt;br /&gt;
distinguished_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; req_distinguished_name&lt;br /&gt;
attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; req_attributes&lt;br /&gt;
x509_extensions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; v3_ca &lt;span style=&quot;color: #999999;&quot;&gt;# The extentions to add to the self signed cert&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Passwords for private keys if not present they will be prompted for&lt;br /&gt;
# input_password&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= secret&lt;br /&gt;
# output_password&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;= secret&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This sets a mask for permitted string types. There are several options.&lt;br /&gt;
# default: PrintableString, T61String, BMPString.&lt;br /&gt;
# pkix : PrintableString, BMPString.&lt;br /&gt;
# utf8only: only UTF8Strings.&lt;br /&gt;
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).&lt;br /&gt;
# MASK:XXXX a literal mask value.&lt;br /&gt;
# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings&lt;br /&gt;
# so use this option with caution!&lt;/span&gt;&lt;br /&gt;
string_mask&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; nombstr&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# req_extensions = v3_req # The extensions to add to a certificate request&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ req_distinguished_name ]&lt;/span&gt;&lt;br /&gt;
countryName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Country Name (2 letter code)&lt;br /&gt;
countryName_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; BR&lt;br /&gt;
countryName_min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 2&lt;br /&gt;
countryName_max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 2&lt;br /&gt;
&lt;br /&gt;
stateOrProvinceName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; State or Province Name (full name)&lt;br /&gt;
stateOrProvinceName_default&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Rio Grande do Sul&lt;br /&gt;
localityName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Locality Name (eg, city)&lt;br /&gt;
localityName_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Porto Alegre&lt;br /&gt;
0.organizationName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Organization Name (eg, company)&lt;br /&gt;
0.organizationName_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; My Company LTDA&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# we can do this but it is not needed normally :-)&lt;br /&gt;
#1.organizationName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= Second Organization Name (eg, company)&lt;br /&gt;
#1.organizationName_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = World Wide Web Pty Ltd&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
organizationalUnitName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Organizational Unit Name (eg, section)&lt;br /&gt;
organizationalUnitName_default &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Security&lt;br /&gt;
&lt;br /&gt;
commonName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Common Name (eg, YOUR name)&lt;br /&gt;
commonName_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; My CA&lt;br /&gt;
commonName_max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 64&lt;br /&gt;
emailAddress&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; Email Address&lt;br /&gt;
emailAddress_default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; email@server.com&lt;br /&gt;
emailAddress_max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 64&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# SET-ex3 = SET extension number 3&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ req_attributes ]&lt;/span&gt;&lt;br /&gt;
challengePassword&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; A challenge password&lt;br /&gt;
challengePassword_min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 4&lt;br /&gt;
challengePassword_max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 20&lt;br /&gt;
unstructuredName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; An optional company name&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ serv_cert ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# These extensions are added when &#39;ca&#39; signs a request.&lt;br /&gt;
&lt;br /&gt;
# This goes against PKIX guidelines but some CAs do it and some software&lt;br /&gt;
# requires this to avoid interpreting an end user certificate as a CA.&lt;/span&gt;&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:FALSE&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# Here are some examples of the usage of nsCertType. If it is omitted&lt;br /&gt;
# the certificate can be used for anything *except* object signing.&lt;br /&gt;
&lt;br /&gt;
# This is OK for an SSL server.&lt;br /&gt;
# nsCertType = server&lt;br /&gt;
&lt;br /&gt;
# For an object signing certificate this would be used.&lt;br /&gt;
# nsCertType = objsign&lt;br /&gt;
&lt;br /&gt;
# For normal client use this is typical&lt;br /&gt;
# nsCertType = client, email&lt;br /&gt;
&lt;br /&gt;
# and for everything including object signing:&lt;br /&gt;
# nsCertType = client, email, objsign&lt;br /&gt;
&lt;br /&gt;
# under ASN.1, the 0 bit would be encoded as 80&lt;/span&gt;&lt;br /&gt;
nsCertType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; 0x40&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This will be displayed in Netscape&#39;s comment listbox.&lt;/span&gt;&lt;br /&gt;
nsComment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &quot;OpenSSL Generated Certificate&quot;&lt;br /&gt;
&lt;br /&gt;
keyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyEncipherment, dataEncipherment, keyAgreement&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# PKIX recommendations harmless if included in all certificates.&lt;/span&gt;&lt;br /&gt;
subjectKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; hash&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid,issuer:always&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This stuff is for subjectAltName and issuerAltname.&lt;br /&gt;
# Import the email address.&lt;br /&gt;
# subjectAltName=email:copy&lt;br /&gt;
# An alternative to produce certificates that aren&#39;t&lt;br /&gt;
# deprecated according to PKIX.&lt;br /&gt;
# subjectAltName=email:move&lt;br /&gt;
&lt;br /&gt;
# Copy subject details&lt;br /&gt;
# issuerAltName=issuer:copy&lt;br /&gt;
&lt;br /&gt;
# Netscape extensions:&lt;/span&gt;&lt;br /&gt;
nsCaRevocationUrl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; http://www.cryptsoft.com/ca-crl.pem&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;#nsBaseUrl&lt;br /&gt;
#nsRevocationUrl&lt;br /&gt;
#nsRenewalUrl&lt;br /&gt;
#nsCaPolicyUrl&lt;br /&gt;
#nsSslServerName&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)&lt;/span&gt;&lt;br /&gt;
crlDistributionPoints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; URI:https://flovato.sytes.net:8443/crl.crl&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
#opcional, extended key usage que pode ser usada num WEB-server:&lt;/span&gt;&lt;br /&gt;
extendedKeyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; serverAuth, codeSigning, emailProtection&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
#ABAIXO ex. como seria para um ocsp server:&lt;br /&gt;
#extendedKeyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= serverAuth, 1.3.6.1.5.5.7.48.1.5&lt;br /&gt;
#ABAIXO para um usuario normal&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ cli_cert1 ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# obs- Esta secao usa fake_oid_user_type1 no extendedKeyUsage&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:FALSE&lt;br /&gt;
nsComment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &quot;OpenSSL Generated Certificate&quot;&lt;br /&gt;
subjectKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; hash&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid,issuer:always&lt;br /&gt;
keyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is the link where to get the latest CRL &lt;/span&gt;&lt;br /&gt;
crlDistributionPoints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; URI:https://flovato.sytes.net:8443/crl.crl&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
#extended key usage para um usuario client&lt;/span&gt;&lt;br /&gt;
extendedKeyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; clientAuth, codeSigning, emailProtection&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ cli_cert2 ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# obs- Esta secao usa fake_oid_user_type2 no extendedKeyUsage&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:FALSE&lt;br /&gt;
nsComment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &quot;OpenSSL Generated Certificate&quot;&lt;br /&gt;
subjectKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; hash&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid,issuer:always&lt;br /&gt;
keyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)&lt;/span&gt;&lt;br /&gt;
crlDistributionPoints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; URI:https://flovato.sytes.net:8443/crl.crl&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
#extended key usage para um usuario client&lt;/span&gt;&lt;br /&gt;
extendedKeyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; clientAuth, codeSigning, emailProtection&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ v3_req ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# Extensions to add to a certificate request&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:FALSE&lt;br /&gt;
keyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ v3_ca ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# Extensions for a typical CA&lt;br /&gt;
# PKIX recommendation.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; hash&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid:always,issuer:always&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is what PKIX recommends but some broken software chokes on critical&lt;br /&gt;
# extensions.&lt;br /&gt;
#basicConstraints = critical,CA:true&lt;br /&gt;
# So we do this instead.&lt;/span&gt;&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:true&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)&lt;/span&gt;&lt;br /&gt;
crlDistributionPoints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; URI:https://flovato.sytes.net:8443/crl.crl&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&lt;br /&gt;
# This is the link where we can get the issuer certificate&lt;br /&gt;
# issuerAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = URI:https://flovato.sytes.net:9999/certificado_ca.crt&lt;br /&gt;
&lt;br /&gt;
# Key usage: this is typical for a CA certificate. However since it will&lt;br /&gt;
# prevent it being used as an test self-signed certificate it is best&lt;br /&gt;
# left out by default.&lt;br /&gt;
# keyUsage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
# Some might want this also&lt;br /&gt;
# nsCertType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = sslCA, emailCA&lt;br /&gt;
&lt;br /&gt;
# Include email address in subject alt name: another PKIX recommendation&lt;br /&gt;
# subjectAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = email:copy&lt;br /&gt;
# Copy issuer details&lt;br /&gt;
# issuerAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = issuer:copy&lt;br /&gt;
&lt;br /&gt;
# DER hex encoding of an extension: beware experts only!&lt;br /&gt;
# obj=DER:02:03&lt;br /&gt;
# Where &#39;obj&#39; is a standard or added object&lt;br /&gt;
# You can even override a supported extension:&lt;br /&gt;
# basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = critical, DER:30:03:01:01:FF&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ crl_ext ]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;# CRL extensions.&lt;br /&gt;
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.&lt;br /&gt;
&lt;br /&gt;
# issuerAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = issuer:copy&lt;/span&gt;&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid:always,issuer:always&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #7030a0;&quot;&gt;[ usr_cert ]&lt;/span&gt;&lt;br /&gt;
basicConstraints&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; CA:FALSE&lt;br /&gt;
subjectKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; hash&lt;br /&gt;
authorityKeyIdentifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; keyid,issuer:always&lt;br /&gt;
nsComment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; &quot;OpenSSL Generated Certificate&quot;&lt;br /&gt;
subjectAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; email:copy&lt;br /&gt;
issuerAltName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;=&lt;/span&gt; issuer:copy&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;1.2. Criando o Certificado da Certificadora&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Para que os certificados dos usuários e do servidor possam ser assinados, é necessário criar um certificado auto-assinado. Para isso, vá até o diretório &lt;strong&gt;.\Cert\&lt;/strong&gt; e execute as etapas abaixo:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Criação do par de chaves RSA&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl genrsa -out chave_privada_ca.key 1024&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Copie o arquivo chave_privada_ca.key para .\demoCA\private\ &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;copy chave_privada_ca.key .\demoCA\private\cakey.key &lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Criação do certificado Root&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl req -new -x509 -config openssl.config -key chave_privada_ca.key -out certificado_ca.pem -days 3650&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; d) Copie o certificado para .\demoCA\ &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;copy certificado_ca.pem .\demoCA\cacert.pem&lt;/div&gt;&lt;br /&gt;
Obs.: O par de chaves RSA da certificadora não está protegido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;em&gt;1.2.1. Script&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo está um exemplo de shell script um pouco mais elaborado e possibilitando a definição de um password de proteção para as chaves RSA.&lt;br /&gt;
&lt;br /&gt;
File: &lt;strong&gt;genCA.bat&lt;/strong&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;@&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; OFF&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[1/4] - CRIANDO PAR DE CHAVES RSA DA CERTIFICADORA&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF &lt;/span&gt;&quot;&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;&quot; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; &quot;&quot; &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; RSA_NOPASS&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6;&quot;&gt;..\openssl&lt;/span&gt; genrsa -des -passout pass:&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt; -out chave_privada_ca.key 1024 &lt;span style=&quot;color: red;&quot;&gt;2&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; RSA_FIM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:RSA_NOPASS&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6;&quot;&gt;..\openssl&lt;/span&gt; genrsa -out chave_privada_ca.key 1024 &lt;span style=&quot;color: red;&quot;&gt;2&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:RSA_FIM&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[2/4] - Copiando Chaves RSA para .\demoCA\private\&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;COPY&lt;/span&gt; chave_privada_ca.key .\demoCA\private\cakey.key /y&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;1&amp;gt;&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO &lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[3/4] - CRIANDO CERTIFICADO ROOT&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;Sugestão: Country.: BR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #cccccc;&quot;&gt;State...: Rio Grade do Sul&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Locality: Porto Alegre&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Company.: Empresa LTDA&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Unit....: TI&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Common N: Minha CA&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Email...: email@servidor.com&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;-----------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF &lt;/span&gt;&quot;&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;&quot; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; &quot;&quot; &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; CA_NOPASS&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6;&quot;&gt;..\openssl&lt;/span&gt; req -new -x509 -config openssl.config -key chave_privada_ca.key -passin pass:&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt; -out certificado_ca.pem -days 3650&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; CA_EXIT&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:CA_NOPASS&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6;&quot;&gt;..\openssl&lt;/span&gt; req -new -x509 -config openssl.config -key chave_privada_ca.key -out certificado_ca.pem -days 3650&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:CA_EXIT&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[4/4] - Copiando certificado para .\demoCA\&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;COPY&lt;/span&gt; certificado_ca.pem .\demoCA\cacert.pem /y &lt;span style=&quot;color: red;&quot;&gt;1&amp;gt;&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... Sucesso. Certificado criado.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:FIM&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.3. Criando o Certificado do Servidor&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Durante a instalação do VisualSVN Server um certificado é automaticamente gerado. Este certificado é utilizado para as conexões https.&lt;br /&gt;
&lt;br /&gt;
Um novo certificado deverá ser criado e assinado pela “certificadora” que foi criada.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Criação do par de chaves RSA&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl genrsa -out server.key 1024&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Criação de uma requisição de certificado&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl req -new -config openssl.config -key server.key -out server.req&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Assinando a requisição com o certificado da “certificadora”&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl ca -config openssl.config -extensions usr_cert -out server.pem -in server.req&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; d) Exportando o certificado criado para um .cer&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl x509 -in server.pem -out server.cer -outform PEM&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.3.1. Script&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo está um exemplo de shell script (.bat).&lt;br /&gt;
&lt;br /&gt;
File: &lt;strong&gt;genServer.bat&lt;/strong&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;@&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;OFF&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF&lt;/span&gt; &quot;&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;&quot; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; &quot;&quot; GOTO SINTAXE&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[1/5] - CRIANDO PAR DE CHAVES RSA DO SERVIDOR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; genrsa -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key 1024 &lt;span style=&quot;color: red;&quot;&gt;2&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 GOTO FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[2/5] - CRIANDO REQUISIÇÃO DE CERTIFICADO PARA SERVIDOR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;Sugestão: Country.: BR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;State...: Rio Grade do Sul&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Locality: Porto Alegre&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Company.: Empresa LTDA&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Unit....: TI&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Common N: SVNServer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Email...: email@server.com&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;-----------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; req -new -config openssl.config -key &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.req&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 GOTO FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[3/5] - ASSINANDO A REQUISIÇÃO DE CERTIFICADO DO SERVIDOR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; ca -config openssl.config -extensions usr_cert -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.pem -in &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.req&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 GOTO FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[4/5] - EXPORTANDO CERTIFICADO (.CER)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; x509 -in &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.pem -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.cer -outform PEM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 GOTO FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[5/5] - GERANDO CERTIFICADO + PRIVATE KEY (.P12)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
copy &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key + &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.cer &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.p12 &lt;span style=&quot;color: red;&quot;&gt;1&amp;gt;&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 GOTO FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... Sucesso. Certificado do servidor criado.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
GOTO FIM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:SINTAXE&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;genServer [Filename]&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:FIM&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.3.2. Usando o novo certificado de servidor&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Criado o novo certificado, agora se deve configurar o VisualSVN Server para utilizá-lo.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Caso o servidor svn esteja rodando, pare a execução do serviço. Isso é feito no console de gerenciamento do VisualSVN Server através da opção &lt;strong&gt;Stop&lt;/strong&gt;, que é disponibilizada no menu de contexto ou através do menu &lt;strong&gt;Action&lt;/strong&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEVhDyyRqUmz9FjXAt37a0nc6M6XXADPw9ad_yPd2vth7SJBhMVrsygSP7aFMgieWjf0zDUTTVxO4ZZbmAIIX67yXvHeqOXiMAItzZizisUsuCPacLUPJ6GT59gFhs_eJzHmC7iCavTBdK/s1600-h/VisualSVN+Reset.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEVhDyyRqUmz9FjXAt37a0nc6M6XXADPw9ad_yPd2vth7SJBhMVrsygSP7aFMgieWjf0zDUTTVxO4ZZbmAIIX67yXvHeqOXiMAItzZizisUsuCPacLUPJ6GT59gFhs_eJzHmC7iCavTBdK/s400/VisualSVN+Reset.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Copie os arquivos &lt;strong&gt;server.key&lt;/strong&gt; e &lt;strong&gt;Server.cer&lt;/strong&gt;, para o subdiretório certs do diretório de instalação do VisualSVN Server (provavelmente &lt;em&gt;C:\Program Files\VisualSVN Server\certs&lt;/em&gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Localize no arquivo de configuração do VisualSVN Server (httpd.conf) as outra opção que especificam o certificado a chave privada do certificado digital padrão (server.pem) e substitua pelos arquivos anteriormente copiados.&lt;br /&gt;
&lt;br /&gt;
Para isso basta editar &lt;strong&gt;httpd.conf&lt;/strong&gt; modificando as linhas:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;SSLCertificateFile certs/server.pem&lt;br /&gt;
SSLCertificateKeyFile certs/server.pem&lt;/div&gt;por&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;SSLCertificateFile certs/server.&lt;span style=&quot;color: red;&quot;&gt;cer&lt;/span&gt;&lt;br /&gt;
SSLCertificateKeyFile certs/server.&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.4. Criando os Certificados dos Usuários&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
A criação dos certificados de usuários é muito semelhante à criação do certificado de servidor.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Criação do par de chaves RSA&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl genrsa -out cliente.key 1024&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Criação de uma requisição de certificado&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl req -new -config openssl.config -key cliente.key -out cliente.req&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Assinando a requisição com o certificado da “certificadora”&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl ca -config openssl.config -extensions cli_cert1 -out cliente.pem -in cliente.req&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; d) Exportando o certificado para o formato PFX&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;..\openssl pkcs12 -export -clcerts -in cliente.pem -inkey cliente.key -out cliente.pfx&lt;/div&gt;&lt;br /&gt;
OBS: O certificado no formato pkcs12 (.pfx) deve ser instalado no browser do cliente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.4.1. Script&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
File: &lt;strong&gt;genClient.bat&lt;/strong&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&lt;span style=&quot;color: #548dd4;&quot;&gt;@ECHO&lt;/span&gt; OFF&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF&lt;/span&gt; &quot;&lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;&quot; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; &quot;&quot; &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; SINTAXE&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[1/4] - CRIANDO PAR DE CHAVES RSA DO CLIENTE&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;***********************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; genrsa -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key 1024 &lt;span style=&quot;color: red;&quot;&gt;2&amp;gt;&lt;/span&gt; log.txt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[2/4] - CRIANDO REQUISIÇÃO DE CERTIFICADO PARA O CLIENTE&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;Sugestão: Country.: BR&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;State...: Rio Grade do Sul&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Locality: Porto Alegre&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Company.: Empresa LTDA&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Unit....: Developer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Common N: Fabius&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;Email...: flovato@empresa.com.br&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;-----------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; req -new -config openssl.config -key &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.req&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[3/4] - ASSINANDO O CERTIFICADO DO CLIENTE&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; ca -config openssl.config -extensions cli_cert1 -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.pem -in &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.req&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... OK&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;[4/4] - EXPORTANDO O CERTIFICADO NO FORMATO PFX&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;**************************************************&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;..\openssl&lt;/span&gt; pkcs12 -export -clcerts -in &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.pem -inkey &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.key -out &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt;.pfx&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;IF NOT&lt;/span&gt; &lt;span style=&quot;color: #e69138;&quot;&gt;%ERRORLEVEL%&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;==&lt;/span&gt; 0 &lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;... Sucesso. Certificado do cliente &lt;span style=&quot;color: #e69138;&quot;&gt;%1&lt;/span&gt; criado.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;GOTO&lt;/span&gt; FIM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:SINTAXE&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #548dd4;&quot;&gt;ECHO&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;genServer [Filename]&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;:FIM&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;2. Opções de configuração do Apache&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Antes de configurarmos o Apache (VisualSVN Server) é importante conhecer para que serve e como utilizar algumas das muitas opções de configuração do Apache.&lt;br /&gt;
&lt;br /&gt;
Esse documento se valerá de uma situação simples para o uso de certificados digitais/SSL. No entanto, é provável que configurações mais elaboradas sejam necessárias com o passar do tempo, e conhecer um pouco mais sobre tais opções certamente ajudará.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;SSLEngine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: Habilita/Desabilita o módulo SSL.&lt;br /&gt;
SSLProtocol&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: Tipos de protocolos SSL aceitos.&lt;br /&gt;
SSLCipherSuite&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: Tipos de ciphers utilizados na negociação&lt;br /&gt;
SSLVerifyClient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Determina a exigência de um certificado de cliente.&lt;br /&gt;
SSLVerifyDepth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: Nível de validação do certificado do cliente.&lt;br /&gt;
SSLCACertificateFile&amp;nbsp; : Certificado a ser utilizado para validar o cliente.&lt;br /&gt;
SSLCACertificatePath&amp;nbsp; : Caminho contendo todos os CA aceitas pelo servidor.&lt;br /&gt;
SSLCertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp; : Certificado do servidor.&lt;br /&gt;
SSLCertificateKeyFile : Chave privada do certificado do servidor.&lt;br /&gt;
SSLCARevocationFile&amp;nbsp;&amp;nbsp; : Lista de certificadoras revogadas.&lt;br /&gt;
SSLCARevocationPath&amp;nbsp;&amp;nbsp; : Caminho contendo todos os CA revogados pelo servidor.&lt;br /&gt;
SSLOptions +StdEnvVars: Exporta variáveis de ambiente para o PHP&lt;br /&gt;
SSLRequireSSL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Obriga conexão SSL (HTTPS).&lt;br /&gt;
SSLRequire&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Permite especificar requisitos para a conexão.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;3. Configurando o VisualSVN Server/Apache&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Após a criação dos certificados digitais (CA, Server e Client) o VisualSVN Server deverá ser configurado para que o mesmo passe a utiliza-los e a requisitar autenticação nos acessos feitos.&lt;br /&gt;
&lt;br /&gt;
Como já mencionado no tópico 1.3.2, deve-se substituir o certificado utilizado pelo VisualSVN pelo novo certificado que foi gerado nas etapas anteriores.&lt;br /&gt;
&lt;br /&gt;
Além disso, acesse o arquivo &lt;strong&gt;httpd.conf&lt;/strong&gt; (em C:\Program Files\VisualSVN Server\conf\). Localize as seguintes linhas:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&amp;lt;location ⁄svn⁄&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DAV svn&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNListParentPath&amp;nbsp; on&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNParentPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;D:/Repositories/&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SVNIndexXSLT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;/svnindex.xsl&quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;Subversion Repositories&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Basic&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthBasicProvider &amp;nbsp;file&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthUserFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;D:/Repositories/htpasswd&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AuthzSVNAccessFile &quot;D:/Repositories/authz&quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;require valid-user&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: red;&quot;&gt;SSLRequireSSL&lt;/span&gt;&lt;br /&gt;
&amp;lt;/location&amp;gt;&lt;/div&gt;&lt;br /&gt;
A opção “&lt;span style=&quot;color: red;&quot;&gt;SSLRequireSSL&lt;/span&gt;” instrui o servidor Apache a requerer conexão SSL (HTTPS). E a opção “&lt;span style=&quot;color: red;&quot;&gt;require valid-user&lt;/span&gt;”, como o próprio nome sugere, exige a identificação de um usuário válido (cuja lista está definida pela opção “&lt;span style=&quot;color: red;&quot;&gt;AuthUserFile&lt;/span&gt;”).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.1. Permissão a todos os browsers&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Por default, o VisualSVN Server vem configurado para permitir conexões apenas do Internet Explorer. No arquivo https.conf, localizado no subdiretório conf, comente (&lt;span style=&quot;color: red;&quot;&gt;#&lt;/span&gt;) as linhas referentes a opção &lt;strong&gt;SetEnvIf&lt;/strong&gt;. Isso permitirá que outros web browsers também possam acessar o repositório.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLEngine on&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLRandomSeed startup&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLRandomSeed connect&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLPassPhraseDialog&amp;nbsp;&amp;nbsp;&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLSessionCache&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;shm:C:/Repositories/ssl_scache&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLSessionCacheTimeout 300&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLMutex default&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;certs/server.cer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCertificateKeyFile&amp;nbsp; certs/server.key&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLProtocol&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -ALL +SSLv3 +TLSv1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCipherSuite&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;#&lt;/span&gt;&amp;nbsp;&amp;nbsp; SetEnvIf User-Agent &quot;.*MSIE.*&quot; \&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;#&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nokeepalive ssl-unclean-shutdown \&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;#&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; downgrade-1.0 force-response-1.0&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.2. Solicitação de Certificado de Cliente&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
O exemplo abaixo acrescenta quatro itens de configuração que instrui o servidor Apache.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #e4ebf4; border-bottom: blue 1px dotted; border-left: blue 1px dotted; border-right: blue 1px dotted; border-top: blue 1px dotted; font-family: Courier New; font-size: 9px;&quot;&gt;&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLEngine on&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLRandomSeed startup&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLRandomSeed connect&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLPassPhraseDialog&amp;nbsp;&amp;nbsp;&amp;nbsp; builtin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLSessionCache&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;shm:C:/Repositories/ssl_scache&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLSessionCacheTimeout 300&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLMutex default&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLVerifyClient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; require&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLVerifyDepth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCACertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp; certs/cacert.pem&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLOptions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +StdEnvVars&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;certs/server.cer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCertificateKeyFile&amp;nbsp; certs/server.key&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLProtocol&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -ALL +SSLv3 +TLSv1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SSLCipherSuite&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM&lt;br /&gt;
&lt;br /&gt;
#&amp;nbsp;&amp;nbsp; SetEnvIf User-Agent &quot;.*MSIE.*&quot; \&lt;br /&gt;
#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nokeepalive ssl-unclean-shutdown \&lt;br /&gt;
#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; downgrade-1.0 force-response-1.0&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;4. Acessando Repositório SVN via WebBrowser&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Concluído a configuração do VisualSVN Server, tente acessar o repositório SVN via web browser.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsFJkApsnMdw1GBMyYuA2XeLtcYZFTVftiNTgya9Ae9HaAGrJAz6c6fXPBzFlWzgPWebPNcKLQSY_H-2-xKKdsvfEtDckWRkLB45MCxzuJBAocgd5bsPxEEh-A5W6ee_AQittSINKd8Q74/s1600-h/Web+1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsFJkApsnMdw1GBMyYuA2XeLtcYZFTVftiNTgya9Ae9HaAGrJAz6c6fXPBzFlWzgPWebPNcKLQSY_H-2-xKKdsvfEtDckWRkLB45MCxzuJBAocgd5bsPxEEh-A5W6ee_AQittSINKd8Q74/s400/Web+1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Provavelmente será exibido uma tela semelhante a imagem&amp;nbsp;acima (case esteja utilizando o IExplorer como webbroser). Essa&amp;nbsp;falha é um indicativo que não há um certificado de cliente instalado e, nesse caso, crie um certificado de cliente conforme descrito no tópico 1.4 e instale-o no web browser.&lt;br /&gt;
&lt;br /&gt;
Criado o certificado com o openssl, o processo de instalação é trivial, bastando um duplo clique sobre o arquivo .pfx e um wizard de importação será apresentado. Como é exibido na imagem abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYOyNlFVVROXtKO-5WUz7kq402NXdRhsEvGZI0KXpTZmFIFd3N1QUKIDRIoD_F1CymK_SIsV9mSMVpXnQi5a1AMqnggD_9O3LL5-GmOZXrV1nP6-WFRY-sE4pBPcbeNv6Ub1tQ6t4FMa9N/s1600-h/Web+2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYOyNlFVVROXtKO-5WUz7kq402NXdRhsEvGZI0KXpTZmFIFd3N1QUKIDRIoD_F1CymK_SIsV9mSMVpXnQi5a1AMqnggD_9O3LL5-GmOZXrV1nP6-WFRY-sE4pBPcbeNv6Ub1tQ6t4FMa9N/s400/Web+2.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;
O wizard também irá solicitar a senha de proteção da chave privada. Essa é a “&lt;em&gt;phase&lt;/em&gt;” informada no processo de criação do certificado (imagem abaixo). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
É recomendado habilitar a opção “&lt;strong&gt;Enable strong private key protection&lt;/strong&gt;”.&lt;br /&gt;
&lt;br /&gt;
Também recomendo marcar a opção “&lt;strong&gt;Mark this key as exportable&lt;/strong&gt;” a qual será útil caso você perca seu arquivo .pfx, possibilitando exporta-lo do web browser.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiQsB61zJUuHpnbgEAUYbF6pshMJTH6B2gaeUP7zysayU234XpFyP6NdsvXmTc5vufXPIkPo2ZGnRWqim5uy81n3nwoysAJpqglI5k3LHpR-_xtwwitRl7yiWpN4pQTXaQ57Er3UH-p9-/s1600-h/Web+3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiQsB61zJUuHpnbgEAUYbF6pshMJTH6B2gaeUP7zysayU234XpFyP6NdsvXmTc5vufXPIkPo2ZGnRWqim5uy81n3nwoysAJpqglI5k3LHpR-_xtwwitRl7yiWpN4pQTXaQ57Er3UH-p9-/s320/Web+3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;
Após a instalação do certificado de cliente no web browser, tente acessar o repositorório svn novamente (&lt;a href=&quot;https://localhost:8443/svn&quot;&gt;https://localhost:8443/svn&lt;/a&gt;). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um novo dialog (&lt;strong&gt;Windows Security&lt;/strong&gt;) será apresentado solicitando que escolha o certificado que deve ser utilizado para a autenticação (conexão SSL - HTTPS). Observe a imagem abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMS7q1J5jYiiPTFlJGnfjIFpJwEGqdp4KMLn5KfAEIrF5xR2FBG3YerSuWrJgdnaf3A09qMwkmxHe_ggR7OFXgTN55xE-zJYniBG0PL7SZBd0mLJKGWSRbL0lW9-2pc6HXkN59EdmuMxfz/s1600-h/Web+4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMS7q1J5jYiiPTFlJGnfjIFpJwEGqdp4KMLn5KfAEIrF5xR2FBG3YerSuWrJgdnaf3A09qMwkmxHe_ggR7OFXgTN55xE-zJYniBG0PL7SZBd0mLJKGWSRbL0lW9-2pc6HXkN59EdmuMxfz/s400/Web+4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;
Se tudo correr bem, o browser irá apresentar uma notificação (warning) de segurança questionando a autenticidade do certificado. &lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeY0f3vVjYfir_o7Npg8MSaUXZTk0E9oBMtx8Mipy8CdzGxKlhhuWcCBqkWPvgnGtYCbZ80_JPF-aDWY68rW68628T-t_gkCsB2jteIyHXt1yWFW-7idQ08_hlZlFoQyQufVDlEdzOnbkX/s1600-h/Web+5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeY0f3vVjYfir_o7Npg8MSaUXZTk0E9oBMtx8Mipy8CdzGxKlhhuWcCBqkWPvgnGtYCbZ80_JPF-aDWY68rW68628T-t_gkCsB2jteIyHXt1yWFW-7idQ08_hlZlFoQyQufVDlEdzOnbkX/s400/Web+5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;
Essa mensagem é exibida porque o certificado não foi emitido por uma certificadora “&lt;em&gt;conhecida&lt;/em&gt;”. Ignore essa notificação e pressione o botão “&lt;strong&gt;Continue&lt;/strong&gt;”. &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRWx0MeDxElrzr5LWgA1DmDt-Yf54HGtQBpvEK7V0wKyf4W-lx5JaUkzxhdI1osss0VeKuxpokHmIKDtMwgqvmc9XujV8-7vLkcoebnrKv3kVa4Lz0UZpF_1kTh3RWPgmCARCsoaNSPZr/s1600-h/Web+6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRWx0MeDxElrzr5LWgA1DmDt-Yf54HGtQBpvEK7V0wKyf4W-lx5JaUkzxhdI1osss0VeKuxpokHmIKDtMwgqvmc9XujV8-7vLkcoebnrKv3kVa4Lz0UZpF_1kTh3RWPgmCARCsoaNSPZr/s400/Web+6.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Em seguida o servidor irá browser irá solicitar a identificação do usuário. &lt;br /&gt;
&lt;br /&gt;
Você deve informar um usuário e senha que foi previamente cadastrado no console de gerenciamento do VisualSVN Server.&lt;br /&gt;
&lt;br /&gt;
Enfim, após a entrada de um usuário e senha válido, será apresentado a página padrão VisualSVN Server listando todos os repositórios.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifiiRplOdy9o9eYXt4_0KbchQGPtaVpaT61UW9iG7gqd5VAPYfnUGd1v7b7gZhjfR8K8nRmbmOm3LMjSOja9Xg5WacyqO2XS9tC1vBL7tjSK8MhjrZ5RjDg9xvgTg_95Fll4nRa3OBQxG9/s1600-h/Web+7.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifiiRplOdy9o9eYXt4_0KbchQGPtaVpaT61UW9iG7gqd5VAPYfnUGd1v7b7gZhjfR8K8nRmbmOm3LMjSOja9Xg5WacyqO2XS9tC1vBL7tjSK8MhjrZ5RjDg9xvgTg_95Fll4nRa3OBQxG9/s400/Web+7.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/8094269726843119229/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/8094269726843119229?isPopup=true' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8094269726843119229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/8094269726843119229'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/09/windows-7-visualsvn-server-openssl.html' title='Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 2)'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ-zBl0mPBfasDLB5OiAfo8Eb4VZm1AIVgUDXoHJaCUP4K0cxTmvZ-rxr96bhlF100ZXXqIquoYefQfXbS8-x1lXGavGVK2Lg4CWzRSTu_8ti2gUMK73wMia64Weyz9PVGoYaLT7HXlfIB/s72-c/OpenSSL+1.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5394441407914227644.post-5688809416903491149</id><published>2009-08-29T14:30:00.035-03:00</published><updated>2009-09-12T12:19:45.336-03:00</updated><title type='text'>Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 1)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Esse artigo irá mostrar detalhadamente cada passo para a instalação e configuração do VisualSVN Server utilizando certificado digital e trabalhando integrado com a ferramenta Trac, no Windows 7.&lt;br /&gt;
&lt;br /&gt;
Essa primeira parte do artigo irá detalhar o processo de instalação e configuração do VisualSVN Server.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;1. Instalando o VisualSVN Server&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O VisualSVN Server é um pacote que contém tudo o que é necessário para instalar, configurar e gerenciar um servidor subversion para a plataforma Windows. Isto inclui o Subversion, Apache e um console de gerenciamento.&lt;br /&gt;
&lt;br /&gt;
O VisualSVN Server possibilita o uso de qualquer client Subversion para conexão ou um rápido acesso aos repositórios através de uma interface web (browser).&lt;br /&gt;
&lt;br /&gt;
Além disso, é 100% free.&lt;br /&gt;
&lt;br /&gt;
Faça o download no site &lt;a href=&quot;http://www.visualsvn.com/server/download/&quot;&gt;http://www.visualsvn.com/server/download/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.1. Iniciando a instalação&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhANXtjW2jFCW67WMOcHj_EUzpQ2tPtk8W3i085vto-7CsfzxlJvvQB9D31lKDYZGAlYH2adkldb5dpPNZ1M14ZECR3koZObf4YAnRsuem_YS3KywEds2klMmiLZZtF7bNn2sHHnkfhcKbf/s1600-h/VisualSVN+Install+1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhANXtjW2jFCW67WMOcHj_EUzpQ2tPtk8W3i085vto-7CsfzxlJvvQB9D31lKDYZGAlYH2adkldb5dpPNZ1M14ZECR3koZObf4YAnRsuem_YS3KywEds2klMmiLZZtF7bNn2sHHnkfhcKbf/s400/VisualSVN+Install+1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEx2Gtn0_OrmljchqnPnp5nkm_GrLtzR2GTOpbjFLvUN-KhY3fv-nsxDDIX7v2vVMP116NNVQpv8cXvt-CWtvLpIcHUThyphenhyphenRh_SuTnbEzGjg0J1xFDsvF5Q0GP_Vd2vJTVE3prY0xbjlY_T/s1600-h/VisualSVN+Install+2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEx2Gtn0_OrmljchqnPnp5nkm_GrLtzR2GTOpbjFLvUN-KhY3fv-nsxDDIX7v2vVMP116NNVQpv8cXvt-CWtvLpIcHUThyphenhyphenRh_SuTnbEzGjg0J1xFDsvF5Q0GP_Vd2vJTVE3prY0xbjlY_T/s400/VisualSVN+Install+2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2. Configurações&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Essa etapa trás cinco itens de configuração do servidor SVN.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;a) Location&lt;/strong&gt;: Local onde são instalados os arquivos do VisualSVN Server. O default é a pasta “VisualSVN Server”, no diretório “Arquivos de Programas” (ou “Program Files”, se o idioma de seu Windows for o inglês).&lt;br /&gt;
&lt;strong&gt;b) Repositories&lt;/strong&gt;: É o diretório padrão usado para repositório, ou seja, o caminho onde os arquivos dos projetos estão ou estarão localizados (repositório do Subversion).&lt;br /&gt;
Se o número da equipe de desenvolvedores for considerável e/ou o número de projetos for expressivo, a quantidade de acesso pode tornar-se um gargalo assim como o espaço necessário. Dessa forma, recomendo avaliar com cuidado o grau de acessos e atualizações que serão efetuados de forma a definir um local com espaço e suficientemente rápido para atender à demanda.&lt;br /&gt;
&lt;strong&gt;c) Server Port&lt;/strong&gt;: A instalação sugere utilizar ou porta 443 ou a porta 8443. No entanto, é possível modificá-la para outro valor. Nesse caso cuide para não especificar um valor conflitante com a porta utilizado por algum outro aplicativo (consulte &lt;a href=&quot;http://pt.wikipedia.org/wiki/Lista_padr%C3%83%C2%A3o_de_servi%C3%83%C2%A7os_e_portas_associadas&quot;&gt;Lista padrão de serviços e portas associadas&lt;/a&gt;).&lt;br /&gt;
&lt;strong&gt;d) HTTPS&lt;/strong&gt;: Determina se o servidor svn irá ou não utilizar conexões seguras (https). É recomendado que deixe essa opção marcada.&lt;br /&gt;
&lt;strong&gt;e) Authentication&lt;/strong&gt;: Esse parâmetro é particularmente interessante e deve ser configurado de acordo com a necessidade de cada empresa.&lt;br /&gt;
&lt;br /&gt;
A autenticação dos usuários nas conexões ao servidor pode ser feita de duas formas: 1 – Utilizando usuários e grupos configurados no próprio servidor; 2 – Utilizando os usuários do Windows (login e senha da rede local ou do ActiveDirectory).&lt;br /&gt;
&lt;br /&gt;
Se for utilizar a autenticação do subversion (opção 1), todos os logins e senhas deverão ser criados.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGi4xhr0kRYoiYTuJFPyxrTicUd0tn4PH8jciSQRe1tf3X0KXfdDz7K7IcEzizGiQsHU8vmJsQV9Uwv-hGggbHBs8MSEZO22VKaUX9CxBUdbgtZ3QCYLiF0E4tsQC7QSoiI7NIWwufa4rI/s1600-h/VisualSVN+Install+Config.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGi4xhr0kRYoiYTuJFPyxrTicUd0tn4PH8jciSQRe1tf3X0KXfdDz7K7IcEzizGiQsHU8vmJsQV9Uwv-hGggbHBs8MSEZO22VKaUX9CxBUdbgtZ3QCYLiF0E4tsQC7QSoiI7NIWwufa4rI/s400/VisualSVN+Install+Config.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Nesse tutorial instalaremos o VisualSVN com as configurações padrões. Principalmente porque o objetivo é a utilização de certificados digitais para garantir a segurança dos acessos e, para isso, no mínimo a opção https deve estar marcada.&lt;br /&gt;
&lt;br /&gt;
Caso seja necessário, todos esses itens de configuração podem ser modificados no console de gerenciamento.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.3. Instalação Concluída&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Concluído a instalação o console de gerenciamento será executado exibindo uma interface semelhante a da imagem abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzkb4KINiFrrdqR02rTEUlQIYh1xCSEPETGZJDAkvmY_FlT4Ucwcw70vTwJk8tILQvA_lxDdK5yOzP2KQPhhzYaUVQmyfj5aUY65KpgJ2MPOBRhKhrBUEvNKlX4f_72zagSV1k0_ycUeB/s1600-h/VisualSVN+Installed.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;349&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzkb4KINiFrrdqR02rTEUlQIYh1xCSEPETGZJDAkvmY_FlT4Ucwcw70vTwJk8tILQvA_lxDdK5yOzP2KQPhhzYaUVQmyfj5aUY65KpgJ2MPOBRhKhrBUEvNKlX4f_72zagSV1k0_ycUeB/s400/VisualSVN+Installed.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;2. Criando Repositórios&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A criação de repositório é muito simples. Você utilizará o console de gerenciamento para isso.&lt;br /&gt;
&lt;br /&gt;
Clique com o botão direito sobre o tópico &lt;strong&gt;Repositories&lt;/strong&gt;. Várias opções serão apresentadas em um popup menu, entre elas &lt;strong&gt;New&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Calibri; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq57fVGYxMpCjgERexNX9wqzXDsP1jJ5H-MOYVDDYm2l8i2iUWvo6ZYRuJ6Hh0YyJ-L4c_qFIhIeLiqf4hyKAs1GOOTWrzYX92ab5k_R32KOSKw630eCtY7nvvvL4IxH-T2E4bpeIvd9z6/s400/VisualSVN+New+Repository.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
Ao clicar em &lt;strong&gt;Repository&lt;/strong&gt;... um dialog será apresentado solicitando que informe o nome do repositório que deseja criar.&lt;br /&gt;
&lt;br /&gt;
Não é obrigatório, mas se você deseja trabalhar com o sistema de private branches, recomendo marcar a opção Create default structure. Essa opção irá criar automaticamente as pastas &lt;strong&gt;trunk&lt;/strong&gt;, &lt;strong&gt;branches&lt;/strong&gt; e &lt;strong&gt;tags&lt;/strong&gt; na estrutura do repositório.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4dIvyZgS3zZQXmtLdk8oxcgc3DTn-8Nb7RwqxPx9gMycqcTda2OivGdorCdJISSQqPKl2RX43TXvVsyWIwOhcPkj3xUnYUGcJR0yRIpJOH_Rax8ZPnSKYx-LZmpKoy4WtejekbnIznS7/s400/VisualSVN+New+Repository+2.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;3. Importando Repositórios&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Se você já possui um repositório e deseja importá-lo ao gerenciamento do VisualSVN, você pode proceder de forma manual ou através do console de gerenciamento.&lt;br /&gt;
&lt;br /&gt;
Na forma manual basta você copiar o repositório desejado para a pasta &lt;strong&gt;D:\Repositórios\SVN&lt;/strong&gt; (ou para o diretório que você especificou como sendo o repositório padrão do Subversion).&lt;br /&gt;
&lt;br /&gt;
Se desejar fazer através do console de gerenciamento, acesse a opção &lt;strong&gt;Import Existing Repository&lt;/strong&gt;, como detalha a imagem abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp892HctJdIRLGtEo5SuHhUjS7gbf97N5wfmfOLp6FXShzKUtedZAkKAU8Q9yJSzsQbHsRZ-aB7Jf1xtLk2rMvEU_JP7niUeHArxYLpzwN0OQ62Fu5EyV-5dVWo3NwkUOumMFkSwfSLuPK/s400/VisualSVN+Repository+Importing+1.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
Ao selecionar essa opção, um dialog será exibido solicitando que informe o diretório de localização do Repository na qual deseja importar e um nome para o mesmo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyjetrc1z2Uv6rD5kola41hZBXMfmDgh0K0Pc3XE9tMOJeapKnEU_WCwCmzLc8xN-ZaxrcrI1oUzAiIQjlyLZ7spLNPf1kx_wZeHuEqqbweTwHg8geMYTSF9dvv-X2-MvDRM-DwpBulBg8/s400/VisualSVN+Repository+Importing+2.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
Um ponto a ser observado é que a importação de repositórios deveser feito projeto a projeto.&lt;br /&gt;
&lt;br /&gt;
O exemplo acima mostra a importação do projeto &lt;strong&gt;WorkPlus&lt;/strong&gt; que está no repositório antigo (I:\Repositories\). E, no caso de uma migração entre repositório, esse procedimento deve ser repetido para os demais projetos.&lt;br /&gt;
&lt;br /&gt;
Tanto a cópia manual das pastas quanto a importação de repositórios não considerada a lista de usuários e as regras/restrições de acessos. Essa informação não está armazenada dentro dos projetos e sim no próprio repositório (D:\Repositories\SVN). Maiores detalhes serão apresentados no tópico abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strong&gt;4. Usuários e Controle de Acesso&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkG5BFuWHCYDnd9EcuK-dUN4OcwPwBfODlzZkq_pOulhxoxaZdvC3usMGZyKom1VtXGyXZ6mdCZguXfRs9TnZGXgGu4l7YF5g-sm7Hp2qzSndwbKeqZfjt_hzoq9NOXdhRBbyTG__yvaD0/s1600-h/VisualSVN+Users.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkG5BFuWHCYDnd9EcuK-dUN4OcwPwBfODlzZkq_pOulhxoxaZdvC3usMGZyKom1VtXGyXZ6mdCZguXfRs9TnZGXgGu4l7YF5g-sm7Hp2qzSndwbKeqZfjt_hzoq9NOXdhRBbyTG__yvaD0/s320/VisualSVN+Users.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Logo após a instalação do VisualSVN Server o sistema não possui qualquer conta de usuário definida. E é necessário possuir pelo menos um usuário para acesso aos projetos via web browser.&lt;br /&gt;
A imagem ao lado pertence à página principal do console de gerenciamento do VisualSVN Server e podemos observar claramente que não há usuários e nem grupos definidos.&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr5B_-YCKcGJeDUA6BAjj_hbWIqbCmf124g3rBI7C_zZWpRQxOTPdsnhnfwV1zQCv_4NnNWSUaao9FojTPdXR9EjoqC3v9WysM7ZiwXXYPt1mwR3KXjbw4CcZXfpH7QK6rQo1MTTJ1Bktn/s1600-h/VisualSVN+Create+User.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; mq=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr5B_-YCKcGJeDUA6BAjj_hbWIqbCmf124g3rBI7C_zZWpRQxOTPdsnhnfwV1zQCv_4NnNWSUaao9FojTPdXR9EjoqC3v9WysM7ZiwXXYPt1mwR3KXjbw4CcZXfpH7QK6rQo1MTTJ1Bktn/s320/VisualSVN+Create+User.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;A criação dos usuários pode ser feita utilizando os links (“&lt;strong&gt;Create new user...&lt;/strong&gt;” e “&lt;strong&gt;Create new group...&lt;/strong&gt;”) dessa mesma página principal ou clicando com o botão direito sobre a pasta “&lt;strong&gt;Users&lt;/strong&gt;” no lado esquerdo da console de gerenciamento.&lt;br /&gt;
&lt;br /&gt;
Tome cuidado na definição das senhas. Elas são sensitivas a maiúsculo-minúscula. O nome dos usuários também é case sensitive.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;4.1. Restringindo o Acesso&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
No acesso via web browser ou através de um client subversion ao repositório, ou a um projeto específico, será solicitado login. O acesso será liberado somente os usuários que foram cadastrados. No entanto o VisualSVN Server, ao ser instalado, vem com uma configuração padrão que dá acesso completo ao repositório a qualquer usuário (quando é dito “qualquer usuário” está se referindo aos usuários previamente cadastrados).&lt;br /&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqrv7-3VUFGof9RXTbxhKVNDHlSMOD1zozODebkYVumBB7guBMlFU4DZXY15aBJGf56Tg06NDLhNkU38KR-cf9yPqko89cvZezikmr3F22YyeIfW6qjH7S3ODe_AROcKJTX_RZpJutZhDS/s1600/VisualSVN+Access+3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqrv7-3VUFGof9RXTbxhKVNDHlSMOD1zozODebkYVumBB7guBMlFU4DZXY15aBJGf56Tg06NDLhNkU38KR-cf9yPqko89cvZezikmr3F22YyeIfW6qjH7S3ODe_AROcKJTX_RZpJutZhDS/s400/VisualSVN+Access+3.png&quot; /&gt;&lt;/a&gt;Essa configuração padrão é “herdada” sempre que um repositório for criado ou importado. E para evitar acessos indesejados devido a descuidos, particularmente, eu recomendo remover o acesso “&lt;strong&gt;Everyone&lt;/strong&gt;”.&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;&quot;&gt;Para isso acesse o menu de contexto em “&lt;strong&gt;Repositories&lt;/strong&gt;”, no console de gerenciamento, e click na opção “&lt;strong&gt;Properties&lt;/strong&gt;”, como exemplifica a imagem à esquerda.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Calibri; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjinENSIpDwEfHDbanGPC74uvUVxr-PrdU75M0af4ezYGKZ0jOlgsPF9ek09YzOozLSorm2uARSQo6shKn0vpLB8DCP0oqN5ptufICXPcv_yJTSNO14jBLLFnZaRXsVWu6hVN7KvSWFajKi/s400/VisualSVN+Access+4.png&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br /&gt;
Observe que a permissão do usuário especial “&lt;strong&gt;Everyone&lt;/strong&gt;” está definida como leitura e escrita (default da instalação).&lt;br /&gt;
&lt;br /&gt;
O controle de acesso do repositório subversion é bastante flexível e possibilita restringir o acesso não somente a todo o repositório, mas também para diretórios e mesmo arquivos específicos. No entanto, tome cuidado para não especificar regras que venham conflitar com outras, resultando em um comportamento indesejado.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de regra conflitante é definir as permissões do usuário “Everyone” como “&lt;strong&gt;No Access&lt;/strong&gt;” e acrescentar outros usuários/grupos. O resultado é falha sempre que os usuários tentarem fazer um svn commit, mesmo tais usuários tendo permissão “&lt;strong&gt;Read / Write&lt;/strong&gt;”.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;4.2. Migrando repositórios&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Como comentado no capítulo anterior (&lt;a href=&quot;file:///G:/Delphi/Documentos/Instala%C3%83%C2%A7%C3%83%C2%A3o%20e%20Configura%C3%83%C2%A7%C3%83%C2%A3o%20do%20VisualSVN%20Sever.docx#_Importando_Repositórios&quot;&gt;3. Importando Repositórios&lt;/a&gt;), as informações sobre usuários, grupos e restrições de acesso são armazenados no repositório raiz (C:\Repositories, ou outro caminho que você tenha especificado na instalação) através dos arquivos &lt;strong&gt;htpasswd&lt;/strong&gt; e &lt;strong&gt;authz&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
No arquivo &lt;strong&gt;htpasswd&lt;/strong&gt; são armazenados os usuários e suas respectivas senhas (criptografadas). O arquivo &lt;strong&gt;authz&lt;/strong&gt; contém as restrições de acesso aos repositórios.&lt;br /&gt;
&lt;br /&gt;
Durante a importação dos projetos, nem a lista de usuários/grupos nem as regras de acesso serão importadas, sendo assumido por default o controle de acesso do repositório raiz. Nesse caso é possível copiar as linhas relativas ao projeto que está sendo importando do arquivo authz do repositório antigo para o novo. Isso é possível porque o arquivo é armazenado em formato texto e sua sintaxe é simples.&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flovato.blogspot.com/feeds/5688809416903491149/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5394441407914227644/5688809416903491149?isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5688809416903491149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5394441407914227644/posts/default/5688809416903491149'/><link rel='alternate' type='text/html' href='http://flovato.blogspot.com/2009/08/windows-7-visualsvn-server-certificado.html' title='Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 1)'/><author><name>Fabius Lovato</name><uri>http://www.blogger.com/profile/16972717059798739960</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-DMtSwL-L8aHynhnbAq4R4AszeXNxXfqGRqq6VvSIH9S8ppvZLQHHRZ5eBUJnYbo-sv-6Ztr4vMQSQCxXTiE4DeGMIYfe5-Zw8TzCfNCfOCI5y8v7KHdx_NeMGUf6ZU/s220/Foto.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhANXtjW2jFCW67WMOcHj_EUzpQ2tPtk8W3i085vto-7CsfzxlJvvQB9D31lKDYZGAlYH2adkldb5dpPNZ1M14ZECR3koZObf4YAnRsuem_YS3KywEds2klMmiLZZtF7bNn2sHHnkfhcKbf/s72-c/VisualSVN+Install+1.png" height="72" width="72"/><thr:total>4</thr:total></entry></feed>