Estação ZN_ Ajax_JSON & Delphi Technologies– Webbrocker, Intraweb (ISAPI), IWTemplateProcessorHTML Com CSS

Embed Size (px)

DESCRIPTION

54654654

Citation preview

  • sbado, 25 de abril de 2009Ajax/JSON & Delphi technologies Webbrocker,Intraweb (ISAPI), IWTemplateProcessorHTML comCSSpor GMotta ZN

    Estou com muita pressa, portanto serei o mais sucinto o possvel ...O objetivo deste artigo documentar uma soluo desenvolvida paraatender um cliente.Vamos criar um servio de consulta que dever fornecer dados paraum requisio Ajax. Para isso construiremos uma aplicao servidora(Delphi/Webbrocker) a qual acessar uma base de dados MS SQLServer (especificamente o banco de dados para exemplosNorthwind), para executarmos uma consulta parametrizada (valorque vir na requisio cliente) cujo os dados retornados serodevidamente formatados para Json (Wik) (No vou usar XML). Ouseja, como resposta a requisio mencionada, a aplicao servidoraretornar os dado que sero consumidos pelo Ajax/Json.

    No sei, ou sei muito pouco sobre o que vc esta falando,Gerson. Ento veja:Pesquisa 1Pesquisa 2Marco Cant AJax XML/DOMNeste artigo o Cant mostra como aproveitar o XMLData doTClientDataSet no DOM/XML (mto legal para delpheros).Marco Cant Artigo AjaxJson

    Em seguida, desenvolveremos o aplicativo cliente, a camada deinterface, em Delphi/Intraweb, aonde implementaremos uma funoJavascript. Nela usaremos o XMLHttpRequest do javascript de formaassncrona.

    Mos Obra, Estao ZN!

    Groove ZN byGrooveshark

    RSS Feed

    0 mais Prximoblog [email protected] Painel Sair

    Estao ZNEstamos estudando e o resultado disso postamos aqui. Sinceramente desejamos que ocontedo aqui semeado possa ser til para muitas pessoas.Seja bemvindo e fique vontade para contribuir da forma que puder e quiser.Bola pra frente ... :)

  • ServerSide development

    Inicie um projeto Webbrocker no Delphi. Menu File New Other Web Server Application.

    A tecnologia de service web que vamos usar ser API do IIS (ISAPI). NoWebModule1 adicione os componentes de acesso a dados:TADOConnetion, TADODataSet, TDataSetProvider, TClientDataSet. Noeditor de string de conexo (Edit Connection String) doADOConnection, configure a conexo com o SQL Server e em seguidaassocie os Datasets (Como Associar? veja no Estao ZN). O ComandoSQl que definiremos no ADODataSet1 ser:

    select * from Customers where CompanyName like :CompanyName

    Criando a Webbrocker Action (WebAction)

    Selecione o WebModule1, de maneira que suas propriedades sejamlistadas no Object Inspector. Crie uma Action e configure suaspropriedades conforme ilustrado abaixo:

    Blog in English GoogleTranslator version

    Busca no blog:Pesquisar

    Contedo

    Aleatrio

    Cyber Culture

    Games

    Multimdia

    Msica

    Programao

    WEB

    Colaboradores

    ralencar

    Pedro

    Felipe Guero

    Daniel Bezerra

    Bruno Lichot

    GMotta ZN

    Amigos do EstaoZN Muito obrigado!

    ParticipardestesiteGoogleFriendConnect

    Membros(41) Mais

    Arquivo do blog

    2011 (6)

    2010 (2)

    2009 (25)

  • Evento OnAction da Action ZnConsClientes:

    uses Math, StrUtils;

    procedure TWebModule1.WebModule1ZnConsClientesAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);const ZnTag = '%s:%s';var StrStatment: String; i, CodRetorno: Integer;begin with ClientDataSet1 do

    Ago (2)

    Mai (6)

    Abr (6)Controle de Verso

    "Seus problemasacabaram!"

    Ajax/JSON & DelphitechnologiesWebbrocker, Intra...

    Navegar? Pois , eupreciso ...

    O Cara o Kutiman

    Mdias na Web Aquesto depropriedadeintelectu...

    Validao de CPF eCNPJ com Javascript Delphi/In...

    Mar (5)

    Fev (2)

    Jan (4)

    2008 (80)

    2007 (125)

    tags

    .NET

    ADO

    AJAX

    Apache

    Arquitetura de Software

    ASP.NET

    Audio

    Automao OLE

    Banco de Dados

    BDS

    C#

    Componentes

  • begin Params[0].AsString := '%' + Request.QueryFields.Values['znNomeCli']+ '%'; try Open; CodRetorno := IfThen(IsEmpty, -1, 1); StrStatment := StrStatment + Format(ZnTag, ['codretornoZn', IntToStr(CodRetorno)]);

    if CodRetorno = 0 then Exit;

    for i := 0 to Pred(FieldCount) do begin StrStatment := StrStatment + ','+ Format(ZnTag, [LowerCase(ClientDataSet1.Fields[i].FieldName), IfThen((ClientDataSet1.Fields[i].AsString = ''), QuotedStr('-'), QuotedStr(ClientDataSet1.Fields[i].AsString))]); end;

    finally Close; Response.Content := Format('{%s}',[StrStatment]); end; end;end;

    Para usar as verses sobrecarregadas da funo IfTehn precisamos,para este exemplo, declarar (fazer uses das ...) as units Math eStrUtils (observe na linha 2 do trecho acima).Pronto, acabamos essa primeira parte! Antes de compilar, garantaque o ADOCOnnection esteja desconectado. Propriedade Connectedigual a false. Agora sim!!! Compile a aplicao servidora paragerar a dll a qual faremos deploy no IIS (Deploy de uma dll ISAPI).Vou criar o diretrio virtual no IIS com o nome de ajaxjsonzn.

    Aps ter tido sucesso em realizar o deploy, vamos testar.Para isso digitar no browser "http://localhost/ajaxjsonzn/?znNomeCli=Cactus" para se emocionar ao ver o que acabamos decriar.

    Veja a string retornada pela nossa aplicao servidora Webbrocker:

    {codretornoZn:1,customerid:'CACTU',companyname:'Cactus Comidas para llevar',contactname:'Patricio Simpson',

    Controle de Verso

    CSS

    Cyber Culture

    DBA

    Delphi

    Diversos

    English

    Ferramentas Case

    Flash

    HTML

    Humor

    IDE

    Internet

    Internet Explorer

    Intraweb

    Introduo a Programo

    Introduo HarmoniaFuncional

    Java

    Javascript

    JCL

    Json

    Linq

    Linux

    Literatura Delphi

    Mencoder

    Modelagem

    Mplayer

    Multimidia

    Multimdia

    Music

    MySQL

    Msica

    Navegadores

    NetBeans

    Novidades

    OLE DB

    Oracle

  • contacttitle:'Sales Agent',address:'Cerrito 333',city:'Buenos Aires',region:'-', postalcode:'1010',country:'Argentina',phone:'(1) 135-5555',fax:'(1) 135-4892'}

    ClienteSide development

    Meu querido leitor do Estao ZN, neste momento vamos comearesta segunda parte do artigo construindo uma pgina html. Hum,hhh?!?!? Como?? Mas o assunto no Delphi? Sim, o assunto gira emtorno das tecnologias para web existentes no Delphi. O que ns vamosfazer agora demonstrar tambm como o framework Intraweb podeinteragir com projetos onde as pginas web so desenvolvidas a partedo Delphi. Existem vrias situaes onde isso poder serextremamente vantajoso. Por exemplo, imagine um projeto ondeexista uma nfase grande na parte de design e por isso as pginas dosite so desenvolvidas especificamente pela equipe de designers ediante disto a equipe de desenvolvimento deve integrlas a parte delgica e persistncia desenvolvida no Delphi. Este cenrio nocontexto Delphi at bem comum, penso que sim. Portanto, antes de qualquer coisa execute seu editor preferido depginas htm e Javascript e bola pra frente. Abaixo, segue o cdigo dpagina que desenvolvi para este exemplo:

    Untitled Document

    var ZnXmlAjaxHttpObj; function ZnGetClienteWsAjx(ZnMyName) { alert('estou na funo!'); if (typeof XMLHttpRequest != "undefined"){ZnXmlAjaxHttpObj = new XMLHttpRequest();} else{ ZnXmlAjaxHttpObj = new ActiveXObject('Msxml2.XMLHTTP'); if (!ZnXmlAjaxHttpObj){ZnXmlAjaxHttpObj = new ActiveXObject('Microsoft.XMLHTTP');} } alert(ZnMyName.value); var ZnSpan = document.getElementById("IWLABEL1

    Partituras

    PHP

    PL/SQL

    POO

    RPC

    RSS

    Script

    Shell Script

    Sibelius

    Slackware

    SQL

    Subversion

    Suporte

    SVN

    Tableless

    Tortoise

    Tratamento de Excees

    Tcnicas de desenvolvimento

    UDF

    UML

    Variedades

    VB6

    VdeoGame

    WAP

    Web

    Web 2.0

    Web 3.0

    Webservice

    Windowhttp://www.blogger.com/img/blank.gifs

    Windows

    Windows API

    WML

    XML

    XSL

    Zn Ringtones

    ZN Media Player

  • "); ZnSpan.innerHTML = "Estaa Zn: Buscando dados do Cliente pelo nome fornecido: " + ZnMyName.value + " ...."; var url = "http://localhost/ajaxjsonzn/?znNomeCli="+ ZnMyName.value; ZnXmlAjaxHttpObj.open("GET", url, true); ZnXmlAjaxHttpObj.onreadystatechange = ZnDynProcessaReqBuscaCliente; ZnXmlAjaxHttpObj.send(null); } function ZnDynProcessaReqBuscaCliente() { var ZnSpan2 = document.getElementById("IWLABEL2"); var ZnElement = document.getElementById("IWEDIT1"); ZnSpan2.innerHTML = 'Processando ..................'; if (ZnSpan2.innerHTML.indexOf("buscando dados",0) >= 0){ZnSpan2.innerHTML = "Processando ...";} else {ZnSpan2.innerHTML = "buscando dados do Cliente: " + ZnElement.value + " ....";} if (ZnXmlAjaxHttpObj.readyState == 4) { if (ZnXmlAjaxHttpObj.status == 200) { processJsonEstacaoZn(ZnXmlAjaxHttpObj.responseText); } } else return false;}

    function processJsonEstacaoZn(obj1) { var ObjLandjah; eval('ObjLandjah = ' + obj1); var Aux = " customerid: "+ ObjLandjah.customerid + " contactname: "+ ObjLandjah.contactname + " contacttitle: "+ ObjLandjah.contacttitle + " companyname: "+ ObjLandjah.companyname + " country: "+ ObjLandjah.country + " CEP/postal code: " + ObjLandjah.postalcode + " Regio: " + ObjLandjah.region + " Cidade: " + ObjLandjah.city + "Logradouro: " + ObjLandjah.address + " fax: " + ObjLandjah.fax + " phone: "+ ObjLandjah.phone; alert(Aux); document.getElementById("cj").innerHTML += '- Ningum vai subir #@#@%#@%#%@ ... vai ficar todo mundo quietinho ae.'; document.getElementById("cj").innerHTML += Aux; document.getElementById("IWMEMO1").innerHTML += ' \n 100% Quatorze? '; document.getElementById("IWMEMO1").innerHTML += ' \n ************************************'; //**************************************************** var insertData = " Resultado Consulta www.estacaozn.blogspot.com:"; try { //alert('Cod Retorno: ' + ObjLandjah.codretornoZn); switch (ObjLandjah.codretornoZn * 1) { case 1:

    Links

    Willian Rodrigues

    Web 4

    Shimatai

    Pensamentos de umProfissional de TI

    Malta on Delphi

    Linguagem de Mquina

    Bruno Lichot Borland

    Atelier das Idias

    Helio Delmiro

    Beijo Partido10/09/2008

    All The Things YouAre03/09/2008

    Inai26/05/2007

    Um Novo Tempo Msica20/05/2007

    Rom Msica17/05/2007

  • document.getElementById("IWMEMO1").innerHTML += ' \n - Cavera meu Capito. '; document.getElementById("IWMEMO1").innerHTML += ' \n ************************************'; insertData += " customerid: "+ ObjLandjah.customerid + " contactname: "+ ObjLandjah.contactname + " contacttitle: "+ ObjLandjah.contacttitle + " companyname: "+ ObjLandjah.companyname + " country: "+ ObjLandjah.country + " CEP/postal code: " + ObjLandjah.postalcode + " Regio: " + ObjLandjah.region + " Cidade: " + ObjLandjah.city + "Logradouro: " + ObjLandjah.address + " fax: " + ObjLandjah.fax + " phone: " + ObjLandjah.phone; //alert("Case, estou aqui"); // Abaixo, veja como atribuir valor do JavaScript Object Notation ao IWMemo e aos IWEdits document.getElementById("IWMEMO1").innerHTML += ' \n ************************************'; document.getElementById("CEP").value = ObjLandjah.postalcode; document.getElementById("CEP").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n CEP: " + ObjLandjah.postalcode; document.getElementById("CONTACTNAME").value = ObjLandjah.contactname; document.getElementById("CONTACTNAME").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n Contato: " + ObjLandjah.contactname; document.getElementById("CONTACTTITLE").value = ObjLandjah.contacttitle; document.getElementById("CONTACTTITLE").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n Contato: " + ObjLandjah.contacttitle; document.getElementById("CIDADE").value = ObjLandjah.city; document.getElementById("CIDADE").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n Cidade: " + ObjLandjah.city; document.getElementById("BAIRRO").value = "Bla!"; document.getElementById("BAIRRO").disabled = true; document.getElementById("FAX").value = ObjLandjah.fax; document.getElementById("FAX").disabled = true; document.getElementById("IWMEMO1").innerHTML += "\n Fax: " + ObjLandjah.fax; document.getElementById("LOGRADOURO").value = ObjLandjah.address; document.getElementById("LOGRADOURO").disabled = true; document.getElementById("IWMEMO1").innerHTML += "\n Logradouro:" + ObjLandjah.address; document.getElementById("COMPANYNAME").value = ObjLandjah.companyname; document.getElementById("COMPANYNAME").disabled = true; document.getElementById("IWMEMO1").innerHTML += "\n Nome da Empresa:" + ObjLandjah.companyname; document.getElementById("COUNTRY").value = ObjLandjah.country; document.getElementById("COUNTRY").disabled = true;

  • document.getElementById("IWMEMO1").innerHTML += "\n Pais:" + ObjLandjah.country; document.getElementById("UF").value = ObjLandjah.region; document.getElementById("UF").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n Regio: " + ObjLandjah.region; document.getElementById("PHONE").value = ObjLandjah.phone; document.getElementById("PHONE").disabled = true; document.getElementById("IWMEMO1").innerHTML += " \n Tel: " + ObjLandjah.phone; document.getElementById("IWMEMO1").innerHTML += '\n ************************************'; break; case -1: insertData += "Cliente no encontrado!"; break; case -2: insertData += "Valor digitado invlido!"; break; case -3: insertData += "Ta com nojinho 02?."; break; case -4: insertData += "AH ESSA ALTURA DO CAMPEONATO VC TA SEM AH BANDOLEIRA ??!"; break; default: "PEDE PRA SAIR 01. Pede pra sair."; } } catch(Error) { insertData = " eRrO. TIRA ESSA ROUPA PRETA QUE VC NO CAVEIRA. As Landjhas de mirandjas!!!" } document.getElementById("IWLABEL2").innerHTML += insertData; document.getElementById("IWLABEL1").innerHTML += " Os senhores esto bem? Os senhores esto feridos? Algum dos senhores esto baleados? " + " Ento, no prximo post vcs vo aprender a carregar corpos!!! " document.getElementById("IWMEMO1").innerHTML += ' \n '; }

    Digite o Nome do Cliente: {%IWEdit1%} | {%IWButton1%} {%Logradouro%}{%Bairro%}{%Cidade%} {%UF%}{%CEP%} {%CompanyName%} {%ContactName%} {%ContactTitle%} {%Phone%} {%Fax%} {%Country%} {%IWLink1%} Reload Page

    {%IWLabel1%} {%IWLabel2%}

  • {%IWMEMO1%}testando!!

    Salve a pgina html (o arquivo html, referente a pgina queacabamos de criar) com o nome de ZnPageAjaxJsonIntraweb.html.

    O prximo passo, ser criar a aplicao cliente intraweb. Retornemosao Delphi ento, para iniciarmos um projeto Intraweb ISAPI. No menuFile New Other Intraweb ISAPI Application.

    Adicione no IWForm1 os seguintes componentes:

    IWTemplateProcessorHTML1: TIWTemplateProcessorHTML; IWLabel1: TIWLabel; IWEdit1: TIWEdit; IWButton1: TIWButton; IWMemo1: TIWMemo; CEP: TIWEdit; UF: TIWEdit; Bairro: TIWEdit; Logradouro: TIWEdit; Cidade: TIWEdit; IWLabel2: TIWLabel; CompanyName: TIWEdit; ContactName: TIWEdit; ContactTitle: TIWEdit;

  • Phone: TIWEdit; Fax: TIWEdit; Country: TIWEdit;

    No evento OnCreate do IWForm1 codifique conforme ilustradoabaixo:

    procedure TformMain.IWAppFormCreate(Sender: TObject);begin Self.TemplateProcessor := IWTemplateProcessorHTML1; IWTemplateProcessorHTML1.Templates.default := 'ZnPageAjaxJsonIntraweb.html'; IWLabel1.Caption := ''; IWMemo1.Font.Enabled := False; IWMemo1.Font.CSSStyle := 'AreaTexto'; CEP.Width := 80; UF.Width := 40; Cidade.Width := 120; Logradouro.Width := 180; Bairro.Width := 90; IWButton1.ExtraTagParams.Add('onClick=ZnGetCLienteWsAjax(IWEDIT1)'); IWMemo1.Lines.Add(''); IWEdit1.Text := 'Cactus Comidas para llevar';end;

    Observe na linha 7, estou atribuindo dinamicamente ao IWMemo1uma classe CSS ('AreaTexto') a qual est definida na pgina HTMLque criamos anteriormente.

    Ok, muito bem, meus amigos e minhas amigas, a parte referente aaplicao cliente termina aqui!! Isso mto bom! Agora, chegado omomento do bom e velho amigo deploy. Para isso, um build all naaplicao Intraweb (alt, p, b) bem vindo, ela ser compilada e a dllpara deploy ser gerada. So .. next step ... enjoy yourself ... O nome do diretrio virtual que vou criar ser estacaozncliente.

    No mesmo diretrio onde est a dll gerada pelo Delphi na compilaodeste projeto Intraweb, crie um diretrio onde ficar a pagina htmlque o IWTemplateProcessorHTML1 vai trabalhar. Me refiro ao arquivoda pgina que criamos anteriormente,ZnPageAjaxJsonIntraweb.html. Esse diretrio tem que se chamarTemplates, desta forma no precisamos definir nenhumaconfigurao para TemplateProcessorHTML encontrar o arquivo.

    Testando Aplicao cliente IntraWeb/ISAPI.

  • O link Reload Page coloquei para facilitar o desenvolvimento daaplicao cliente. Assim evito de ficar digitandoa url do servio todavez que houver alguma alterao, seja na aplicao servidora, sejana aplicao cliente, ou na pgina html.

    Concluso A partir da experincia realizada e documentada neste artigo,destaco as seguintes observaes:Usar a tecnologia Ajax nos seus sistemas web, sites, ou servios traz,alm de um ganho de performance, escalabilidade einteroperabilidade. Isso porque a soluo Ajax independente datecnologia que esteja sendo utilizada no clientside. Pretendo, para oprximo post documentar um exemplo da mesma soluodesenvolvida neste arquivo, sendo que a camada cliente desenvolvereiem Java com o Netbeans.O uso do JavaScript Object Notation (Json) descomplica muito adesenvolvimento de uma soluo baseada em jax. Um ponto muito importante neste artigo o emprego do componenteprocessador de templates o IWTemplateProcessorHTML. Elepermite que seu form Intraweb seja construdo em cima de umarquivo HTML criado separadamente. Dessa forma um leque depossibilidades se abre. No momento a que eu mais quero destacar que com isso possvel modularizar seu projeto colocando toda aparte de layout, disign, bem como o processamento clientside. Comisso, todo o Javascript que trabalhamos nos artigos anteriores podeser definido na pgina web. Igualzinho feito por webmasters,inclusive usando a tag src para cdigos Javascript que ficam emarquivos separados.Javascript placement: o Cdigo JavaScript pode estar fisicamentedisposto em um diretrio especfico para este fim, num arquivo .jsseparado da pgina HTML. Isso melhora inda mais a modularizao doseu sistema, site, portal, etc...O arquivo fonte do Javascript em questo referenciado na pginaHTML usando a tag script o atributo "src" com o nome do arquivo eo path definidos como valor.

  • Estive conversando com o Felipe e com o Malta sobre os exemplosanteriores que estive postando. Onde demonstrei o cdigo Javascriptdefinido como string no meio do cdigo Delphi. Essa forma deimplementar um metodologia que condeno enfaticamente nos meusprojetos. Inclusive, todos dois, tanto o Felipe, quanto o Malta,concordam e estavam me chamando a ateno sobre isso. Que oJavascript no meio do cdigo Delphi, mesmo eu organizando,atravs de constantes o caos, uma soluo macarrnica, feia,nojenta, asquerosa. Entretanto, eu fiz dessa forma nos exemplosanteriores porque acredito que assim o artigo que estou escrevendopara o Estao ZN fica menor, menos complexo, mais didtico, namedida em que eu procuro estar focado nos assuntos que pretendofalar naquele momento. Quando estou postando aqui minha nfase totalmente didtica. Entendo que para passar um conhecimentocomplexo ele deve ser simplificado, de maneira que seja reduzidatoda complexidade inerente ao problema em questo. Portanto, de agora em diante, sugiro que voc cuide para que,imperativamente, o Javascript fique separado da aplicao Delphi.Para isso temos basicamente dois caminhos a tomar: O primeiro seriausar o IWTemplateProcessorHTML. Uma segunda opo seria usarum LoadFromFile, ou seja ler dinamicamente arquivos com asfunes Javascript. Se voc optar por usar o IwTemplateProcesso,implementar desta forma, o js na pgina HTML, uma aointuitiva. Como fazer isso est demostrado neste artigo. Casonegativo, uma idia, proposta pelo Malta, que eu gostei bastante,seria do Delphi, fazer um LoadFromFile de um arquivo, ondeestaria com cdigo JavaScript parametrizado (semelhante a umparmetro de um comando SQL). A idia usar, ao invs deparmetros de FormatString (%s) uma sintaxe como nome deparmetros (:nome) e fazer substituio por pares (nome, valor).Deixeme explicar melhor:Veja num dos artigos anteriores: O Cdigo Javascript que defini notem %s para usar na funo Format? Ento, substitua todos o %spor uma sintaxe prpria, que estaramos criando, que represente onome de um parmetro. Por exemplo: ..... :par1 ... :idade ...:cidade... :idade. A exemplo de um comando SQL num TSQLQurey.Para trabalhar em conjunto, criaramos uma funo para substituir osparmetros por valores em runtime, por exemplo: functionZnReplaceParams(const znParmName, znParamValue: String). Achamada seria: ReplaceParams('idade', '18');. De cara podemoscitar como vantagens melhor legibilidade do cdigo Javascript, almde no fica dependente de posio (como o caso do Format(%s)).Dentro da funo caixa preta ZnReplaceParams, um StringReplacepode dar conta do recado, com rfReplaceAll e rfIgnoreCase. O queinclusive facilita quando voc precisa repetir o mesmo valor vriasvezes no mesmo script bastaria repetir o nome da "macro" ouparmetro. Boa Malta, Estao Zn agradece! Tks!!Uma outra abordagem seria usar argumentos na prpria funoJavascript, a qual vai estar definida num arquivo .txt, ou .js, que

  • seja, e no Delphi atribuir as definies das chamadas a essas funesnos eventos Javascript, nas propriedades ExtragParams, ouScriptEvent. Como exemplifiquei no artigo sobre validao de CIC.

    Falar sobre modularizao muito simples. Mas demonstrar, nomnimo trabalhoso. Eu prefiro inclusive demonstrar o como nofazer, para melhorar, aumentar a aderncia da explicao do sobrecomo fazer.

    Aconselho ao desenvolvedor que decidir usar o Delphi/Intraweb termuita ateno na hora de referenciar os objetos, inputs, submits,selects, criados pelo Intraweb, no que tange a caixa do nome doscontroles definidos no Delphi. Isso pq o Delphi no case sensitive,conseqentemente o desenvolvedor delphi no dever, a pricpio,estar acostumado com essa restrio. Portanto, cuidado comcomandos do tipo document.getElementById("IWMEMO1"), porquetodo componente Intraweb criado na pgina html com o nome emCAIXA ALTA. A funo getElementById sensvel a caixa. Programar em Javascript exige muita ateno a questes extraintelectuais, pois voc no vai poder contar com code insight, nemautocomplemento de cdigo (code complete) e ainda existe ooverhead de ateno na questo do case sensitive sem contar que asmensagens de erro no so to amigveis. Uma ferramenta que podeajudar neste sentido so os plugins para desenvolvimento web do FireFox. Outro ponto adverso desenvolver um script clientside compatvelcom todos os browsers. Isso exige bastante de quem estdesenvolvendo. Entretanto os bnus adquiridos em usar enfaticamenteJavascript acaba compensando todos os nus listados. Alm disso,com o tempo o desenvolvedor ganha prtica nesta abordagem e essesfatores negativos acabam perdendo sua fora. A tecnologia Json ainda bem nova, nas minhas pesquisas encontreimuito pouca gente usando. Mas pra minha surpresa um nmerorazovel de pessoas, blogs, falando sobre. Dei uma pesquisada nogoogle trends http://www.google.com/trends sobre as buscas sobreJson.

  • Abaixo, cdigo completo das units Delphi:

    Aplicao Cliente Intraweb

    unit IWUnit1;{PUBDIST}

    interface

    uses IWAppForm, IWApplication, IWTypes, IWCompMemo, IWCompButton, IWCompEdit, Controls, IWControl, IWCompLabel, Classes, IWLayoutMgr, IWTemplateProcessorHTML, IWHTMLControls;

    type TformMain = class(TIWAppForm) IWTemplateProcessorHTML1: TIWTemplateProcessorHTML; IWLabel1: TIWLabel; IWEdit1: TIWEdit; IWButton1: TIWButton; IWMemo1: TIWMemo; CEP: TIWEdit; UF: TIWEdit; Bairro: TIWEdit; Logradouro: TIWEdit; Cidade: TIWEdit; IWLabel2: TIWLabel; CompanyName: TIWEdit; ContactName: TIWEdit; ContactTitle: TIWEdit; Phone: TIWEdit; Fax: TIWEdit; Country: TIWEdit; procedure IWAppFormCreate(Sender: TObject); public end;

    implementation{$R *.dfm}

  • uses ServerController, IWForm;

    //ajaxconcorretor

    procedure TformMain.IWAppFormCreate(Sender: TObject);begin Self.TemplateProcessor := IWTemplateProcessorHTML1; IWLabel1.Caption := ''; IWMemo1.Font.Enabled := False; IWMemo1.Font.CSSStyle := 'AreaTexto'; CEP.Width := 80; UF.Width := 40; Cidade.Width := 120; Logradouro.Width := 180; Bairro.Width := 90; IWButton1.ExtraTagParams.Add('onClick=return ZnGetClienteWsAjx(IWEDIT1);'); IWMemo1.RawText := True; IWMemo1.Lines.Add(''); IWEdit1.Text := 'Cactus Comidas para llevar';end;

    end.

    Aplicao Servidora Webbrocker

    unit Unit1;

    interface

    uses SysUtils, Classes, HTTPApp, DBClient, Provider, DB, ADODB;

    type TWebModule1 = class(TWebModule) ADOConnection: TADOConnection; ADODataSet1: TADODataSet; DataSetProvider1: TDataSetProvider; ClientDataSet1: TClientDataSet; ClientDataSet1CustomerID: TWideStringField; ClientDataSet1CompanyName: TWideStringField; ClientDataSet1ContactName: TWideStringField; ClientDataSet1ContactTitle: TWideStringField; ClientDataSet1Address: TWideStringField; ClientDataSet1City: TWideStringField; ClientDataSet1Region: TWideStringField; ClientDataSet1PostalCode: TWideStringField; ClientDataSet1Country: TWideStringField; ClientDataSet1Phone: TWideStringField; ClientDataSet1Fax: TWideStringField; procedure WebModule1ZnConsClientesAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); private { Private declarations } public { Public declarations } end;

    var

  • WebModule1: TWebModule1;

    implementation

    {$R *.dfm}

    uses Math, StrUtils;

    procedure TWebModule1.WebModule1ZnConsClientesAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);const ZnTag = '%s:%s';var StrStatment: String; i, CodRetorno: Integer;begin with ClientDataSet1 do begin Params[0].AsString := '%' + Request.QueryFields.Values['znNomeCli']+ '%'; try Open; CodRetorno := IfThen(IsEmpty, -1, 1); StrStatment := StrStatment + Format(ZnTag, ['codretornoZn', IntToStr(CodRetorno)]);

    if CodRetorno = 0 then Exit;

    for i := 0 to Pred(FieldCount) do begin StrStatment := StrStatment + ','+ Format(ZnTag, [LowerCase(ClientDataSet1.Fields[i].FieldName), IfThen((ClientDataSet1.Fields[i].AsString = ''), QuotedStr('-'), QuotedStr(ClientDataSet1.Fields[i].AsString))]); end;

    finally Close; Response.Content := Format('{%s}',[StrStatment]); end; end;end;

    end.

    tags: AJAX, CSS, Delphi, Internet, Intraweb, Javascript, Json, Web

    Nenhum comentrio:

    Postar um comentrio

  • Postagem mais recente Postagem mais antiga

    Sair

    Notifiqueme

    Digiteseucomentrio...

    Comentarcomo: Alexandre(Google)

    Publicar Visualizar

    Pgina inicial

    Assinar: Postar comentrios (Atom)

    BlogBlogs.Com.Br