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