<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Estação ZN</title><link>http://estacaozn.blogspot.com/</link><description>Estamos estudando e o resultado disso postamos aqui. Sinceramente desejamos que o conteúdo aqui semeado possa ser útil para muitas pessoas.&lt;br&gt;
Seja bem-vindo e fique à vontade para contribuir da forma que puder e quiser.&lt;br&gt;
Bola pra frente ... :)</description><language>en</language><managingEditor>noreply@blogger.com (GMotta ZN)</managingEditor><lastBuildDate>Fri, 16 Oct 2009 12:18:25 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">229</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">25</openSearch:itemsPerPage><geo:lat>22</geo:lat><geo:long>43</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/EstaoZn" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title></title><link>http://feedproxy.google.com/~r/EstaoZn/~3/GQngu5r4W9U/ola-pessoal-dando-manutencao-em-um.html</link><category>Web</category><category>Javascript</category><category>Java</category><category>Oracle</category><category>HTML</category><author>noreply@blogger.com (ralencar)</author><pubDate>Mon, 24 Aug 2009 14:05:12 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-5576671152620026240</guid><description>Olá pessoal!&lt;br /&gt;&lt;br /&gt;Dando manutenção em um sistema java web com interface jsp precisei usar uma treeview para apresentar as categorias de produtos para o usuário. Vou relatar aqui a experiência.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;As categorias estão modeladas no banco em uma tabela com autorelacionamento.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_XV7fFbhKKpk/SpLuNPROyOI/AAAAAAAABME/JntxqtSggcQ/s1600-h/post-categoria.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 231px; DISPLAY: block; HEIGHT: 153px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5373619216610937058" border="0" alt="" src="http://3.bp.blogspot.com/_XV7fFbhKKpk/SpLuNPROyOI/AAAAAAAABME/JntxqtSggcQ/s320/post-categoria.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No oracle para consultar uma table com autorelacionamento podemos utilizar a seguinte query:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;&lt;br /&gt;select id, LEVEL, SYS_CONNECT_BY_PATH(nome, '@') as caminho&lt;br /&gt;from categoria CONNECT BY parent_id = PRIOR id START WITH id = categoria_inicial&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A categoria_inicial é a primeira categoria de uma árvore, nesse sistemas existem várias árvores de categorias.&lt;br /&gt;&lt;br /&gt;O resultado fica assim para a categoria_inicial igual a 30:&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;id  level caminho&lt;br /&gt;30  1     @Material de escritório&lt;br /&gt;31  2     @Material de escritório@Informática&lt;br /&gt;34  3     @Material de escritório@Informática@Tinta&lt;br /&gt;55  4     @Material de escritório@Informática@Tinta@Tinta Impressoras&lt;br /&gt;60  3     @Material de escritório@Informática@Armazenamento&lt;br /&gt;63  4     @Material de escritório@Informática@Armazenamento@DAT/DLT/DVD/DDS&lt;br /&gt;64  4     @Material de escritório@Informática@Armazenamento@Disquetes&lt;br /&gt;92  3     @Material de escritório@Informática@Teste&lt;br /&gt;93  4     @Material de escritório@Informática@Teste@Teste1&lt;br /&gt;113 4     @Material de escritório@Informática@Teste@Teste2&lt;br /&gt;120 4     @Material de escritório@Informática@Teste@Test3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ai no java criei uma classe para representar a estrutura da categoria, ficou assim:&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;public class CategoriaTreeView {&lt;br /&gt; public String id;&lt;br /&gt; public int level;&lt;br /&gt; public String path;&lt;br /&gt;&lt;br /&gt; public CategoriaTreeView(String id, int level, String path){&lt;br /&gt;  this.id = id;&lt;br /&gt;  this.level = level;&lt;br /&gt;  this.path = path;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como essa classe vai ser utilizada somente como uma estrutura de dados para representar o dado que será exibido na tela ela não tem gets e sets. Nem toda classe java precisa ter gets e sets. Gets e sets aqui são desnecessários e não acresentam nada. Acredite. Mas isso é assunto para outro post.&lt;br /&gt;&lt;br /&gt;Também tenho um DAO que acessa o banco e entrega um List com os objetos CategoriaTreeView.&lt;br /&gt;&lt;br /&gt;Antes disso fiz uma pesquisa na internet sobre como criar uma treeview no jsp (ou html) e encontrei o &lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-treeview/"&gt;jQuery plugin: Treeview&lt;/a&gt; que transforma uma lista não ordenada do html &amp;lt;ul&amp;gt; em uma árvore.&lt;br /&gt;&lt;br /&gt;Agora o problema é transformar a minha coleção de CategoriaTreeView em uma lista não ordenada com &amp;lt;ul&amp;gt; e &amp;lt;li&amp;gt;. Para isso eu criei a seguinte função recursiva que retorna uma String que será utilizada dentro do html:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;private String processa(int atual, List&amp;lt;CategoriaTreeView&amp;gt; lista){&lt;br /&gt; if(lista == null) return "";&lt;br /&gt; String out = "";&lt;br /&gt; if(lista.size() == 0) {&lt;br /&gt;  if(atual &amp;gt; 0){&lt;br /&gt;   out += "&amp;lt;/li&amp;gt;\n";&lt;br /&gt;   out += "&amp;lt;/ul&amp;gt;\n";&lt;br /&gt;   out += processa(atual - 1, lista);&lt;br /&gt;  }&lt;br /&gt; }else if(lista.size()&amp;gt;0){&lt;br /&gt;  CategoriaTreeView item = lista.remove(0);&lt;br /&gt;  if(item.level == atual){&lt;br /&gt;   out += "&amp;lt;/li&amp;gt;\n";&lt;br /&gt;   out += "&amp;lt;li&amp;gt;&amp;lt;span&amp;gt;" + subString(item.level, item.path) + "&amp;lt;/span&amp;gt;\n";&lt;br /&gt;   out += processa(item.level, lista);&lt;br /&gt;  }else if(item.level &amp;gt; atual){&lt;br /&gt;   out += "&amp;lt;ul&amp;gt;\n";&lt;br /&gt;   out += "&amp;lt;li&amp;gt;&amp;lt;span&amp;gt;" + subString(item.level, item.path) + "&amp;lt;/span&amp;gt;\n";&lt;br /&gt;   out += processa(item.level, lista);&lt;br /&gt;  }else if(item.level &amp;lt; atual){&lt;br /&gt;   out += "&amp;lt;/li&amp;gt;\n";&lt;br /&gt;   out += "&amp;lt;/ul&amp;gt;\n";&lt;br /&gt;   // adiciono o cara de volta na lista pois ainda não foi processado. estou voltando um nivel na árvore.&lt;br /&gt;   lista.add(0, item);&lt;br /&gt;   out += processa(atual - 1, lista);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return out;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Também temos a função para retornar a categoria de dentro do caminho:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;private String subString(int i, String s){&lt;br /&gt; String[] ss = s.split("@");&lt;br /&gt; return ss[i];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dentro do meu servlet eu tenho o seguinte código:&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;ArrayList categorias = dao.categorias(categoria_inicial);&lt;br /&gt;String treeView = processa(0, categorias);&lt;br /&gt;treeView = treeView.replaceFirst("&amp;lt;ul&amp;gt;", "&amp;lt;ul id=\"browser\"&amp;gt;");&lt;br /&gt;request.setAttribute("treeView", treeView);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para exibir a treeview no jsp eu utilizei o exemplo simple.html que vem no download do jQuery plugin: Treeview. A única mudança foi que eu fiz o download do &lt;a href="http://jquery.com/"&gt;jquery &lt;/a&gt;ao invés de usar o link direto do ajax.googleapis.com. &lt;br /&gt;&lt;br /&gt;Adicionei o seguinte ao jsp:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" href="../jquery.treeview.css" /&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" href="../red-treeview.css" /&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" href="screen.css" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="jquery-1.3.2.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="../lib/jquery.cookie.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="../jquery.treeview.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt; $("#browser").treeview({control: "#treecontrol", animated:"normal", persist: "cookie"});&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;String s = (String)request.getAttribute("treeView");&lt;br /&gt;if(s != null &amp;amp;&amp;amp; !s.trim().equals("")){&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt; &amp;lt;td&amp;gt;&lt;br /&gt; &amp;lt;br&amp;gt;&lt;br /&gt;  &amp;lt;div id="treecontrol"&amp;gt;&lt;br /&gt;   &amp;lt;a title="Collapse the entire tree below" href="#"&amp;gt;Fechar Tudo&amp;lt;/a&amp;gt;&lt;br /&gt;   &amp;lt;a title="Expand the entire tree below" href="#"&amp;gt;Abrir Tudo&amp;lt;/a&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt; &amp;lt;td&amp;gt;&lt;br /&gt; &amp;lt;br&amp;gt;&lt;br /&gt; &amp;lt;div&amp;gt;&amp;lt;%= s %&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;}&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O resultado fica parecido com esse demo que está no site.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_XV7fFbhKKpk/SpLxrojP6oI/AAAAAAAABMM/Ntg4rTDr_V0/s1600-h/post-treeview.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 155px; height: 187px;" src="http://2.bp.blogspot.com/_XV7fFbhKKpk/SpLxrojP6oI/AAAAAAAABMM/Ntg4rTDr_V0/s320/post-treeview.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5373623037328353922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abraços, Rodrigo Alencar.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-5576671152620026240?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/GQngu5r4W9U" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T18:05:12.546-03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_XV7fFbhKKpk/SpLuNPROyOI/AAAAAAAABME/JntxqtSggcQ/s72-c/post-categoria.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/08/ola-pessoal-dando-manutencao-em-um.html</feedburner:origLink></item><item><title>Cursor with parameters in PL/SQL</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/2rg9aHlqogs/cursor-with-parameters-in-plsql.html</link><category>PL/SQL</category><category>Banco de Dados</category><category>Oracle</category><category>English</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 23 May 2009 07:42:10 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-8286565985505477906</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/05/cursor-com-parametros-em-plsql.html"&gt;Ver este post em Portugûes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here I'm gonna show another technique to work with cursors in PL/SQL. I had to do something at work where it was very useful: cursor that take arguments.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;The biggest advantages of parametrized queries is that the server doesn't have to pass through the parse and plan phases ever again (after the first time, of course) and the compile-time checking for syntax errors (when we use string queries we only know any syntax errors in runtime).&lt;br /&gt;&lt;br /&gt;That said let's go to examples:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;cursor ProductCursor(pname in varchar2) is&lt;br /&gt;    select *&lt;br /&gt;    from product&lt;br /&gt;    where name like pname;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nice, isn't it? It's like a procedure in terms of syntax. And opening the cursor is like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;open ProductCursor('A%');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It'll open the cursor with all the products which name starts with 'A'.&lt;br /&gt;&lt;br /&gt;We can create a rowtype based var from this cursor:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;prod ProductCursor%rowtype;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I'm gonna join it all in a script:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;declare&lt;br /&gt;    -- Cursor&lt;br /&gt;    cursor ProductCursor(pname in varchar2) is&lt;br /&gt;        select *&lt;br /&gt;        from product&lt;br /&gt;        where name like pname;&lt;br /&gt;&lt;br /&gt;    -- Simple loop&lt;br /&gt;    prod ProductCursor%rowtype;&lt;br /&gt;&lt;br /&gt;    -- bulk collect loop&lt;br /&gt;    type Tprods is table of ProductCursor%rowtype;&lt;br /&gt;    prods Tprods;&lt;br /&gt;    i integer;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;    -- simple loop&lt;br /&gt;    open ProductCursor('A%');&lt;br /&gt;    loop&lt;br /&gt;        fetch ProductCursor into prod;&lt;br /&gt;        exit when ProductCursor%notfound;&lt;br /&gt;        DBMS_OUTPUT.put_line(prod.nome);&lt;br /&gt;        -- other commands&lt;br /&gt;    end loop;&lt;br /&gt;    close ProductCursor;&lt;br /&gt;&lt;br /&gt;    -- bulk collect loop&lt;br /&gt;    open ProductCursor('A%');&lt;br /&gt;    fetch ProductCursor bulk collect into prods;&lt;br /&gt;    for i in prods.first .. prods.last loop&lt;br /&gt;        DBMS_OUTPUT.put_line(prods(i).nome);&lt;br /&gt;        -- another commands using prods(i)&lt;br /&gt;    end loop;&lt;br /&gt;    close ProductCursor;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cool, isn't it? See you next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-8286565985505477906?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=2rg9aHlqogs:HXiSgjVBnf8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/2rg9aHlqogs" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T11:42:10.999-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/cursor-with-parameters-in-plsql.html</feedburner:origLink></item><item><title>Cursor com parâmetros em PL/SQL</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/8797fck4wQs/cursor-com-parametros-em-plsql.html</link><category>PL/SQL</category><category>Banco de Dados</category><category>Oracle</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 23 May 2009 07:44:44 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-7915061455464950682</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/05/cursor-with-parameters-in-plsql.html"&gt;View this post in English&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aqui vou mostrar outra técnica para trabalhar com cursores em PL/SQL. Eu tive que fazer um trabalho recentemente onde isso foi muito útil: Cursores que aceitam argumentos.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;As maiores vantagem de usar queries parametrizadas no banco de dados é que o servidor não precisa fazer o parse e traçar um plano de execução (ele só faz isso na primeira vez que a query é executada) e ela fica certa em tempo de compilação (ao contrário das queries em string que nós só sabemos se há um erro de sintaxe em tempo de execução).&lt;br /&gt;&lt;br /&gt;Dito isso vamos a um exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;cursor ProdutoCursor(pnome in varchar2) is&lt;br /&gt;    select *&lt;br /&gt;    from produto&lt;br /&gt;    where nome like pnome;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Legal, não? A sintaxe fica muito parecida com uma procedure. E o método de abrir o cursor também é legal:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;open ProdutoCursor('A%');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aqui vai abrir o cursor trazendo todos os produtos onde o nome começa com a letra 'A'.&lt;br /&gt;&lt;br /&gt;Podemos ainda criar um rowtype a partir deste cursor:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;prod ProdutoCursor%rowtype;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora vou criar um script para juntar tudo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;declare&lt;br /&gt;    -- Cursor&lt;br /&gt;    cursor ProdutoCursor(pnome in varchar2) is&lt;br /&gt;        select *&lt;br /&gt;        from produto&lt;br /&gt;        where nome like pnome;&lt;br /&gt;&lt;br /&gt;    -- Para loop simples&lt;br /&gt;    prod ProdutoCursor%rowtype;&lt;br /&gt;&lt;br /&gt;    -- Para loop com bulk collect&lt;br /&gt;    type Tprods is table of ProdutoCursor%rowtype;&lt;br /&gt;    prods Tprods;&lt;br /&gt;    i integer;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;    -- Loop simples&lt;br /&gt;    open ProdutoCursor('A%');&lt;br /&gt;    loop&lt;br /&gt;        fetch ProdutoCursor into prod;&lt;br /&gt;        exit when ProdutoCursor%notfound;&lt;br /&gt;        -- comandos a serem executados com o registro prod&lt;br /&gt;        DBMS_OUTPUT.put_line(prod.nome);&lt;br /&gt;    end loop;&lt;br /&gt;    close ProdutoCursor;&lt;br /&gt;&lt;br /&gt;    -- Loop com bulk collect&lt;br /&gt;    open ProdutoCursor('A%');&lt;br /&gt;    fetch ProdutoCursor bulk collect into prods;&lt;br /&gt;    for i in prods.first .. prods.last loop&lt;br /&gt;        -- comandos a serem executaos com o registro prods(i)&lt;br /&gt;        DBMS_OUTPUT.put_line(prods(i).nome);&lt;br /&gt;    end loop;&lt;br /&gt;    close ProdutoCursor;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Muito legal, né? Até a próxima.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-7915061455464950682?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=8797fck4wQs:MZaqkBMB8Dk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/8797fck4wQs" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T11:44:44.550-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/cursor-com-parametros-em-plsql.html</feedburner:origLink></item><item><title>Generics - A great addition to .Net</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/xh8BYkcr32Q/generics-great-addition-to-net.html</link><category>C#</category><category>English</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 23 May 2009 06:58:20 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-1336621284283836135</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/05/generics-uma-grande-adicao-net.html"&gt;Ver este post em Portugûes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hello. In this post I'll show something very nice about .Net: Generics.&lt;br /&gt;&lt;br /&gt;First, I'll show a simple struct in order to explain the feature:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;struct Person {&lt;br /&gt;    public string Name;&lt;br /&gt;    public string Address;&lt;br /&gt;    public string Zip;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;We have here a classic example of a data struct. Here we define fields with their respective data types (we're talking here about a strongly typed language). That means we have to provide the data type of the attributes at compile time. But, what if we could let the (struct's) user define what type s/he wants to use in their struct? How so? e.g.: A struct, two fields and their data type is open to the user to specify and set the attribute, making it "appear" a weakly typed language, but with the advantage of type checking at compile time.&lt;br /&gt;&lt;br /&gt;Let's take a look at an example:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;struct Pair&amp;lt;TClass1, TClass2&amp;gt;&lt;br /&gt;    where TClass1 : class&lt;br /&gt;    where TClass2 : class {&lt;br /&gt;&lt;br /&gt;    public TClass1 obj1;&lt;br /&gt;    public TClass2 obj2;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here comes the generics: We define a struct, asking the user to provide which clases will will represent the TClass1 and TClass2, which we are defining that have to inherit the class object and it automatically defines what data type that fields inside will accept&lt;br /&gt;&lt;br /&gt;The nice part is when we start to use this structure. Let's see another code block:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;    class Customer {&lt;br /&gt;        public int ID;&lt;br /&gt;        public string Name;&lt;br /&gt;&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return string.Format("Customer ID = {0}, Name = {1}", ID, Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Product {&lt;br /&gt;        public int ID;&lt;br /&gt;        public string Name;&lt;br /&gt;&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return string.Format("Product ID = {0}, Name = {1}", ID, Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    struct Pair&amp;lt;TClass1, TClass2&amp;gt;&lt;br /&gt;        where TClass1 : class&lt;br /&gt;        where TClass2 : class {&lt;br /&gt;&lt;br /&gt;        public TClass1 obj1;&lt;br /&gt;        public TClass2 obj2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program {&lt;br /&gt;        static void Main(string[] args) {&lt;br /&gt;&lt;br /&gt;            var c = new Customer { ID = 1, Name = "Felipe" };&lt;br /&gt;            var p = new Product { ID = 1, Name = "Caneta BIC" };&lt;br /&gt;&lt;br /&gt;            var pair = new Pair&amp;lt;Customer, Product&amp;gt;() { obj1 = c, obj2 = p };&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(pair.obj1.ToString());&lt;br /&gt;            Console.WriteLine(pair.obj2.ToString());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The braces after the new instanct are a new notation of C# that allows us to create new instances of classes and set values to public fields in the same instruction.&lt;br /&gt;&lt;br /&gt;In the progem we create instances of Customer and Product and define these types as the relevant types for the struct Pair. Note that, after we define the struct with these types we can only inform instances of these types for the specific fields. The compiler doens't let us inform any other value; and even the IntelliSense indicates correctly.&lt;br /&gt;&lt;br /&gt;I hope you all liked this post and again, sorry for my english, as I am no native English speaker. Thank you very much and see you next time.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-1336621284283836135?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=xh8BYkcr32Q:JITL_pAVF14:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/xh8BYkcr32Q" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T10:58:20.086-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/generics-great-addition-to-net.html</feedburner:origLink></item><item><title>Generics - Uma Grande adição a .Net</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/QGSULuft8_4/generics-uma-grande-adicao-net.html</link><category>C#</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 23 May 2009 06:58:01 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-6363469319575198554</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/05/generics-great-addition-to-net.html"&gt;View this post in English&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Olá a todos. Neste post vou mostrar algo muito legal a respeito da .Net: Generics.&lt;br /&gt;&lt;br /&gt;Primeiro vou preparar o terreno para explicar o recurso: Vamos ter como exemplo uma estrutura básica:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;&lt;br /&gt;struct Pessoa {&lt;br /&gt;    public string Nome;&lt;br /&gt;    public string Endereco;&lt;br /&gt;    public string CEP;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;Nós temos aqui um exemplo clássico de uma estrutura de dados. Nela nós definimos campos com os tipos definidos de dados (claro, numa linguagem fortemente tipada). Isso significa que nós temos que fornecer os tipos de dados na hora em que a criamos. Mas, E se pudéssemos criar uma estrutura de dados onde o usuário (da estrutura, claro) escolha os tipos de dados dos atributos? Como assim? A estrutura possui dois atributos e o usuário diz de que tipo de dados são estes atributos antes de definir seus valores, tendo "aparência" de linguagem de tipagem fraca, mas com a vantagem de checagem de tipos em tempo de compilação.&lt;br /&gt;&lt;br /&gt;Nada melhor para explicar do que um exemplo prático:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;struct Par&amp;lt;TClasse1, TClasse2&amp;gt;&lt;br /&gt;    where TClasse1 : class&lt;br /&gt;    where TClasse2 : class {&lt;br /&gt;&lt;br /&gt;    public TClasse1 obj1;&lt;br /&gt;    public TClasse2 obj2;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aqui vem o uso dos genéricos: Definimos uma estrutura, pedido que o usuário forneça dois tipo, TClasse1 e TClasse2, que dizemos abaixo que elas devem ser descendentes de object (ou object) e isso vira uma classe para ser referenciada dentro da struct.&lt;br /&gt;&lt;br /&gt;A parte legal vem na hora em que começamos a utilizar esta estrutura. Abaixo tem mais um bloco de código:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;    class Cliente {&lt;br /&gt;        public int ID;&lt;br /&gt;        public string Nome;&lt;br /&gt;&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return string.Format("Cliente ID = {0}, Nome = {1}", ID, Nome);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Produto {&lt;br /&gt;        public int ID;&lt;br /&gt;        public string Nome;&lt;br /&gt;&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return string.Format("Produto ID = {0}, Nome = {1}", ID, Nome);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    struct Par&amp;lt;TClasse1, TClasse2&amp;gt;&lt;br /&gt;        where TClasse1 : class&lt;br /&gt;        where TClasse2 : class {&lt;br /&gt;&lt;br /&gt;        public TClasse1 obj1;&lt;br /&gt;        public TClasse2 obj2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program {&lt;br /&gt;        static void Main(string[] args) {&lt;br /&gt;&lt;br /&gt;            var c = new Cliente { ID = 1, Nome = "Felipe" };&lt;br /&gt;            var p = new Produto { ID = 1, Nome = "Caneta BIC" };&lt;br /&gt;&lt;br /&gt;            var par = new Par&amp;lt;Cliente, Produto&amp;gt;() { obj1 = c, obj2 = p };&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(par.obj1.ToString());&lt;br /&gt;            Console.WriteLine(par.obj2.ToString());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As chaves depois da nova instância das classes é uma facilidade do C# que nos permite criar uma nova instância de uma classe e atribuir valores aos membros públicos naquele momento.&lt;br /&gt;&lt;br /&gt;Dentro do programa nós criamos instâncias das classes Cliente e Produto e definimos como atributos da nossa estrutura para usarmos depois. O detalhe é que, assim que nós definimos que as classes da estrutura são Cliente e Produto, o compilador não deixa nenhum outro valor; até o IntelliSense indica corretamente.&lt;br /&gt;&lt;br /&gt;Espero que que vocês tenham gostado deste post e o assunto tenha despertado em vocês o interesse que despertou em mim. Muito obrigado e até a próxima.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-6363469319575198554?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=QGSULuft8_4:6I1Oaez6KNI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/QGSULuft8_4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T10:58:01.983-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/generics-uma-grande-adicao-net.html</feedburner:origLink></item><item><title>Você já isntalou o IE8?</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/uyeyIGQ_aZc/voce-ja-isntalou-o-ie8.html</link><category>Internet Explorer</category><category>Novidades</category><category>Internet</category><category>Navegadores</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 23 May 2009 06:23:01 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-2564266360451149380</guid><description>Como o título já diz: eu já. A microsoft colocou o Internet Explorer 8 como atualização crítica para o Windows XP e cá estamos nós usuários deste maravilhoso sistema operacional atualizando.&lt;br /&gt;&lt;br /&gt;O navegador é muito bonitinho: A interface é boa, tem depurador de Javascript (já dava para fazer isso anteriormente, mas agora está incorporado no navegador), etc. Mas um problema assola alguns usuários (como minha digníssima que ainda usa muito o Internet Explorer): o teclado.&lt;br /&gt;&lt;br /&gt;Alguns usuários têm notado que no IE 8 o teclado não responde legal. Na minhma máquina acontece isso &lt;a href='http://forum.clubedohardware.com.br/dica-windows-xp/p3565124#post3565124'&gt;Neste link&lt;/a&gt; [forum.clubedohardware.com.br] há uma discussão do problema e possíveis causas e soluções.&lt;br /&gt;&lt;br /&gt;Alguns males vêm para bem: Agora minha patroa já está começando a usar o querido por todos Firefox para navegar, graças as minhas insistentes investidas. Ha ha. Aproveitei essa hora para trazê-la ao lado da luz.&lt;br /&gt;&lt;br /&gt;Abraços e até a próxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-2564266360451149380?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=uyeyIGQ_aZc:SyFG8_l1LsY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/uyeyIGQ_aZc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T10:23:01.566-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/voce-ja-isntalou-o-ie8.html</feedburner:origLink></item><item><title>JclStrings - StrPadRight, StrPadLeft</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/7r_QoR7bzBE/jclstrings-strpadright-strpadleft.html</link><category>Delphi</category><category>JCL</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Fri, 15 May 2009 10:32:46 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-6080619705059818845</guid><description>&lt;div align="justify"&gt;È uma biblioteca da JCL (&lt;a href="http://estacaozn.blogspot.com/2007/01/projeto-jedi.html"&gt;Jedi&lt;/a&gt;), como o nome da “unit” indica, para trabalhar com strings. Esteja certo de que, tudo e qualquer coisa que você pensar fazer com strings eles implementaram nesta biblioteca. &lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;div align="justify"&gt;Caso você, desafortunadamente, precise de alguma função para trabalhar com strings e não encontre na JclStrings, provavelmente é porque você está querendo fazer alguma variação do “&lt;a href="http://desciclo.pedia.ws/wiki/Bozosort"&gt;BozoSort&lt;/a&gt;” (rsrsrs, neste caso &lt;a href="http://nerdson.com/blog/category/bozo/"&gt;procure o Bozo &lt;/a&gt;ou o Jaspion). Quem me apresentou a ela foi o &lt;a href="http://singularsistemas.com.br/blog/"&gt;Malta&lt;/a&gt;, desde então nunca mais me separei dela. A seguir, um exemplo de como concatenar caracteres a esquerda ou a direita de uma string de tamanho limitado. Ou seja, mantendo o tamanho (Length) da string inalterado.&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt; Dialogs, StdCtrls, Buttons;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt; TForm1 = class(TForm)&lt;br /&gt;   BitBtn1: TBitBtn;&lt;br /&gt;   procedure BitBtn1Click(Sender: TObject);&lt;br /&gt; private&lt;br /&gt;   { Private declarations }&lt;br /&gt; public&lt;br /&gt;   { Public declarations }&lt;br /&gt; end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt; Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;uses jclStrings, Math;&lt;br /&gt;&lt;br /&gt;procedure TForm1.BitBtn1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt; ZnDt, ZnNum: String;&lt;br /&gt; ADay, AMonth, AYear: Word;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  DecodeDate(Date, AYear, AMonth, ADay);&lt;br /&gt;  ZnDt := Format('%s%s%s', [ StrPadLeft(IntToStr(ADay), 2, '0'),&lt;br /&gt;     StrPadLeft(IntToStr(AMonth), 2, '0'), IntToStr(AYear)]);&lt;br /&gt;  Self.Canvas.TextOut(12, 32, ZnDt);&lt;br /&gt;&lt;br /&gt;  Randomize;&lt;br /&gt;  ZnNum := IntToStr(RandomRange(0, 50000));&lt;br /&gt;  ZnNum := StrPadRight(ZnNum, 6, 'X');&lt;br /&gt;  Self.Canvas.TextOut(12, 52, ZnNum);&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por falar me Bozo, lembrei de uma coisa (rsrsrs)..... Esse exemplo com datas, não foi uma boa idéia!?!?!?!??!?! &lt;br /&gt;Na verdade ... esse exemplo com datas foi ótimo! Para demonstrarmos como não fazer ... uma coisa que provavelmente todo desenvolvedor, em algum momento, vai precisar fazer (rsrsrs).&lt;br /&gt;Por favor, não façam assim (concatenar zeros a direita do dia e do mês).&lt;br /&gt;Por isso, preste a tenção para substituir o código da linha 35 ...&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;  ZnDt := Format('%s%s%s', [ StrPadLeft(IntToStr(ADay), 2, '0'),  &lt;br /&gt;     StrPadLeft(IntToStr(AMonth), 2, '0'), IntToStr(AYear)]);  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Por &lt;pre name="code" class="delphi"&gt;&lt;br /&gt;    ZnDt := Format('%.2d%.2d%.4d', [ADay, AMonth, AYear]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bem melhor agora!!!!!!!&lt;br /&gt;&lt;br /&gt;Se você veio procurar "StrPadLeft" para trabalhar com datas, se deu bem! Use o "Format('%.2d%.2d%.4d, [ADay, AMonth, AYear])". &lt;br /&gt;O Malta, mais uma vez, nos emprestou o conhecimento dele.&lt;br /&gt;Grato!  &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-6080619705059818845?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=7r_QoR7bzBE:Vt92NgO_MiY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/7r_QoR7bzBE" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-15T14:32:46.999-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/05/jclstrings-strpadright-strpadleft.html</feedburner:origLink></item><item><title>Controle de Versão - "Seus problemas acabaram!"</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/ly2CgjSRH_8/controle-de-versao-seus-problemas.html</link><category>Subversion</category><category>Controle de Versão</category><author>noreply@blogger.com (Daniel)</author><pubDate>Fri, 01 May 2009 11:31:48 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-8961405928465832784</guid><description>&lt;!-- coloque fora da tag abaixo os primeiros parágrafos do post - os que você que que apareçam no index --&gt;&lt;br /&gt;Você é aquele cara que, pra controlar as versões do seu sistema, zipa os fontes e nomeia com o número da versão? Ou paga um software caríssimo de controle de versão? Ou toma uma coça pra instalar um controlador gratuito? SEUS PROBLEMAS ACABARAM!!!&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;&lt;br /&gt;Apresento-lhes os dois softwares que vão resolver todos os seus problemas: VisualSVN + TortoiseSVN.&lt;br /&gt;&lt;br /&gt;O primeiro é um servidor Windows de Subversion, um controlador de versões gratuito muito bom. Muito simples de instalar, esquema Windows: next, next, next, finish.&lt;br /&gt;Muito fácil também de manusear. Basta criar os repositórios e os usuários que acessam esses repositórios.&lt;br /&gt;Então aqui vai o link do VisualSVN: &lt;a href=http://www.visualsvn.com/server/&gt;http://www.visualsvn.com/server/&lt;/a&gt;&lt;br /&gt;O segundo é um cliente de Subversion muito, muito bom mesmo. Integra-se ao Windows Explorer e é super simples de usar também. Basicamente, você deve criar uma pasta que apontará para o repositório do VisualSVN. Depois do TortoiseSVN instalado, quando você clicar com o botão direito sobre a pasta pelo Windows Explorer, vai aparecer uma opção chamada "SVN Checkout...".&lt;br /&gt;Colocou arquivos/diretórios novos dentro da pasta, "Add". Quer subir os fontes? "Commit". Quer atualizar seus fontes? "Update".&lt;br /&gt;No próximo post sobre o assunto, eu vou dar uma passada mais detalhada sobre esta ferramenta.&lt;br /&gt;Chega de blá, blá, blá. Lá vai o link: &lt;a href=http://tortoisesvn.net/&gt;http://tortoisesvn.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Então é isso. Abraço a todos e até o próximo post!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-8961405928465832784?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=ly2CgjSRH_8:VMKzQC11wS8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/ly2CgjSRH_8" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T15:31:48.297-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/controle-de-versao-seus-problemas.html</feedburner:origLink></item><item><title>Ajax/JSON &amp; Delphi technologies– Webbrocker, Intraweb (ISAPI), IWTemplateProcessorHTML com CSS</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/upu6qc74-HQ/ajaxjson-delphi-technologies-webbrocker.html</link><category>Web</category><category>Delphi</category><category>Javascript</category><category>Intraweb</category><category>AJAX</category><category>Json</category><category>CSS</category><category>Internet</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Sun, 26 Apr 2009 01:50:07 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-5968013299104660855</guid><description>&lt;div align="justify"&gt;Estou com muita pressa, portanto serei o mais sucinto o possível ...&lt;br /&gt;O objetivo deste artigo é documentar uma solução desenvolvida para atender um cliente.&lt;br /&gt;Vamos criar um serviço de &lt;a href="http://estacaozn.blogspot.com/2008/04/mdulo-de-consulta-para-crud-win32-for.html"&gt;consulta&lt;/a&gt; que deverá fornecer dados para um requisição Ajax.  Para isso construiremos uma aplicação servidora (Delphi/Webbrocker) a qual acessará uma base de dados MS SQL Server (especificamente o banco de dados para exemplos “Northwind”), para executarmos uma consulta parametrizada (valor que virá na requisição cliente) cujo os dados retornados serão devidamente formatados para &lt;a href="http://www.blogger.com/JavaScript%20Object%20Notation%20http://json.org/"&gt;Json&lt;/a&gt; (&lt;a href="http://pt.wikipedia.org/wiki/JSON"&gt;Wik&lt;/a&gt;) (Não vou usar XML). Ou seja, como resposta a requisição mencionada, a aplicação servidora retornará os dado que serão consumidos pelo Ajax/Json. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Não sei, ou sei muito pouco sobre o que vc esta falando, Gerson&lt;/span&gt;. Então veja:&lt;br /&gt;&lt;a href="http://www.bergbrandt.com.br/v1/asp/mostra_artigo.asp?artigo_id=14"&gt;Pesquisa 1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ctrlc.blog.br/2007/10/json-javascript-object-notation.html"&gt;Pesquisa 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://conferences.embarcadero.com/article/33365"&gt;Marco Cantù AJax XML/DOM&lt;/a&gt;&lt;br /&gt;Neste artigo o Cantù mostra como aproveitar o XMLData do TClientDataSet no DOM/XML (mto legal para delpheros).&lt;br /&gt;&lt;a href="http://ajax.marcocantu.com/doc/DelphiAndAjax.html"&gt;Marco Cantù Artigo Ajax&lt;/a&gt;&lt;br /&gt;&lt;a href="http://json.org/"&gt;Json&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Em seguida, desenvolveremos o aplicativo cliente, a camada de interface, em  Delphi/&lt;span style="font-weight:bold;"&gt;Intraweb&lt;/span&gt;, aonde implementaremos uma função Javascript. Nela usaremos  o &lt;span style="font-weight:bold;"&gt;XMLHttpRequest&lt;/span&gt; do javascript de forma &lt;span style="font-weight:bold;"&gt;assíncrona&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;&lt;strong&gt;Mãos à Obra, Estação ZN!&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Server-Side development&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Inicie um projeto Webbrocker no Delphi. Menu ►File ►New ►Other ► Web Server Application.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQM8Jn3qmI/AAAAAAAABcg/LfI7z3f7xp4/s1600-h/NewWebServerApplication.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQM8Jn3qmI/AAAAAAAABcg/LfI7z3f7xp4/s320/NewWebServerApplication.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328898486600968802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;A tecnologia de service web que vamos usar será API do IIS (ISAPI). No WebModule1 adicione os componentes de acesso a dados: TADOConnetion, TADODataSet, TDataSetProvider, TClientDataSet. No editor de string de conexão (Edit Connection String) do ADOConnection, configure a conexão com o SQL Server e em seguida associe os Datasets (Como Associar? veja no Estação ZN). O Comando SQl que definiremos no  ADODataSet1 será:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;  select * from Customers&lt;br /&gt;  where CompanyName like :CompanyName&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="font-weight:bold;"&gt;Criando a Webbrocker Action&lt;/span&gt; (WebAction)&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Selecione o WebModule1, de maneira que suas propriedades sejam listadas no Object Inspector. Crie uma Action e configure suas propriedades conforme ilustrado abaixo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_buFzmAtZPuc/SfQNIDU0giI/AAAAAAAABco/lS8QwuD9Wkw/s1600-h/CStringdeConexaoSQLServerNorthwind.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 255px; height: 320px;" src="http://3.bp.blogspot.com/_buFzmAtZPuc/SfQNIDU0giI/AAAAAAAABco/lS8QwuD9Wkw/s320/CStringdeConexaoSQLServerNorthwind.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328898691068887586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Evento OnAction da Action “&lt;span style="font-weight:bold;"&gt;ZnConsClientes&lt;/span&gt;”:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_buFzmAtZPuc/SfQPSI5mc6I/AAAAAAAABcw/eqrLsmBelpY/s1600-h/ObjInspectorWebModuleActions.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 202px; height: 320px;" src="http://1.bp.blogspot.com/_buFzmAtZPuc/SfQPSI5mc6I/AAAAAAAABcw/eqrLsmBelpY/s320/ObjInspectorWebModuleActions.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328901063387280290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;uses&lt;br /&gt;   Math, StrUtils;&lt;br /&gt;&lt;br /&gt;procedure TWebModule1.WebModule1ZnConsClientesAction(Sender: TObject;&lt;br /&gt;  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);&lt;br /&gt;const&lt;br /&gt;  ZnTag = '%s:%s';&lt;br /&gt;var&lt;br /&gt;  StrStatment: String;&lt;br /&gt;  i, CodRetorno: Integer;&lt;br /&gt;begin&lt;br /&gt;  with ClientDataSet1 do&lt;br /&gt;  begin&lt;br /&gt;    Params[0].AsString := '%' + Request.QueryFields.Values['znNomeCli']+ '%';&lt;br /&gt;    try&lt;br /&gt;      Open;&lt;br /&gt;      CodRetorno := IfThen(IsEmpty, -1, 1);&lt;br /&gt;      StrStatment := StrStatment +&lt;br /&gt;          Format(ZnTag, ['codretornoZn',&lt;br /&gt;            IntToStr(CodRetorno)]);&lt;br /&gt;&lt;br /&gt;      if CodRetorno = 0 then Exit;&lt;br /&gt;&lt;br /&gt;      for i := 0 to Pred(FieldCount) do&lt;br /&gt;      begin&lt;br /&gt;        StrStatment := StrStatment + ','+&lt;br /&gt;          Format(ZnTag, [LowerCase(ClientDataSet1.Fields[i].FieldName),&lt;br /&gt;            IfThen((ClientDataSet1.Fields[i].AsString = ''), QuotedStr('-'),&lt;br /&gt;              QuotedStr(ClientDataSet1.Fields[i].AsString))]);&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;    finally&lt;br /&gt;      Close;&lt;br /&gt;      Response.Content := Format('{%s}',[StrStatment]);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Para usar as versões sobrecarregadas da função “&lt;span style="font-weight:bold;"&gt;IfTehn&lt;/span&gt;” precisamos, para este exemplo, declarar (fazer uses das ...) as units “Math” e “StrUtils” (observe na linha 2 do trecho acima).&lt;br /&gt;Pronto, acabamos essa primeira parte! Antes de compilar, garanta que o ADOCOnnection esteja desconectado. Propriedade “Connected” igual a “false”. Agora sim!!!   Compile a aplicação servidora para gerar a dll  a qual faremos deploy no IIS (&lt;a href="http://estacaozn.blogspot.com/2008/09/deploy-de-uma-dll-isapi-no-iss-5.html"&gt;Deploy de uma dll ISAPI&lt;/a&gt;). Vou criar o diretório virtual no IIS com o nome de “ajaxjsonzn”.&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;Após ter tido sucesso em realizar o deploy, vamos testar.&lt;br /&gt;Para isso digitar no browser "http://localhost/ajaxjsonzn/?znNomeCli=Cactus" para se emocionar ao ver o que acabamos de criar.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_buFzmAtZPuc/SfQPn8GdboI/AAAAAAAABc4/-ldUntKMgFU/s1600-h/TestandoAAppServnoBrowser.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 138px;" src="http://3.bp.blogspot.com/_buFzmAtZPuc/SfQPn8GdboI/AAAAAAAABc4/-ldUntKMgFU/s320/TestandoAAppServnoBrowser.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328901437908676226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Veja a string retornada pela nossa aplicação servidora Webbrocker:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{codretornoZn:1,customerid:'CACTU',companyname:'Cactus Comidas para llevar',contactname:'Patricio Simpson',&lt;br /&gt;  contacttitle:'Sales Agent',address:'Cerrito 333',city:'Buenos Aires',region:'-',&lt;br /&gt;  postalcode:'1010',country:'Argentina',phone:'(1) 135-5555',fax:'(1) 135-4892'}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cliente-Side development&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Meu querido leitor do Estação ZN, neste momento vamos começar esta segunda parte do artigo construindo uma página html. Hum, ãhhh?!?!? Como?? Mas o assunto não é Delphi? Sim, o assunto gira em torno das tecnologias para web existentes no Delphi. O que nós vamos fazer agora é demonstrar também como o framework Intraweb pode interagir com projetos onde as páginas web são desenvolvidas a parte do Delphi. Existem várias situações onde isso poderá ser extremamente vantajoso. Por exemplo, imagine um projeto onde exista uma ênfase grande na parte de design e por isso as páginas do site são desenvolvidas especificamente pela equipe de designers e diante disto a equipe de desenvolvimento deve integrá-las a parte de lógica e persistência desenvolvida no Delphi. Este cenário no contexto Delphi é até bem comum, penso que sim. &lt;br /&gt;Portanto, antes de qualquer coisa execute seu editor preferido de páginas htm e Javascript e bola pra frente. Abaixo, segue o código dá pagina que desenvolvi para este exemplo:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Untitled Document&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;&amp;lt;!-- &lt;br /&gt;.AreaTexto {&lt;br /&gt; font-family: "Comic Sans MS", "Courier New", Georgia;&lt;br /&gt; width: 420px;&lt;br /&gt; height:540px;&lt;br /&gt; background-color:#FFFF38;&lt;br /&gt;}&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;var ZnXmlAjaxHttpObj;&lt;br /&gt; &lt;br /&gt;function ZnGetClienteWsAjx(ZnMyName) { &lt;br /&gt;   &lt;br /&gt;   alert('estou na função!');&lt;br /&gt;    if (typeof XMLHttpRequest != "undefined"){ZnXmlAjaxHttpObj = new XMLHttpRequest();}&lt;br /&gt;   else{&lt;br /&gt;     ZnXmlAjaxHttpObj = new ActiveXObject('Msxml2.XMLHTTP');&lt;br /&gt;     if (!ZnXmlAjaxHttpObj){ZnXmlAjaxHttpObj = new ActiveXObject('Microsoft.XMLHTTP');}&lt;br /&gt; } &lt;br /&gt;    alert(ZnMyName.value); &lt;br /&gt;    var ZnSpan = document.getElementById("IWLABEL1");&lt;br /&gt; &lt;br /&gt; ZnSpan.innerHTML = "Estaçaõ Zn: Buscando dados do Cliente pelo nome fornecido: " + ZnMyName.value + " ....";&lt;br /&gt;    &lt;br /&gt; var url = "http://localhost/ajaxjsonzn/?znNomeCli="+ ZnMyName.value;&lt;br /&gt; ZnXmlAjaxHttpObj.open("GET", url, true);&lt;br /&gt;    ZnXmlAjaxHttpObj.onreadystatechange = ZnDynProcessaReqBuscaCliente; &lt;br /&gt;    ZnXmlAjaxHttpObj.send(null); &lt;br /&gt; } &lt;br /&gt; &lt;br /&gt; function ZnDynProcessaReqBuscaCliente() { &lt;br /&gt;    var ZnSpan2 = document.getElementById("IWLABEL2");&lt;br /&gt; var  ZnElement = document.getElementById("IWEDIT1");&lt;br /&gt; ZnSpan2.innerHTML = 'Processando ..................';&lt;br /&gt; if (ZnSpan2.innerHTML.indexOf("buscando dados",0) &amp;gt;= 0){ZnSpan2.innerHTML = "Processando ...";}&lt;br /&gt;   else {ZnSpan2.innerHTML = "&amp;lt;b&amp;gt;buscando dados do Cliente: &amp;lt;/b&amp;gt;" + ZnElement.value + " ....";}&lt;br /&gt;       &lt;br /&gt;    if (ZnXmlAjaxHttpObj.readyState == 4) {&lt;br /&gt;       if (ZnXmlAjaxHttpObj.status == 200) {&lt;br /&gt;       processJsonEstacaoZn(ZnXmlAjaxHttpObj.responseText);&lt;br /&gt;  }&lt;br /&gt;      }  &lt;br /&gt;    else return false;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function processJsonEstacaoZn(obj1) {&lt;br /&gt;  &lt;br /&gt;  var ObjLandjah; &lt;br /&gt;  eval('ObjLandjah = ' + obj1);&lt;br /&gt;  var Aux  =&lt;br /&gt;        " &amp;lt;br /&amp;gt; customerid: "+ ObjLandjah.customerid +&lt;br /&gt;        " &amp;lt;br /&amp;gt; contactname: "+ ObjLandjah.contactname +&lt;br /&gt;        " &amp;lt;br /&amp;gt; contacttitle: "+ ObjLandjah.contacttitle +&lt;br /&gt;        " &amp;lt;br /&amp;gt; companyname: "+ ObjLandjah.companyname +&lt;br /&gt;        " &amp;lt;br /&amp;gt; country: "+ ObjLandjah.country +&lt;br /&gt;        " &amp;lt;br /&amp;gt; CEP/postal code: "   + ObjLandjah.postalcode     +&lt;br /&gt;     "&amp;lt;br /&amp;gt; Região: "   + ObjLandjah.region  +&lt;br /&gt;     "&amp;lt;br /&amp;gt; Cidade: "  + ObjLandjah.city  +&lt;br /&gt;     "&amp;lt;br /&amp;gt;Logradouro: " + ObjLandjah.address +&lt;br /&gt;        " &amp;lt;br /&amp;gt; fax: " + ObjLandjah.fax +&lt;br /&gt;        " &amp;lt;br /&amp;gt; phone: "+ ObjLandjah.phone;&lt;br /&gt; alert(Aux);    &lt;br /&gt; document.getElementById("cj").innerHTML += '- &amp;lt;b&amp;gt;Ninguém vai subir #@#@%#@%#%@ ... vai ficar todo mundo quietinho ae.&amp;lt;/b&amp;gt;';&lt;br /&gt; document.getElementById("cj").innerHTML += Aux; &lt;br /&gt; document.getElementById("IWMEMO1").innerHTML += ' \n &amp;lt;b&amp;gt;100% Quatorze? &amp;lt;/b&amp;gt;';   &lt;br /&gt;    document.getElementById("IWMEMO1").innerHTML += ' \n ************************************';&lt;br /&gt;  //****************************************************&lt;br /&gt; &lt;br /&gt;  var insertData = "&amp;lt;b&amp;gt; Resultado Consulta www.estacaozn.blogspot.com:&amp;lt;/b&amp;gt;";&lt;br /&gt;  try {&lt;br /&gt; //alert('Cod Retorno: ' + ObjLandjah.codretornoZn);&lt;br /&gt; switch (ObjLandjah.codretornoZn * 1) {&lt;br /&gt;     case 1: &lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += ' \n - Cavera meu Capitão. ';&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += ' \n ************************************';&lt;br /&gt;  insertData += " &amp;lt;br /&amp;gt; customerid: "+ ObjLandjah.customerid +&lt;br /&gt;        " &amp;lt;br /&amp;gt; contactname: "+ ObjLandjah.contactname +&lt;br /&gt;        " &amp;lt;br /&amp;gt; contacttitle: "+ ObjLandjah.contacttitle +&lt;br /&gt;        " &amp;lt;br /&amp;gt; companyname: "+ ObjLandjah.companyname +&lt;br /&gt;        " &amp;lt;br /&amp;gt; country: "+ ObjLandjah.country +&lt;br /&gt;        " &amp;lt;br /&amp;gt; CEP/postal code: "   + ObjLandjah.postalcode     +&lt;br /&gt;     "&amp;lt;br /&amp;gt; Região: "   + ObjLandjah.region  +&lt;br /&gt;     "&amp;lt;br /&amp;gt; Cidade: "  + ObjLandjah.city  +&lt;br /&gt;     "&amp;lt;br /&amp;gt;Logradouro: " + ObjLandjah.address +&lt;br /&gt;        " &amp;lt;br /&amp;gt; fax: " + ObjLandjah.fax +   &lt;br /&gt;        " &amp;lt;br /&amp;gt; phone: " + ObjLandjah.phone;&lt;br /&gt;   //alert("Case, estou aqui");&lt;br /&gt;  // Abaixo, veja como atribuir valor do JavaScript Object Notation ao IWMemo e aos IWEdits &lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += ' \n ************************************';&lt;br /&gt;  document.getElementById("CEP").value = ObjLandjah.postalcode;&lt;br /&gt;        document.getElementById("CEP").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += " \n CEP: "  + ObjLandjah.postalcode;&lt;br /&gt;  document.getElementById("CONTACTNAME").value = ObjLandjah.contactname;&lt;br /&gt;        document.getElementById("CONTACTNAME").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += " \n Contato: "  + ObjLandjah.contactname;&lt;br /&gt;  document.getElementById("CONTACTTITLE").value = ObjLandjah.contacttitle;&lt;br /&gt;  document.getElementById("CONTACTTITLE").disabled = true;&lt;br /&gt;        document.getElementById("IWMEMO1").innerHTML += " \n Contato: "  + ObjLandjah.contacttitle; &lt;br /&gt;  document.getElementById("CIDADE").value = ObjLandjah.city;&lt;br /&gt;        document.getElementById("CIDADE").disabled = true;&lt;br /&gt;     document.getElementById("IWMEMO1").innerHTML += " \n Cidade: "  + ObjLandjah.city;&lt;br /&gt;     document.getElementById("BAIRRO").value = "Bla!";&lt;br /&gt;        document.getElementById("BAIRRO").disabled = true;&lt;br /&gt;  document.getElementById("FAX").value = ObjLandjah.fax;&lt;br /&gt;        document.getElementById("FAX").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += "\n Fax: " + ObjLandjah.fax;&lt;br /&gt;  document.getElementById("LOGRADOURO").value = ObjLandjah.address;&lt;br /&gt;        document.getElementById("LOGRADOURO").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += "\n Logradouro:" + ObjLandjah.address;&lt;br /&gt;  document.getElementById("COMPANYNAME").value =  ObjLandjah.companyname;&lt;br /&gt;        document.getElementById("COMPANYNAME").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += "\n Nome da Empresa:" + ObjLandjah.companyname;&lt;br /&gt;  document.getElementById("COUNTRY").value = ObjLandjah.country;&lt;br /&gt;        document.getElementById("COUNTRY").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += "\n Pais:" + ObjLandjah.country;&lt;br /&gt;  document.getElementById("UF").value = ObjLandjah.region;&lt;br /&gt;        document.getElementById("UF").disabled = true;&lt;br /&gt;     document.getElementById("IWMEMO1").innerHTML += " \n Região: "  + ObjLandjah.region;&lt;br /&gt;        document.getElementById("PHONE").value = ObjLandjah.phone;&lt;br /&gt;        document.getElementById("PHONE").disabled = true;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += " \n Tel: "  + ObjLandjah.phone;&lt;br /&gt;  document.getElementById("IWMEMO1").innerHTML += '\n ************************************'; &lt;br /&gt;  break;&lt;br /&gt;  case -1: insertData += "Cliente n&amp;atilde;o encontrado!";  break;&lt;br /&gt;  case -2: insertData += "Valor digitado inv&amp;aacute;lido!";  break;&lt;br /&gt;  case -3: insertData += "Ta com nojinho 02?.";  break;&lt;br /&gt;  case -4: insertData += "AH ESSA ALTURA DO CAMPEONATO VC TA SEM AH BANDOLEIRA ??!";  break;&lt;br /&gt;  default: "PEDE PRA SAIR 01. Pede pra sair.";&lt;br /&gt;    }&lt;br /&gt;      }&lt;br /&gt;   catch(Error) {&lt;br /&gt;    insertData = "&amp;lt;br&amp;gt; &amp;lt;font color=#FF0000&amp;gt; eRrO. TIRA ESSA ROUPA PRETA QUE VC NÃO É CAVEIRA. &amp;lt;/font&amp;gt; As Landjhas de mirandjas!!!"&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;      document.getElementById("IWLABEL2").innerHTML += insertData;&lt;br /&gt;   document.getElementById("IWLABEL1").innerHTML += " &amp;lt;br /&amp;gt;&amp;lt;b&amp;gt; Os senhores estão bem? Os senhores estão feridos? Algum dos senhores estão baleados? " +&lt;br /&gt;   " Então, no próximo post vcs vão aprender a carregar corpos!!! &amp;lt;/b&amp;gt;"&lt;br /&gt;   document.getElementById("IWMEMO1").innerHTML += ' \n ';&lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form id="form1" name="form1" method="post" action=""&amp;gt;&lt;br /&gt;&amp;lt;div id="PosControles" style="position: absolute; top: 32px; left: 12px; width: 887px; height: 92px; background-color: #3399CC; &lt;br /&gt;  font-size:16px; font-weight:400" align="justify"&amp;gt;&amp;lt;br /&amp;gt;Digite o Nome do Cliente: {%IWEdit1%} | {%IWButton1%} &lt;br /&gt;&amp;lt;br&amp;gt; &lt;br /&gt;{%Logradouro%}{%Bairro%}{%Cidade%} {%UF%}{%CEP%} {%CompanyName%}&lt;br /&gt;    {%ContactName%}&lt;br /&gt;    {%ContactTitle%}&lt;br /&gt;    {%Phone%}&lt;br /&gt;    {%Fax%}&lt;br /&gt;    {%Country%}&lt;br /&gt; {%IWLink1%} &amp;lt;a href="http://localhost/estacaozncliente"&amp;gt;Reload Page&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="PosSpan" style="position: absolute; top: 128px; left: 12px; width: 440px; height: 580px; background-color: #99FF99;"&amp;gt;&lt;br /&gt;{%IWLabel1%} {%IWLabel2%}&lt;br /&gt;&amp;lt;span id="cj"&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="PosMemo" style="position: absolute; top: 128px; left: 458px; width: 440px; height: 580px; background-color: #99FF99;"&lt;br /&gt;align="center"&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;{%IWMEMO1%}&lt;br /&gt;testando!!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Salve a página html (o arquivo html, referente a página que acabamos de criar) com o nome de “ZnPageAjaxJsonIntraweb.html”.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQP8JmnHfI/AAAAAAAABdA/1qr1dl7oaEk/s1600-h/DirvirtualEstacaoZnCliente.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQP8JmnHfI/AAAAAAAABdA/1qr1dl7oaEk/s320/DirvirtualEstacaoZnCliente.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328901785130573298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;O próximo passo, será criar a aplicação cliente intraweb. Retornemos ao Delphi então, para iniciarmos um projeto Intraweb ISAPI. No menu File ► New ►Other ►Intraweb ►ISAPI Application.&lt;br /&gt;&lt;br /&gt;Adicione no IWForm1 os seguintes componentes:&lt;/div&gt; &lt;br /&gt;    &lt;pre class="normal"&gt;&lt;br /&gt;    IWTemplateProcessorHTML1: TIWTemplateProcessorHTML;&lt;br /&gt;    IWLabel1: TIWLabel;&lt;br /&gt;    IWEdit1: TIWEdit;&lt;br /&gt;    IWButton1: TIWButton;&lt;br /&gt;    IWMemo1: TIWMemo;&lt;br /&gt;    CEP: TIWEdit;&lt;br /&gt;    UF: TIWEdit;&lt;br /&gt;    Bairro: TIWEdit;&lt;br /&gt;    Logradouro: TIWEdit;&lt;br /&gt;    Cidade: TIWEdit;&lt;br /&gt;    IWLabel2: TIWLabel;&lt;br /&gt;    CompanyName: TIWEdit;&lt;br /&gt;    ContactName: TIWEdit;&lt;br /&gt;    ContactTitle: TIWEdit;&lt;br /&gt;    Phone: TIWEdit;&lt;br /&gt;    Fax: TIWEdit;&lt;br /&gt;    Country: TIWEdit; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No evento OnCreate do IWForm1 codifique conforme ilustrado abaixo:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TformMain.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Self.TemplateProcessor := IWTemplateProcessorHTML1;&lt;br /&gt;  IWTemplateProcessorHTML1.Templates.default := 'ZnPageAjaxJsonIntraweb.html';&lt;br /&gt;  IWLabel1.Caption := '&amp;nbsp;';&lt;br /&gt;  IWMemo1.Font.Enabled := False;&lt;br /&gt;  IWMemo1.Font.CSSStyle := 'AreaTexto';&lt;br /&gt;  CEP.Width := 80;&lt;br /&gt;  UF.Width := 40;&lt;br /&gt;  Cidade.Width := 120;&lt;br /&gt;  Logradouro.Width := 180;&lt;br /&gt;  Bairro.Width := 90;&lt;br /&gt;  IWButton1.ExtraTagParams.Add('onClick=ZnGetCLienteWsAjax(IWEDIT1)');&lt;br /&gt;  IWMemo1.Lines.Add('&amp;nbsp;');&lt;br /&gt;  IWEdit1.Text := 'Cactus Comidas para llevar';&lt;br /&gt;end; &lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Observe na linha 7, estou atribuindo dinamicamente ao IWMemo1 uma classe CSS (“'AreaTexto'”) a qual está definida na página HTML que criamos anteriormente. &lt;br /&gt;&lt;br /&gt;Ok, muito bem, meus amigos e minhas amigas, a parte referente a aplicação cliente termina aqui!! Isso é mto bom! Agora, é chegado o momento do bom e velho amigo deploy. Para isso, um “build all” na aplicação Intraweb (alt, p, b) é bem vindo, ela será compilada e a dll para deploy será gerada. So .. next step ... enjoy yourself ... &lt;br /&gt;O nome do diretório virtual que vou criar será “estacaozncliente”.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;No mesmo diretório onde está a dll gerada pelo Delphi na compilação deste projeto Intraweb, crie um diretório onde ficará a pagina html que o IWTemplateProcessorHTML1 vai trabalhar. Me refiro ao arquivo da página que criamos anteriormente, “ZnPageAjaxJsonIntraweb.html”. Esse diretório tem que se chamar “Templates”, desta forma não precisamos definir nenhuma configuração para TemplateProcessorHTML encontrar o arquivo.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testando Aplicação cliente IntraWeb/ISAPI.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQR0a02buI/AAAAAAAABdM/WRe9pNBbKtk/s1600-h/TestandoAppAclienteIntraWebIsapi.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 300px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQR0a02buI/AAAAAAAABdM/WRe9pNBbKtk/s320/TestandoAppAclienteIntraWebIsapi.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5328903851338002146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;O link “Reload Page” coloquei para facilitar o desenvolvimento da aplicação cliente. Assim evito de ficar digitandoa url do serviço toda vez que houver alguma alteração, seja na aplicação servidora, seja na aplicação cliente, ou na página html.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusão &lt;/span&gt;&lt;br /&gt;&lt;div align="justify"&gt;A partir da experiência realizada e documentada neste artigo, destaco as seguintes observações:&lt;br /&gt;Usar a tecnologia Ajax nos seus sistemas web, sites, ou serviços traz, além de um ganho de performance, escalabilidade e interoperabilidade. Isso porque a solução Ajax é independente da tecnologia que esteja sendo utilizada no client-side. Pretendo, para o próximo post documentar um exemplo da mesma solução desenvolvida neste arquivo, sendo que a camada cliente desenvolverei em Java com o Netbeans.&lt;br /&gt;O uso do JavaScript Object Notation  (Json) descomplica muito a desenvolvimento de uma solução baseada em Ájax. &lt;br /&gt;Um ponto muito importante neste artigo é o emprego do componente processador de “templates” o IWTemplateProcessorHTML. Ele permite que seu form Intraweb seja construído em cima de um arquivo HTML criado separadamente. Dessa forma  um leque de possibilidades se abre. No momento a que eu mais quero destacar é que com isso é possível modularizar seu projeto colocando toda a parte de layout, disign, bem como o processamento client-side. Com isso, todo o &lt;a href="http://estacaozn.blogspot.com/search/label/Javascript"&gt;Javascript&lt;/a&gt; que trabalhamos nos &lt;a href="http://estacaozn.blogspot.com/2009/02/delphi-intraweb-gerar-dinamicamente.html"&gt;artigos anteriores&lt;/a&gt; pode ser definido na página web. Igualzinho é feito por webmasters, inclusive usando a tag “src” para códigos Javascript que ficam em arquivos separados.&lt;br /&gt;Javascript placement: o Código JavaScript pode estar fisicamente disposto em um diretório específico para este fim, num arquivo “.js” separado da página HTML. Isso melhora inda mais a modularização do seu sistema, site, portal, etc...&lt;br /&gt;O arquivo fonte do Javascript em questão é referenciado na página HTML usando a tag “script” o atributo "src" com o nome do arquivo e o  path definidos como valor. &lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;script language="JavaScript" src="ZnJavaScriptFile.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Estive conversando com o Felipe e com o Malta &lt;a href="http://estacaozn.blogspot.com/2009/01/inicializando-o-iwform-com-alguns.html"&gt;sobre os exemplos anteriores que estive postando&lt;/a&gt;. Onde demonstrei o código Javascript definido como string no meio do código Delphi. Essa forma de implementar é um metodologia que condeno enfaticamente nos meus projetos. Inclusive, todos dois, tanto o Felipe, quanto o Malta, concordam  e estavam me chamando a atenção sobre isso. Que o &lt;a href="http://estacaozn.blogspot.com/2009/01/delphi-intraweb-javascript-ii-continua.html"&gt;Javascript no meio do código Delphi&lt;/a&gt;, mesmo eu “organizando”, através de &lt;a href="http://estacaozn.blogspot.com/2007/02/3-constantes-variveis-e-tipos-de-dados.html"&gt;constantes&lt;/a&gt; o caos, é uma solução macarrônica, feia, nojenta, asquerosa. Entretanto, eu fiz dessa forma nos exemplos anteriores porque acredito que assim o artigo que estou escrevendo para o &lt;a href="http://estacaozn.blogspot.com"&gt;Estação ZN&lt;/a&gt; fica menor, menos complexo, mais didático, na medida em que eu procuro estar focado nos assuntos que pretendo falar naquele momento. Quando estou postando aqui minha ênfase é totalmente didática. Entendo que para passar um conhecimento complexo ele deve ser simplificado, de maneira que seja reduzida toda complexidade inerente ao problema em questão. &lt;br /&gt;Portanto, de agora em diante, sugiro que você cuide para que, imperativamente, o Javascript fique separado da aplicação Delphi. Para isso temos basicamente dois caminhos a tomar: O primeiro seria usar o “IWTemplateProcessorHTML”. Uma segunda opção seria usar um “LoadFromFile”, ou seja ler dinamicamente arquivos com as funções Javascript. Se você optar por usar o IwTemplateProcesso, implementar desta forma, o “js” na página HTML, é uma ação intuitiva. Como fazer isso está demostrado neste artigo. Caso negativo, uma idéia, proposta pelo Malta, que eu gostei bastante, seria do Delphi, fazer um “LoadFromFile” de um arquivo, onde estaria com código JavaScript parametrizado (semelhante a um parâmetro de um comando SQL). A idéia é usar, ao invés de parâmetros de “FormatString (%s)” uma sintaxe como nome de parâmetros (:nome) e fazer substituição por pares (nome, valor). Deixe-me explicar melhor:&lt;br /&gt;&lt;a href="http://estacaozn.blogspot.com/2009/02/delphi-intraweb-gerar-dinamicamente.html"&gt;Veja num dos artigos anteriores&lt;/a&gt;: O Código Javascript que defini não tem “%s” para usar na função Format? Então, substitua todos o “%s” por uma sintaxe própria, que estaríamos criando, que represente o nome de um parâmetro. Por exemplo: ..... :par1 ... :idade ... :cidade... :idade. A exemplo de um comando SQL num TSQLQurey. Para trabalhar em conjunto, criaríamos uma função para substituir os parâmetros por valores em runtime, por exemplo: “function ZnReplaceParams(const znParmName, znParamValue: String)”. A chamada seria: “ReplaceParams('idade', '18');”. De cara podemos citar como vantagens melhor legibilidade do código Javascript, além de  não fica dependente de posição (como é o caso do “Format(%s)”). Dentro da função &lt;a href="http://estacaozn.blogspot.com/2008/08/o-princpio-da-caixa-preta.html"&gt;caixa preta&lt;/a&gt; “ZnReplaceParams”, um StringReplace pode dar conta do recado, com rfReplaceAll e rfIgnoreCase. O que inclusive facilita quando você precisa repetir o mesmo valor várias vezes no mesmo script bastaria repetir o nome da "macro" ou parâmetro. Boa Malta, Estação Zn agradece! Tks!!&lt;br /&gt;Uma outra abordagem seria usar argumentos na própria função Javascript, a qual vai estar definida num arquivo “.txt”, ou “.js”, que seja, e no Delphi atribuir as definições das chamadas a essas funções nos eventos “Javascript”, nas propriedades “ExtragParams”, ou “ScriptEvent”. &lt;a href="http://estacaozn.blogspot.com/2009/04/validacao-de-cpf-e-cnpj-com-javascript.html"&gt;Como exemplifiquei no artigo sobre validação de CIC.&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Falar sobre &lt;a href="http://estacaozn.blogspot.com/2008/08/modularizao-em-programao-coeso-x.html"&gt;modularização&lt;/a&gt; é muito simples. Mas demonstrar, é no mínimo trabalhoso. Eu prefiro inclusive demonstrar o “como não fazer”, para melhorar, aumentar a aderência da explicação do sobre “como fazer”.&lt;br /&gt;&lt;br /&gt;Aconselho ao desenvolvedor que decidir usar o Delphi/Intraweb ter muita atenção na hora de referenciar os objetos, inputs, submits, selects, criados pelo Intraweb, no que tange a caixa do nome dos controles definidos no Delphi. Isso pq o Delphi não é case sensitive, conseqüentemente o desenvolvedor delphi não deverá, a pricípio, estar acostumado com essa restrição. Portanto, cuidado com comandos do tipo  “document.getElementById("IWMEMO1")”, porque todo componente Intraweb é criado na página html com o nome em CAIXA ALTA. A função “getElementById” é sensível a caixa. &lt;br /&gt;Programar em Javascript exige muita atenção a questões extra-intelectuais, pois você não vai poder contar com code insight, nem auto-complemento de código (code complete) e ainda existe o overhead  de atenção na questão do case sensitive sem contar que as mensagens de erro não são tão amigáveis. Uma ferramenta que pode ajudar neste sentido são os plugins para desenvolvimento web do Fire Fox. &lt;br /&gt;Outro ponto adverso é desenvolver um script client-side compatível com todos os browsers. Isso exige bastante de quem está desenvolvendo. Entretanto os bônus adquiridos em usar enfaticamente Javascript acaba compensando todos os ônus listados. Além disso, com o tempo o desenvolvedor ganha prática nesta abordagem e esses fatores negativos acabam perdendo sua força.  &lt;br /&gt;A tecnologia &lt;span style="font-weight:bold;"&gt;Json&lt;/span&gt; ainda é bem nova, nas minhas pesquisas encontrei muito pouca gente usando. Mas pra minha surpresa um número razoável de pessoas, blogs, falando sobre. Dei uma pesquisada no google trends http://www.google.com/trends sobre as buscas sobre Json.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_buFzmAtZPuc/SfQS8nFokjI/AAAAAAAABdc/eom-w6JX_ec/s1600-h/GoogleTrends.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://1.bp.blogspot.com/_buFzmAtZPuc/SfQS8nFokjI/AAAAAAAABdc/eom-w6JX_ec/s320/GoogleTrends.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5328905091580203570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQSAiR5wPI/AAAAAAAABdU/R3ruRg6sy9g/s1600-h/TestandoAppAclienteIntraWebIsapiProcessado.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 300px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQSAiR5wPI/AAAAAAAABdU/R3ruRg6sy9g/s320/TestandoAppAclienteIntraWebIsapiProcessado.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5328904059497332978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abaixo, código completo das units Delphi:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="font-weight:bold;"&gt;Aplicação Cliente Intraweb&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;unit IWUnit1;&lt;br /&gt;{PUBDIST}&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  IWAppForm, IWApplication, IWTypes, IWCompMemo, IWCompButton, IWCompEdit,&lt;br /&gt;  Controls, IWControl, IWCompLabel, Classes, IWLayoutMgr,&lt;br /&gt;  IWTemplateProcessorHTML, IWHTMLControls;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TformMain = class(TIWAppForm)&lt;br /&gt;    IWTemplateProcessorHTML1: TIWTemplateProcessorHTML;&lt;br /&gt;    IWLabel1: TIWLabel;&lt;br /&gt;    IWEdit1: TIWEdit;&lt;br /&gt;    IWButton1: TIWButton;&lt;br /&gt;    IWMemo1: TIWMemo;&lt;br /&gt;    CEP: TIWEdit;&lt;br /&gt;    UF: TIWEdit;&lt;br /&gt;    Bairro: TIWEdit;&lt;br /&gt;    Logradouro: TIWEdit;&lt;br /&gt;    Cidade: TIWEdit;&lt;br /&gt;    IWLabel2: TIWLabel;&lt;br /&gt;    CompanyName: TIWEdit;&lt;br /&gt;    ContactName: TIWEdit;&lt;br /&gt;    ContactTitle: TIWEdit;&lt;br /&gt;    Phone: TIWEdit;&lt;br /&gt;    Fax: TIWEdit;&lt;br /&gt;    Country: TIWEdit;&lt;br /&gt;    procedure IWAppFormCreate(Sender: TObject);&lt;br /&gt;  public&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  ServerController, IWForm;&lt;br /&gt;&lt;br /&gt;  //ajaxconcorretor&lt;br /&gt;&lt;br /&gt;procedure TformMain.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Self.TemplateProcessor := IWTemplateProcessorHTML1;&lt;br /&gt;  IWLabel1.Caption := '&amp;nbsp;';&lt;br /&gt;  IWMemo1.Font.Enabled := False;&lt;br /&gt;  IWMemo1.Font.CSSStyle := 'AreaTexto';&lt;br /&gt;  CEP.Width := 80;&lt;br /&gt;  UF.Width := 40;&lt;br /&gt;  Cidade.Width := 120;&lt;br /&gt;  Logradouro.Width := 180;&lt;br /&gt;  Bairro.Width := 90;&lt;br /&gt;  IWButton1.ExtraTagParams.Add('onClick=return ZnGetClienteWsAjx(IWEDIT1);');&lt;br /&gt;  IWMemo1.RawText := True;&lt;br /&gt;  IWMemo1.Lines.Add('&amp;nbsp;');&lt;br /&gt;  IWEdit1.Text := 'Cactus Comidas para llevar';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="font-weight:bold;"&gt;Aplicação Servidora Webbrocker&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;&lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils, Classes, HTTPApp, DBClient, Provider, DB, ADODB;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TWebModule1 = class(TWebModule)&lt;br /&gt;    ADOConnection: TADOConnection;&lt;br /&gt;    ADODataSet1: TADODataSet;&lt;br /&gt;    DataSetProvider1: TDataSetProvider;&lt;br /&gt;    ClientDataSet1: TClientDataSet;&lt;br /&gt;    ClientDataSet1CustomerID: TWideStringField;&lt;br /&gt;    ClientDataSet1CompanyName: TWideStringField;&lt;br /&gt;    ClientDataSet1ContactName: TWideStringField;&lt;br /&gt;    ClientDataSet1ContactTitle: TWideStringField;&lt;br /&gt;    ClientDataSet1Address: TWideStringField;&lt;br /&gt;    ClientDataSet1City: TWideStringField;&lt;br /&gt;    ClientDataSet1Region: TWideStringField;&lt;br /&gt;    ClientDataSet1PostalCode: TWideStringField;&lt;br /&gt;    ClientDataSet1Country: TWideStringField;&lt;br /&gt;    ClientDataSet1Phone: TWideStringField;&lt;br /&gt;    ClientDataSet1Fax: TWideStringField;&lt;br /&gt;    procedure WebModule1ZnConsClientesAction(Sender: TObject;&lt;br /&gt;      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  WebModule1: TWebModule1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;   Math, StrUtils;&lt;br /&gt;&lt;br /&gt;procedure TWebModule1.WebModule1ZnConsClientesAction(Sender: TObject;&lt;br /&gt;  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);&lt;br /&gt;const&lt;br /&gt;  ZnTag = '%s:%s';&lt;br /&gt;var&lt;br /&gt;  StrStatment: String;&lt;br /&gt;  i, CodRetorno: Integer;&lt;br /&gt;begin&lt;br /&gt;  with ClientDataSet1 do&lt;br /&gt;  begin&lt;br /&gt;    Params[0].AsString := '%' + Request.QueryFields.Values['znNomeCli']+ '%';&lt;br /&gt;    try&lt;br /&gt;      Open;&lt;br /&gt;      CodRetorno := IfThen(IsEmpty, -1, 1);&lt;br /&gt;      StrStatment := StrStatment +&lt;br /&gt;          Format(ZnTag, ['codretornoZn',&lt;br /&gt;            IntToStr(CodRetorno)]);&lt;br /&gt;&lt;br /&gt;      if CodRetorno = 0 then Exit;&lt;br /&gt;&lt;br /&gt;      for i := 0 to Pred(FieldCount) do&lt;br /&gt;      begin&lt;br /&gt;        StrStatment := StrStatment + ','+&lt;br /&gt;          Format(ZnTag, [LowerCase(ClientDataSet1.Fields[i].FieldName),&lt;br /&gt;            IfThen((ClientDataSet1.Fields[i].AsString = ''), QuotedStr('-'),&lt;br /&gt;              QuotedStr(ClientDataSet1.Fields[i].AsString))]);&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;    finally&lt;br /&gt;      Close;&lt;br /&gt;      Response.Content := Format('{%s}',[StrStatment]);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-5968013299104660855?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=upu6qc74-HQ:WQKZIqfFk5A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/upu6qc74-HQ" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-26T05:50:07.748-03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_buFzmAtZPuc/SfQM8Jn3qmI/AAAAAAAABcg/LfI7z3f7xp4/s72-c/NewWebServerApplication.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/ajaxjson-delphi-technologies-webbrocker.html</feedburner:origLink></item><item><title>Navegar? Pois é, eu preciso ...</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/gCa2WUYmhbg/navegar-pois-e-eu-preciso.html</link><category>Web</category><category>Cyber Culture</category><category>Variedades</category><category>Diversos</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Tue, 21 Apr 2009 23:43:07 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-7550689176710789285</guid><description>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Opera&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Faz tempo que eu não usava o Opera (&lt;a href="http://my.opera.com/community/"&gt;Opera Software&lt;/a&gt;). Acho que a última vez foi por volta de 1999.  Volta e meia, navegando, vejo alguém falando bem da nova versão. Prontamente, instalei e gostei muito! Realmente é bem rápido. Imediatamente você percebe isso. Mas o melhor vem depois, se você gosta de ficar antenado, e conhecer coisas que te tragam vantagens vale a pena experimentar e &lt;a href="http://pt.wikipedia.org/wiki/Opera"&gt;conferir o que ele tem de bom&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/Se68H95Ku0I/AAAAAAAABcY/d-JHA4iF8QY/s1600-h/OperaSite.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 250px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/Se68H95Ku0I/AAAAAAAABcY/d-JHA4iF8QY/s320/OperaSite.jpg" alt="" id="BLOGGER_PHOTO_ID_5327402254285323074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-7550689176710789285?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=gCa2WUYmhbg:p-Wsj0ieseE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/gCa2WUYmhbg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-22T03:43:07.023-03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_buFzmAtZPuc/Se68H95Ku0I/AAAAAAAABcY/d-JHA4iF8QY/s72-c/OperaSite.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/navegar-pois-e-eu-preciso.html</feedburner:origLink></item><item><title>O Cara é o Kutiman</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/X2sBkoIDQbk/o-cara-e-o-kutiman.html</link><category>Music</category><category>Música</category><category>Multimidia</category><category>Cyber Culture</category><category>Variedades</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Tue, 21 Apr 2009 22:58:03 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-8452988029172398089</guid><description>&lt;div style="text-align: justify;"&gt;É impressionantemente, surpreendente, sensacional, criativo, positivo, sadio, anárquico, idoneamente geek,  inteligentemente livre e devastadoramente afinado a nova mídia.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Mother of All Funk Chords - E9&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tprMEs-zfQA&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tprMEs-zfQA&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Nada mais a dizer ... estou sem palavras!!!!  :-) &lt;br /&gt;&lt;a href="http://thru-you.com/"&gt;Thru-you &lt;/a&gt; Aperte o play ...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I'm New&lt;/span&gt;&lt;br /&gt;Destaque para &lt;a href="http://www.youtube.com/user/ElexisTrinity"&gt;ElexisTrinity&lt;/a&gt;, para o &lt;a href="http://www.youtube.com/user/hef513"&gt;rapper HE 513knect&lt;/a&gt; e também para segunda cantora (Misteriosa  Mandy).&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EsBfj6khrG4&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/EsBfj6khrG4&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="fullpost"&gt;Se você ja assistiu o video, prossiga: O que ele fez do Noturno de Chopin foi magnífico, acho pouco provável que isso seja percebido facilmente, mas basta conferir no &lt;a href="http://www.youtube.com/watch?v=OSCoaQgmx0I"&gt;video original - Chopin Nocturne Number 13 in C-Minor Op.48 No.1 &lt;/a&gt;. Eu percebi de cara pq cresci ouvindo minha mãe tocar Chopin de forma maravilhosa, sempre. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Wait For Me&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/i88CKr6Shn4&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/i88CKr6Shn4&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xDMFBsuc3Ig&amp;hl=pt-br&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xDMFBsuc3Ig&amp;hl=pt-br&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OBS:&lt;/span&gt; pOR fAvoR, Não deixe de conferir na totalidade as informações sobre o video que ele escreve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-8452988029172398089?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=X2sBkoIDQbk:YRC-44WypMQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/X2sBkoIDQbk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-22T02:58:03.493-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/o-cara-e-o-kutiman.html</feedburner:origLink></item><item><title>Mídias na Web - A questão de propriedade intelectual</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/G1q27OItPWk/midias-na-web-questao-de-propriedade.html</link><category>Web</category><category>Cyber Culture</category><category>Variedades</category><category>Diversos</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Sun, 19 Apr 2009 13:18:35 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-3903545450334963904</guid><description>&lt;div style="text-align: justify;"&gt;Encontrei no &lt;a href="http://idgnow.uol.com.br/internet/2009/02/02/entrevista-saiba-como-usar-imagens-na-web-sem-infringir-a-lei/"&gt;IDG Now uma entrevista&lt;/a&gt; interessante com dicas de como fazer uso de imagens baixadas da web.&lt;span class="fullpost"&gt;&lt;br /&gt;Embora o assunto principal da entrevista seja sobre “como usar imagens da web”, vale dar uma olhada porque são dadas dicas que servem para qualquer tipo de mídia produzida e publicada na web. &lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Baixei o áudio da entrevista.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;object type="video/x-ms-wmv" standby="Loading Microsoft Windows Media Player components..." data="http://estacaozn.googlepages.com/bruno_magrani_030209.mp3" align="middle" width="320" height="260"&gt;&lt;br /&gt;&lt;param name="src" value="http://estacaozn.googlepages.com/MsgInBottleSolo.mp3"&gt;&lt;br /&gt;&lt;param name="autostart" value="false"&gt;&lt;br /&gt;&lt;param name="animationatStart" value="true"&gt;&lt;br /&gt;&lt;param name="transparentatStart" value="true"&gt;&lt;br /&gt;&lt;param name="controller" value="true"&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;OBS, Importante visitar:&lt;br /&gt;&lt;a href="http://creativecommons.org.br/"&gt;Creative Commons Barsil&lt;/a&gt;&lt;br /&gt;&lt;a href="http://creativecommons.org/"&gt;Creative Commons org/&lt;/a&gt;&lt;br /&gt;Muita coisa interessante lá ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-3903545450334963904?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=G1q27OItPWk:Skw1bbroQo4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/G1q27OItPWk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T17:18:35.419-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/midias-na-web-questao-de-propriedade.html</feedburner:origLink></item><item><title>Validação de CPF e CNPJ com Javascript - Delphi/Intraweb</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/XbWm7Rmo7MU/validacao-de-cpf-e-cnpj-com-javascript.html</link><category>Web</category><category>Delphi</category><category>Javascript</category><category>Intraweb</category><category>BDS</category><category>Técnicas de desenvolvimento</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Wed, 15 Apr 2009 02:51:09 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-1631605249853223312</guid><description>&lt;div style="text-align: justify;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Mais um da série ... &lt;span style="color: rgb(51, 51, 51);"&gt;(&lt;/span&gt;&lt;/span&gt;da séria série ...)&lt;br /&gt;Ok, já fizemos vários artigos sobre como usar Javascript no Intraweb. Tenho gastado tempo registrando essa abordagem por vários motivos:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Um deles é (uma tecla que venho batendo bastante) a importância de buscar um equilíbrio, distribuído responsabilidades entre client-side e server-side (obviamente, me refiro ao contexto restrito os sistemas desenvolvidos para plataforma web). Um segundo motivo pode ser: “Como fazer isso, se eu uso Delphi/Intraweb?” Na medida em que essa é uma questão que considero possuir alguma relevância. Outro motivo, porem, trata sobre “Qual implicação, ou quais implicações, terei ao percorrer este caminho?” Tenho procurado, nos assuntos abordados, trazer alguns elementos que apontem para a responder a essa questão.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Justamente, esse último ponto, sobre as implicações, ou seja, falar sobre algumas vantagens e desvantagens, é um dos objetivos desse texto. No Intraweb existem certas particularidades ao se aplicar o Javascript, uma delas é o evento “onSubmit” do form definido numa página web. Veremos, então, sobre isso mais adiante.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Neste artigo pretendo mostrar também como podemos usar a passagem por parâmetro, de uma função Javascript, para a referência de um objeto “html” de um form no Intraweb. Seguindo a metodologia de ir do mais simples para o mais complexo, iniciaremos nossa parte prática com a criação de uma função para validação no lado cliente. Validação essa para a qual atribuiremos a responsabilidade de exemplificar esse uso de parâmetros, ao qual me referi, em Javascript, relacionado aos objetos Intraweb.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Quero usar um exemplo que seja prático, ordinário, para um cenário de sistemas de informação. Portanto, vamos criar uma função para validar CPF, uma outra para validar CNPJ e uma terceira função que vai opcionalmente validar CNPJ, CPF, ou os dois simultaneamente. Desta forma teremos uma função polivalente (a qual servirá para validar ambos os casos), cujo o processamento será realizado no lado do cliente.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; color: rgb(0, 102, 0);"&gt;Javascript para validar CNPJ, CPF no Delphi/Intraweb&lt;br /&gt;&lt;/div&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Inicie um novo projeto Intraweb no Delphi, adicione no IWForm1 um IWEdit e três IWButtons. Em seguida, defina uma área de declarações de constantes e digite conforme ilustrado abaixo:&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses IWBaseForm;&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;const&lt;br /&gt;  AQuebraLinhaJsZN = #13;&lt;br /&gt;  AFncCriticaCIC =&lt;br /&gt;     ' function CriticaCIC(ZnNumCic, ZnCnpjBool, ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var CicValidoZn = false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(!ZnVerificaCnpj(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CNPJ Inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     if (!ZnVerificaCPF(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     alert("CPF inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     ;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    CicValidoZn = ZnVerificaCnpj(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return true;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    else{ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      CicValidoZn = ZnVerificaCPF(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      if(!CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CIC Inválido") ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var ZnMsg = ""; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPJ ou CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPF"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);' + AQuebraLinhaJsZN +&lt;br /&gt;     ' return true;} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt;  AFncCriticaCPF =&lt;br /&gt;   ' function ZnVerificaCPF (ZnCpfObj){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '       var gmSort = new Array(ZnCpfObj.value.length); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (i=0; i&lt; ZnCpfObj.value.length; i++){gmSort[i] = ZnCpfObj.value.charAt(i);} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  gmSort.sort(); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (gmSort[0] == gmSort[gmSort.length -1]){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZnCpfObj.value); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (ZnCont = 0; ZnCont &lt; 9; ZnCont ++) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (10 - ZnCont); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 11 - (ZnAuxCal % 11); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn == 10 || DgVZn == 11) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn != parseInt(ZnCpfObj.value.charAt(9))) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (ZnCont = 0; ZnCont &lt; 10; ZnCont ++) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (11 - ZnCont); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 11 - (ZnAuxCal % 11); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn == 10 || DgVZn == 11) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn != parseInt(ZnCpfObj.value.charAt(10))){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  //alert("O CPF INFORMADO É VÁLIDO."); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return true; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt; AFncCriticaCNPJ  =&lt;br /&gt;   ' function ZnVerificaCnpj(ZNObjInput){' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnDigitos, ZnDg, ZnSum, ZnCount;' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnResult, ZnPos, tamanho;' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnAuxCNPJ = ZNObjInput.value.replace(/\D+/g, "");' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '    if (ZnAuxCNPJ.length != 14){' + AQuebraLinhaJsZN +&lt;br /&gt;   '     ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '     return false;' + AQuebraLinhaJsZN +&lt;br /&gt;   '     }' + AQuebraLinhaJsZN +&lt;br /&gt;   '    var gmSort = new Array(ZNObjInput.value.length); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (i=0; i&lt; ZNObjInput.value.length; i++){gmSort[i] = ZNObjInput.value.charAt(i);} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  gmSort.sort(); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (gmSort[0] == gmSort[gmSort.length -1]){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZNObjInput.value); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnAuxTamanho = ZnAuxCNPJ.length - 2' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDg = ZnAuxCNPJ.substring(ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnSum = 0;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnPos = ZnAuxTamanho - 7;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         if (ZnPos &lt; 2)' + AQuebraLinhaJsZN +&lt;br /&gt;   '               ZnPos = 9;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         }' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   if (ZnResult != ZnDg.charAt(0)){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '         return false;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         }' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnAuxTamanho = ZnAuxTamanho + 1;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnSum = 0;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnPos = ZnAuxTamanho - 7;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         if (ZnPos &lt; 2)' + AQuebraLinhaJsZN +&lt;br /&gt;   '               ZnPos = 9;}' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   if (ZnResult != ZnDg.charAt(1)){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '         return false;}' + AQuebraLinhaJsZN +&lt;br /&gt;   '   else {' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return true;' + AQuebraLinhaJsZN +&lt;br /&gt;   '    }' + AQuebraLinhaJsZN +&lt;br /&gt;   ' }' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Dando continuidade, para usarmos o que acabamos de definir devemos usar as propriedades específicas dos componentes Intraweb destinadas a trabalhar com Javascript. Elas existem tanto no IWForm (Formulário Delphi para web), quanto nos controles, IWControls.&lt;/div&gt;&lt;br /&gt;  &lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; color: rgb(0, 102, 0);"&gt;Evento OnCreate do IWFrom1:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TIWForm1.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  (* Atribuindo a propriedade "JavaScript" do IWForm1 as &lt;br /&gt;     funções que serão processadas pelo browser*)&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCPF);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCNPJ);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCIC);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  // O IWButton1 vai validar as duas opções CPF e CNPJ&lt;br /&gt;  IWButton1.Caption := 'Valida CPF e CNPJ';&lt;br /&gt;  IWButton1.Width := 200;&lt;br /&gt;  IWButton1.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'true']));&lt;br /&gt;  //O IWButton2 vai validar apenas CPF&lt;br /&gt;  IWButton2.Caption := 'Valida CPF';&lt;br /&gt;  IWButton2.Width := 200;&lt;br /&gt;  IWButton2.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'false', 'true']));&lt;br /&gt;  //O IWButton3 vai validar apenas CNPJ&lt;br /&gt;  IWButton3.Caption := 'Valida CNPJ';&lt;br /&gt;  IWButton3.Width := 200;&lt;br /&gt;  IWButton3.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'false']));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;No trecho de código acima, podemos observar, comparando com os exemplos postados nos artigos anteriores, sobre Intraweb e Javascript, que o uso de parâmetros nas funções Javascript para referenciar os objetos  do form (na página html), reduz sensivelmente a o número de linhas. Isso melhora a legibilidade do código, consequentimente aumenta a manutenibilidade do mesmo. Visto que, não precisamos usar o temperamental “document.all” (sensível a diversidade de navegadores). Também não precisamos mais do “document.forms[x]”, isso nos abstém da preocupação em referenciar o form específico (Lembra, no Intraweb 8, o framework pode criar vários forms na mesma página?). Obviamente, isso é possível porque a chamada a função esta sendo feita no mesmo form proprietário do objeto que está sendo passado como argumento. Em outras palavras: O objeto que está sendo passado como parâmetro na função critica CIC 2, está definido no mesmo form no qual a função esta sendo chamada. &lt;br /&gt;Entretanto, infelizmente, essa abordagem pode encontrar limitações. Vejamos adiante ....&lt;br /&gt;&lt;br /&gt;Sobre as funções de validação de CNPJ e CPF, não estou preocupado com a otimização da lógica que elas implementam. Basiei-me em alguns dos milhares de exemplos que podemos encontrar na web. Com certeza, fiz alguns ajustes. Mas nada que mereça grande atenção, embora elas funcionem corretamente, no sentido de serem eficientes em alcançarem o objetivo que se propõem. Reiterando, o propósito dessa parte do artigo é exemplificar como resolver via Javascript uma validação bastante necessária, uma situação comum, presumo, em muitos sistemas (desenvolvidos com Intraweb).&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; font-weight: bold; color: rgb(0, 102, 0);"&gt;OnClick do IWButton chamar mais de uma função Javascript no evento “onSubmit” do form&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt; &lt;br /&gt;Supondo que o IWButton, ou qualquer outro controle que seja, já possua uma chamada a uma função Javascript. Hipoteticamente, imagine um cenário onde o mesmo IWButton, que vai submeter o form da página web, precisa, no mesmo evento “OnClick”, validar o CIC e fazer qualquer outro tipo de validação. &lt;/div&gt;&lt;span class='fullpost'&gt;&lt;div style="text-align: justify;"&gt; Note que estou, propositalmente, construindo uma situação onde o click do botão está relacionado a ação de submeter o form da página web. Além disso, estamos trabalhando com um grau de complexidade onde você precisa (ou precisará) executar mais de um função em reposta ação do usuário clicar esse botão. O botão “Submit” (no caso, nosso IWButton1). Ora, grau de complexidade? Isso que você descreveu, Gerson, me parece tão comum! Concordo, é muito comum se você está trabalhando com outra tecnologia. No Intraweb, lamentavelmente isso não é trivial. &lt;br /&gt;Então, prosseguindo, vejamos: Em primeiro lugar, vamos criar a segunda função (a qual será responsável por tornar o valor do IWEdit1 obrigatório). Ou seja, para submeter o form da página web, o usuário será obrigado a digitar algum valor no IWEdit1. Feito isso, teremos construído todos elementos necessários para a experiência que irá confirmar minha argumentação (assim espero ....). Portanto, na seção “const” (que definimos anteriormente) codificaremos, em forma de outra constante, a string com a função supracitada. Digite conforme ilustrado abaixo:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;&lt;br /&gt;AFncValorRequerido =&lt;br /&gt;     ' function ValorRequerido(){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   var ObjInput = document.getElementById("%s); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   var AFriendlyName = "%s"; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   if (ObjInput.value == ""){ ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     alert("É obrigatório o valor para o campo: " + AFriendlyName); ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.style.backgroundColor = "#FD88AA"; ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.focus(); ' + AQuebraLinhaJsZN +&lt;br /&gt;    '    }' + AQuebraLinhaJsZN +&lt;br /&gt;     '   else { ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.style.backgroundColor = "#FFFFFF"; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' }' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt; &lt;br /&gt;Em seguida faremos uma pequena modificação na primeira função que criamos, “CriticaCIC”. No caso, ela é a segunda constante de definimos para o exemplo anterior, a “AFncCriticaCIC”. Espere, não é exatamente isso o que faremos. O que quero realmente fazer é copiar a constante “AFncCriticaCIC”, a partir disso, definir uma nova com o mesmo conteúdo. Porque, desta forma posso fazer as alterações que preciso, sem perder completamente  o exemplo anterior. Logo, assim sendo, quem estiver acompanhando este artigo poderá facilmente testar e verificar a diferença entra as duas &lt;a href="http://desciclo.pedia.ws/wiki/Conceito_de_Estrat%C3%A9gia "&gt;estratégias&lt;/a&gt; (“do grego, "Στρατηγικη"... ...no inglês, "strategy"... ...no francês, "stratégie"... ZzZzZzZzzzz...... ...Senhor leitor, o senhor está dormindo? Senhor leitor, tenha bondade..”. (Parafraseando Capitão Nascimento)&lt;br /&gt;&lt;br /&gt;Prosseguindo (era brincadeira), retomemos: Criaremos então a nova constante a partir da cópia de “AFncCriticaCIC”:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;AFncCriticaCIC2 =&lt;br /&gt;     ' function CriticaCIC2(ZnCnpjBool, ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' var ZnNumCic = document.getElementById("%s); ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var CicValidoZn = false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(!ZnVerificaCnpj(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CNPJ Inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     if (!ZnVerificaCPF(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     alert("CPF inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     ;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    CicValidoZn = ZnVerificaCnpj(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return true;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    else{ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      CicValidoZn = ZnVerificaCPF(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      if(!CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CIC Inválido") ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var ZnMsg = ""; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPJ ou CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPF"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);' + AQuebraLinhaJsZN +&lt;br /&gt;     ' return true;} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt; &lt;br /&gt;Essa nova versão da crítica de “CIC” possui um parâmetro a menos. Eu retirei o argumento referente ao objeto do form (input que recebe o valor digitado do suposto CIC). Já que decidimos não perder o que foi feito no exemplo anterior, vamos adicionar mais um IWButton. O IWButton4, servirá, nessa segunda parte do artigo, para chamar a nova critica CIC (o conteúdo da AFncCriticaCIC2). Feito isso, vamos acrescentar mais umas linhas de código no evento “OnCreate” do IWForm1.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;    &lt;br /&gt;  (* segunda parte do artigo:&lt;br /&gt;      OnClick do IWButton chamar mais de uma função Javascript *)&lt;br /&gt;  IWEdit1.FriendlyName := 'CIC: "CNPJ" ou "CPF"';&lt;br /&gt;  Self.JavaScript.Add('//**************************************');&lt;br /&gt;  Self.JavaScript.Add('//segunda parte do artigo:' + #13 +&lt;br /&gt;    '// OnClick do IWButton chamar mais de uma função Javascript');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncCriticaCIC2, [UpperCase(IWEdit1.Name)]));&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncValorRequerido, [UpperCase(IWEdit1.Name),&lt;br /&gt;    IWEdit1.FriendlyName]));&lt;br /&gt;  Self.JavaScript.Add('//*******www.estacaozn.blogspot.com**********');&lt;br /&gt;&lt;br /&gt;  IWButton4.Caption := 'Valor Obrigatório &amp; Valida CIC';&lt;br /&gt;  IWButton4.Width := 360;&lt;br /&gt;  IWButton4.ScriptEvents.Add('onClick').EventCode.Add(&lt;br /&gt;    'ValorRequerido() &amp;&amp; CriticaCIC(true, true)');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;No Intraweb, chamar, efetivamente, no evento “onClick”, mais de um função pode ser feito declarando o nome das funções, juntamente com o operador lógico adequado, ao caso específico, na propriedade “ScriptEvent” do componente escolhido (No nosso caso o escolhido foi o TIWButton). Provavelmente, essa não deve ser a única forma de se fazer isso, essa é apenas uma (suponho ;-)). Especificamente a que eu encontrei no momento para alcançar meu objetivo.&lt;/div&gt;&lt;span class='fullpost'&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Cabe registrar que, como alternativa, para propriedade “ExtraTagParams” existe um restrição. Só funciona se a ação não envolver o submit do form. Como posso ter certeza do acabei de afirmar?&lt;br /&gt;Para exemplificar, respondendo a pergunta anterior, vamos submeter o form. Contudo, para isso, precisamos pelo menos processar algo no servidor. Com essa finalidade, codificaremos qualquer coisa dummy no evento OnClick do componente Delphi/Intraweb TIWButton4. Adicione um novo componente, um IWLabel, em seguida, acompanhe trecho de código abaixo:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TIWForm1.IWButton4Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  IWLabel1.Font.Size := 16;&lt;br /&gt;  IWLabel1.Caption := Format('Valor digitado válido: %s', [IWEdit1.Text]); ;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Veja, como o Intraweb monta a função que submete o form:&lt;br /&gt; &lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt; var IWLABEL1IWCL = null;&lt;br /&gt; var IWBUTTON1IWCL = null;&lt;br /&gt; var IWEDIT1IWCL = null;&lt;br /&gt; var IWBUTTON2IWCL = null;&lt;br /&gt; var IWBUTTON3IWCL = null;&lt;br /&gt; var IWBUTTON4IWCL = null;&lt;br /&gt;  function IWBUTTON4_onclick(event) {&lt;br /&gt;   return ValorRequerido() &amp;&amp; CriticaCIC2(true, true)&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;function IWBUTTON4_onclick0(event) {&lt;br /&gt;return SubmitClickConfirm('IWBUTTON4','', true, '');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok, finalizamos! Podemos testar, F9 .. e manda ver ...&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; color: rgb(0, 102, 0);"&gt;Prova dos Nove&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Considero que terminamos o assunto aqui. Se por acaso você inda quer conferir o que eu afirmei acima prossiga:&lt;br /&gt;Agora vamos testar se realmente, de fato, quando esta situação acontece, não é possível ter sucesso usando a propriedade “ExtraTagParams”.&lt;br /&gt;Adicionaremos mais um IWButton, no meu exemplo esse será o IWButton5. Retornaremos ao evento “OnCreate” do IWForm1 (Unit1) e codificaremos a chamada ao Javascript de crítica de valor requerido e validação de CIC, na propriedade ExtraTagParams do último IWButton adicionado. Veja abaixo como ficou:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TIWForm1.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCPF);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCNPJ);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCIC);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  // O IWButton1 vai validar as duas opções CPF e CNPJ&lt;br /&gt;  IWButton1.Caption := 'Valida CPF e CNPJ';&lt;br /&gt;  IWButton1.Width := 200;&lt;br /&gt;  IWButton1.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'true']));&lt;br /&gt;  //O IWButton2 vai validar apenas CPF&lt;br /&gt;  IWButton2.Caption := 'Valida CPF';&lt;br /&gt;  IWButton2.Width := 200;&lt;br /&gt;  IWButton2.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'false', 'true']));&lt;br /&gt;  //O IWButton3 vai validar apenas CNPJ&lt;br /&gt;  IWButton3.Caption := 'Valida CNPJ';&lt;br /&gt;  IWButton3.Width := 200;&lt;br /&gt;  IWButton3.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'false']));&lt;br /&gt;&lt;br /&gt;  (* segunda parte do artigo:&lt;br /&gt;      OnClick do IWButton chamar mais de uma função Javascript *)&lt;br /&gt;  IWEdit1.FriendlyName := 'CIC: CNPJ ou CPF';&lt;br /&gt;  Self.JavaScript.Add('//**************************************');&lt;br /&gt;  Self.JavaScript.Add('//segunda parte do artigo:' + #13 +&lt;br /&gt;    '// OnClick do IWButton chamar mais de uma função Javascript');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncCriticaCIC2, [UpperCase(IWEdit1.Name)]));&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncValorRequerido, [UpperCase(IWEdit1.Name),&lt;br /&gt;    IWEdit1.FriendlyName]));&lt;br /&gt;  Self.JavaScript.Add('//*******www.estacaozn.blogspot.com**********');&lt;br /&gt;&lt;br /&gt;  IWButton4.Caption := 'Valor Obrigatório &amp; Valida CIC';&lt;br /&gt;  IWButton4.Width := 360;&lt;br /&gt;  IWButton4.ScriptEvents.Add('onClick').EventCode.Add(&lt;br /&gt;    'return ValorRequerido() &amp;&amp; CriticaCIC2(true, true)');&lt;br /&gt;&lt;br /&gt;  (* testando chamar duas funções Javascript na propriedade ExtraTagParams *)&lt;br /&gt;&lt;br /&gt;  IWButton5.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=return ValorRequerido() &amp;&amp; CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'true']));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;O trecho que acabamos de digitar inicia com o comentário da linha 48. Note que fizemos a chamada semelhante ao IWButton4. Da forma como está agora, funciona perfeitamente. Mesmo que eu faça a chamada, no IWButton5, igualzinho a do IWButton4, funciona.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;  IWButton5.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=return ValorRequerido() &amp;&amp; CriticaCIC2(true, true)',&lt;br /&gt;      [UpperCase(IWEdit1.Name)]));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Todavia, se eu envolver o IWButton5 no submit do form teremos fracasso. Babau! A vaca vai pro brejo. &lt;br /&gt;Para conferir basta codificar qualquer coisa no evento “OnClick” do IWButton5. Isso irá forçar um submit para que esse código seja processado no servidor. Vou colocar uma dummy aqui ... veja:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TIWForm1.IWButton5Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  IWLabel1.Caption := IWEdit1.Text;&lt;br /&gt;  WebApplication.ShowMessage('Se você esta codificando esse exemplo corretamente, '+&lt;br /&gt;    'essa mensagem nunca não vai ser exibida. Jamais será! Garanto (heheh ..).');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;O Intraweb tenta ter controle total de alguns eventos do objeto form da página html. Isso acontece de forma mais rigorosa no evento “onLoad”. Eu até entendo a razão deles fazerem isso, mas não a considero justificável, e justamente por isso discordo desse tipo de controle. Acho isso extremamente prejudicial ao desenvolvimento de sites, sistemas, serviços, web com o Intraweb. Ao mesmo tempo isso demonstra de forma muito clara o quanto esse framework é frágil e imaturo. &lt;br /&gt;&lt;br /&gt;Abaixo, o código integral da Unit1, seguido do código da página html gerado pelo Intraweb:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, IWCompEdit,&lt;br /&gt;  Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl,&lt;br /&gt;  IWCompButton, IWCompLabel;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TIWForm1 = class(TIWAppForm)&lt;br /&gt;    IWButton1: TIWButton;&lt;br /&gt;    IWEdit1: TIWEdit;&lt;br /&gt;    IWButton2: TIWButton;&lt;br /&gt;    IWButton3: TIWButton;&lt;br /&gt;    IWButton4: TIWButton;&lt;br /&gt;    IWLabel1: TIWLabel;&lt;br /&gt;    IWButton5: TIWButton;&lt;br /&gt;    procedure IWButton5Click(Sender: TObject);&lt;br /&gt;    procedure IWButton4Click(Sender: TObject);&lt;br /&gt;    procedure IWAppFormCreate(Sender: TObject);&lt;br /&gt;  public&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;const&lt;br /&gt;  AQuebraLinhaJsZN = #13;&lt;br /&gt;  AFncCriticaCIC =&lt;br /&gt;     ' function CriticaCIC(ZnNumCic, ZnCnpjBool, ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var CicValidoZn = false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(!ZnVerificaCnpj(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CNPJ Inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     if (!ZnVerificaCPF(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     alert("CPF inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     ;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    CicValidoZn = ZnVerificaCnpj(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return true;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    else{ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      CicValidoZn = ZnVerificaCPF(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      if(!CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CIC Inválido") ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var ZnMsg = ""; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPJ ou CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPF"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);' + AQuebraLinhaJsZN +&lt;br /&gt;     ' return true;} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt;  AFncCriticaCPF =&lt;br /&gt;   ' function ZnVerificaCPF (ZnCpfObj){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '       var gmSort = new Array(ZnCpfObj.value.length); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (i=0; i&lt; ZnCpfObj.value.length; i++){gmSort[i] = ZnCpfObj.value.charAt(i);} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  gmSort.sort(); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (gmSort[0] == gmSort[gmSort.length -1]){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZnCpfObj.value); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (ZnCont = 0; ZnCont &lt; 9; ZnCont ++) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (10 - ZnCont); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 11 - (ZnAuxCal % 11); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn == 10 || DgVZn == 11) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn != parseInt(ZnCpfObj.value.charAt(9))) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (ZnCont = 0; ZnCont &lt; 10; ZnCont ++) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (11 - ZnCont); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 11 - (ZnAuxCal % 11); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn == 10 || DgVZn == 11) ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  DgVZn = 0; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (DgVZn != parseInt(ZnCpfObj.value.charAt(10))){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  //alert("O CPF INFORMADO É VÁLIDO."); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  return true; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt; AFncCriticaCNPJ  =&lt;br /&gt;   ' function ZnVerificaCnpj(ZNObjInput){' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnDigitos, ZnDg, ZnSum, ZnCount;' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnResult, ZnPos, tamanho;' + AQuebraLinhaJsZN +&lt;br /&gt;   '      var ZnAuxCNPJ = ZNObjInput.value.replace(/\D+/g, "");' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '    if (ZnAuxCNPJ.length != 14){' + AQuebraLinhaJsZN +&lt;br /&gt;   '     ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '     return false;' + AQuebraLinhaJsZN +&lt;br /&gt;   '     }' + AQuebraLinhaJsZN +&lt;br /&gt;   '    var gmSort = new Array(ZNObjInput.value.length); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  for (i=0; i&lt; ZNObjInput.value.length; i++){gmSort[i] = ZNObjInput.value.charAt(i);} ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  gmSort.sort(); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  if (gmSort[0] == gmSort[gmSort.length -1]){ ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZNObjInput.value); ' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;   '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnAuxTamanho = ZnAuxCNPJ.length - 2' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDg = ZnAuxCNPJ.substring(ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnSum = 0;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnPos = ZnAuxTamanho - 7;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         if (ZnPos &lt; 2)' + AQuebraLinhaJsZN +&lt;br /&gt;   '               ZnPos = 9;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         }' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   if (ZnResult != ZnDg.charAt(0)){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '         return false;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         }' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnAuxTamanho = ZnAuxTamanho + 1;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnSum = 0;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnPos = ZnAuxTamanho - 7;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;' + AQuebraLinhaJsZN +&lt;br /&gt;   '         if (ZnPos &lt; 2)' + AQuebraLinhaJsZN +&lt;br /&gt;   '               ZnPos = 9;}' + AQuebraLinhaJsZN +&lt;br /&gt;   '' + AQuebraLinhaJsZN +&lt;br /&gt;   '   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;' + AQuebraLinhaJsZN +&lt;br /&gt;   '   if (ZnResult != ZnDg.charAt(1)){' + AQuebraLinhaJsZN +&lt;br /&gt;   '         ZNObjInput.focus();' + AQuebraLinhaJsZN +&lt;br /&gt;   '         return false;}' + AQuebraLinhaJsZN +&lt;br /&gt;   '   else {' + AQuebraLinhaJsZN +&lt;br /&gt;   '    return true;' + AQuebraLinhaJsZN +&lt;br /&gt;   '    }' + AQuebraLinhaJsZN +&lt;br /&gt;   ' }' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt;   AFncValorRequerido =&lt;br /&gt;     ' function ValorRequerido(){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   var ObjInput = document.getElementById("%s"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   var AFriendlyName = "%s"; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   if (ObjInput.value == ""){ ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     alert("É obrigatório o valor para o campo: " + AFriendlyName); ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.style.backgroundColor = "#FD88AA"; ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.focus(); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;    '    }' + AQuebraLinhaJsZN +&lt;br /&gt;     '   else { ' + AQuebraLinhaJsZN +&lt;br /&gt;    '     ObjInput.style.backgroundColor = "#FFFFFF"; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' return true;}' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt;     AFncCriticaCIC2 =&lt;br /&gt;     ' function CriticaCIC2(ZnCnpjBool, ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' var ZnNumCic = document.getElementById("%s"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var CicValidoZn = false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     ' ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(!ZnVerificaCnpj(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CNPJ Inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     if (!ZnVerificaCPF(ZnNumCic)){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     alert("CPF inválido"); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     return false; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     ;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  else { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    CicValidoZn = ZnVerificaCnpj(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    if(CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return true;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '    else{ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      CicValidoZn = ZnVerificaCPF(ZnNumCic); ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      if(!CicValidoZn){ ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      alert("CIC Inválido") ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      return false;} ' + AQuebraLinhaJsZN +&lt;br /&gt;     '     } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '   } ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  var ZnMsg = ""; ' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPJ ou CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CNPJ"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     '  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { ' + AQuebraLinhaJsZN +&lt;br /&gt;     '      ZnMsg = "CPF"; }' + AQuebraLinhaJsZN +&lt;br /&gt;     ' alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);' + AQuebraLinhaJsZN +&lt;br /&gt;     ' return true;} ' + AQuebraLinhaJsZN;&lt;br /&gt;&lt;br /&gt;procedure TIWForm1.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCPF);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCNPJ);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(AFncCriticaCIC);&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  // O IWButton1 vai validar as duas opções CPF e CNPJ&lt;br /&gt;  IWButton1.Caption := 'Valida CPF e CNPJ';&lt;br /&gt;  IWButton1.Width := 200;&lt;br /&gt;  IWButton1.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'true']));&lt;br /&gt;  //O IWButton2 vai validar apenas CPF&lt;br /&gt;  IWButton2.Caption := 'Valida CPF';&lt;br /&gt;  IWButton2.Width := 200;&lt;br /&gt;  IWButton2.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'false', 'true']));&lt;br /&gt;  //O IWButton3 vai validar apenas CNPJ&lt;br /&gt;  IWButton3.Caption := 'Valida CNPJ';&lt;br /&gt;  IWButton3.Width := 200;&lt;br /&gt;  IWButton3.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'false']));&lt;br /&gt;&lt;br /&gt;  (* segunda parte do artigo:&lt;br /&gt;      OnClick do IWButton chamar mais de uma função Javascript *)&lt;br /&gt;  IWEdit1.FriendlyName := 'CIC: CNPJ ou CPF';&lt;br /&gt;  Self.JavaScript.Add('//**************************************');&lt;br /&gt;  Self.JavaScript.Add('//segunda parte do artigo:' + #13 +&lt;br /&gt;    '// OnClick do IWButton chamar mais de uma função Javascript');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncCriticaCIC2, [UpperCase(IWEdit1.Name)]));&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;&lt;br /&gt;  Self.JavaScript.Add('');&lt;br /&gt;  Self.JavaScript.Add(Format(AFncValorRequerido, [UpperCase(IWEdit1.Name),&lt;br /&gt;    IWEdit1.FriendlyName]));&lt;br /&gt;  Self.JavaScript.Add('//*******www.estacaozn.blogspot.com**********');&lt;br /&gt;&lt;br /&gt;  IWButton4.Caption := 'Valor Obrigatório &amp; Valida CIC';&lt;br /&gt;  IWButton4.Width := 360;&lt;br /&gt;  IWButton4.ScriptEvents.Add('onClick').EventCode.Add(&lt;br /&gt;    'return ValorRequerido() &amp;&amp; CriticaCIC2(true, true)');&lt;br /&gt;&lt;br /&gt;  (* testando chamar duas funções Javascript na propriedade ExtraTagParams *)&lt;br /&gt;&lt;br /&gt; (* IWButton5.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=return ValorRequerido() &amp;&amp; CriticaCIC(%s, %s, %s)', [UpperCase(IWEdit1.Name),&lt;br /&gt;    'true', 'true']));  *)&lt;br /&gt;&lt;br /&gt;  IWButton5.ExtraTagParams.Add(&lt;br /&gt;    Format('onClick=return ValorRequerido() &amp;&amp; CriticaCIC2(true, true)',&lt;br /&gt;      [UpperCase(IWEdit1.Name)]));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TIWForm1.IWButton4Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  IWLabel1.Font.Size := 16;&lt;br /&gt;  IWLabel1.Caption := Format('Valor digitado válido: %s', [IWEdit1.Text]); ;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TIWForm1.IWButton5Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  IWLabel1.Caption := IWEdit1.Text;&lt;br /&gt;  WebApplication.ShowMessage('Se você esta codificando esse exemplo corretamente, '+&lt;br /&gt;    'essa mensagem nunca não vai ser exibida. Jamais será! Garanto (heheh ..).');&lt;br /&gt;end;&lt;br /&gt;(* esse trecho para Intrweb 8*)&lt;br /&gt;initialization&lt;br /&gt;  TIWForm1.SetAsMainForm;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Abaixo, trecho código Javascript gerado pelo Intraweb como resultado do processamento do que implementamos em Delphi.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function ZnVerificaCPF (ZnCpfObj){ &lt;br /&gt;       var gmSort = new Array(ZnCpfObj.value.length); &lt;br /&gt;  for (i=0; i&lt; ZnCpfObj.value.length; i++){gmSort[i] = ZnCpfObj.value.charAt(i);} &lt;br /&gt;  gmSort.sort(); &lt;br /&gt;  if (gmSort[0] == gmSort[gmSort.length -1]){ &lt;br /&gt;    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZnCpfObj.value); &lt;br /&gt;    return false; &lt;br /&gt;  } &lt;br /&gt;  ZnAuxCal = 0; &lt;br /&gt;  for (ZnCont = 0; ZnCont &lt; 9; ZnCont ++) &lt;br /&gt;    ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (10 - ZnCont); &lt;br /&gt;  DgVZn = 11 - (ZnAuxCal % 11); &lt;br /&gt;  if (DgVZn == 10 || DgVZn == 11) &lt;br /&gt;  DgVZn = 0; &lt;br /&gt;  if (DgVZn != parseInt(ZnCpfObj.value.charAt(9))) &lt;br /&gt;  return false; &lt;br /&gt;  ZnAuxCal = 0; &lt;br /&gt;  for (ZnCont = 0; ZnCont &lt; 10; ZnCont ++) &lt;br /&gt;  ZnAuxCal += parseInt(ZnCpfObj.value.charAt(ZnCont)) * (11 - ZnCont); &lt;br /&gt;  DgVZn = 11 - (ZnAuxCal % 11); &lt;br /&gt;  if (DgVZn == 10 || DgVZn == 11) &lt;br /&gt;  DgVZn = 0; &lt;br /&gt;  if (DgVZn != parseInt(ZnCpfObj.value.charAt(10))){ &lt;br /&gt;  return false;} &lt;br /&gt;  //alert("O CPF INFORMADO É VÁLIDO."); &lt;br /&gt;  return true; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; function ZnVerificaCnpj(ZNObjInput){&lt;br /&gt;      var ZnDigitos, ZnDg, ZnSum, ZnCount;&lt;br /&gt;      var ZnResult, ZnPos, tamanho;&lt;br /&gt;      var ZnAuxCNPJ = ZNObjInput.value.replace(/\D+/g, "");&lt;br /&gt;&lt;br /&gt;    if (ZnAuxCNPJ.length != 14){&lt;br /&gt;     ZNObjInput.focus();&lt;br /&gt;     return false;&lt;br /&gt;     }&lt;br /&gt;    var gmSort = new Array(ZNObjInput.value.length); &lt;br /&gt;  for (i=0; i&lt; ZNObjInput.value.length; i++){gmSort[i] = ZNObjInput.value.charAt(i);} &lt;br /&gt;  gmSort.sort(); &lt;br /&gt;  if (gmSort[0] == gmSort[gmSort.length -1]){ &lt;br /&gt;    alert("www.estacaozn.blogspot.com: Os números são iguais: " + ZNObjInput.value); &lt;br /&gt;    return false; &lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;   ZnAuxTamanho = ZnAuxCNPJ.length - 2&lt;br /&gt;   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);&lt;br /&gt;   ZnDg = ZnAuxCNPJ.substring(ZnAuxTamanho);&lt;br /&gt;   ZnSum = 0;&lt;br /&gt;   ZnPos = ZnAuxTamanho - 7;&lt;br /&gt;   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){&lt;br /&gt;         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;&lt;br /&gt;         if (ZnPos &lt; 2)&lt;br /&gt;               ZnPos = 9;&lt;br /&gt;         }&lt;br /&gt;   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;&lt;br /&gt;   if (ZnResult != ZnDg.charAt(0)){&lt;br /&gt;         ZNObjInput.focus();&lt;br /&gt;         return false;&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;   ZnAuxTamanho = ZnAuxTamanho + 1;&lt;br /&gt;   ZnDigitos = ZnAuxCNPJ.substring(0,ZnAuxTamanho);&lt;br /&gt;   ZnSum = 0;&lt;br /&gt;   ZnPos = ZnAuxTamanho - 7;&lt;br /&gt;   for (ZnCount = ZnAuxTamanho; ZnCount &gt;= 1; ZnCount--){&lt;br /&gt;         ZnSum += ZnDigitos.charAt(ZnAuxTamanho - ZnCount) * ZnPos--;&lt;br /&gt;         if (ZnPos &lt; 2)&lt;br /&gt;               ZnPos = 9;}&lt;br /&gt;&lt;br /&gt;   ZnResult = ZnSum % 11 &lt; 2 ? 0 : 11 - ZnSum % 11;&lt;br /&gt;   if (ZnResult != ZnDg.charAt(1)){&lt;br /&gt;         ZNObjInput.focus();&lt;br /&gt;         return false;}&lt;br /&gt;   else {&lt;br /&gt;    return true;&lt;br /&gt;    }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; function CriticaCIC(ZnNumCic, ZnCnpjBool, ZnCpfBool){ &lt;br /&gt; alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");&lt;br /&gt;  var CicValidoZn = false; &lt;br /&gt; &lt;br /&gt;  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { &lt;br /&gt;    if(!ZnVerificaCnpj(ZnNumCic)){ &lt;br /&gt;      alert("CNPJ Inválido"); &lt;br /&gt;      return false;} &lt;br /&gt;  } &lt;br /&gt;  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ &lt;br /&gt;     if (!ZnVerificaCPF(ZnNumCic)){ &lt;br /&gt;     alert("CPF inválido"); &lt;br /&gt;     return false; &lt;br /&gt;     ;} &lt;br /&gt;     } &lt;br /&gt;  else { &lt;br /&gt;    CicValidoZn = ZnVerificaCnpj(ZnNumCic); &lt;br /&gt;    if(CicValidoZn){ &lt;br /&gt;      return true;} &lt;br /&gt;    else{ &lt;br /&gt;      CicValidoZn = ZnVerificaCPF(ZnNumCic); &lt;br /&gt;      if(!CicValidoZn){ &lt;br /&gt;      alert("CIC Inválido") &lt;br /&gt;      return false;} &lt;br /&gt;     } &lt;br /&gt;   } &lt;br /&gt;  var ZnMsg = ""; &lt;br /&gt;  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CPJ ou CNPJ"; }&lt;br /&gt;  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CNPJ"; }&lt;br /&gt;  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CPF"; }&lt;br /&gt; alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);&lt;br /&gt; return true;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//**************************************&lt;br /&gt;//segunda parte do artigo:&lt;br /&gt;// OnClick do IWButton chamar mais de uma função Javascript&lt;br /&gt; function CriticaCIC2(ZnCnpjBool, ZnCpfBool){ &lt;br /&gt; var ZnNumCic = document.getElementById("IWEDIT1"); &lt;br /&gt; alert("www.estacaozn.blogspot.com verifica CPF/CNPJ");&lt;br /&gt;  var CicValidoZn = false; &lt;br /&gt; &lt;br /&gt;  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { &lt;br /&gt;    if(!ZnVerificaCnpj(ZnNumCic)){ &lt;br /&gt;      alert("CNPJ Inválido"); &lt;br /&gt;      return false;} &lt;br /&gt;  } &lt;br /&gt;  else if (!ZnCnpjBool &amp;&amp; ZnCpfBool){ &lt;br /&gt;     if (!ZnVerificaCPF(ZnNumCic)){ &lt;br /&gt;     alert("CPF inválido"); &lt;br /&gt;     return false; &lt;br /&gt;     ;} &lt;br /&gt;     } &lt;br /&gt;  else { &lt;br /&gt;    CicValidoZn = ZnVerificaCnpj(ZnNumCic); &lt;br /&gt;    if(CicValidoZn){ &lt;br /&gt;      return true;} &lt;br /&gt;    else{ &lt;br /&gt;      CicValidoZn = ZnVerificaCPF(ZnNumCic); &lt;br /&gt;      if(!CicValidoZn){ &lt;br /&gt;      alert("CIC Inválido") &lt;br /&gt;      return false;} &lt;br /&gt;     } &lt;br /&gt;   } &lt;br /&gt;  var ZnMsg = ""; &lt;br /&gt;  if (ZnCnpjBool &amp;&amp; ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CPJ ou CNPJ"; }&lt;br /&gt;  if (ZnCnpjBool &amp;&amp; !ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CNPJ"; }&lt;br /&gt;  if (!ZnCnpjBool &amp;&amp; ZnCpfBool) { &lt;br /&gt;      ZnMsg = "CPF"; }&lt;br /&gt; alert("Valor Validado Ok, " +ZnMsg + ": " + ZnNumCic.value);&lt;br /&gt; return true;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; function ValorRequerido(){ &lt;br /&gt;   var ObjInput = document.getElementById("IWEDIT1"); &lt;br /&gt;   var AFriendlyName = "CIC: CNPJ ou CPF"; &lt;br /&gt;   if (ObjInput.value == ""){ &lt;br /&gt;     alert("É obrigatório o valor para o campo: " + AFriendlyName); &lt;br /&gt;     ObjInput.style.backgroundColor = "#FD88AA"; &lt;br /&gt;     ObjInput.focus(); &lt;br /&gt;     return false; &lt;br /&gt;    }&lt;br /&gt;   else { &lt;br /&gt;     ObjInput.style.backgroundColor = "#FFFFFF"; &lt;br /&gt;      }&lt;br /&gt; return true;}&lt;br /&gt;&lt;br /&gt;//*******www.estacaozn.blogspot.com**********&lt;br /&gt;&lt;br /&gt;function Validate() {&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-1631605249853223312?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=XbWm7Rmo7MU:PAIrDz2aOV0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/XbWm7Rmo7MU" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-15T06:51:09.903-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/04/validacao-de-cpf-e-cnpj-com-javascript.html</feedburner:origLink></item><item><title>Ajax-enabled Web Services with ScriptManager</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/1qys-bllirg/ajax-enabled-web-services-with.html</link><category>Webservice</category><category>AJAX</category><category>ASP.NET</category><category>C#</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 28 Mar 2009 06:17:16 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-2164842546245602917</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/03/web-services-em-ajax-com-scriptmanager.html"&gt;Clique aqui para ver este post em Português&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this post I'll show an incredible ASP.Net feature I've learned recently: Ajax-enabled Web Services.&lt;br /&gt;&lt;br /&gt;With the ScriptManager component (that we've already seen in &lt;a href="http://estacaozn.blogspot.com/2009/03/ajax-in-simple-way-with-aspnet.html"&gt;this post&lt;/a&gt;) we're able to consume a Web Service in our Web Site and use the results in JavaScript with little to none specific programming effort. With this component, the Web Service looks like it's a client script object.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;Let's start with a new Web Site in Visual Studio (the Visual Web Developer express edition works fine, too). Choose a folder to save the Web Site (you don't need the IIS installed in order to test de project). Now we'll create the Web Service.&lt;br /&gt;&lt;br /&gt;Right-click the Web Site's root directory and choose Add New Item. In the dialog box select Web Service. Name it AjaxWs.asmx and click Ok. The IDE should open the file App_Code/AjaxWs.cs. This is where we're gonna work.&lt;br /&gt;&lt;br /&gt;Let's leave its implementation as it is for now. It should come with a sample method HelloWorld. The only thing we'll do is "enable" the client script calls. To do that find the class definition:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;public class AjaxWs : System.Web.Services.WebService&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the line above there's a commented class decoration that we only need to remove the comment bars to enable this feature:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;// [System.Web.Script.Services.ScriptService]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, remove the comment and save the file and click the menu Build &amp;gt; Build Web Site.&lt;br /&gt;&lt;br /&gt;The Web Service part is done (for now). Now we're gonna code the Web Form that calls the Web Service. Open the Default.aspx file and go to the visualization "Source" or "Split". Below the form tag&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We're gonna add a ScriptManager component. You can drag it from the toolbox or simply type manually the asp:ScriptManager tag. The VS makes the effort of type the tags manually very smooth, even if it may not seem that way. After done the tag looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:ScriptManager runat="server" ID="ScriptMngr"&amp;gt;&lt;br /&gt;    &amp;lt;Services&amp;gt;&lt;br /&gt;        &amp;lt;asp:ServiceReference Path="~/AjaxWs.asmx" /&amp;gt;&lt;br /&gt;    &amp;lt;/Services&amp;gt;&lt;br /&gt;&amp;lt;/asp:ScriptManager&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We'll now create a client script block in our Web Form. Find the head section and add a script block inside. Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;        function executarWs() {&lt;br /&gt;            AjaxWs.HelloWorld(&lt;br /&gt;                function(resultado) {&lt;br /&gt;                    alert(resultado)&lt;br /&gt;                }&lt;br /&gt;            )&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'll give a brief explanation about this script:&lt;br /&gt;&lt;br /&gt;AjaxWs - Our Web Service - was created by VS when we added the ScriptManager component and referenced the ~/AjaxWs.asmx Web Service. We're coding a method call to Hello World and pass a function as an argument - more precisely a callback. A callback is a function definition that is called when the function that took is as an argument needs. Think of it as some sort of event handler. But it's subject for another post.&lt;br /&gt;&lt;br /&gt;Now we need to call this method. We've seen "new feature" part. Now we're gonna call our Web Service's methods as an ordinary JavaScript call. We'll create a HTML button to call the JavaScript function:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;button onclick="executarWs()"&amp;gt;Clique aqui&amp;lt;/button&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here goes the complete WebForm's code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;        function executarWs() {&lt;br /&gt;            AjaxWs.HelloWorld(&lt;br /&gt;                function(resultado) {&lt;br /&gt;                    alert(resultado)&lt;br /&gt;                }&lt;br /&gt;            )&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;asp:ScriptManager runat="server" ID="ScriptMngr"&amp;gt;&lt;br /&gt;        &amp;lt;Services&amp;gt;&lt;br /&gt;            &amp;lt;asp:ServiceReference Path="~/AjaxWs.asmx" /&amp;gt;&lt;br /&gt;        &amp;lt;/Services&amp;gt;&lt;br /&gt;    &amp;lt;/asp:ScriptManager&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;button onclick="executarWs()"&amp;gt;Clique aqui&amp;lt;/button&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now run the Web Site (F5) to see what we've done in action. When we click the button the message "Hello World" will pop up. This alone is very nice already; but, what if we could return objects with properties instead of pure strings and ints? Well, we can!&lt;br /&gt;&lt;br /&gt;First, let's create a class in our Web Site. Right click in the App_Code folder below the root folder and choose Add New Item. In the dialog box choose Class. Name it Pessoa.cs and click Ok. Here's the complete code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;public class Pessoa {&lt;br /&gt;&lt;br /&gt;    public string Nome { get; set; }&lt;br /&gt;    public string Sobrenome { get; set; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now let's get back to our Web Service and create a new method that take two parameters and returns  an instance of Pessoa. Open the AjaxWs.cs again and add the following code under the HelloWorld method:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;[WebMethod]&lt;br /&gt;public Pessoa ObterPessoa(string nome, string sobrenome) {&lt;br /&gt;    return new Pessoa { Nome = nome, Sobrenome = sobrenome };&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now get back to Default.aspx and modify the HelloWorld method call to ObetrPessoa, giving the nome and sobrenome arguments before the callback argument:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;function executarWs() {&lt;br /&gt;    AjaxWs.ObterPessoa(&lt;br /&gt;        "Estação",&lt;br /&gt;        "ZN",&lt;br /&gt;        function(resultado) {&lt;br /&gt;            alert(resultado.Nome + " " + resultado.Sobrenome)&lt;br /&gt;        }&lt;br /&gt;    )&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now run the Web Site again and see the result. Awesome! We had nearly zero effort and the possibilities are many with this technology. Thank you and take care.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-2164842546245602917?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=1qys-bllirg:QPxyH1hgRQE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/1qys-bllirg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T10:17:16.826-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/03/ajax-enabled-web-services-with.html</feedburner:origLink></item><item><title>Web Services em Ajax com ScriptManager</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/49OSiZ19OfI/web-services-em-ajax-com-scriptmanager.html</link><category>Webservice</category><category>AJAX</category><category>ASP.NET</category><category>C#</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 28 Mar 2009 06:06:26 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-6157372432537477570</guid><description>&lt;a href="#"&gt;Click here to see this post in English&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Neste post eu mostro uma facilidade incrível do ASP.Net que eu aprendi: Acessar Web Services via Ajax.&lt;br /&gt;&lt;br /&gt;Com o componente ScriptManager - é o mesmo &lt;a href="http://estacaozn.blogspot.com/2009/03/ajax-de-um-jeito-simples-em-aspnet.html"&gt;daquele post sobre ASP.Net e Ajax&lt;/a&gt; - podemos incluir referência para um Web Service criado no nosso WebSite, executá-lo e recuperar o resultado com um esforço mínimo de código. Com este componente parece que o Web Service é um objeto do próprio Script cliente da nossa página.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;Bem, vamos começar criando projeto WebSite no Visual Studio (pode ser o Visual Web Developer Express Edition também). Escolham uma pasta para abrigar o WebSite (lembrando que para testar o VS inicia um servidor Web virtual com o nosso site) e pronto. Agora vamos criar nosso Web Service.&lt;br /&gt;&lt;br /&gt;Clique com o botão direito na raiz do WebSite e selecione Add New Item. Na janela de New Item escolha Web Service. Chame de AjaxWs.asmx e clique Ok. A IDE vai abrir o arquivo App_Code/AjaxWs.cs. É nele que vamos trabalhar&lt;br /&gt;&lt;br /&gt;Vamos Deixar a implementação dele como está por enquanto. Ele já vem com um método de exemplo HelloWorld. A única coisa que vamos fazer é "habilitar" que ele seja chamado por Script cliente. Para isso procure a definição da classe:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;public class AjaxWs : System.Web.Services.WebService&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na linha acima desta há uma decoração comentada que nós só precisamos descomentar para adicionar esta funcionalidade:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;// [System.Web.Script.Services.ScriptService]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Portanto descomente esta linha e salve o arquivo e chame o menu  Build &amp;gt; Build Web Site.&lt;br /&gt;&lt;br /&gt;A parte do Web Service está pronte (por enquanto). Agora vamos trabalhar no nosso WebForm para chamar este Web Service. Abra o arquivo Default.aspx e vá para a visualização "Source" ou "Split". Abaixo da tag do form&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;form id="form1" runat="server"&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;vamos colocar um componente ScriptManager. Você pode arrastar da toolbox ou simplesmente digitar a tag. O VS deixa o tabalhar de digitar os componentes muito rápido e produtivo, apesar de parecer o contrário. Enfim, a tag fica assim depois de pronta:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:ScriptManager runat="server" ID="ScriptMngr"&amp;gt;&lt;br /&gt;    &amp;lt;Services&amp;gt;&lt;br /&gt;        &amp;lt;asp:ServiceReference Path="~/AjaxWs.asmx" /&amp;gt;&lt;br /&gt;    &amp;lt;/Services&amp;gt;&lt;br /&gt;&amp;lt;/asp:ScriptManager&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Com ele aí vamos criar um bloco de script na nossa página. Procure a seção &amp;lt;header&amp;gt; do WebForm e crie um bloco de script dentro. Abaixo está o código:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;        function executarWs() {&lt;br /&gt;            AjaxWs.HelloWorld(&lt;br /&gt;                function(resultado) {&lt;br /&gt;                    alert(resultado)&lt;br /&gt;                }&lt;br /&gt;            )&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vou dar uma breve explicação sobre este script:&lt;br /&gt;&lt;br /&gt;AjaxWs - que é o nome do nosso Web Service - foi definido automaticamente pelo VS quando nós colocamos o ScriptManager no WebForm. Estamos chamando o método HelloWorld do nosso Web Service e passando como argumento uma função - mais precisamente um callback. Um callback é uma definição de função que será chamado pela função que nós invocamos quando necessário. É um conceito semelhante ao de manipuladores de eventos. Em outro post eu me dedico somente a JavaScript.&lt;br /&gt;&lt;br /&gt;Agora precisamos executar esta função de alguma maneira. A novidade da tecnologia já passou; agora podemos fazer como uma chamada normal de alguma função JavaScript. Para este exemplo vou criar um botão HTML no WebForm:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;button onclick="executarWs()"&amp;gt;Clique aqui&amp;lt;/button&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Abaixo segue o WebForm completo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;        function executarWs() {&lt;br /&gt;            AjaxWs.HelloWorld(&lt;br /&gt;                function(resultado) {&lt;br /&gt;                    alert(resultado)&lt;br /&gt;                }&lt;br /&gt;            )&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;asp:ScriptManager runat="server" ID="ScriptMngr"&amp;gt;&lt;br /&gt;        &amp;lt;Services&amp;gt;&lt;br /&gt;            &amp;lt;asp:ServiceReference Path="~/AjaxWs.asmx" /&amp;gt;&lt;br /&gt;        &amp;lt;/Services&amp;gt;&lt;br /&gt;    &amp;lt;/asp:ScriptManager&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;button onclick="executarWs()"&amp;gt;Clique aqui&amp;lt;/button&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora execute o programa (F5) para ver o que nós fizemos em ação. Quando clicamos no botão a mensagem "Hello World" aparece. Isso por si só já é muito legal, mas imagine se, em vez de retornar somente uma string, pudéssemos retornar objetos com propriedades? Mas só pode!&lt;br /&gt;&lt;br /&gt;Primeiro vamos criar uma classe no Web Site. Clique com o botão direito na pasta App_Code dentro da raiz do Web Site e clique Add New Item. Na janela selecione Class. chame o arquivo de Pessoa.cs e clique Ok. abaixo segue a classe pronta:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;public class Pessoa {&lt;br /&gt;&lt;br /&gt;    public string Nome { get; set; }&lt;br /&gt;    public string Sobrenome { get; set; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos voltar no nosso Web Service e criar um novo método que pegue dois parâmetros e retorne uma instância de PEssoa. Abra o AjaxWs.cs outra vez e adicione o seguinte método abaixo do HelloWorld:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;[WebMethod]&lt;br /&gt;public Pessoa ObterPessoa(string nome, string sobrenome) {&lt;br /&gt;    return new Pessoa { Nome = nome, Sobrenome = sobrenome };&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora volte no Default.aspx e modifique a chamada do método HelloWorld para ObterPessoa, passando agora os argumentos nome e sobrenome antes da função de callback:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;function executarWs() {&lt;br /&gt;    AjaxWs.ObterPessoa(&lt;br /&gt;        "Estação",&lt;br /&gt;        "ZN",&lt;br /&gt;        function(resultado) {&lt;br /&gt;            alert(resultado.Nome + " " + resultado.Sobrenome)&lt;br /&gt;        }&lt;br /&gt;    )&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora execute novamente e veja o resultado. Demais! Nosso esforço foi praticamente zero o as possibilidades são muitas com esta tecnologia. Um grande abraço a todos e até a próxima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-6157372432537477570?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=49OSiZ19OfI:-kqFdNkVrOY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/49OSiZ19OfI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T10:06:26.925-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/03/web-services-em-ajax-com-scriptmanager.html</feedburner:origLink></item><item><title>Ajax in a Simple way with ASP.NET</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/kr7xtsJNK84/ajax-in-simple-way-with-aspnet.html</link><category>AJAX</category><category>ASP.NET</category><category>C#</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 28 Mar 2009 05:47:33 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-6807836903308062928</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/03/ajax-de-um-jeito-simples-em-aspnet.html"&gt;Clique aqui para ver este post em Português&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hello. In this post I'll show a very nice way to enable Ajax in our ASP.NET WebForms I learned.&lt;br /&gt;&lt;br /&gt;When I (and most people) learned Ajax, the solution was to use a javascript object (XmlHttpRequest), create a separate script to process the request and write code to display the results that come in XML or plain text. I must confess that I always liked to work with Ajax, even with all that code effort xD&lt;br /&gt;&lt;br /&gt;Another interesting point is the debugging and the error tracking.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;In VS 2008 there are a couple of simple, but very useful components that allows us to work with Ajax in an easy and transparent way: ScriptManager and UpdatePanel.&lt;br /&gt;&lt;br /&gt;To demonstrate the use of these components I'll create an ASP.NET WebForm that searches an object collection, and next add these componentes to enable Ajax. So, Let's start with an ASP.NET WebSite and edit the Default.aspx. Here goes the Markup source code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&lt;br /&gt;    CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Ajax com ASP.NET&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;            Busca: &amp;lt;asp:TextBox runat="server" ID="BuscaTxt" Width="200" /&amp;gt;&amp;nbsp;&lt;br /&gt;            &amp;lt;asp:Button runat="server" ID="BuscaBtn" Text="Buscar"&lt;br /&gt;                onclick="BuscaBtn_Click" /&amp;gt;&lt;br /&gt;        &amp;lt;/p&amp;gt;&lt;br /&gt;   &lt;br /&gt;        &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:GridView runat="server"&lt;br /&gt;                      ID="PessoasGridView"&lt;br /&gt;                      AutoGenerateColumns="false"&lt;br /&gt;                      CellPadding="4"&lt;br /&gt;                      CellSpacing="0"&amp;gt;&lt;br /&gt;            &amp;lt;Columns&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                HeaderText="Nome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                HeaderText="Sobrenome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;            &amp;lt;/Columns&amp;gt;&lt;br /&gt;        &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now the source code of Default.aspx.cs:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;&lt;br /&gt;public partial class _Default : System.Web.UI.Page {&lt;br /&gt;&lt;br /&gt;    class Pessoa {&lt;br /&gt;        public string Nome { get; set; }&lt;br /&gt;        public string Sobrenome { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;Pessoa&amp;gt; Pessoas = new List&amp;lt;Pessoa&amp;gt;{&lt;br /&gt;        new Pessoa { Nome = "Felipe", Sobrenome = "Guerço" },&lt;br /&gt;        new Pessoa { Nome = "Gerson", Sobrenome = "Motta" },&lt;br /&gt;        new Pessoa { Nome = "Joaquim", Sobrenome = "José" },&lt;br /&gt;        new Pessoa { Nome = "João", Sobrenome = "Silva" },&lt;br /&gt;        new Pessoa { Nome = "Aristarco", Sobrenome = "Pederneiras" },&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    protected void Consultar() {&lt;br /&gt;        PessoasGridView.DataSource =&lt;br /&gt;            from p in Pessoas&lt;br /&gt;            where p.Nome.Contains(BuscaTxt.Text)&lt;br /&gt;            orderby p.Nome&lt;br /&gt;            select p;&lt;br /&gt;        PessoasGridView.DataBind();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void Page_Load(object sender, EventArgs e) {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    protected void BuscaBtn_Click(object sender, EventArgs e) {&lt;br /&gt;        Consultar();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With that we can query the private member Pessoas according to the filter criteria in the textbox. But this way each request will produce a full round trip just to update the grid contents. Let's see how to avoid this with the Ajax components.&lt;br /&gt;&lt;br /&gt;We'll add the ScriptManager component in our WebForm in order to enable Ajax. Next we'll add the UpdatePanel and put the grid "inside" it.&lt;br /&gt;&lt;br /&gt;The UpdatePanel is a very interesting component. It represents a "piece" of the WebForm that is updated when certain events are fired up. But which events? Here comes the interesting part: We configure which component's events we want to "trigger" the update panel. In other words: When that action fires up the only part updated is the content inside the UpdatePanel. Let's see the markup here:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:UpdatePanel runat="server" ID="GridUpdatePanel"&amp;gt;&lt;br /&gt;    &amp;lt;Triggers&amp;gt;&lt;br /&gt;        &amp;lt;asp:AsyncPostBackTrigger&lt;br /&gt;            ControlID="BuscaBtn" EventName="Click" /&amp;gt;&lt;br /&gt;    &amp;lt;/Triggers&amp;gt;&lt;br /&gt;    &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;        &amp;lt;asp:GridView runat="server"&lt;br /&gt;                      ID="PessoasGridView"&lt;br /&gt;                      AutoGenerateColumns="false"&lt;br /&gt;                      CellPadding="4"&lt;br /&gt;                      CellSpacing="0"&amp;gt;&lt;br /&gt;            &amp;lt;Columns&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                HeaderText="Nome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                HeaderText="Sobrenome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;            &amp;lt;/Columns&amp;gt;&lt;br /&gt;        &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;    &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:UpdatePanel&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now the entire WebForm markup:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&lt;br /&gt;    CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Ajax com ASP.NET&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;asp:ScriptManager runat="server" ID="AjaxScriptManager" /&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;            Busca: &amp;lt;asp:TextBox runat="server" ID="BuscaTxt" Width="200" /&amp;gt;&amp;nbsp;&lt;br /&gt;            &amp;lt;asp:Button runat="server" ID="BuscaBtn" Text="Buscar"&lt;br /&gt;                onclick="BuscaBtn_Click" /&amp;gt;&lt;br /&gt;        &amp;lt;/p&amp;gt;&lt;br /&gt;   &lt;br /&gt;        &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:UpdatePanel runat="server" ID="GridUpdatePanel"&amp;gt;&lt;br /&gt;            &amp;lt;Triggers&amp;gt;&lt;br /&gt;                &amp;lt;asp:AsyncPostBackTrigger&lt;br /&gt;                    ControlID="BuscaBtn" EventName="Click" /&amp;gt;&lt;br /&gt;            &amp;lt;/Triggers&amp;gt;&lt;br /&gt;            &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;                &amp;lt;asp:GridView runat="server"&lt;br /&gt;                              ID="PessoasGridView"&lt;br /&gt;                              AutoGenerateColumns="false"&lt;br /&gt;                              CellPadding="4"&lt;br /&gt;                              CellSpacing="0"&amp;gt;&lt;br /&gt;                    &amp;lt;Columns&amp;gt;&lt;br /&gt;                        &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                        HeaderText="Nome"&lt;br /&gt;                                        HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                        &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                        HeaderText="Sobrenome"&lt;br /&gt;                                        HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                    &amp;lt;/Columns&amp;gt;&lt;br /&gt;                &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;            &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:UpdatePanel&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Try to run the WebSite and notice that the page doesn't refresh anymore. And the best part is that we didn't need to write any javascript code and create any "support" files.&lt;br /&gt;&lt;br /&gt;Thank you for the support and until next time.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-6807836903308062928?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=kr7xtsJNK84:DmXsZDHzXL8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/kr7xtsJNK84" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T09:47:33.435-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/03/ajax-in-simple-way-with-aspnet.html</feedburner:origLink></item><item><title>Ajax de um jeito simples em ASP.NET</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/TXsJUxa-2po/ajax-de-um-jeito-simples-em-aspnet.html</link><category>AJAX</category><category>ASP.NET</category><category>C#</category><author>noreply@blogger.com (Felipe Guerço)</author><pubDate>Sat, 28 Mar 2009 05:47:40 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-7381903785329088509</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/03/ajax-in-simple-way-with-aspnet.html"&gt;Click here to see this post in English&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Olá a todos. Neste post vou mostrar uma maneira de implementar Ajax no ASP.NET muito legal que eu aprendi.&lt;br /&gt;&lt;br /&gt;Quando eu (e a grande maioria) aprendi Ajax a maneira de se fazer era usar um objeto javascript (XmlHttpRequest), criar uma página separada para processar o request e montar o resultado em XML ou texto plano, e tratar este resultado no nosso script principal. Eu confesso que eu sempre achei muito legal programar com Ajax, apesar do trabalhão que dá xD.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;Outra parte interessante é o trabalho que dá para depurar e corrigir errors.&lt;br /&gt;&lt;br /&gt;No VS 2008 eu vi uns componentes simples, mas que nos permitem trabalhar com Ajax de maneira muito simples e transparente: ScriptManager e UpdatePanel.&lt;br /&gt;&lt;br /&gt;Para mostrar o uso destes componentes vou criar uma pequena página ASP.NET que vai fazer uma consulta numa coleção de strings e depois adicionar funcionalidade Ajax a esta página. Para isso vou partir de um WebSite ASP.NET e editar a Default.aspx. Abaixo segue o código-fonte HTML:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&lt;br /&gt;    CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Ajax com ASP.NET&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;            Busca: &amp;lt;asp:TextBox runat="server" ID="BuscaTxt" Width="200" /&amp;gt;&amp;nbsp;&lt;br /&gt;            &amp;lt;asp:Button runat="server" ID="BuscaBtn" Text="Buscar"&lt;br /&gt;                onclick="BuscaBtn_Click" /&amp;gt;&lt;br /&gt;        &amp;lt;/p&amp;gt;&lt;br /&gt;   &lt;br /&gt;        &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:GridView runat="server"&lt;br /&gt;                      ID="PessoasGridView"&lt;br /&gt;                      AutoGenerateColumns="false"&lt;br /&gt;                      CellPadding="4"&lt;br /&gt;                      CellSpacing="0"&amp;gt;&lt;br /&gt;            &amp;lt;Columns&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                HeaderText="Nome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                HeaderText="Sobrenome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;            &amp;lt;/Columns&amp;gt;&lt;br /&gt;        &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora o código Default.aspx.cs:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;&lt;br /&gt;public partial class _Default : System.Web.UI.Page {&lt;br /&gt;&lt;br /&gt;    class Pessoa {&lt;br /&gt;        public string Nome { get; set; }&lt;br /&gt;        public string Sobrenome { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;Pessoa&amp;gt; Pessoas = new List&amp;lt;Pessoa&amp;gt;{&lt;br /&gt;        new Pessoa { Nome = "Felipe", Sobrenome = "Guerço" },&lt;br /&gt;        new Pessoa { Nome = "Gerson", Sobrenome = "Motta" },&lt;br /&gt;        new Pessoa { Nome = "Joaquim", Sobrenome = "José" },&lt;br /&gt;        new Pessoa { Nome = "João", Sobrenome = "Silva" },&lt;br /&gt;        new Pessoa { Nome = "Aristarco", Sobrenome = "Pederneiras" },&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    protected void Consultar() {&lt;br /&gt;        PessoasGridView.DataSource =&lt;br /&gt;            from p in Pessoas&lt;br /&gt;            where p.Nome.Contains(BuscaTxt.Text)&lt;br /&gt;            orderby p.Nome&lt;br /&gt;            select p;&lt;br /&gt;        PessoasGridView.DataBind();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void Page_Load(object sender, EventArgs e) {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    protected void BuscaBtn_Click(object sender, EventArgs e) {&lt;br /&gt;        Consultar();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Com isso nosso programa vai consultar a lista no membro privado Pessoas de acordo com o filtro. Mas dessa forma a página está fazendo uma viagem completa ao servidor só para atualizar o grid. Vamos ver como evitar isso com os componentes de Ajax do ASP.NET.&lt;br /&gt;&lt;br /&gt;Na página vamos colocar o componente ScriptManager para habilitar o uso do componente que vai realizar o  Ajax. Em seguida vamos colocar na página o componente UpdatePanel e colocar o grid dentro dele.&lt;br /&gt;&lt;br /&gt;O componente UpdatePanel é muito interessante: Ele representa um "pedaço" do WebForm que vai ser atualizado quando determinada ação acontecer. Mas que ação? Agora vem a parte interessante: No UpdatePanel nós configuramos quais eventos de quais objetos vão disparar o refresh daquela área. Vou colocar só o trecho do grid aqui:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:UpdatePanel runat="server" ID="GridUpdatePanel"&amp;gt;&lt;br /&gt;    &amp;lt;Triggers&amp;gt;&lt;br /&gt;        &amp;lt;asp:AsyncPostBackTrigger&lt;br /&gt;            ControlID="BuscaBtn" EventName="Click" /&amp;gt;&lt;br /&gt;    &amp;lt;/Triggers&amp;gt;&lt;br /&gt;    &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;        &amp;lt;asp:GridView runat="server"&lt;br /&gt;                      ID="PessoasGridView"&lt;br /&gt;                      AutoGenerateColumns="false"&lt;br /&gt;                      CellPadding="4"&lt;br /&gt;                      CellSpacing="0"&amp;gt;&lt;br /&gt;            &amp;lt;Columns&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                HeaderText="Nome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                HeaderText="Sobrenome"&lt;br /&gt;                                HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;            &amp;lt;/Columns&amp;gt;&lt;br /&gt;        &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;    &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:UpdatePanel&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Segue abaixo a página modificada:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&lt;br /&gt;    CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Ajax com ASP.NET&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;asp:ScriptManager runat="server" ID="AjaxScriptManager" /&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;            Busca: &amp;lt;asp:TextBox runat="server" ID="BuscaTxt" Width="200" /&amp;gt;&amp;nbsp;&lt;br /&gt;            &amp;lt;asp:Button runat="server" ID="BuscaBtn" Text="Buscar"&lt;br /&gt;                onclick="BuscaBtn_Click" /&amp;gt;&lt;br /&gt;        &amp;lt;/p&amp;gt;&lt;br /&gt;   &lt;br /&gt;        &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:UpdatePanel runat="server" ID="GridUpdatePanel"&amp;gt;&lt;br /&gt;            &amp;lt;Triggers&amp;gt;&lt;br /&gt;                &amp;lt;asp:AsyncPostBackTrigger&lt;br /&gt;                    ControlID="BuscaBtn" EventName="Click" /&amp;gt;&lt;br /&gt;            &amp;lt;/Triggers&amp;gt;&lt;br /&gt;            &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;                &amp;lt;asp:GridView runat="server"&lt;br /&gt;                              ID="PessoasGridView"&lt;br /&gt;                              AutoGenerateColumns="false"&lt;br /&gt;                              CellPadding="4"&lt;br /&gt;                              CellSpacing="0"&amp;gt;&lt;br /&gt;                    &amp;lt;Columns&amp;gt;&lt;br /&gt;                        &amp;lt;asp:BoundField DataField="Nome"&lt;br /&gt;                                        HeaderText="Nome"&lt;br /&gt;                                        HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                        &amp;lt;asp:BoundField DataField="Sobrenome"&lt;br /&gt;                                        HeaderText="Sobrenome"&lt;br /&gt;                                        HeaderStyle-Width="200" /&amp;gt;&lt;br /&gt;                    &amp;lt;/Columns&amp;gt;&lt;br /&gt;                &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;            &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:UpdatePanel&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E o mais legal é que nós criamos zero de código javascript para habilitar Ajax no nosso WebForm.&lt;br /&gt;&lt;br /&gt;Um grande abraço a todos e até a próxima.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-7381903785329088509?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=TXsJUxa-2po:G99NRHHYT4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/TXsJUxa-2po" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T09:47:40.796-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/03/ajax-de-um-jeito-simples-em-aspnet.html</feedburner:origLink></item><item><title>Rapidinha</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/A_hu24Hl1Tg/rapidinha.html</link><author>noreply@blogger.com (ralencar)</author><pubDate>Wed, 11 Mar 2009 09:00:49 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-3532013754936170730</guid><description>&lt;!-- coloque fora da tag abaixo os primeiros parágrafos do post - os que você que que apareçam no index --&gt;&lt;br /&gt;Essa eu tenho que postar!&lt;br /&gt;&lt;br&gt;&lt;br /&gt;"Quanto mais desesperadora é a situação, mais otimista é o relatório de progresso"&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://blog.bytequeeugosto.com.br/?p=1368"&gt;daqui&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Qualquer relação com a minha realidade é ... ah, vocês sabem.&lt;br /&gt;&lt;br&gt;&lt;br /&gt;[]s, Rodrigo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-3532013754936170730?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=A_hu24Hl1Tg:94neS5puAto:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/A_hu24Hl1Tg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-11T13:00:49.406-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/03/rapidinha.html</feedburner:origLink></item><item><title>Delphi Intraweb - Gerar dinamicamente JavaScript</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/HgGBQqK5WIA/delphi-intraweb-gerar-dinamicamente.html</link><category>Web</category><category>Delphi</category><category>Intraweb</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Wed, 25 Feb 2009 18:42:43 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-1819944485698051273</guid><description>Continuação do artigo &lt;a href="http://estacaozn.blogspot.com/2009/01/delphi-intraweb-javascript-ii-continua.html"&gt;Delphi Intraweb – JavaScript II (Continua)&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Antes de qualquer coisa, preciso registrar a alegria de podermos contar com mais um colaborador no nosso blog.&lt;br /&gt;Prezados leitores, em nome de todos os colaboradores, quero manifestar a alegria em poder contar com mais um grande amigo no time do Estação ZN. &lt;a href="http://www.blogger.com/profile/17947676750754221519"&gt;Rodrigo Alencar&lt;/a&gt;, brother de longas datas tem contribuído com &lt;a href="http://estacaozn.blogspot.com/2009/01/mais-threads-classloader-classpath.html"&gt;um material de extrema qualidade&lt;/a&gt;, &lt;a href="http://estacaozn.blogspot.com/2009/01/pessoal-meu-primeiro-post-no-estao-zn.html"&gt;pertinência&lt;/a&gt; e &lt;a href="http://estacaozn.blogspot.com/2009/02/sistema-de-tarifacao-hsqldb-e-java.html"&gt;originalidade&lt;/a&gt;.&lt;br /&gt;Rodrigão, seja bem vindo ao Estação ZN, é uma honra poder contar com o sua participação!&lt;br /&gt;&lt;br /&gt;Dando continuidade ao tema ...&lt;br /&gt;&lt;br /&gt;Para controlarmos, através de JavaScript, a ação de habilitar e desabilitar o IWCombo1 (O que carregamos com os nomes das bandas)  vamos gerar dinamicamente o script que vai no browser fazer esse gerenciamento. &lt;br /&gt;Adicione no IWForm mais um IWCheckBox, e codifique conforme ilustrado abaixo:&lt;span class='fullpost'&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private&lt;br /&gt;    procedure LoadComboBandas;&lt;br /&gt;    procedure DesabilitaControles;&lt;br /&gt;    procedure BuildScriptControlEnabled;&lt;br /&gt;  public&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na seção “private” declarei o método que vai construir dinamicamente o JavaScript, “BuildScriptControlEnabled”.&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TZnIWForm.BuildScriptControlEnabled;&lt;br /&gt;const&lt;br /&gt;  FunctionJsBodyStatment = 'function %s{%s}';&lt;br /&gt;  AQuebraLinhaJs = #13;&lt;br /&gt;  AStatementFnc =&lt;br /&gt;      '  var ZnComboLnd = FindElem("%s");' + AQuebraLinhaJs +&lt;br /&gt;      '  alert(ZnComboLnd[ZnComboLnd.selectedIndex].innerHTML);' + AQuebraLinhaJs +&lt;br /&gt;      '  var ZnChkBox = FindElem("%s");' + AQuebraLinhaJs +&lt;br /&gt;      '  alert(ZnChkBox.innerHTML);' + AQuebraLinhaJs +&lt;br /&gt;      '  ZnChkBox.checked  = !ZnChkBox.checked;' + AQuebraLinhaJs +&lt;br /&gt;      '  ZnComboLnd.disabled = !ZnChkBox.checked;'  + AQuebraLinhaJs +&lt;br /&gt;      ' if (!ZnComboLnd.disabled){ ' + AQuebraLinhaJs +&lt;br /&gt;      '   alert(ZnComboLnd.name + " está Habilitado"); ' + AQuebraLinhaJs +&lt;br /&gt;      '   ZnComboLnd.style.backgroundColor = "#FFFFFF"; ' + AQuebraLinhaJs +&lt;br /&gt;      '   ZnComboLnd.focus(); ' + AQuebraLinhaJs +&lt;br /&gt;      '   return true; ' + AQuebraLinhaJs +&lt;br /&gt;      '  } ' + AQuebraLinhaJs +&lt;br /&gt;      ' else{ '+ AQuebraLinhaJs +&lt;br /&gt;      ' ZnComboLnd.style.backgroundColor ="#E7E7E7"; '+ AQuebraLinhaJs +&lt;br /&gt;      '   return false; ' + AQuebraLinhaJs +&lt;br /&gt;      ' };'+ AQuebraLinhaJs;&lt;br /&gt;var&lt;br /&gt;  StrStatement: String;&lt;br /&gt;begin&lt;br /&gt;  StrStatement := AQuebraLinhaJs;&lt;br /&gt;  StrStatement :=  StrStatement + Format(AStatementFnc,&lt;br /&gt;    [UpperCase(IWComboBox1.Name), UpperCase(ChckBoxBandas.Name)]);&lt;br /&gt;&lt;br /&gt;  StrStatement := Format(FunctionJsBodyStatment,&lt;br /&gt;    ['ZnHabilitaCmbBanda()', StrStatement]);&lt;br /&gt;  Self.JavaScript.Add(StrStatement);&lt;br /&gt;  ChckBoxBandas.ScriptEvents.Add('onClick').EventCode.Add('ZnHabilitaCmbBanda()');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Observe que temos problemas na hora de trabalharmos com o objeto do tipo “&lt;span style="font-weight:bold;"&gt;CheckBox&lt;/span&gt;”. Veja que, para montar a string que será adicionada a propriedade “JavaScript” do IWForm, na &lt;span style="font-weight:bold;"&gt;linha 8&lt;/span&gt;, recuperamos o objeto com  função “FindElem()”.Do contrário, teríamos que usar o nome completo do componente (definido em JavaScript na página web). Ou seja, teríamos que concatenar com o nome do controle (IWCheckBox) no Delphi como bendito sufixo “_CHECKBOX”. &lt;br /&gt;Na &lt;span style="font-weight:bold;"&gt;linha 9&lt;/span&gt;, somos obrigados a simular o comportamento “Click” do objeto. Que absurdo! Do contrário ele não efetiva o “Click”. Pelo menos, essa foi a solução que encontrei, visto que o click do componente não rolava. &lt;br /&gt;Na &lt;span style="font-weight:bold;"&gt;linha 10&lt;/span&gt;, somente então, efetivamos a atribuição de valor a propriedade “disabled” do objeto recuperado na &lt;span style="font-weight:bold;"&gt;linha 7&lt;/span&gt; (o “IWComboBox1”).&lt;br /&gt;&lt;br /&gt;No trecho de código abaixo, podemos ver como ficou no browser a função que dinamicamente montamos no Delphi:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function ZnHabilitaCmbBanda(){&lt;br /&gt;  var ZnCombo = document.forms[0].IWCOMBOBOX1;&lt;br /&gt;  var ZnChkBox = FindElem("CHCKBOXBANDAS");&lt;br /&gt;  ZnChkBox.checked  = !ZnChkBox.checked;&lt;br /&gt;  ZnCombo.disabled = !ZnChkBox.checked;&lt;br /&gt; if (!ZnCombo.disabled){ &lt;br /&gt;   alert(ZnCombo.name + " está Habilitado"); &lt;br /&gt;   ZnCombo.style.backgroundColor = "#FFFFFF"; &lt;br /&gt;   ZnCombo.focus(); &lt;br /&gt;   return true; &lt;br /&gt;  }; &lt;br /&gt; else{ &lt;br /&gt; ZnCombo.style.backgroundColor ="#E7E7E7"; &lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isso acontece especialmente no Intraweb 8 porque ele trata o comportamento de todo  “CheckBox” com uma tag “span”. Como se não bastasse isso, para complicar ainda mais, ele agrega, arbitráriamente, um sufixo ao nome original do componente, “_CHECKBOX”. Isso certamente deve ter complicado a vida de quem tentou trabalhar com JavaScript no Intraweb 8. Veja um trecho de código gerado no browser pelo Intraweb 8 na definição do “CHCKBOXBANDAS”:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;input tabindex=&amp;quot;27&amp;quot; type=&amp;quot;CHECKBOX&amp;quot; name=&amp;quot;CHCKBOXBANDAS_CHECKBOX&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;span onclick=&amp;quot;FindElem('CHCKBOXBANDAS_CHECKBOX').checked = &lt;br /&gt;   !FindElem('CHCKBOXBANDAS_CHECKBOX').checked;&amp;quot;&amp;gt;Habilitar Bandas&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;No Intraweb 5 isso não acontece. Primeiro, não existe o sufixo na definição JavaScript do componente. Segundo, embora exista a tag span, ela presta somente para exibir o conteúdo do caption do IWCheckBox, o comportamento do CheckBox não está programado nela. Portanto, não precisaríamos simular o click em código conforme eu fiz na &lt;span style="font-weight:bold;"&gt;linha 04&lt;/span&gt; da “function ZnHabilitaCmbBanda()”. Alias, se alguém tiver algo a acrescentar a minha análise, por favor, fique a vontade. Em outras, palavras, foi a solução que encontrei. &lt;br /&gt;&lt;br /&gt;Outro ponto importante, quero destacar  nesse exemplo a atribuição dinâmica da propriedade “ScriptEvent” do TIWCheckBox, “ChkBoxBandas”. Isso está sendo feito na &lt;span style="font-weight:bold;"&gt;linha 28&lt;/span&gt; do procedimento “BuildScriptControlEnabled”.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-1819944485698051273?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=HgGBQqK5WIA:uCHk1WL_-J8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/HgGBQqK5WIA" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-25T23:42:43.172-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/02/delphi-intraweb-gerar-dinamicamente.html</feedburner:origLink></item><item><title>Sistema de tarifação, HSQLDB e Java - PARTE 2.</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/0mMZAZFGODo/sistema-de-tarifacao-hsqldb-e-java.html</link><author>noreply@blogger.com (ralencar)</author><pubDate>Mon, 09 Feb 2009 14:01:11 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-391820745932593550</guid><description>&lt;a href="http://estacaozn.blogspot.com/2009/01/mais-threads-classloader-classpath.html" target="_blank"&gt;Continuando o post anterior...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O problema é interceptar determinados eventos em um servidor de download para tarifação em tempo real em um servidor de tarifação. O servidor de download permite a instalação de plug-ins escritos em Java para interceptar os eventos de download.&lt;br /&gt;&lt;br /&gt;No post anterior vimos a implementação do servidor de download e um plugin de exemplo. Neste post vamos ver a outra ponta: o sistema de tarifação. O sistema de tarifação é um sistema implementado em um servidor de banco de dados com tabelas e stored procedures. &lt;br /&gt;&lt;br /&gt;O sistema que vamos ver é um sistema simulado, composto de uma tabela e três procedures que consultam e atualizam o sistema.&lt;br /&gt;&lt;br /&gt;As procedures são as seguintes e todas possuem dois parâmetros, o primeiro é o id do usuário e o segundo o servico que ele esta tentando acessar.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;boolean queryBalance(int, string)&lt;/strong&gt; - consulta se o usuário possui saldo para acessar o serviço.&lt;br /&gt;&lt;strong&gt;void charge(int, string)&lt;/strong&gt; - tarifa o usuário no serviço especificado.&lt;br /&gt;&lt;strong&gt;void credit(int, string)&lt;/strong&gt; - estorna o usuário no serviço especificado.&lt;br /&gt;&lt;br /&gt;O sistema é implementado no &lt;a href="http://hsqldb.org/" target="_blank"&gt;HSQLDB&lt;/a&gt;, um gerenciador de banco de dados escrito em Java. O HSQLDB possui um instalação simples e rápida. O HSQLDB possui suporte a stored procedures escritas em Java.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;Para a instalação basta fazer o download e descompactar o arquivo no diretório de sua preferência. &lt;br /&gt;&lt;br /&gt;Após descompactar no diretório de destino você vai ter uma pasta chamada hsqldb. No prompt de comando dentro dessa pasta execute o camando abaixo para executar o HSQLDB no modo servidor.&lt;br /&gt;&lt;br /&gt;java -classpath ./lib/hsqldb.jar org.hsqldb.Server&lt;br /&gt;&lt;br /&gt;Para executar a ferramenta administrativa do HSQLDB execute o comando abaixo.&lt;br /&gt;&lt;br /&gt;java -cp ./lib/hsqldb.jar org.hsqldb.util.DatabaseManager&lt;br /&gt;&lt;br /&gt;Para a criação das stored procedures utilizei o Netbeans. Uma stored procedure no HSQLDB é um método stático de uma classe Java. E a classe Java deve estar no classpath do servidor. Esse método acessa o ambiente do servidor através de um parâmetro Connection declarado na assinatura do método.&lt;br /&gt;&lt;br /&gt;Nesse sistema criei uma classe chamada hsqldbSP_Billing no pacote hsqldbSP_Billing. A classe é a seguinte.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package hsqldbSP_Billing;&lt;br /&gt;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.PreparedStatement;&lt;br /&gt;import java.sql.ResultSet;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.sql.Statement;&lt;br /&gt;&lt;br /&gt;public class hsqldbSP_Billing {&lt;br /&gt;&lt;br /&gt;    public static double DOWNLOAD = 10;&lt;br /&gt;&lt;br /&gt;    public static boolean query(Connection conn, Integer id, String service) throws SQLException{&lt;br /&gt;        boolean hasBalance = false;&lt;br /&gt;        Statement st = null;&lt;br /&gt;        ResultSet rs = null;&lt;br /&gt;        st = conn.createStatement();&lt;br /&gt;        String sql = "select amount from balance where id = " + id;&lt;br /&gt;        rs = st.executeQuery(sql);&lt;br /&gt;&lt;br /&gt;        if(rs.next()) {&lt;br /&gt;            double amount = rs.getDouble("amount");&lt;br /&gt;            if(amount &gt; 0){&lt;br /&gt;                hasBalance = true;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        st.close();&lt;br /&gt;        return hasBalance;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void charge(Connection conn, Integer id, String service) throws SQLException{&lt;br /&gt;        String sql = "update balance set amount = amount - ? where id = ?";&lt;br /&gt;        PreparedStatement pstmt = conn.prepareStatement(sql);&lt;br /&gt;        pstmt.setDouble(1, DOWNLOAD);&lt;br /&gt;        pstmt.setInt(2, id);&lt;br /&gt;&lt;br /&gt;        pstmt.executeUpdate();&lt;br /&gt;&lt;br /&gt;        pstmt.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void credit(Connection conn, Integer id, String service) throws SQLException{&lt;br /&gt;        String sql = "update balance set amount = amount + ? where id = ?";&lt;br /&gt;        PreparedStatement pstmt = conn.prepareStatement(sql);&lt;br /&gt;        pstmt.setDouble(1, DOWNLOAD);&lt;br /&gt;        pstmt.setInt(2, id);&lt;br /&gt;&lt;br /&gt;        pstmt.executeUpdate();&lt;br /&gt;&lt;br /&gt;        pstmt.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No HSQLDB podemos criar aliases para as SPs através do seguinte comando.&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE ALIAS QUERYBALANCE FOR "hsqldbSP_Billing.hsqldbSP_Billing.query"&lt;/pre&gt;&lt;br /&gt;No HSQLDB a assinatura da procedure possui somente do dois últimos parâmetros pois a Connection será passada pelo servidor. Parar executar as stores procedures a sintaxe é a seguinte.&lt;br /&gt;&lt;pre class="sql" name="code"&gt;call queryBalance(1, 'DOWNLOAD')&lt;br /&gt;call charge(1, 'DOWNLOAD')&lt;br /&gt;call credit(1, 'DOWNLOAD')&lt;/pre&gt;&lt;br /&gt;Executando o código.&lt;br /&gt;&lt;br /&gt;Faça o download do arquivo &lt;a href="http://sites.google.com/site/estacaozndorcalencar/Home/hsqldb.zip" target="_blank"&gt;hsqldb.zip&lt;/a&gt; e copie seu conteúdo para a pasta do HSQLDB. Este arquivo possui dois arquivos para auxiliar na execução do HSQLDB para este exemplo, o &lt;strong&gt;run.bat&lt;/strong&gt; que executa o servidor HSQLDB com as SPs no classpath e o arquivo &lt;strong&gt;manager.bat&lt;/strong&gt; que executa a ferramente administrativa do HSQLDB. Além disso esse arquivo possui a configuração inicial das tabelas e aliases necessárias para o sistema.&lt;br /&gt;&lt;br /&gt;No arquivo &lt;a href="http://sites.google.com/site/estacaozndorcalencar/Home/hsqldbSP_Billing.zip" target="_blank"&gt;hsqldbSP_Billing.zip&lt;/a&gt; está o projeto Netbeans com o código das SPs criadas.&lt;br /&gt;&lt;br /&gt;No próximo post vamos criar a infra necessária para acessar o sistema de tarifação através de um sistema &lt;a href="http://www.oracle.com/technology/products/ias/bpel/index.html" target="_blank"&gt;BPEL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Até o próximo post!&lt;br /&gt;Rodrigo Alencar.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-391820745932593550?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=0mMZAZFGODo:EwIWNuQr1QA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/0mMZAZFGODo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-09T19:01:11.110-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/02/sistema-de-tarifacao-hsqldb-e-java.html</feedburner:origLink></item><item><title>Inicializando o IWForm com alguns controles desabilitados</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/Az1UCqlbCJw/inicializando-o-iwform-com-alguns.html</link><category>Web</category><category>Delphi</category><category>Intraweb</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Wed, 25 Feb 2009 18:39:01 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-7412449977824663981</guid><description>Continuação do artigo &lt;a href="http://estacaozn.blogspot.com/2009/01/delphi-intraweb-javascript-ii-continua.html"&gt;Delphi Intraweb – JavaScript II (Continua)&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Eu tenho no IWForm dois IWComboBoxes (CMBTIPOEMAIL e IWComboBox1) e um IWEdit (EDTEMAIL).&lt;br /&gt;Podemos definir na propriedade “ExtraTagParams” valores específicos para cada tag original de um controle Intraweb. Por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TZnIWForm.DesabilitaControles;&lt;br /&gt;begin&lt;br /&gt;  IWComboBox1.ExtraTagParams.Add('disabled="true"');&lt;br /&gt;  IWComboBox1.ExtraTagParams.Add('style=background:#E7E7E7');&lt;br /&gt;&lt;br /&gt;  EDTEMAIL.ExtraTagParams.Add('disabled="true"');&lt;br /&gt;  EDTEMAIL.BgColor := RGB(231, 231, 231);&lt;br /&gt;  CMBTIPOEMAIL.ExtraTagParams.Add('disabled="true"');&lt;br /&gt;  CMBTIPOEMAIL.ExtraTagParams.Add('style=background:#E7E7E7');&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;No trecho de código acima, na linha 3, definimos a propriedade “disabled” do objeto, select, que será criado na página HTML, referente ao controle VCL “IWComboBox1”.&lt;br /&gt;&lt;br /&gt;Na linha 4, definimos a propriedade “style” do objeto, select, para que o “background” seja cinza.&lt;br /&gt;.&lt;br /&gt;Na linha 5, assim como fizemos na linha 3, definimos a propriedade “disabled” do objeto, input text, que será criado na página HTML, referente ao controle VCL “EdtMail”.&lt;br /&gt;Na linha 6, definimos a cor do input através da propriedade “BgColor”. A função RGB, permite que possamos definir as cores usando números inteiros de 0 a 255 representando as 256 variações de intensidade no o padrão RGB (Red, Green, Blue). OBS: A função “RGB” está definida na unit “Windows”, portanto declare essa unit na seção “uses”.&lt;br /&gt;OBS: Por falar em RGB achei esse artigo sobre converter, em Delphi, RGB para CMYK (Cyan, Magenta, Yellow, Black - Key Plate), se é isso que vc procura veja em(http://delphi.about.com/od/delphitips2007/qt/rgb_cmyk.htm).&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;Agora, mais uma vez no evento OnCreate do IWForm faça a chamada a este novo método:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TZnIWForm.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  LoadCmbTipoEmail;&lt;br /&gt;  DesabilitaControles;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;IWComboBox&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;Adicione ao IWForm um IWComboBox (Palheta IWStandard). Em seguida codificaremos um método que irá preenchê-lo. Vou declarar uma seção “private” na definição da classe do IWForm. Nesta seção vou codificar o cabeçalho do método “LoadComboBandas”:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;  procedure LoadComboBandas;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;Codificando o corpo do procedimento ..&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TZnIWForm.LoadComboBandas;&lt;br /&gt;begin&lt;br /&gt;  IWComboBox1.Items.Add('Police');&lt;br /&gt;  IWComboBox1.Items.Add('Man At Work');&lt;br /&gt;  IWComboBox1.Items.Add('Pealr Jam');&lt;br /&gt;  IWComboBox1.Items.Add('The Smith');&lt;br /&gt;  IWComboBox1.Items.Add('U2');&lt;br /&gt;  IWComboBox1.Items.Add('Dire Straits');&lt;br /&gt;  IWComboBox1.Items.Add('Siouxsie &amp; the Banshees');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;No evento OnCreate do IWForm você pode fazer chamada a este método.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TZnIWForm.IWAppFormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  LoadCmbTipoEmail;&lt;br /&gt;  DesabilitaControles; &lt;br /&gt;  (*excuta a chamada ao método que carrega a IWCombo Bandas de Rock*)&lt;br /&gt;  LoadComboBandas;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://estacaozn.blogspot.com/2009/02/delphi-intraweb-gerar-dinamicamente.html"&gt;Continua em ...&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-7412449977824663981?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=Az1UCqlbCJw:QH26r2SMzS8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/Az1UCqlbCJw" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-25T23:39:01.300-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/01/inicializando-o-iwform-com-alguns.html</feedburner:origLink></item><item><title>Delphi Intraweb – JavaScript II (Continua)</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/XJRrHGPOR14/delphi-intraweb-javascript-ii-continua.html</link><category>Web</category><category>Delphi</category><category>Javascript</category><category>Intraweb</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Wed, 25 Feb 2009 12:59:55 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-1499562226200811334</guid><description>&lt;div style="text-align: justify;"&gt;Quem desenvolve para Web, precisa conhecer bem JavaScript. Quem desenvolve para Web, precisa usar muito JavaScript. Mesmo que ainda não saiba disso, quem desenvolve em Delphi para Web, também precisa ousar usar mais JavaScript.&lt;br /&gt;&lt;br /&gt;JavaScript é o caminho o qual trilharemos neste artigo. Não temas, o Intraweb não é e não precisa ser tão feio quanto tem sido apresentado.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Intraweb&lt;/span&gt; (&lt;a href="http://www.atozed.com/IntraWeb/index.en.aspx"&gt;Atozed Software&lt;/a&gt;)&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Será que você ficaria surpreso ao saber que existem pessoas desenvolvendo em Intraweb? Bem, pelo menos é o indica os &lt;a href="https://forums.codegear.com/forum.jspa;jsessionid=C9459F99889189FFFC18BE2D52F7A283?forumID=93&amp;amp;start=0"&gt;números no fórum da Embarcadero Technologies&lt;/a&gt;. Bem interessante o “Embarcadero Discussion Forums” para quem esta pesquisando sobre o Intraweb recomendo dar uma passada por lá.&lt;br /&gt;Será que a pergunta por que, apesar de tantos pontos fracos, o número de projetos Intraweb vem crescendo? Pelo que percebi, fora do Brasil também. Principalmente, diante do amadurecimento do “.Net” e do JSF, além da competitividade do Rails, será que o Intraweb ainda assim tem fôlego para  competir com essas tecnologias? Pretendo dedicar um tempo e investigar em busca dessas repostas.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Neste artigo, vamos ver mais sobre “Delphi Intraweb” com JavaScript. Como conseqüência você poderá aprender mais e conhecer melhor o framework Intraweb.&lt;br /&gt;&lt;br /&gt;Em forma geral, sobre Web e programação no lado cliente, percebo cada vez maior a pertinência desse tema. Acredito ser totalmente improvável o sucesso de um sistema Web, o qual não exista uma ênfase no balanceamento do que vai ser processado client-side e o que vai ser processado server-side. &lt;a href="http://estacaozn.blogspot.com/2007/01/internet-trouxe-uma-enxurrada-de.html"&gt;Temos discutido bastante sobre isso aqui no Estação Zn&lt;/a&gt;.&lt;br /&gt;Portanto, vamos falar mais sobre.&lt;br /&gt;Usaremos JavaScript no Intraeweb para tentar demonstrar como podemos obter um ganho em performance, robustez e elegância no desenvolvimento para Web.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos começar com um exemplo simplório. Adicione no IWForm um IWEdit (Palheta IWStandard). Meu objetivo é mostrar como podemos acessar e manipular no lado cliente (browser) os objetos que adicionamos no IWForm. O desenvolvedor acostumado a pensar puramente em Delphi pode estar interessado em como interagir através do seu mundo “delphiano” com mundo dos navegadores.&lt;br /&gt;Prosseguindo, após adicionar o IWEdit, codifique a função JavaScript exatamente conforme ilustrado abaixo. Muita atenção a caixa das letras digitadas. Não importa a caixa do nome do IWComponente que você definiu no Delphi. O Intraweb sempre vai criar um objeto HTML, em JavaScript na página que ele cria, referente ao IWForm em questão, em caixa ALTA.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function testaEdit(){&lt;br /&gt;   alert(document.forms[0].IWEDIT1.value);&lt;br /&gt;   document.forms[0].IWEDIT1.value = "";&lt;br /&gt;   document.forms[0].IWEDIT1.focus();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A função acima, simplesmente trata de exibir o conteúdo digitado no IWEdit1, lembrando que esse processamento é realizado no próprio browser. Ela deve ser adicionada na &lt;a href="http://estacaozn.blogspot.com/2008/06/delphi-java-script-intraweb.html"&gt;propriedade “JavaScript”&lt;/a&gt; do IWForm.&lt;br /&gt;&lt;br /&gt;Para poder acessar o “IWEDIT1” em JavaScript usei a referencia “document.forms[0]” porque a forma mais comum seria usar “document.all. IWEDIT1”. O Problema é que dessa forma o script  vai funcionar somente no browser da MS (Internet Explorer). Então, podemos concluir que ao usar “document.forms[0]” nosso JavaScript, pelo menos no que tange a referencias os objetos numa página HTML, estaria compatível com todos os navegadores? Sim, dessa forma nosso JavaScript está compatível. Todavia, isso não funciona no Intraewb 8. Ou melhor, ou talvez pior, ora funciona, ora não funciona. O Intraweb 8 criar várias tags “form” na página HTML. Provavelmente é por isso que volta e meia me deparo com aplicações Intraweb 8 que não estão usando nada de JavaScript.&lt;br /&gt;Então, para garantir o comportamento adequado da função “testaEdit()” vamos modificar o código para:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function testaEdit(){&lt;br /&gt;    var ZnEdt = FindElem("IWEDIT1”);&lt;br /&gt;   alert(ZnEdt.value);&lt;br /&gt;   ZnEdt.value = "";&lt;br /&gt;   ZnEdt.focus();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Adicione ao IWForm um IWButton (TIWButton, palheta IWStandard). Altere a propriedade “Name” dele para “BtnTestaEdit”. Altere o “Caption” dele para “Testa IWEdit1 JavaScript”. Usaremos o “BtnTestaEdit” para chamarmos essa nova função. Digite na propriedade “ScriptEvent” do BtnTestaEdit, no “Event” OnClick, conforme ilustrado abaixo (adiante veremos como setar essa propriedade dinamicamente):&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWP_nMNVBI/AAAAAAAABbY/BfmQ6Yx9QQU/s1600-h/PropridadeJavascriptIWForm1PrecorreTudo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 162px;" src="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWP_nMNVBI/AAAAAAAABbY/BfmQ6Yx9QQU/s320/PropridadeJavascriptIWForm1PrecorreTudo.gif" alt="" id="BLOGGER_PHOTO_ID_5306806058940716050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="text-align: center; font-weight:bold;"&gt;Server-Side X Client-Side – Delphi Intraweb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;Podemos, para ilustrar nosso exemplo, implementar um procedimento em Delphi equivalente ao processamento realizado pela função JavaScript “testaEdit()”. Para isso, adicione mais um IWButton (TIWButton, palheta IWStandard). Altere a propriedade “Name” dele para “BtnTestaEditServerSide”. Altere a propriedade “Caption” para “Testa IWEdit1 Delphi”.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_buFzmAtZPuc/SaWSJ3CDdRI/AAAAAAAABbg/FqpJGpUC2Hg/s1600-h/FormTesteIwEdit.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 82px;" src="http://2.bp.blogspot.com/_buFzmAtZPuc/SaWSJ3CDdRI/AAAAAAAABbg/FqpJGpUC2Hg/s320/FormTesteIwEdit.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306808434015040786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vejamos, no evento “OnClick” do “BtnTestaEditServerSide” digite:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TIWForm1.BtnTestaEditServerSideClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Self.ActiveControl := IWEdit1;&lt;br /&gt;  WebApplication.ShowMessage(IWEdit1.Text);&lt;br /&gt;  IWEdit1.Text := ''&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora você pode experimentar o efeito da diferença entre processar Server-side frente ao processamento client-side. Para testar, pressione F9. Em seguida, na janela de diálogo do servidor standalone pressione F9 novamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;text-align: center"&gt;VCL X HTML&lt;/span&gt;&lt;br /&gt;Não é papo de bêbado, garanto. Conforme mencionei anteriormente, o framework Intraweb gera, a partir de um form Delphi (IWForm - VCL) e de controles (IWControls - VCL) associados a ele, uma página HTML na qual objetos são declarados (em JavaScript) referentes a cada um dos controles VCL dispostos no IWForm que a originou. &lt;br /&gt;Para conhecer todos os objetos que compõem o objeto “form” de uma página HTML:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function percorreTudo(){&lt;br /&gt;    var ZnForms = document.getElementsByTagName("form");&lt;br /&gt;    alert("Oi");&lt;br /&gt;    for (i = 0; i&lt; ZnForms.length;i++) {&lt;br /&gt;       alert("Bla!! O nome do form é: " + ZnForms[i].name);&lt;br /&gt;       for (j = 0; j&lt; ZnForms[i].elements.length; j++) {&lt;br /&gt;         alert("Bla!! O nome do form é: " + ZnForms[i].name + " o elemento é:" + ZnForms[i].elements[j].name);&lt;br /&gt;       }  &lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essa função pode ser utilizada em qualquer página HTML. No Intrweb, podemos codificá-la na propriedade “JavaScript” do IWForm (TIWForm).  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_buFzmAtZPuc/SaWWiAZs4pI/AAAAAAAABbo/B8xHMXbzLeI/s1600-h/PropridadeJavascriptIWForm1PrecorreTudo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://4.bp.blogspot.com/_buFzmAtZPuc/SaWWiAZs4pI/AAAAAAAABbo/B8xHMXbzLeI/s320/PropridadeJavascriptIWForm1PrecorreTudo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306813246893515410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para chamarmos a função “precorreTudo()” vou adicionar ao IWForm1 um IWButton (palheta IWStandard). Em seguida na propriedade “ScriptEvent”, no evento OnClick digite, conforme ilustrado na imagem abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_buFzmAtZPuc/SaWXEgpLlpI/AAAAAAAABbw/VOwQdrJgUNg/s1600-h/TestaEdit_ScriptEvent.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="http://1.bp.blogspot.com/_buFzmAtZPuc/SaWXEgpLlpI/AAAAAAAABbw/VOwQdrJgUNg/s320/TestaEdit_ScriptEvent.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306813839663928978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na propriedade “Caption” do IWButton1 vou digitar “PrecorreTudo”. Ok, caro leitor do Estação ZN, mais um teste já pode ser feito. Porem, antes adicione alguns controles no IWForm1. Por exemplo umas IWListBox, uns IWEdits (todos da palheta IWStandard).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Manipulando os objetos HTML via JavaScript no Intraweb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na próxima função seremos mais ousados. Vamos percorrer todos os objetos do “form”  num laço (“for”), atribuindo o nome, tanto do “form”, quanto dos objetos associados a ele, num IWListBox. Veja como o framework Intraweb cria e manipula os objetos, componentes visuais Delphi, numa página HTML.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function percorreTudoSetValue(){&lt;br /&gt;    var ZnForms = document.getElementsByTagName("form");&lt;br /&gt;     var ZnList = FindElem("IWLISTBOX1");&lt;br /&gt;     var ZnMemo = FindElem("IWMEMO1");&lt;br /&gt;    for (i = 0; i&lt; ZnForms.length;i++) {&lt;br /&gt;       alert("Bla!! O nome do form é: " + ZnForms[i].name);&lt;br /&gt;        alert("Bla!! O ID do form é: " + ZnForms[i].id);&lt;br /&gt;        alert(ZnList.item(i).innerHTML);&lt;br /&gt;       idx = ZnList.options.length++;&lt;br /&gt;       ZnList.options[idx].value = ZnForms[i].name;&lt;br /&gt;       ZnList.options[idx].text = ZnForms[i].name;&lt;br /&gt;       ZnList.setAttribute("Selected","Selected");&lt;br /&gt;       document.SubmitForm.IWLISTBOX1.text = "&lt;br&gt;" + ZnForms[i].name;&lt;br /&gt;       ZnMemo.value += ZnForms[i].name;&lt;br /&gt;       for (j = 0; j&lt; ZnForms[i].elements.length; j++) {&lt;br /&gt;          alert("Bla!! O nome do form é: " + ZnForms[i].name + " o elemento é: " + ZnForms[i].elements[j].name);&lt;br /&gt;          idx = ZnList.options.length++;&lt;br /&gt;          ZnList.options[idx].value = ZnForms[i].name + " | elemento: " + ZnForms[i].elements[j].name;&lt;br /&gt;          ZnList.options[idx].text = ZnForms[i].name + "   | elemento: " + ZnForms[i].elements[j].name;&lt;br /&gt;          ZnList.setAttribute("Selected","Selected");&lt;br /&gt;          ZnMemo.value += "\n" + ZnForms[i].elements[j].name;&lt;br /&gt;       }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Observe que atribuir valor a um objeto “Select” usando JavaScript para isso não é um das coisas mais triviais. Observe também que sabendo fazer isso você pode ganhar bastante performance no seu aplicativo, isso caso você substitua processamento server-side, para montar os valores num “Select”, fazendo através de JavaScript,  client-side. &lt;br /&gt;Vamos testar então? O próximo passo: Você vai adicionar um IWListBox e manter a propriedade name dele como “IWLISTBOX1”. Adicione um IWMemo também “IWMEMO1”. O Memo é criado na página HTML como um objeto “TextArea”, ao passo que o IWListBox gera um “Select”.&lt;br /&gt;Agora, adicionaremos mais um IWButton, para fazermos chamada a essa function. No IWButton3, altere a propriedade “Caption” para “Percorre Tudo II”. No evento “ScriptEvent”, semelhante ao que fizemos no IWButton1, no item OnClick, digite “percorreTudoSetValue()”.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_buFzmAtZPuc/SaWYJOLM61I/AAAAAAAABb4/pZkIm_BQIBA/s1600-h/ScriptEvent_OnclickButton3.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_buFzmAtZPuc/SaWYJOLM61I/AAAAAAAABb4/pZkIm_BQIBA/s320/ScriptEvent_OnclickButton3.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306815020117322578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.7pt;"&gt;&lt;span style="font-weight:bold;"&gt;OBS:&lt;/span&gt; O JavaScript é super, ultra, hiper, case sensitive. Portanto, muito cuidado com a digitação. Nas funções JavaScript que estamos criando, devemos ter sempre a preocupação de usar um JavaScript que seja compatível com todos os navegadores (ou no mínino com os mais conhecidos: IE e FireFox). Por isso, note que não estou usando “document.all.Obj” Esse comando não é suportado pelo Fire Fox.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;Propriedade “Name” do Form&lt;br /&gt; Não me refiro ao form VCL (IWForm), mas a tag “form” da página HTML.&lt;br /&gt;A próxima função será para definirmos dinamicamente um nome para o objeto “form” na página HTML:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;function NamedForm(){&lt;br /&gt;    alert("www.estacaozn.blogspot.com");&lt;br /&gt;    document.forms[0].name = "Landjah";&lt;br /&gt;                   document.forms[0].id = "Landjah";&lt;br /&gt;    alert("Estação zn - O nome do form é: " + document.forms[0].name);&lt;br /&gt;                  document.forms[0].IWEDIT1.value = "Landjah";&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vou adicionar outro IWButton ao IWForm1, para a propriedade “Caption” dele vou definir “Nome do Form”. Desta vez, vamos fazer a chamada da função “NamedForm()” em outra propriedade. Faremos isso na propriedade “ExtraTagParams”, do IWButton2:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWaEOffQOI/AAAAAAAABcA/8yg_Bi8W8rs/s1600-h/ExtraTagParamsButton2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 167px;" src="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWaEOffQOI/AAAAAAAABcA/8yg_Bi8W8rs/s320/ExtraTagParamsButton2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306817133326319842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gora, se você clicar no IWButton2 antes de fazê-lo no IWBurron1, perceberá que o nome do “form” foi, na verdade pela primeira vez, definido.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Habilitando e Desabilitando controles através de  JavaScript.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pode ser de grande utilidade saber habilitar e desabilitar os controles, inputs de um form HTML, sem que para isso precise ir ao servidor. Veja a função abaixo:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function HabilitaControleEmail(){&lt;br /&gt;    var ZnEdtMail = FindElem("EDTEMAIL");&lt;br /&gt;    var ZnCmbTipoMail = FindElem("CMBTIPOEMAIL");&lt;br /&gt;    var ZnChkBoxMail =  FindElem("IWCHECKBOX1");&lt;br /&gt;    ZnChkBoxMail.checked = !ZnChkBoxMail.checked;&lt;br /&gt;    ZnEdtMail.disabled = !ZnChkBoxMail.checked;&lt;br /&gt;    ZnCmbTipoMail.disabled = !ZnChkBoxMail.checked;&lt;br /&gt;&lt;br /&gt;    if (ZnEdtMail.disabled) {&lt;br /&gt;      ZnEdtMail.style.backgroundColor = "#E7E7E7";&lt;br /&gt;      ZnCmbTipoMail.style.backgroundColor = "#E7E7E7";&lt;br /&gt;     }&lt;br /&gt;    else {&lt;br /&gt;        ZnEdtMail.style.backgroundColor = "#FFFFFF";&lt;br /&gt;      ZnCmbTipoMail.style.backgroundColor = "#FFFFFF";&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;Na &lt;span style="font-weight:bold;"&gt;linha 2&lt;/span&gt;, recupero o objeto "EDTEMAIL".&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;Na &lt;span style="font-weight:bold;"&gt;linha 3&lt;/span&gt;, recupero  o objeto Select  o qual representa uma IWComboBox "CMBTIPOEMAIL ".&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;Na &lt;span style="font-weight:bold;"&gt;linha 4&lt;/span&gt;, recupero o objeto CheckBox  o qual representa uma IWCheckBox "IWCHECKBOX1".&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;Na &lt;span style="font-weight:bold;"&gt;linha 5&lt;/span&gt;, simulo o comportamento do CheckBox.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;Na &lt;span style="font-weight:bold;"&gt;linha 6 e 7&lt;/span&gt;, atribuímos a propriedade “disabled” dos controles “EDTMAIL” e “CMBTIPOEMAIL” a negação do valor do CheckBox.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left; text-indent: 36.4pt;"&gt;A partir da &lt;span style="font-weight:bold;"&gt;linha 9&lt;/span&gt;, controlamos o efeito visual: atribuímos a cor cinza aos controles caso estejam desabilitados. Caso contrário, recebem a cor branca.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;Precisamos, então, adicionar outro IWEdit, o qual alteraremos a propriedade “Name” para “EdtEMail”. Adicione um IWComboBox, altere sua propriedade “Name” para “CMBTIPOEMAIL”. Vamos atribuir dinamicamente valores a propridade “Items” do CMBTIPOEMAIL. Na seção “private” declare o procedimento “LoadCmbTipoEmail”. Implemente conforme ilustrado abaixo:&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TZnIWForm.LoadCmbTipoEmail;&lt;br /&gt;begin&lt;br /&gt;  CMBTIPOEMAIL.Items.Add('Email Comercial');&lt;br /&gt;  CMBTIPOEMAIL.Items.Add('Email Residencial');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;No envento “OnCreate” do IWForm faça chamada ao método “LoadCmbTipoEmail”.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;Adicione também ao IWForm um IWCheckBox. No Intraweb 8, não é possível acessar um CheckBox simplesmente pelo nome que ele esta definido no Delphi. Por exemplo, para você acessar o IWCheckBox1, além de ter usar caixa alta ainda temos que acrescentar “_CHECKBOX” com sufixo do nome do componente. O IWCheckBos1 deve ser referenciado em código como “IWCHECKBOX1_CHECKBOX” . Como alternativa podemos acessar o componente usando “document.all[IWCHECKBOX1]”. Esse comando é compatível tanto com o Mozila, quanto com o IE.&lt;br /&gt;Na propriedade “ExtraTagParams” do IWCheckBox1 digite conforme ilustrado abaixo:&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWhpjKF8mI/AAAAAAAABcQ/2m3JHHwm9Jk/s1600-h/HabilitaCombo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWhpjKF8mI/AAAAAAAABcQ/2m3JHHwm9Jk/s320/HabilitaCombo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5306825471110279778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; text-indent: 35.4pt;"&gt;Observe que a propriedade “ExtraTagParams” habilita o “Code Editor” (Delphi 2006 – Intraweb 8).&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;Continua ....&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-1499562226200811334?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=XJRrHGPOR14:hHEk1_Nzvjg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/XJRrHGPOR14" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-25T17:59:55.880-03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_buFzmAtZPuc/SaWP_nMNVBI/AAAAAAAABbY/BfmQ6Yx9QQU/s72-c/PropridadeJavascriptIWForm1PrecorreTudo.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/01/delphi-intraweb-javascript-ii-continua.html</feedburner:origLink></item><item><title>Mais Threads, ClassLoader, Classpath, Arquitetura de Plug-ins, Interfaces e mais recursos Java - PARTE 1.</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/2boXvekeTWQ/mais-threads-classloader-classpath.html</link><author>noreply@blogger.com (ralencar)</author><pubDate>Mon, 26 Jan 2009 09:29:33 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-2701280204793887881</guid><description>O problema é interceptar determinados eventos em um servidor de download para tarifação em tempo real em um servidor de tarifação.  O servidor de download permite a instalação de plug-ins escritos em Java para interceptar os eventos de download.&lt;br /&gt;&lt;br /&gt;Esses eventos são disparados no ciclo do download, e são os seguintes: solicitação de download, download iniciado, download terminado com sucesso, download cancelado.&lt;br /&gt;&lt;br /&gt;A classe Java não deve sobrecarregar o servidor para não causar indisponibilidade do serviço. Se a tarifação não puder ser efetuada o download não pode ser interrompido.&lt;br /&gt;&lt;br /&gt;O problema é conectar o sistema de tarifação ao sistema de download.&lt;br /&gt;&lt;br /&gt;Interface Java que deve ser implementada para interceptar os eventos:&lt;br /&gt;&lt;pre class="java" name="code"&gt;public interface MonitorPlugin {&lt;br /&gt;&lt;br /&gt;    public void downloadRequested(Download download);&lt;br /&gt;&lt;br /&gt;    public void downloadStarted(Download download);&lt;br /&gt;&lt;br /&gt;    public void downloadFinished(Download download);&lt;br /&gt;&lt;br /&gt;    public void downloadCanceled(Download download);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A classe Java deve estar dentro do pacote padrão (sem pacote) dentro de um JAR com o mesmo nome no diretório raiz da aplicação.&lt;br /&gt;&lt;br /&gt;&lt;span class='fullpost'&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;&lt;pre class="java" name="code"&gt;import downloadserver.Download;&lt;br /&gt;import downloadserver.MonitorPlugin;&lt;br /&gt;&lt;br /&gt;public class MonitorPluginSOP implements MonitorPlugin {&lt;br /&gt;&lt;br /&gt;    public void downloadRequested(Download download) {&lt;br /&gt;        System.out.println("downloadRequested T:" + download.getThreadId() + " U:" + download.getUserId());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void downloadStarted(Download download) {&lt;br /&gt;        System.out.println("downloadStarted T:" + download.getThreadId() + " U:" + download.getUserId());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void downloadFinished(Download download) {&lt;br /&gt;        System.out.println("downloadFinished T:" + download.getThreadId() + " U:" + download.getUserId());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void downloadCanceled(Download download) {&lt;br /&gt;        System.out.println("downloadCanceled T:" + download.getThreadId() + " U:" + download.getUserId());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A classe MonitorPluginSOP vai estar dentro do JAR MonitorPluginSOP.jar.&lt;br /&gt;&lt;br /&gt;O sistema de tarifação possui os comandos de tarifação e estorno. Para tarifação e estorno devem ser informados o numero de identificação do cliente, o comando e o serviço a ser tarifado.&lt;br /&gt;&lt;br /&gt;Vamos discutir mais sobre o sistema de tarifação e o plug-in que fará a conexão entre os servidores no próximo post.&lt;br /&gt;&lt;br /&gt;Por enquanto vamos ver o servidor de download que é uma simulação de um servidor real.&lt;br /&gt;&lt;br /&gt;A classe que representa um download é a seguinte:&lt;br /&gt;&lt;pre class="java" name="code"&gt;package downloadserver;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * A classe Download implementa Runnable para possuir o comportamento de uma&lt;br /&gt; * Thread. Para dar a possibilidade de parar a execução a classe possui &lt;br /&gt; * um atributo running, quando running igual a false o objeto para a sua &lt;br /&gt; * execução. O atributo running é alterado através do método cancel.&lt;br /&gt; */&lt;br /&gt;public class Download implements Runnable {&lt;br /&gt;&lt;br /&gt;    static private long threadCount = 0;&lt;br /&gt;    static public final long DOWNLOAD_SIZE = 16;&lt;br /&gt;    private long threadId;&lt;br /&gt;    private long bytesSent = 0;&lt;br /&gt;    private int userId;&lt;br /&gt;    private boolean running = true;&lt;br /&gt;    private List&lt;MonitorPlugin&gt; monitors = new ArrayList&lt;MonitorPlugin&gt;();&lt;br /&gt;&lt;br /&gt;    public Download() {&lt;br /&gt;        threadId = threadCount++;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Download(int userId) {&lt;br /&gt;        this.userId = userId;&lt;br /&gt;        threadId = threadCount++;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setUserId(int userId) {&lt;br /&gt;        this.userId = userId;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getUserId() {&lt;br /&gt;        return userId;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public long getThreadId() {&lt;br /&gt;        return threadId;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public long getBytesSent() {&lt;br /&gt;        return bytesSent;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void request() {&lt;br /&gt;        downloadRequested();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void cancel() {&lt;br /&gt;        running = false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addMonitor(MonitorPlugin monitor) {&lt;br /&gt;        monitors.add(monitor);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addMonitor(List&lt;MonitorPlugin&gt; monitors) {&lt;br /&gt;        this.monitors.addAll(monitors);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void downloadRequested() {&lt;br /&gt;        for (MonitorPlugin m : monitors) {&lt;br /&gt;            m.downloadRequested(this);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void downloadStarted() {&lt;br /&gt;        for (MonitorPlugin m : monitors) {&lt;br /&gt;            m.downloadStarted(this);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void downloadFinished() {&lt;br /&gt;        for (MonitorPlugin m : monitors) {&lt;br /&gt;            m.downloadFinished(this);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void downloadCanceled() {&lt;br /&gt;        for (MonitorPlugin m : monitors) {&lt;br /&gt;            m.downloadCanceled(this);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void run() {&lt;br /&gt;        downloadStarted();&lt;br /&gt;        while (running &amp;&amp; bytesSent &lt; DOWNLOAD_SIZE) {&lt;br /&gt;            bytesSent++;&lt;br /&gt;            try {&lt;br /&gt;                Thread.sleep(500);&lt;br /&gt;            } catch (InterruptedException e) {&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (bytesSent == DOWNLOAD_SIZE) {&lt;br /&gt;            downloadFinished();&lt;br /&gt;        } else {&lt;br /&gt;            downloadCanceled();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E a classe que representa o Servidor é a seguinte, a classe está comentada nos seus principais recursos:&lt;br /&gt;&lt;pre class="java" name="code"&gt;package downloadserver;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FilenameFilter;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLClassLoader;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;&lt;br /&gt;public class Server extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    private int usersCount = 0;&lt;br /&gt;    private List&lt;MonitorPlugin&gt; monitorPlugins = new ArrayList&lt;MonitorPlugin&gt;();&lt;br /&gt;&lt;br /&gt;    public Server() {&lt;br /&gt;        initComponents();&lt;br /&gt;        loadMonitorPlugin();&lt;br /&gt;        inicia();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @SuppressWarnings("unchecked")&lt;br /&gt;    // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;                          &lt;br /&gt;    private void initComponents() {&lt;br /&gt;&lt;br /&gt;        jButton2 = new javax.swing.JButton();&lt;br /&gt;&lt;br /&gt;        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;        setTitle("Server");&lt;br /&gt;        setBounds(new java.awt.Rectangle(0, 0, 100, 500));&lt;br /&gt;        getContentPane().setLayout(new java.awt.FlowLayout());&lt;br /&gt;&lt;br /&gt;        jButton2.setText("Novo");&lt;br /&gt;        jButton2.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;            public void actionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;                jButton2ActionPerformed(evt);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        getContentPane().add(jButton2);&lt;br /&gt;    }// &lt;/editor-fold&gt;                        &lt;br /&gt;&lt;br /&gt;    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         &lt;br /&gt;        novo();&lt;br /&gt;    }                                        &lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;     * Lê os arquivos de plug-in sem a necessidade de estarem no classepath.&lt;br /&gt;     */&lt;br /&gt;    public void loadMonitorPlugin() {&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            File dir = new File(".");&lt;br /&gt;            String[] children;&lt;br /&gt;            FilenameFilter filter = new FilenameFilter() {&lt;br /&gt;&lt;br /&gt;                public boolean accept(File dir, String name) {&lt;br /&gt;                    return name.endsWith(".jar");&lt;br /&gt;                }&lt;br /&gt;            };&lt;br /&gt;            children = dir.list(filter);&lt;br /&gt;            if (children != null) {&lt;br /&gt;                for (int i = 0; i &lt; children.length; i++) {&lt;br /&gt;                    String filename = children[i];&lt;br /&gt;                    try {&lt;br /&gt;                        String classname = filename.replaceAll("[.]jar", "");&lt;br /&gt;&lt;br /&gt;                        java.io.File file = new java.io.File(filename);&lt;br /&gt;                        java.net.URL url = file.toURI().toURL();&lt;br /&gt;                        URL[] urls = new URL[]{url};&lt;br /&gt;&lt;br /&gt;                        ClassLoader loader = URLClassLoader.newInstance(urls, this.getClass().getClassLoader());&lt;br /&gt;&lt;br /&gt;                        Class clazz = loader.loadClass(classname);&lt;br /&gt;                        MonitorPlugin mp = (MonitorPlugin) clazz.newInstance();&lt;br /&gt;                        monitorPlugins.add(mp);&lt;br /&gt;&lt;br /&gt;                        System.out.println("Adicionada: " + classname);&lt;br /&gt;&lt;br /&gt;                    } catch (Exception ex) {&lt;br /&gt;                        ex.printStackTrace();&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;     * Cria um novo download e exibe na tela como um botão. Ao clicar no botão o download é cancelado.&lt;br /&gt;     */&lt;br /&gt;    private void novo() {&lt;br /&gt;        Download d = new Download(usersCount++);&lt;br /&gt;        d.addMonitor(monitorPlugins);&lt;br /&gt;        d.request();&lt;br /&gt;        print(d);&lt;br /&gt;        new Thread(d).start();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;     * Executado no início cria 5 novos downloads.&lt;br /&gt;     */&lt;br /&gt;    public void inicia() {&lt;br /&gt;        for (int i = 0; i &lt; 5; i++) {&lt;br /&gt;            novo();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;     * Exibe um download na tela como um botão, adiciona um ouvinte (monitor)&lt;br /&gt;     * ao download para atualizar a interface e adiciona ao evento de click&lt;br /&gt;     * a operação de cancelar o download.&lt;br /&gt;     */&lt;br /&gt;    private void print(final Download d) {&lt;br /&gt;        final JButton elementoGrafico = new JButton();&lt;br /&gt;        elementoGrafico.setText("T:" + d.getThreadId() + " U:" + d.getUserId());&lt;br /&gt;        getContentPane().add(elementoGrafico);&lt;br /&gt;&lt;br /&gt;        elementoGrafico.addMouseListener(new java.awt.event.MouseAdapter() {&lt;br /&gt;&lt;br /&gt;            @Override&lt;br /&gt;            public void mouseClicked(java.awt.event.MouseEvent evt) {&lt;br /&gt;                d.cancel();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        d.addMonitor(&lt;br /&gt;                new MonitorPlugin() {&lt;br /&gt;&lt;br /&gt;                    public void downloadRequested(Download download) {&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    public void downloadStarted(Download download) {&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    public void downloadFinished(Download download) {&lt;br /&gt;                        elementoGrafico.setBackground(new java.awt.Color(51, 204, 0));&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    public void downloadCanceled(Download download) {&lt;br /&gt;                        elementoGrafico.setBackground(new java.awt.Color(255, 0, 51));&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String args[]) {&lt;br /&gt;        java.awt.EventQueue.invokeLater(new Runnable() {&lt;br /&gt;&lt;br /&gt;            public void run() {&lt;br /&gt;                new Server().setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Variables declaration - do not modify                     &lt;br /&gt;    private javax.swing.JButton jButton2;&lt;br /&gt;    // End of variables declaration                   &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bem, é isso. Vou tentar postar a continuação o mais breve possível.&lt;br /&gt;&lt;br /&gt;O arquivo para &lt;a href="http://sites.google.com/site/estacaozndorcalencar/Home/DownloadServerEPlugin.zip"&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Abraços, Rodrigo Alencar.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-2701280204793887881?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=2boXvekeTWQ:bvJ7FIpSMY8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/2boXvekeTWQ" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-26T14:29:33.944-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/01/mais-threads-classloader-classpath.html</feedburner:origLink></item><item><title>Java: Threads concorrentes, swing, observable para conectar objetos a GUI, herança, interface e mais algumas coisas.</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/Zn1WRPRY2Qk/pessoal-meu-primeiro-post-no-estao-zn.html</link><author>noreply@blogger.com (ralencar)</author><pubDate>Tue, 13 Jan 2009 12:23:56 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-8660552735921847859</guid><description>Pessoal,&lt;br /&gt;&lt;br /&gt;Meu primeiro post no Estação ZN!&lt;br /&gt;&lt;br /&gt;Numa manhã sem muito trabalho escrevi um programa em JAVA para ilustrar alguns recursos. Tem threads concorrentes, swing, observable para conectar objetos a GUI, herança, interface e mais algumas coisas.&lt;br /&gt;&lt;br /&gt;O programa ilustra a concorrência de dois objetos tentando se conectar para formar uma parceria e se reproduzir em um novo objeto que vai continuar com esse ciclo.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Acredito que esse programa possa ajudar a quem está começando ou quem quer ver um exemplo dos recursos que citei.&lt;br /&gt;&lt;br /&gt;Como funciona:&lt;br /&gt;&lt;br /&gt;Existe uma classe Elemento que define o objeto principal e que será herdada por Macho e Fêmea. Os Objetos da classe Macho e Fêmea são associados a um objeto da classe Ambiente. A classe Ambiente define o ambiente onde os objetos viverão. A classe Elemento implementa Runnable e no método run executa o código necessário para dar vida aos objetos.&lt;br /&gt;&lt;br /&gt;Abaixo um diagrama simplificado dessas classes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_XV7fFbhKKpk/SWzf4ajN_lI/AAAAAAAAA1k/wlgEyGqDGSA/s1600-h/imagem.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5290849822546198098" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 238px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_XV7fFbhKKpk/SWzf4ajN_lI/AAAAAAAAA1k/wlgEyGqDGSA/s320/imagem.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A classe Main é um JFrame que exibe os objetos criados como JButtons. A classe Main possui um método simular que inicia a simulação.&lt;br /&gt;&lt;br /&gt;A seguir as principais classes do programa.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Classe: Elemento&lt;/strong&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package simulador;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;public abstract class Elemento implements Runnable {&lt;br /&gt;&lt;br /&gt;    private static int contador = 0;&lt;br /&gt;    private int id;&lt;br /&gt;    private Elemento mae;&lt;br /&gt;    private Elemento pai;&lt;br /&gt;    private long nascimento;&lt;br /&gt;    private long morte;&lt;br /&gt;    private int folego = 3 * 1000;&lt;br /&gt;    private int idadeMaxima = 2 * 60 * 1000;&lt;br /&gt;    private boolean running = true;&lt;br /&gt;    private boolean vivo = true;&lt;br /&gt;    private boolean ocupado;&lt;br /&gt;    protected Ambiente ambiente;&lt;br /&gt;    protected Elemento parceiro;&lt;br /&gt;    private ArrayList&lt;string&gt; memoria = new ArrayList&lt;string&gt;();&lt;br /&gt;    private ArrayList&lt;ouvinte&gt; observadoresVida = new ArrayList&lt;ouvinte&gt;();&lt;br /&gt;    private ArrayList&lt;ouvinte&gt; observadoresMorte = new ArrayList&lt;ouvinte&gt;();&lt;br /&gt;    private ArrayList&lt;ouvinte&gt; observadoresParceria = new ArrayList&lt;ouvinte&gt;();&lt;br /&gt;&lt;br /&gt;    public Elemento(Ambiente ambiente) {&lt;br /&gt;        id = contador++;&lt;br /&gt;        setAmbiente(ambiente);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getFolego() {&lt;br /&gt;        return folego;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setFolego(int folego) {&lt;br /&gt;        this.folego = folego;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getIdadeMaxima() {&lt;br /&gt;        return idadeMaxima;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setIdadeMaxima(int idadeMaxima) {&lt;br /&gt;        this.idadeMaxima = idadeMaxima;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Elemento getMae() {&lt;br /&gt;        return mae;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setMae(Elemento mae) {&lt;br /&gt;        this.mae = mae;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Elemento getPai() {&lt;br /&gt;        return pai;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPai(Elemento pai) {&lt;br /&gt;        this.pai = pai;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ArrayList&lt;string&gt; getMemoria() {&lt;br /&gt;        return memoria;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void memorizar(String s) {&lt;br /&gt;        memoria.add(id + ": " + new Date() + ": " + s);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setAmbiente(Ambiente ambiente) {&lt;br /&gt;        this.ambiente = ambiente;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setRunning(boolean running) {&lt;br /&gt;        this.running = running;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isRunning() {&lt;br /&gt;        return running &amp;amp;&amp;amp; ambiente.isRunnig() &amp;amp;&amp;amp; !expirou();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean expirou() {&lt;br /&gt;        long idade = System.currentTimeMillis() - nascimento;&lt;br /&gt;        return idade &gt; idadeMaxima;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public long idadeMorte() {&lt;br /&gt;        long idade = morte - nascimento;&lt;br /&gt;        return idade;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isVivo() {&lt;br /&gt;        return vivo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Elemento getParceiro(){&lt;br /&gt;        return parceiro;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private synchronized boolean ocupar() {&lt;br /&gt;        if (!ocupado) {&lt;br /&gt;            ocupado = true;&lt;br /&gt;            return true;&lt;br /&gt;        } else {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void liberar() {&lt;br /&gt;        ocupado = false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private boolean aceitar(Elemento outro) {&lt;br /&gt;        if (solteiro() &amp;amp;&amp;amp; desejo()) {&lt;br /&gt;            String s1 = "Aceitei o convite para ser parceiro do " + outro.id + ".";&lt;br /&gt;            notificarEncontrarParceiro(s1);&lt;br /&gt;            parceiro = outro;&lt;br /&gt;            outro.parceiro = this;&lt;br /&gt;            return true;&lt;br /&gt;        } else {&lt;br /&gt;            String s2 = "N?o aceitei o convite para ser parceiro do " + outro.id + ".";&lt;br /&gt;            notificarEncontrarParceiro(s2);&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void encontrarParceiro() {&lt;br /&gt;        if (ocupar()) {&lt;br /&gt;            Random rand = new Random();&lt;br /&gt;            int quantidadeDeElementos = candidatos().size();&lt;br /&gt;            int aleatorio = rand.nextInt(quantidadeDeElementos);&lt;br /&gt;            Elemento outro = candidatos().get(aleatorio);&lt;br /&gt;            if (!equals(outro)) {&lt;br /&gt;                String s1 = "Escolhi o " + outro.id + " para ser parceiro.";&lt;br /&gt;                notificarEncontrarParceiro(s1);&lt;br /&gt;                if (!outro.vivo) {&lt;br /&gt;                    String s2 = "O " + outro.id + " estava morto.";&lt;br /&gt;                    notificarEncontrarParceiro(s2);&lt;br /&gt;                } else if (outro.ocupar()) {&lt;br /&gt;                    String s3 = "Convidando o " + outro.id + " para ser parceiro.";&lt;br /&gt;                    notificarEncontrarParceiro(s3);&lt;br /&gt;                    if (outro.aceitar(this)) {&lt;br /&gt;                        String s4 = "O " + outro.id + " aceitou ser parceiro.";&lt;br /&gt;                        notificarEncontrarParceiro(s4);&lt;br /&gt;                    } else {&lt;br /&gt;                        String s5 = "O " + outro.id + " n?o aceitou ser parceiro.";&lt;br /&gt;                        notificarEncontrarParceiro(s5);&lt;br /&gt;                    }&lt;br /&gt;                    outro.liberar();&lt;br /&gt;                } else {&lt;br /&gt;                    String s6 = "O " + outro.id + " estava ocupado.";&lt;br /&gt;                    notificarEncontrarParceiro(s6);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            liberar();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected abstract Elemento reproduzir();&lt;br /&gt;&lt;br /&gt;    protected abstract List&lt;elemento&gt; candidatos();&lt;br /&gt;&lt;br /&gt;    protected boolean desejo() {&lt;br /&gt;        Random rand = new Random();&lt;br /&gt;        int aleatorio = rand.nextInt(2);&lt;br /&gt;        if (aleatorio == 1) {&lt;br /&gt;            return true;&lt;br /&gt;        } else {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean equals(Object o) {&lt;br /&gt;        Elemento outro = (Elemento) o;&lt;br /&gt;        if (outro == this) {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        if (outro.id == id) {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean solteiro() {&lt;br /&gt;        return parceiro == null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void run() {&lt;br /&gt;        notificarNascimento();&lt;br /&gt;        nascimento = System.currentTimeMillis();&lt;br /&gt;&lt;br /&gt;        while (isRunning()) {&lt;br /&gt;            if (solteiro()) {&lt;br /&gt;                if (desejo()) {&lt;br /&gt;                    encontrarParceiro();&lt;br /&gt;                }&lt;br /&gt;            } else { // Possui um parceiro, pode se reproduzir.&lt;br /&gt;&lt;br /&gt;                if (desejo() &amp;amp;&amp;amp; parceiro.isVivo() &amp;amp;&amp;amp; parceiro.desejo()) {&lt;br /&gt;                    Elemento novo = reproduzir();&lt;br /&gt;                    if (novo != null) {&lt;br /&gt;                        try {&lt;br /&gt;                            new Thread(novo).start();&lt;br /&gt;                        } catch (OutOfMemoryError e) {&lt;br /&gt;                            ambiente.setRunning(false);&lt;br /&gt;                            throw e;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if (isRunning()) {&lt;br /&gt;                try {&lt;br /&gt;                    Thread.sleep(folego);&lt;br /&gt;                } catch (InterruptedException e) {&lt;br /&gt;                    e.printStackTrace();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        morte = System.currentTimeMillis();&lt;br /&gt;        vivo = false;&lt;br /&gt;        notificarMorte();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ArrayList&lt;ouvinte&gt; getObservadoresVida() {&lt;br /&gt;        return observadoresVida;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ArrayList&lt;ouvinte&gt; getObservadoresMorte() {&lt;br /&gt;        return observadoresMorte;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ArrayList&lt;ouvinte&gt; getObservadoresParceria() {&lt;br /&gt;        return observadoresParceria;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addObservadoresVida(Ouvinte o) {&lt;br /&gt;        observadoresVida.add(o);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addObservadoresMorte(Ouvinte o) {&lt;br /&gt;        observadoresMorte.add(o);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addObservadoresParceria(Ouvinte o) {&lt;br /&gt;        observadoresParceria.add(o);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void notificarNascimento() {&lt;br /&gt;        memorizar("Nasci.");&lt;br /&gt;        for (Ouvinte e : observadoresVida) {&lt;br /&gt;            e.atualizar(this, "Nasci.");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void notificarMorte() {&lt;br /&gt;        memorizar("Morri.");&lt;br /&gt;        for (Ouvinte e : observadoresMorte) {&lt;br /&gt;            e.atualizar(this, "Morri.");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void notificarEncontrarParceiro(String s) {&lt;br /&gt;        memorizar(s);&lt;br /&gt;        for (Ouvinte e : observadoresParceria) {&lt;br /&gt;            e.atualizar(this, s);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void notificarNascimento(Elemento e, String s) {&lt;br /&gt;        memorizar(s);&lt;br /&gt;        for (OuvinteNascimento o : ambiente.getObservadoresNascimento()) {&lt;br /&gt;            o.atualizar(this, e, s);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Classe: Macho&lt;/strong&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package simulador;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class Macho extends Elemento {&lt;br /&gt;&lt;br /&gt; public Macho(Ambiente ambiente){&lt;br /&gt;  super(ambiente);&lt;br /&gt;  ambiente.getElementosMachos().add(this);&lt;br /&gt;  ambiente.getElementos().add(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected Elemento reproduzir() {&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected List&lt;elemento&gt; candidatos() {&lt;br /&gt;  return ambiente.getElementosFemeas();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Classe: Femea&lt;/strong&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package simulador;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class Femea extends Elemento {&lt;br /&gt;&lt;br /&gt;    public Femea(Ambiente ambiente) {&lt;br /&gt;        super(ambiente);&lt;br /&gt;        ambiente.getElementosFemeas().add(this);&lt;br /&gt;        ambiente.getElementos().add(this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected List&lt;elemento&gt; candidatos() {&lt;br /&gt;        return ambiente.getElementosMachos();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected Elemento reproduzir() {&lt;br /&gt;        Elemento e;&lt;br /&gt;        if (desejo()) {&lt;br /&gt;            e = new Femea(ambiente);&lt;br /&gt;            notificarNascimento(e, "Pari a femea " + e.getId());&lt;br /&gt;        } else {&lt;br /&gt;            e = new Macho(ambiente);&lt;br /&gt;            notificarNascimento(e, "Pari o macho " + e.getId());&lt;br /&gt;        }&lt;br /&gt;        e.setMae(this);&lt;br /&gt;        e.setPai(parceiro);&lt;br /&gt;        return e;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Classe: Main&lt;/strong&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package simulador;&lt;br /&gt;&lt;br /&gt;public class Main extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    public Main() {&lt;br /&gt;        initComponents();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /** This method is called from within the constructor to&lt;br /&gt;     * initialize the form.&lt;br /&gt;     * WARNING: Do NOT modify this code. The content of this method is&lt;br /&gt;     * always regenerated by the Form Editor.&lt;br /&gt;     */&lt;br /&gt;    @SuppressWarnings("unchecked")&lt;br /&gt;    // &lt;editor-fold desc="Generated Code" defaultstate="collapsed"&gt;                      &lt;br /&gt;    private void initComponents() {&lt;br /&gt;&lt;br /&gt;        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;        setTitle("Simulador");&lt;br /&gt;        getContentPane().setLayout(new java.awt.FlowLayout());&lt;br /&gt;&lt;br /&gt;        pack();&lt;br /&gt;    }// &lt;/EDITOR-FOLD&gt;                    &lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param args the command line arguments&lt;br /&gt;     */&lt;br /&gt;    public static void main(String args[]) {&lt;br /&gt;        final Main f = new Main();&lt;br /&gt;        java.awt.EventQueue.invokeLater(new Runnable() {&lt;br /&gt;&lt;br /&gt;            public void run() {&lt;br /&gt;                f.setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        f.simular();&lt;br /&gt;    }&lt;br /&gt;    Detalhe detalhe;&lt;br /&gt;&lt;br /&gt;    public Detalhe detalhe() {&lt;br /&gt;        if (detalhe == null) {&lt;br /&gt;            detalhe = new Detalhe();&lt;br /&gt;        }&lt;br /&gt;        return detalhe;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void print(final Elemento e) {&lt;br /&gt;        javax.swing.JButton elementoGrafico = new javax.swing.JButton();&lt;br /&gt;        elementoGrafico.setText("" + e.getId());&lt;br /&gt;        getContentPane().add(elementoGrafico);&lt;br /&gt;&lt;br /&gt;        elementoGrafico.addMouseListener(new java.awt.event.MouseAdapter() {&lt;br /&gt;&lt;br /&gt;            @Override&lt;br /&gt;            public void mouseClicked(java.awt.event.MouseEvent evt) {&lt;br /&gt;                detalhe().setDetalhe(e.getMemoria());&lt;br /&gt;                detalhe().setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        pack();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void simular() {&lt;br /&gt;        int TEMPO_DE_VIDA = 2 * 60 * 1000;&lt;br /&gt;&lt;br /&gt;        Ambiente ambiente = new Ambiente();&lt;br /&gt;&lt;br /&gt;        ambiente.addObservadoresNascimento(new OuvinteNascimento() {&lt;br /&gt;&lt;br /&gt;            public void atualizar(Elemento mae, Elemento filho, String s) {&lt;br /&gt;                print(filho);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        Elemento m = new Macho(ambiente);&lt;br /&gt;        print(m);&lt;br /&gt;        new Thread(m).start();&lt;br /&gt;&lt;br /&gt;        Elemento f = new Femea(ambiente);&lt;br /&gt;        print(f);&lt;br /&gt;        new Thread(f).start();&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            Thread.sleep(TEMPO_DE_VIDA);&lt;br /&gt;        } catch (InterruptedException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        ambiente.setRunning(false);&lt;br /&gt;&lt;br /&gt;        while (ambiente.vivo()) {&lt;br /&gt;            try {&lt;br /&gt;                Thread.sleep(3000);&lt;br /&gt;            } catch (InterruptedException e1) {&lt;br /&gt;                e1.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Fim.");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Variables declaration - do not modify                 &lt;br /&gt;    // End of variables declaration               &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Não está comentado, mas começando da classe Main ninguém se perde. O programa vem como um projeto Netbeans, mas vai rodar fácil no Eclipse.&lt;br /&gt;&lt;br /&gt;Vou continuar melhorando o programa, aceito comentários, sugestões, melhorias e correções!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://sites.google.com/site/estacaozndorcalencar/Home/Simulador.zip?attredirects=0"&gt;Download&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Obs: A tela de detalhe não se atualiza sozinha.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abraços, Rodrigo Alencar.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-8660552735921847859?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=Zn1WRPRY2Qk:goPIJeTw1dc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/Zn1WRPRY2Qk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T17:23:56.215-03:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_XV7fFbhKKpk/SWzf4ajN_lI/AAAAAAAAA1k/wlgEyGqDGSA/s72-c/imagem.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2009/01/pessoal-meu-primeiro-post-no-estao-zn.html</feedburner:origLink></item><item><title>Oracle - Pl/SQL No Alter Table: Constraints e Checks, sem usar o comando</title><link>http://feedproxy.google.com/~r/EstaoZn/~3/BYrML6FC3fI/plsql-no-alter-table-constraints-e.html</link><category>PL/SQL</category><category>Banco de Dados</category><category>Oracle</category><author>noreply@blogger.com (GMotta ZN)</author><pubDate>Sun, 04 Jan 2009 21:53:58 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1939219507308718594.post-9127318832525107697</guid><description>&lt;div style="text-align: justify;"&gt;No artigo anterior demonstrei varias possibilidades de usar o camando “ALTER TABLE” no Oracle. Contudo, algumas vezes acho mais conveniente para mim definir as constraints e checks imediatamente quando estou criado a tabela. Acho que para a prática de documentação, versionamento de código/script, se toda a definição estiver no mesmo comando é mais eficiente o versionamento do script da tabela durante a evolução e manutenção do banco de dados.&lt;br /&gt;A partir do que foi &lt;a href="http://estacaozn.blogspot.com/2008/12/plsql-alter-table-variaes-sobre-o-tema.html"&gt;exemplificado no artigo anterior&lt;/a&gt;, vou definir todas as constraints e checks na criação das tabelas “ENDERECO_ZN” e “Tipo_EnderecoZN”. Veja a seguir ...&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;DROP TABLE TIPO_ENDERECOZN;&lt;br /&gt;CREATE TABLE TIPO_ENDERECOZN (&lt;br /&gt;  TIPO_ENDERECOID NUMBER(10) NOT NULL,&lt;br /&gt;  TIPO_ENDERECO VARCHAR2(100) NOT NULL,&lt;br /&gt;  DATACADASTRO DATE NOT NULL,&lt;br /&gt;  CONSTRAINT PK_TIPO_ENDEZN PRIMARY KEY (TIPO_ENDERECOID),&lt;br /&gt;  CONSTRAINT CHK_TIPO_ENDERECO CHECK (LENGTH(TIPO_ENDERECO) &gt; 5),&lt;br /&gt;  CONSTRAINT CHK_DATACADASTRO_TP CHECK (DATACADASTRO &gt; TO_DATE('31/12/2000', 'DD/MM/YYYY'))&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Na linha 1&lt;/span&gt;, primeiro excluo a tabela do banco, para em seguida recriá-la.&lt;br /&gt;a partir da linha 6 começamos a definir as constraints.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Na Lina 6&lt;/span&gt;, defino quem é a chave primária.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Na linha 7&lt;/span&gt; validação para a coluna “TIPO_ENDERECO”.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Na linha 8&lt;/span&gt; validação para a coluna “DATACADASTRO”.&lt;br /&gt;&lt;br /&gt;Agora vamos fazer o mesmo para a tabela “ENDERECO_ZN”:&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;DROP TABLE ENDERECO_ZN;&lt;br /&gt;CREATE TABLE ENDERECO_ZN&lt;br /&gt;(&lt;br /&gt; ENDERECO_ZNID    NUMBER(10) NOT NULL,&lt;br /&gt; TIPO_ENDERECOID NUMBER(10),&lt;br /&gt; LOGRADOURO       VARCHAR2(130) NOT NULL,&lt;br /&gt; COMPLEMENTO      VARCHAR2(170),&lt;br /&gt; BAIRRO           VARCHAR2(50),&lt;br /&gt; CIDADE           VARCHAR2(50),&lt;br /&gt; ESTADO           VARCHAR2(2),&lt;br /&gt; CEP              VARCHAR2(10),&lt;br /&gt; NUMERO           VARCHAR2(10),&lt;br /&gt; DATACADASTRO     DATE NOT NULL,&lt;br /&gt; CONSTRAINT PK_ENDERECOZN PRIMARY KEY (ENDERECO_ZNID),&lt;br /&gt; CONSTRAINT FK_ENDERECO_ZN_TP_END FOREIGN KEY (TIPO_ENDERECOID) REFERENCES TIPO_ENDERECOZN (TIPO_ENDERECOID),&lt;br /&gt; CONSTRAINT CHK_ESTADO CHECK (LENGTH(ESTADO) &gt; 1),&lt;br /&gt; CONSTRAINT CHK_CIDADE CHECK (LENGTH(CIDADE) &gt; 4),&lt;br /&gt; CONSTRAINT CHK_DATACADASTRO CHECK (DATACADASTRO &gt; TO_DATE('31/12/2000', 'DD/MM/YYYY'))&lt;/pre&gt;&lt;br /&gt;);&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1939219507308718594-9127318832525107697?l=estacaozn.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EstaoZn?a=BYrML6FC3fI:Nha3prEizmI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EstaoZn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EstaoZn/~4/BYrML6FC3fI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-05T02:53:58.390-03:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://estacaozn.blogspot.com/2008/12/plsql-no-alter-table-constraints-e.html</feedburner:origLink></item></channel></rss>
