Você está na página 1de 78

236 Delphi 7 Internet e Banco de Dados

Captulo 12
Intraweb

A grande revoluo, e por que no dizer, a agradvel surpresa presente na nova verso do Delphi: Intraweb. Desenvolvido pela
empresa Atozed Software, e rapidamente adotado pela Borland numa distribuio especial (existe uma verso mais poderosa),
vem ganhando simpatizantes em todo o mundo. Diversas empresas esto desenvolvendo componentes para trabalhar em
conjunto com o Intraweb, dando ainda mais poder a esta incrvel tecnologia.
Desenvolver aplicaes com o Intraweb bastante agradvel e prtico e certamente vai encorajar excelentes desenvolvedores
Delphi, que antes torciam o nariz para a tecnologia WebBroker, devido s dificuldades comuns encontradas no
desenvolvimento de aplicaes para Internet, como o aprendizado de HTML, JavaScript, alguma ferramenta aliada, como o
DreamWeaver, entre outros.
Desenvolvedores Delphi, criem coragem para entrar no mundo Internet com o Intraweb. Digo isso a todos que chegaram nesse
captulo, passando pelos anteriores, ou at mesmo a quem abriu o livro aqui, neste tpico.

Algumas curiosidades
A Borland vem trabalhando com extremo profissionalismo, apoiando diversas empresas
parceiras em projetos de tecnologia para as suas ferramentas. S para ter uma idia disso
tudo, incorporou na verso 7 diversas tecnologias, como o prprio Intraweb, Rave Report
(fantstico gerador de relatrios, e forte substituto do QuickReport), RxLib agora vem no
CD 2, Indy Components, j visto no captulo 9, entre outras tecnologias. Se a tecnologia
boa, pode ter certeza de que ser adotada nas prximas verses, e isso vem crescendo a
cada dia. Sorte nossa!
Antes de colocar a mo-na-massa, vou apresentar seus principais componentes:
Os componentes esto divididos em quatro sees: IWStandard, IWData,
IWClientSide e IWControl.

236

Intraweb 237

Componentes IWStandard
COMPONENTE

TIWApplet
TIWButton
TIWCheckBox
TIWComboBox
TIWEdit

TIIWHRule
TIWImage
TIWImageFile
TIWLabel
TIWLink
TIWList
TIWListBox

TIWMemo
TIWMenu

TIWRadioGroup
TIWTable

DESCRIO/USO

Para inserir uma Applet Java em sua


pgina, oferecendo a configurao dos
controles atravs do Object Inspector.
Boto de formulrio, com funes
adversas, inclusive Submit.
Controles de CheckBox para formulrio.
ComboBox para seleo, com opes
de preenchimento de lista.
Campo para edio com diversas
propriedades de controle, como
tamanho, se requerido, tipo password,
entre outras.
Linha horizontal.
Para exibio de imagens estticas ou
dinmicas. Transforma automaticamente
a maioria dos formatos para JPEG.
Utilizado para exibir imagens estticas,
armazenadas num arquivo.
Semelhante ao Label do Delphi.
Cria um hyperlink, controlado atravs do
evento OnClick.
Utilizado para apresentar listas de
marcao ou numeradas.
Lista de opes que podem ser
selecionadas. Possui um forte controle
de propriedades.
rea de edio (assim como o Delphi),
com mltiplas linhas.
Componente fantstico, que cria um
menu a partir de um componente
TMainMenu do Delphi. Muito bom
mesmo. Agora suas aplicaes Web
tero um aspecto mais profissional.
Conjunto de opes ao usurio,
semelhante ao RadioGroup do Delphi.
Amigos, fiquei impressionado com o
poder deste componente. Semelhante
ao StringGrid, com opo individual de
controle de clulas. Muito bom mesmo.

238 Delphi 7 Internet e Banco de Dados

COMPONENTE

TIWTemplateProcessorHTML
TIWText
TIWTimer
TIWTreeView
TIWURL
TIWFile

TIWGrid
TIWRectangle
TIWRegion

DESCRIO/USO

Este componente permite associar um


template HTML ao nosso formulrio.
Apresenta textos com mltiplas linhas,
sem suporte edio.
Cria um Timer no lado servidor para
disparar eventos.
Apresenta um TreeView com diversos
controles. Muito bom.
Hyperlinks externos.
Este componente quebra um galho
incrvel. Quem j tentou fazer rotinas de
upload com a tecnologia WebBroker
sabe do que estou falando. Era muito
difcil, mas agora ficou muito fcil com
este componente.
Grid sem vnculo com banco de dados.
Apresenta figuras retangulares, com
diversas opes de preenchimento.
Amigos, fiquei de boca aberta com os
recursos deste componente. Tem a
funo de um container, como o Panel
do Delphi. Fantstico!

Componentes IWData
COMPONENTE

TIWDBCheckbox
TIWDBCombobox

TIWDBEdit
TIWDBGrid
TIWDBImage
TIWDBLabel
TIWDBListbox

DESCRIO/USO

CheckBox Data Ware, com diversas


opes de configurao.
ComboBox Data Ware, com incrveis
propriedades, como tipo do cursor,
ordenao, controle de scripts, entre
outros.
DBEdit Data Ware, com todos os
eventos do HTML, alm de propriedades
controladas pelo JavaScript.
DBGrid muito bacana e funcional, com
diversos controles e eventos.
DBImage Data Ware.
DBLabel Data Ware.
DBListBox com diversos controles e
propriedades.

Intraweb 239

COMPONENTE

TIWDBLookupCombobox

TIWDBLookupListbox
TIWDBMemo
TIWDBNavigator

TIWDBText
TIWDBFile

DESCRIO/USO

Fantstico componente semelhante ao


DBLookupComboBox do Delphi. Quem
j desenvolveu aplicaes padro
WebBroker sabe o enorme trabalho que
d para fazer um LookupComboBox.
Outra maravilha, semelhante ao
DBLookupListBox do Delphi.
DBMemo com diversos controles e
propriedades.
Amigos, este componente incrvel, tem
todos os controles do DBNavigator do
Delphi e possui controle de mensagens
de diversos nveis. Voc poder
configurar a prpria mensagem de
confirmao para excluso. Muito bom.
Nota 10.
Semelhante ao DBText.
Utilizado para associar um campo do
tipo stream com a funo de uploads de
arquivo.

Componentes IWClientSide
COMPONENTE

TIWCSLabel
TIWCSNavigator

TIWDynamicChart

TIWDynamicChartLegend
TIWDynGrid

DESCRIO/USO

Apresentao de campos de uma tabela


do lado cliente (veja controles
IWControl).
Controle de Navegao dos dados de
uma tabela do lado Cliente. Imagine
voc acessando uma tabela prconfigurada no lado cliente, e
navegando vontade.
Grfico com diversas opes, baseados
em dados do lado cliente embora seja
possvel alimentar com os dados do lado
Servidor, pois no existe vnculo com
DataWare, e sim com um
IWClientDataSet (IW Control).
Legendas do grfico, para ser utilizado
em conjunto com o TIWDynamicChart.
Grid ligado ao IWClientDataSet (IW
Control).

240 Delphi 7 Internet e Banco de Dados

Componentes IWControl
COMPONENTE

TIWClientSideDataSet
TIWClientSideDataSetDBLink

TIWLayoutMgrForm
TIWLayoutMgrHTML

TIWModuleController
TIWPageProducer

TIWStandAloneServer

DESCRIO/USO

Controle DataSet para armazenar


informaes e disponibilizar aos
controles IWClientSide.
Controle DataSet no padro DataWare,
onde voc dever ligar diretamente a
um DataSource. Isso muito legal, pois
o DataSource poder coletar dados de
diversas origens.
Controle de layout dos objetos de um
formulrio.
Permite a edio do formulrio no
padro HTML. Quer dar o seu toque
pessoal? Ento este o componente
certo.
Habilita o controle do servidor para o
padro PageMode do Intraweb.
Com este componente voc poder
utilizar toda a tecnologia Intraweb com
WebSnap, e tambm aproveitar a
tecnologia dos Page Producers do
WebBroker.
Controle da aparncia e outras
propriedades da aplicao.

Antes de Comear
Este tpico muito importante, pois precisamos conhecer alguns conceitos do Intraweb.
Na verso distribuda com o Delphi 7, o Intraweb coloca automaticamente o nome das units iniciais bem como do projeto. Isso
pode dificultar um pouco no comeo, mas em nosso caso iremos criar uma estrutura de diretrios com o intuito de organizar
nossos exerccios com o Intraweb, e evitar conflitos.
Crie a seguinte estrutura de diretrios (diagrama 12.1)

Intraweb 241

C:\CursoWeb
Intraweb

exercicio1
exercicio2
exerccio3
exerccio4
exerccio5
exerccio6
clientes
Diagrama 12.1

Primeiro Exemplo (controles Standard)


Vamos desenvolver nossa primeira aplicao, utilizando alguns componentes da seo IWStandard. Vamos escolher o padro
Stand Alone para facilitar a compreenso e o desenvolvimento.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application (figura 12.1).

Figura 12.1 Escolha do tipo da Aplicao


Em seguida, selecione o diretrio de nossa primeira aplicao, em nosso caso (c:\cursoweb\intraweb\exercicio1).

242 Delphi 7 Internet e Banco de Dados

Figura 12.2 Seleo do diretrio


Perceba que o Intraweb criou um mdulo principal, com alguns controles (figuras 12.3 e 12.4).

Figura 12.3 Mdulo do Projeto

Figura 12.4 Formulrios padro da aplicao Stand Alone


O Intraweb cria a seguinte estrutura de arquivos para o tipo de aplicao Stand Alone:

Intraweb 243
!"
!"
!"

IWProject.DPR
IWUnit1.PAS
ServerController.PAS

Projeto
Unit principal, contendo o formulrio principal da aplicao
Controle principal da aplicao, com sesses de usurio, tipo de acesso,
protocolos de segurana (SSL), browsers, entre outros.

Agora com o foco no formulrio (selecione o formulrio da unit IWUnit1), insira um componente do tipo IWLabel e altere sua
propriedade caption para Exerccio 1. A figura 12.5 ilustra o formulrio principal com o objeto IWLabel1.

Figura 12.5 Formulrio principal


Agora, meus amigos, para quem estava com saudades do famoso F9 para executar e depurar as aplicaes, o Intraweb retorna
aos bons tempos e habilita esta opo. Aperte F9 para executar nosso primeiro exerccio. Dever aparecer o servidor de
testes do Intraweb, como ilustra a figura 12.6.

Figura 12.6 Servidor de Aplicaes Intraweb


Repare que no existe nenhuma sesso ativa (Active Sessions). Para executar nossa aplicao, voc poder teclar novamente
F9, ou pressionar o primeiro speed button, ou ento acessar o menu File/Run.. A figura 12.7 ilustra o resultado do nosso
primeiro exerccio.

244 Delphi 7 Internet e Banco de Dados

Figura 12.7 Resultado do primeiro exerccio


Tente pressionar F9 algumas vezes no Intraweb Server Application, e repare que so criadas novas sesses (figura 12.8).

Figura 12.8 Sesses ativas


O mais interessante de tudo isso, que o Intraweb possui um forte controle de sesses. Repare na figura 12.9 que o Intraweb
utiliza um nmero extenso, definindo a sesso do usurio. Este controle bastante robusto e facilita muito a vida do
desenvolvedor no controle de sesses.

Figura 12.9 Controle de sesses


Encerre o servidor de aplicaes, e retorne ao Delphi.
Vejamos agora, todo o cdigo criado pelo Intraweb em nossa primeira aplicao.

Listagem 12.1 Unit IWUnit1.


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl,
IWCompLabel;
type

Intraweb 245
TformMain = class(TIWAppForm)
IWLabel1: TIWLabel;
public
end;
implementation
{$R *.dfm}
uses
ServerController;
end.
Basicamente define a classe TformMain com o objeto IWLabel1.
Para analisar mais profundamente nosso primeiro exerccio, clique com o boto direito do mouse no formulrio principal e
selecione a opo Preview. A figura 12.10 ilustra o Preview do Intraweb.

Figura 12.10 Preview do Intraweb


muito interessante essa versatilidade do Intraweb. Agora, selecione a seo Source logo abaixo do Preview e repare o cdigo
HTML gerado, inclusive com CSS (figura 12.11).

Figura 12.11 Cdigo HTML


Como o cdigo dinmico, o modelo gerado e visto na figura 12.11 apropriado para o modelo de servidor IntraWeb Server
Application, no modo Preview. Veja a verso HTML gerada fora do Preview, mas ainda no servidor Intraweb.

246 Delphi 7 Internet e Banco de Dados

Listagem 12.2 HTML


<html><head>
<style type="text/css">
.IWLABEL1CSS {position:absolute;left:136;top:112;z-index:100;font: 10pt;}
</style>
<script language="Javascript1.2">
function FormDefaultSubmit()
{return false;}
function Validate() {return true;}
var GURLBase="";
var GAppID="08A197007D9506F23B52E240";
history.go(1);
var IWLABEL1IWCL;
function InitIWCLObjects() {
IWLABEL1IWCL = new CreateIWCLObject(IWCLForm, "IWLABEL1", "IWLABEL1IWCL");
if (IWLABEL1IWCL.Item != null) {
IWLABEL1IWCL.SetAlign(alNone);
IWLABEL1IWCL.SetAnchors(new CreateAnchors(true, false, true, false));
}
Body_OnResize();
}
function Initialize() {
InitSubmitter();
StaticInit();
if (document.body.leftMargin < 0 && document.body.topMargin < 0) {
document.body.leftMargin = 0;
document.body.topMargin = 0;
}
InitRects(349, 296);
InitIWCLObjects();
}
</script>
<meta name="GENERATOR" content="IW5.0.43 Serial 0">
<script language=Javascript src="/js/IWCommon.js_5.0.43"></script>
<script language=Javascript src="/js/IWCL.js_5.0.43"></script>
<script language=Javascript src="/js/IWCSData.js_5.0.43"></script>
<script language=Javascript src="/js/IWExplorer.js_5.0.43"></script>
</head>
<body onload="Initialize()" onblur="GSubmitting = false;" onresize="return
Body_OnResize();"><form onsubmit="return FormDefaultSubmit();" name="SubmitForm"
action="/EXEC/1/08A197007D9506F23B52E240" method="POST">
<input type="HIDDEN" name="IW_Action">
<input type="HIDDEN" name="IW_ActionParam">
</form>

Intraweb 247
<span id="IWLABEL1" class="IWLABEL1CSS">IWLabel1</span>
</body>
</html>
Complicado, no acham? Podem ficar tranqilos, pois dificilmente teremos que dar manuteno no cdigo HTML. A idia
justamente essa, utilizar o RAD (Rapid Application Development) do Intraweb para criar e dar manuteno s nossas
aplicaes.
S para finalizar a parte de cdigos deste tpico, vamos analisar a unit ServerController.

Listagem 12.3 Unit ServerController


unit ServerController;
{PUBDIST}
interface
uses
SysUtils, Classes, IWServerControllerBase,
// For OnNewSession Event
IWApplication, IWAppForm;
type
TIWServerController = class(TIWServerControllerBase)
procedure IWServerControllerBaseNewSession(ASession: TIWApplication;
var VMainForm: TIWAppForm);
private
public
end;
// This is a class which you can add variables to that are specific to the user.
Add variables
// to this class instead of creating global variables. This object can references
by using:
//
UserSession
// So if a variable named UserName of type string is added, it can be referenced by
using:
//
UserSession.UserName
// Such variables are similar to globals in a normal application, however these
variables are
// specific to each user.
//
// See the IntraWeb Manual for more details.
TUserSession = class
public
end;
// Procs
function UserSession: TUserSession;
implementation
{$R *.dfm}
uses
IWInit;

248 Delphi 7 Internet e Banco de Dados


function UserSession: TUserSession;
begin
Result := TUserSession(RWebApplication.Data);
end;
procedure TIWServerController.IWServerControllerBaseNewSession(
ASession: TIWApplication; var VMainForm: TIWAppForm);
begin
ASession.Data := TUserSession.Create;
end;
end.
Amigos, analisando o cdigo da unit ServerController, podemos perceber a flexibilidade no controle de sesses por usurio.
possvel criar variveis similares s globais, mas com instncias por sesso, ou seja, cada usurio ter a sua prpria varivel.
Eu explico melhor.Vamos imaginar uma varivel que totaliza o valor da compra, ou at mesmo uma matriz, contendo diversas
informaes sobre a compra atual, e poder acessar em nvel de usurio, ou melhor, por sesso, cada varivel. Veja o cenrio:
Usurio
1
Sesso 08A197007D9506F23B52E240
Valor 300
Usurio
2
Sesso E4949A0062C7BBC23C52E240
Valor 180
Usurio
3
Sesso D0679B0010B757C63C52E240
Valor 180
Repare que cada sesso possui uma identificao diferente. Imagine quando o usurio solicitar a finalizao da compra, onde
necessrio apresentar o resumo e o valor total. Com o Intraweb extremamente simples; basta acessar o contedo das variveis
definidas no ServerController. Mas como ele faz isso? Uma mistura de cookies com persistncia.
Com isso conclumos nosso primeiro exerccio e conhecemos alguns conceitos do Intraweb.

Segundo Exemplo (controles Standard 2. parte)


Vamos aproveitar o embalo do primeiro exemplo e conhecer alguns componentes do IW Standard.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application (figura 12.12).

Intraweb 249

Figura 12.12 Escolha do tipo da Aplicao


Em seguida, selecione o diretrio de nossa segunda aplicao, em nosso caso (c:\cursoweb\intraweb\exercicio2). Grave toda a
aplicao, e insira os componentes que seguem:

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Segundo Exemplo
120
16

OBJETO
TIWEdit
Objeto
edNome

Propriedade
Name
Left
MaxLength
Top
Width

Valor
edNome
72
30
56
225

250 Delphi 7 Internet e Banco de Dados

OBJETO
TIWButton
Objeto
btConfirma

Propriedade
Name
Caption
Left
Top

Valor
btConfirma
Confirma
136
104

OBJETO
TIWLabel
Objeto
lbMensagem

Propriedade
Name
Caption
Left
Top
Visible

Valor
lbMensagem
deixe em branco
24
152
False

A figura 12.13 ilustra nosso formulrio.

Figura 12.13 Formulrio segundo exemplo


Agora vamos codificar um pouco. Selecione o objeto btConfirma (boto) e insira o cdigo que segue, no evento OnClick.
lbMensagem.Caption:='Seja bem vindo(a) '+edNome.Text;
lbMensagem.Visible:=True;
O mais interessante de tudo isso, que estamos colocando cdigo Object Pascal puro, ou melhor, Delphi Language como
chamado agora.

Intraweb 251
Execute a aplicao, e seguindo o mesmo procedimento do primeiro exemplo, no Intraweb Server Application, pressione
novamente a tecla F9. A figura 12.14 ilustra o resultado do nosso segundo exemplo.

Figura 12.14 Resultado segundo exemplo.


Muito fcil, no ?

Listagem 12.4 Unit IWUnit1 (segundo exemplo)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompEdit, Classes, Controls,
IWControl, IWCompLabel, IWCompButton;
type
TformMain = class(TIWAppForm)
IWLabel1: TIWLabel;
edNome: TIWEdit;
btConfirma: TIWButton;
lbMensagem: TIWLabel;
procedure btConfirmaClick(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController;
procedure TformMain.btConfirmaClick(Sender: TObject);
begin
lbMensagem.Caption:='Seja bem vindo(a) '+edNome.Text;
lbMensagem.Visible:=true;
end;
end.

252 Delphi 7 Internet e Banco de Dados

Terceiro Exemplo (controles Standard 3. parte)


Agora que sabemos que o Intraweb trabalha com Delphi Language pura, vamos abusar um pouco da programao.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application (figura 12.15).

Figura 12.15 Escolha do tipo da Aplicao


Em seguida, selecione o diretrio de nossa segunda aplicao, em nosso caso (c:\cursoweb\intraweb\exercicio3). Insira a unit
SysUtils, na clusula uses da aplicao, para que possamos fazer algumas operaes. Grave toda a aplicao, e insira os
componentes que seguem:

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Terceiro Exemplo
112
16

OBJETO
TIWHRule
Objeto
IWHRule1

Propriedade
Left
Top
Width

Valor
56
40
225

Intraweb 253

OBJETO
TIWLabel
Objeto
IWLabel2

Propriedade
Name
Caption
Left
Top

Valor
IWLabel2
Insira dois nmeros e
selecione a operao
56
56

OBJETO
TIWEdit
Objeto
edN1

Propriedade
Name
Left
Text
Top

Valor
edN1
56
(deixe em branco)
80

OBJETO
TIWEdit
Objeto
edN2

Propriedade
Name
Left
Text
Top

Valor
edN2
56
(deixe em branco)
112

OBJETO
TIWHRule
Objeto
IWHRule1

Propriedade
Left
Top
Width

Valor
56
144
73

254 Delphi 7 Internet e Banco de Dados

OBJETO
TIWEdit
Objeto
edTotal

Propriedade
Name
Left
Text
Top

Valor
edTotal
56
(deixe em branco)
152

OBJETO
TIWButton
Objeto
btAdicao

importante >>>

Propriedade
Name
Caption
Left
Tag
Width

Valor
btAdicao
+
144
1
25

OBJETO
TIWButton
Objeto
btSubtracao

importante >>>

Propriedade
Name
Caption
Left
Tag
Width

Valor
btSubtracao
176
2
25

OBJETO
TIWButton
Objeto
btMultiplicacao

importante >>>

Propriedade
Name
Caption
Left
Tag
Width

Valor
btMultiplicacao
x
208
3
25

Intraweb 255

OBJETO
TIWButton
Objeto
btDivisao

importante >>>

Propriedade
Name
Caption
Left
Tag
Width

Valor
btDivisao
:
240
4
25

A figura 12.16 ilustra nosso formulrio.

Figura 12.16 Formulrio terceiro exemplo


Agora vamos codificar o boto btAdicao. No evento OnClick do boto, insira o cdigo que segue:
var
n1,n2,total:single;
operacao:integer;
begin
try
n1:=StrtoFloat(edN1.Text);
n2:=StrtoFloat(edN2.Text);
total:=0;
operacao:=(Sender as TIWButton).Tag;
case operacao of
1:total:=n1+n2;
2:total:=n1-n2;
3:total:=n1*n2;
4:total:=n1/n2;
end;

256 Delphi 7 Internet e Banco de Dados


edTotal.Text:=FloatToStr(total);
except
on EZeroDivide do WebApplication.ShowMessage('Diviso por zero !');
on EOverFlow do WebApplication.ShowMessage('Aconteceu OverFlow !');
//
end;
Antes de analisar o cdigo, selecione os demais botes e associe o cdigo do evento OnClick, como ilustra a figura 12.17.

Figura 12.17 Associao do evento OnClick aos demais botes.


Vamos analisar o cdigo.
var
n1,n2,total:single;
operacao:integer;
Neste primeiro bloco estamos declarando variveis para execuo da operao matemtica (n1, n2 e total), bem como uma
varivel auxiliar (operao) com o intuito de associar o boto que est chamando o evento. Em cada boto, definimos valores
diferentes para a propriedade TAG, que ser facilmente assimilada por nossa aplicao.
try
n1:=StrtoFloat(edN1.Text);
n2:=StrtoFloat(edN2.Text);
total:=0;
operacao:=(Sender as TIWButton).Tag;
Em seguida, iniciamos um bloco protegido (try) e convertemos o contedo dos campos de edio edN1 e edN2, para o tipo
float. Neste mesmo bloco estamos iniciando a varivel total e atribuindo varivel operacao, o valor contido na propriedade
TAG de um objeto do tipo TIWButton, que em nosso caso, so representadas pelos botes btAdicao, btSubtracao,
btMultiplicacao e btDivisao.
case operacao of
1:total:=n1+n2;
2:total:=n1-n2;
3:total:=n1*n2;
4:total:=n1/n2;
end;
Neste bloco, fazemos as devidas operaes de acordo com o boto pressionado.
edTotal.Text:=FloatToStr(total);

Intraweb 257
Em seguida, atribumos ao objeto edTotal o resultado da operao.
except
on EZeroDivide do WebApplication.ShowMessage('Diviso por zero !');
on EOverFlow do WebApplication.ShowMessage('Aconteceu OverFlow !');
//
end;
Por fim, tratamos duas excees: EZeroDivide (diviso por zero), e EOverFlow (Overflow na operao). Repare que em caso
de erro, estamos apresentando mensagens ao usurio. muito parecido com o famoso Application.ShowMessage. Neste caso,
utilizamos o WebApplication.ShowMessage. As figuras 12.18, 12.19 e 12.20 ilustram nossa aplicao em tempo de execuo.

Figura 12.18 Operao de adio


A figura 12.18 ilustra o sucesso da operao de adio.
Em seguida temos nossa primeira mensagem de erro. A figura 12.19 ilustra um erro de diviso por zero.

Figura 12.19 Diviso por zero


Em seguida temos um erro de OverFlow (figura 12.20).

258 Delphi 7 Internet e Banco de Dados

Figura 12.20 Overflow

Listagem 12.5 Unit IWUnit1.pas (exemplo 3)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWHTMLControls, Classes, Controls,
IWControl, IWCompLabel, IWCompEdit, IWCompButton, SysUtils;
type
TformMain = class(TIWAppForm)
IWLabel1: TIWLabel;
IWHRule1: TIWHRule;
edN1: TIWEdit;
edN2: TIWEdit;
btAdicao: TIWButton;
btSubtracao: TIWButton;
btMultiplicacao: TIWButton;
btDivisao: TIWButton;
IWLabel2: TIWLabel;
edTotal: TIWEdit;
IWHRule2: TIWHRule;
procedure btAdicaoClick(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController;
procedure TformMain.btAdicaoClick(Sender: TObject);
var
n1,n2,total:single;
operacao:integer;

Intraweb 259

begin
try
n1:=StrtoFloat(edN1.Text);
n2:=StrtoFloat(edN2.Text);
total:=0;
operacao:=(Sender as TIWButton).Tag;
case operacao of
1:total:=n1+n2;
2:total:=n1-n2;
3:total:=n1*n2;
4:total:=n1/n2;
end;
edTotal.Text:=FloatToStr(total);
except
on EZeroDivide do WebApplication.ShowMessage('Diviso por zero !');
on EOverFlow do WebApplication.ShowMessage('Aconteceu OverFlow !');
//
end;
end;
end.

Quarto Exemplo (controles Standard 4. parte)


No quarto exemplo, vamos desenvolver uma rotina para uploads de arquivos. Como disse anteriormente, este processo era
muito trabalhoso com o Web-Broker e agora ficou muito mais fcil. Com pouqussimas linhas de cdigo, na realidade apenas
uma linha faz o servio, mas em nosso caso faremos um tratamento de erro. Vamos desenvolver tal rotina.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application (figura 12.21).

Figura 12.21 Escolha do tipo da Aplicao


Em seguida, selecione o diretrio de nossa segunda aplicao, em nosso caso (c:\cursoweb\intraweb\exercicio4). Grave toda a
aplicao, e insira os componentes que seguem:

260 Delphi 7 Internet e Banco de Dados

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Quarto Exemplo
112
16

OBJETO
TIWLabel
Objeto
IWLabel2

Propriedade
Name
Caption
Left
Top

Valor
IWLabel2
Selecione o arquivo para
UpLoad
32
48

OBJETO
TIWLabel
Objeto
lbMensagem

Propriedade
Name
Caption
Left
Top
Font.Color

Valor
lbMensagem
Mensagem
32
168
clRed

OBJETO
TIWFile1
Objeto
IWFile1

Propriedade
Name
Left
Top
Width

Valor
IWFile1
32
72
200

Intraweb 261

OBJETO
TIWButton1
Objeto
IWButton1

Propriedade
Name
Caption
Left
Top
Width

Valor
IWButton1
UpLoad
32
104
75

A figura 12.22 ilustra o nosso formulrio.

Figura 12.22 Formulrio para UpLoad


Agora vamos codificar a rotina de UpLoad. No evento OnClick do objeto IWButton1, coloque o cdigo que segue:
try
IWFile1.SaveToFile(ExtractFilePath(ParamStr(0)) + IWFile1.FileName);
lbMensagem.Caption:='O arquivo'+IWFile1.Filename+' foi gravado no diretrio
'+#13#10+ ExtractFilePath(ParamStr(0))+' com xito';
lbMensagem.Visible := True;
except
lbMensagem.Caption:='Houve um problema com a rotina de UPLOAD';
lbMensagem.Visible := True;
end;
Amigos, a linha em negrito (IWFile1,SaveToFile...), a nica linha necessria para fazer o UpLoad do arquivo. Em nosso
caso estamos fazendo uma rotina de tratamento de erros e exibindo a mensagem do resultado da operao. Caso seja bem
sucedida, apresenta o nome do arquivo e em qual diretrio foi gravado no servidor. Em caso de erro, apresenta apenas uma
mensagem : Houve um problema....
A figura 12.23 ilustra nossa aplicao sendo executada.

262 Delphi 7 Internet e Banco de Dados

Figura 12.23 Arquivo sendo gravado no diretrio da aplicao.


muito fcil, no ?

Dica
Voc poder configurar o diretrio que receber os arquivos. Normalmente numa Intranet,
existe um servidor de arquivos, onde sua aplicao poder gravar as informaes
provenientes da rotina de UpLoad. Veja o exemplo:

IWFile1.SaveToFile(F:\arquivos\+ IWFile1.FileName);

Listagem 12.6 IWUnit1.pas (Quarto Exemplo)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl,
IWCompLabel, IWCompEdit, SysUtils, IWCompButton;
type
TformMain = class(TIWAppForm)
IWLabel1: TIWLabel;
IWFile1: TIWFile;
IWLabel2: TIWLabel;
lbMensagem: TIWLabel;
IWButton1: TIWButton;
procedure IWButton1Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}

Intraweb 263
uses
ServerController;
procedure TformMain.IWButton1Click(Sender: TObject);
begin
try
IWFIle1.SaveToFile(ExtractFilePath(ParamStr(0)) + IWFile1.FileName);
lbMensagem.Caption:='O arquivo'+IWFile1.Filename+' foi gravado no diretrio
'+#13#10+ ExtractFilePath(ParamStr(0))+' com xito';
lbMensagem.Visible := True;
except
lbMensagem.Caption:='Houve um problema com a rotina de UPLOAD';
lbMensagem.Visible := True;
end;
end;
end.

Quinto Exemplo (controles Standard 5. parte)


No quinto exemplo, vamos aprender a trabalhar com mltiplos formulrios. O conceito bem parecido com as aplicaes
desktop, com criao e destruio de formulrios dinamicamente. Atravs das opes File/New/Other..., selecione a seo
Intraweb e escolha o modelo Stand Alone Application (figura 12.24).

Figura 12.24 Escolha do tipo da Aplicao


Em seguida, selecione o diretrio de nossa segunda aplicao, em nosso caso (c:\cursoweb\intraweb\exercicio5). Grave toda a
aplicao, e insira os componentes que seguem:

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Quinto Exemplo
112
16

264 Delphi 7 Internet e Banco de Dados

OBJETO
TIWButton
Objeto
IWButton1

Propriedade
Name
Caption
Left
Top
Width

Valor
IWButton1
Formulrio 2
120
56
115

OBJETO
TIWButton
Objeto
IWButton2

Propriedade
Name
Caption
Left
Top
Width

Valor
IWButton2
Formulrio 3
225
124
115

OBJETO
TIWEdit1
Objeto
edNome

Propriedade
Name
Left
Text
Top
Width

Valor
edNome
40
(deixe em branco)
126
175

Agora vamos criar um segundo formulrio. Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o
modelo Application Form (figura 12.25).

Intraweb 265

Figura 12.25 Criando um novo formulrio


Altere a propriedade Name do formulrio para Form2. Grave a unit com o nome un_formulrio2. Insira os componentes que
seguem no Form2.

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Formulrio 2
136
36

OBJETO
TIWButton
Objeto
IWButton1

Propriedade
Name
Caption
Left
Top
Width

Valor
IWButton1
Fecha
136
96
75

Vamos codificar este formulrio. No evento OnClick do objeto IWButton1, insira o seguinte cdigo
Hide;
No cdigo que acabamos de inserir, estamos escondendo o formulrio, e retornando origem. Para entender o
funcionamento, vamos codificar o nosso formulrio principal.

266 Delphi 7 Internet e Banco de Dados


Insira a unit un_formulario2 na clusula uses do formulrio principal. Agora vamos codificar o evento OnClick do objeto
IWButton1 do formulrio principal.
var
Form2:TForm2;
begin
Form2 := TForm2.Create(WebApplication);
Form2.Show;
end;
Estamos fazendo uma operao bastante simples. Primeiro declaramos uma varivel do tipo TForm2 (classe herdada da
TForm2 que est contida na unit un_formulario2).
var
Form2:TForm2;
Em seguida instanciamos o objeto.
Form2 := TForm2.Create(WebApplication);
E por fim, apresentamos o objeto.
Form2.Show;
As figuras 12.26 e 12.27 ilustram nossos dois primeiros formulrios.

Figura 12.26 Formulrio principal.

Intraweb 267

Figura 12.27 Formulrio 2


Vamos dar uma olhadinha no resultado desta primeira parte de nossa aplicao. Execute a aplicao e clique no boto que
representa a chamada do primeiro formulrio. As figuras 12.28 e 12.29 ilustram o resultado da primeira parte de nossa
aplicao.

Figura 12.28 Formulrio principal em ao

Figura 12.29 Formulrio 2 chamado atravs do formulrio principal

268 Delphi 7 Internet e Banco de Dados


Agora vamos criar a segunda parte de nossa aplicao, fazendo uma interatividade entre os formulrios. Atravs das opes
File/New/Other..., selecione a seo Intraweb e escolha o modelo Application Form (figura 12.30).

Figura 12.30 Criando um novo formulrio


Altere a propriedade Name do formulrio para Form3. Grave a unit com o nome un_formulrio3. Insira os componentes que
seguem no Form3.

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Formulrio 3
136
36

OBJETO
TIWLabel
Objeto
lbMensagem

Propriedade
Name
Caption
Left
Top

Valor
lbMensagem
Mensagem
32
72

Intraweb 269

OBJETO
TIWButton
Objeto
IWButton1

Propriedade
Name
Caption
Left
Top
Width

Valor
IWButton1
Fecha
128
120
75

Vamos codificar este formulrio. No evento OnClick do objeto IWButton1, insira o seguinte cdigo
Hide;
Voltando ao formulrio principal, coloque a unit un_formulario3 na clusula uses. Vamos codificar o boto IWButton2 do
formulrio principal. Coloque o cdigo que segue no evento OnClick do boto.
var
Form3:TForm3;
begin
Form3 := TForm3.Create(WebApplication);
Form3.lbMensagem.Caption:=edNome.Text+', seja bem-vindo(a)';
Form3.Show;
end;
Assim como na primeira fase da aplicao, declaramos uma varivel do tipo TForm3 (classe herdada da TForm3 que est
contida na unit un_formulario3).
var
Form3:TForm3;
Em seguida instanciamos o objeto.
Form3 := TForm3.Create(WebApplication);
E agora, que temos o controle total do objeto, estamos alterando a propriedade Caption do objeto lbMensagem.
Form3.lbMensagem.Caption:=edNome.Text+', seja bem-vindo(a)';
E por fim, apresentamos o objeto.
Form3.Show;
As figuras 12.31 e 12.32 ilustram o resultado da segunda fase de nossa aplicao.

270 Delphi 7 Internet e Banco de Dados

Figura 12.31 Formulrio principal fazendo a chamada ao formulrio 3

Figura 12.32 Formulrio 3 em ao


Este exemplo, embora bastante simples, demonstra a interatividade entre formulrios. Bastante comum em aplicaes Internet,
tenho certeza que utilizaro muito este conceito.

Listagem 12.7 IWUnit1.pas (Quinto Exemplo, Form Principal)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompEdit, IWCompLabel, Classes,
Controls, IWControl, IWCompButton;
type
TformMain = class(TIWAppForm)
IWButton1: TIWButton;

Intraweb 271
IWLabel1: TIWLabel;
edNome: TIWEdit;
IWLabel2: TIWLabel;
IWButton2: TIWButton;
procedure IWButton1Click(Sender: TObject);
procedure IWButton2Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController, un_formulario2, un_formulario3;
procedure TformMain.IWButton1Click(Sender: TObject);
var
Form2:TForm2;
begin
Form2 := TForm2.Create(WebApplication);
Form2.Show;
end;
procedure TformMain.IWButton2Click(Sender: TObject);
var
Form3:TForm3;
begin
Form3 := TForm3.Create(WebApplication);
Form3.lbMensagem.Caption:=edNome.Text+', seja bem-vindo(a)';
Form3.Show;
end;
end.

Listagem 12.8 un_formulario2.ps


unit un_formulario2;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompButton, Classes, Controls,
IWControl, IWCompLabel;
type
TForm2 = class(TIWAppForm)
IWLabel1: TIWLabel;
IWButton1: TIWButton;
procedure IWButton1Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses

272 Delphi 7 Internet e Banco de Dados


ServerController;
procedure TForm2.IWButton1Click(Sender: TObject);
begin
Hide;
end;
end.

Listagem 12.9 un_formulario3.ps


unit un_formulario3;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompButton, Classes, Controls,
IWControl, IWCompLabel;
type
TForm3 = class(TIWAppForm)
IWLabel1: TIWLabel;
lbMensagem: TIWLabel;
IWButton1: TIWButton;
procedure IWButton1Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController;
procedure TForm3.IWButton1Click(Sender: TObject);
begin
Hide;
end;
end.

Sexto Exemplo (primeiro com banco de dados)


Amigos, agora chegou a hora boa: trabalhar com banco de dados e Internet. J desenvolvemos nossas aplicaes com banco de
dados para Internet com outras tecnologias (Web-Broker e Websnap) e agora teremos o prazer de utilizar o Intraweb.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application with Data
Module (figura 12.33).

Intraweb 273

Figura 12.33 Iniciando a aplicao


A nica diferena na opo with Data Module, justamente a criao automtica de um Data Module, bem como suas
referncias. Insira um objeto do tipo TSQLConnection, e atravs do duplo-clique, j na tela de configurao, aponte para a
nossa conexo Clientes, criada anteriormente. Vamos relembrar os atributos da conexo.
PROPRIEDADE

VALOR

CommitRetain

False

Database

localhost:c:\cursoweb\clientes.gdb

Password

a famosa masterkey

UserName

o famoso SYSDBA

Name

ConexaoBD

Altere tambm a propriedade LoginPrompt para false. Nunca esquea de fazer esta alterao, pois numa aplicao servidora,
no existe a possibilidade do usurio interagir no login do banco de dados.

274 Delphi 7 Internet e Banco de Dados

Figura 10.34 Configurao da Conexo


Agora vamos inserir o objeto para manipular nossa tabela de clientes. Insira um objeto do tipo TSQLDataSet e altere as
seguintes propriedades:
PROPRIEDADE

VALOR

SQLConnection

ConexaoBD

CommandText

select * from TBCLIENTE

Active

True

timo, agora vamos para o formulrio principal. Insira a unit DataModuleUnit na clusula uses, e grave a aplicao. Insira os
componentes que seguem.

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Sexto Exemplo
128
208

Intraweb 275

OBJETO
TDataSource [DataAccess]
Objeto
DataSource1

Propriedade
Name
DataSet

Valor
DataSource1
DataModule1.SQLDataSet1

OBJETO
TIWDBGrid
Objeto
IWDBGrid1

Propriedade
Name
Align
DataSource

Valor
IWDBGRID1
alTop
DataSource1

A figura 12.35 ilustra nosso formulrio principal.

Figura 12.35 Formulrio principal


No colocamos nenhum cdigo nesta aplicao. Assim como em aplicaes desktop, apenas associamos os objetos. Vamos
executar a aplicao e ver o resultado (figura 12.36).

276 Delphi 7 Internet e Banco de Dados

Figura 12.36 Sexto exemplo em execuo


Demonstrei neste exemplo uma forma simples de disponibilizar informaes de banco de dados na Internet. O grande
momento deste exemplo foi justamente a simplicidade e a semelhana com o mtodo tradicional de desenvolvimento.
No prximo tpico vamos desenvolver uma aplicao completa, a mesma que desenvolvemos no Captulo 7.

Listagem 12.10 IWUnit1.pas (Form principal)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl, IWGrids,
IWDBGrids, DB, IWDBStdCtrls, IWClientSideDatasetBase,
IWClientSideDatasetDBLink, IWCompLabel;
type
TformMain = class(TIWAppForm)
IWDBGrid1: TIWDBGrid;
DataSource1: TDataSource;
IWLabel1: TIWLabel;
public
end;
implementation
{$R *.dfm}
uses
ServerController, DataModuleUnit;
end.

Listagem 12.11 unit DataModuleUnit.pas


unit DatamoduleUnit;

Intraweb 277

interface
uses
{$IFDEF Linux}QForms, {$ELSE}Forms, {$ENDIF}
SysUtils, Classes, DBXpress, FMTBcd, DB, SqlExpr;
type
TDataModule1 = class(TDataModule)
SQLConnection1: TSQLConnection;
SQLDataSet1: TSQLDataSet;
private
public
end;
// Procs
function DataModule1: TDataModule1;
implementation
{$R *.dfm}
uses
IWInit,
ServerController;
// Since we are threaded we cannot use global variables to store form / datamodule
references
// so we store them in WebApplication.Data and we could reference that each time, but
by creating
// a function like this our other code looks "normal" almost as if its referencing a
global.
// This function is not necessary but it makes the code in the main form which
references this
// datamodule a lot neater.
// Without this function ever time we would reference this datamodule we would use:
//
TDataModule1(WebApplication.Data).Datamodule.<method / component>
// By creating this procedure it becomes:
//
TDataModule1.<method / component>
// Which is just like normal Delphi code.
function DataModule1: TDataModule1;
begin
Result := TUserSession(RWebApplication.Data).Datamodule1;
end;
end.

Cadastro de Clientes
Agora iremos desenvolver uma aplicao parecida com a do Captulo 7, onde faremos um cadastro de clientes com as
principais operaes.
Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Stand Alone Application with Data
Module (figura 12.37).

278 Delphi 7 Internet e Banco de Dados

Definies iniciais

Figura 12.37 Iniciando a aplicao


Selecione o DataModule e insira um objeto do tipo TSQLConnection. Atravs do duplo-clique, j na tela de configurao,
aponte para a nossa conexo Clientes, criada anteriormente. Vamos relembrar os atributos da conexo.
PROPRIEDADE

VALOR

CommitRetain

False

Database

localhost:c:\cursoweb\clientes.gdb

Password

a famosa masterkey

UserName

o famoso SYSDBA

Name

ConexaoBD

Altere tambm a propriedade LoginPrompt para false. Nunca esquea de fazer esta alterao, pois numa aplicao servidora,
no existe a possibilidade do usurio interagir no login do banco de dados.

Intraweb 279

Figura 10.38 Configurao da Conexo


Agora vamos inserir o objeto para manipular nossa tabela de clientes. Insira um objeto do tipo TSQLDataSet, e altere as
seguintes propriedades:
PROPRIEDADE

VALOR

SQLConnection

ConexaoBD

CommandText

select * from TBCLIENTE

Active

True

Objeto de Incluso
Insira um objeto do tipo TSQLQuery e altere as propriedades que seguem.

280 Delphi 7 Internet e Banco de Dados

OBJETO
TSQLQuery
Objeto
SQLInclui

Propriedade
Valor
Name
SQLInclui
SQLConnection ConexaoBD
SQL

INSERT INTO TBCLIENTE


VALUES(0,:prazao,
:pendereco,:pcidade,
:pestado,:pcep,:pemail)

Na propriedade PARAMS do SQLInclui altere os tipos dos parmetros para String.

Objeto de Alterao
Insira um objeto do tipo TSQLQuery e altere as propriedades que seguem.

OBJETO
TSQLQuery
Objeto
SQLAltera

Propriedade
Valor
Name
SQLAltera
SQLConnection BancoDados
SQL

UPDATE TBCLIENTE SET


RAZAO_SOCIAL=:prazao,
ENDERECO=:pendereco,
CIDADE=:pcidade,
ESTADO=:pestado,
CEP=:pcep,
EMAIL=:pemail
WHERE
COD_CLIENTE=:pcodigo

Na propriedade PARAMS do SQLAltera altere os tipos dos parmetros para String, com exceo do parmetro PCODIGO, que
deve ser Integer.

Objeto de Excluso
Insira um objeto do tipo TSQLQuery e altere as propriedades que seguem.

Intraweb 281

OBJETO
TSQLQuery
Objeto
SQLExclui

Propriedade
Valor
Name
SQLExclui
SQLConnection BancoDados
SQL

DELETE FROM TBCLIENTE


WHERE
COD_CLIENTE=:pcodigo

Na propriedade PARAMS do SQLExclui altere o tipo do parmetro para Integer.

Criando o Formulrio Principal


No formulrio principal (FormMain), adicione um componente do tipo TMainMenu (que utilizamos habitualmente), e
configure as opes como segue:
Arquivo
Incluso Clientes
Manuteno/Consulta
Finaliza

Sobre
Informaes...

A figura 12.39 ilustra o nosso menu principal.

Figura 12.39 Menu Principal


Insira um objeto do tipo TIWMenu (seo IW Standard) e altere a propriedade Attached Menu para MainMenu1. Na realidade
estamos vinculando nosso objeto MainMenu1 com o IWMenu1 do Intraweb.
Configure a propriedade BackGroundColor do objeto FormMain para $00DDFFFF. Amigos, isto apenas uma sugesto de
cor.
Insira os componentes que seguem no FormMain.

282 Delphi 7 Internet e Banco de Dados

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Cadastro de Clientes
136
80

OBJETO
TIWImage
Objeto
IWImage1

Propriedade
Name
Left
Picture
Top

Valor
IWImmage1
168
insira uma figura qualquer,
exemplo: logo.jpg
120

A figura 12.40 ilustra o nosso formulrio principal.

Figura 12.40 Formulrio principal


Agora iremos codificar duas opes do menu principal: Finaliza e Informaes/Sobre.
Selecione a opo Finaliza no objeto MainMenu1 e insira o cdigo que segue no evento OnClick.
WebApplication.Terminate('At logo !');
Neste evento estamos finalizando a aplicao e apresentando a mensagem At Logo!, ao usurio.
Agora selecione a opo Informaes/.Sobre e insira o cdigo que segue.

Intraweb 283
WebApplication.ShowMessage('Cadastro de Clientes' +#13#10+ 'Verso 1.0',smAlert);
Neste evento apresentamos uma janela de dilogo ao usurio, com as informaes da aplicao. Bastante simples, no?

Criando o Formulrio de Incluso


Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Application Form (figura 12.41).

Figura 12.41 Criando um novo formulrio


Altere a propriedade Name do formulrio para FmInclusao e BackGroundColor para $00DDFFFF. . Grave a unit com o
nome un_inclusao. Insira os componentes que seguem no FmInclusao..

OBJETO
TIWRectangle
Objeto
IWRectangle1

Propriedade
Name
Align
Color
Font.Color
Font.Size
Font.Style.fsBold
Text

Valor
IWRectangle1
alTop
clNavy
clWhite
16
True
Cadastro de Clientes
(Incluso)

284 Delphi 7 Internet e Banco de Dados

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Razo Social
24
88

OBJETO
TIWLabel
Objeto
IWLabel2

Propriedade
Name
Caption
Left
Top

Valor
IWLabel2
Endereo
24
120

OBJETO
TIWLabel
Objeto
IWLabel3

Propriedade
Name
Caption
Left
Top

Valor
IWLabel3
Cidade
24
152

OBJETO
TIWLabel
Objeto
IWLabel4

Propriedade
Name
Caption
Left
Top

Valor
IWLabel4
UF
328
152

Intraweb 285

OBJETO
TIWLabel
Objeto
IWLabel5

Propriedade
Name
Caption
Left
Top

Valor
IWLabel5
CEP
448
152

OBJETO
TIWLabel
Objeto
IWLabel6

Propriedade
Name
Caption
Left
Top

Valor
IWLabel6
e-Mail
24
184

OBJETO
TIWEdit
Objeto
edRazao

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edRazao
clYellow
21
128
deixar em branco
88
450

OBJETO
TIWEdit
Objeto
edEndereco

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edEndereco
clYellow
21
128
deixar em branco
120
450

286 Delphi 7 Internet e Banco de Dados

OBJETO
TIWEdit
Objeto
edCidade

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edCidade
clYellow
21
128
deixar em branco
152
185

OBJETO
TIWComboBox
Objeto
edUF

Propriedade
Name
Height
Left
Items
Sorted
Top
Width

Valor
edUF
21
360
Insira a sigla de todos os
estados brasileiros
True
152
65

OBJETO
TIWEdit
Objeto
edCEP

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edCEP
clYellow
21
488
deixar em branco
152
90

Intraweb 287

OBJETO
TIWEdit
Objeto
edEmail

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edEmail
clYellow
21
128
deixar em branco
184
450

OBJETO
TIWButton1
Objeto
btConfirma

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btConfirma
Confirma
25
128
232
75

OBJETO
TIWButton1
Objeto
btDesiste

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btDesiste
Desiste
25
216
232
75

Agora vamos codificar o formulrio. Insira a unit DataModuleUnit na clusula uses do formulrio.
uses
ServerController, DatamoduleUnit;
No evento OnClick do objeto btDesiste insira o cdigo que segue:
Hide;
Para que possamos retornar ao formulrio de origem, utilizamos o mtodo Hide do formulrio. Agora vamos codificar o evento
OnClick do objeto btConfirma.

288 Delphi 7 Internet e Banco de Dados


try
{Inclui Cliente}
with DataModule1.SQLInclui do
begin
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
ExecSQL;
end;
WebApplication.ShowMessage('Cliente incluido com sucesso',smSameWindow);
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;
Hide;

um

problema

na

incluso

do

cliente',

Vamos analisar o cdigo. Nesta primeira parte, iniciamos um bloco protegido.


try
Em seguida, estamos atribuindo parmetros ao objeto SQLInclui do DataModule1.
{Inclui Cliente}
with DataModule1.SQLInclui do
begin
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
E, finalmente, executando a operao e apresentando a mensagem de sucesso na opero.
ExecSQL;
WebApplication.ShowMessage('Cliente incluido com sucesso',smSameWindow);
Em caso de erro, estamos criando o bloco except.
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;

um

problema

na

incluso

do

E apresentando a mensagem do problema. A figura 12.42 ilustra o nosso formulrio de incluso de clientes.

cliente',

Intraweb 289

Figura 12.42 Formulrio incluso de clientes

Criando o Formulrio de Alterao


Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Application Form (figura 12.43).

Figura 12.43 Criando um novo formulrio


Altere a propriedade Name do formulrio para FmAltera e BackGroundColor para $00DDFFFF. Grave a unit com o nome
un_alteracao. Insira os componentes que seguem no FmAltera.

290 Delphi 7 Internet e Banco de Dados

OBJETO
TIWRectangle
Objeto
IWRectangle1

Propriedade
Name
Align
Color
Font.Color
Font.Size
Font.Style.fsBold
Text

Valor
IWRectangle1
alTop
clNavy
clWhite
16
True
Cadastro de Clientes
(Alterao)

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Razo Social
24
88

OBJETO
TIWLabel
Objeto
IWLabel2

Propriedade
Name
Caption
Left
Top

Valor
IWLabel2
Endereo
24
120

OBJETO
TIWLabel
Objeto
IWLabel3

Propriedade
Name
Caption
Left
Top

Valor
IWLabel3
Cidade
24
152

Intraweb 291

OBJETO
TIWLabel
Objeto
IWLabel4

Propriedade
Name
Caption
Left
Top

Valor
IWLabel4
UF
328
152

OBJETO
TIWLabel
Objeto
IWLabel5

Propriedade
Name
Caption
Left
Top

Valor
IWLabel5
CEP
448
152

OBJETO
TIWLabel
Objeto
IWLabel6

Propriedade
Name
Caption
Left
Top

Valor
IWLabel6
e-Mail
24
184

OBJETO
TIWLabel
Objeto
IWLabel7

Propriedade
Name
Caption
Left
Top

Valor
IWLabel7
Cdigo Cliente
24
56

OBJETO
TIWLabel
Objeto
lbCodigo

Propriedade
Name
Caption
Left
Top

Valor
lbCodigo
cdigo
144
56

292 Delphi 7 Internet e Banco de Dados

OBJETO
TIWEdit
Objeto
edRazao

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edRazao
clYellow
21
128
deixar em branco
88
450

OBJETO
TIWEdit
Objeto
edEndereco

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edEndereco
clYellow
21
128
deixar em branco
120
450

OBJETO
TIWEdit
Objeto
edCidade

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edCidade
clYellow
21
128
deixar em branco
152
185

Intraweb 293

OBJETO
TIWComboBox
Objeto
edUF

Propriedade
Name
Height
Left
Items
Sorted
Top
Width

Valor
edUF
21
360
Insira a sigla de todos os
estados brasileiros
True
152
65

OBJETO
TIWEdit
Objeto
edCEP

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edCEP
clYellow
21
488
deixar em branco
152
90

OBJETO
TIWEdit
Objeto
edEmail

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edEmail
clYellow
21
128
deixar em branco
184
450

294 Delphi 7 Internet e Banco de Dados

OBJETO
TIWButton1
Objeto
btConfirma

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btConfirma
Confirma
25
128
232
75

OBJETO
TIWButton1
Objeto
btDesiste

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btDesiste
Desiste
25
216
232
75

Agora vamos codificar o formulrio. Insira a unit DataModuleUnit na clusula uses do formulrio.
uses
ServerController, DatamoduleUnit;
No evento OnClick do objeto btDesiste insira o cdigo que segue:
Hide;
Para que possamos retornar ao formulrio de origem, utilizamos o mtodo Hide do formulrio.
Agora vamos codificar o evento OnClick do objeto btConfirma.
try
{Altera Cliente}
with DataModule1.SQLAltera do
begin
ParamByName('pcodigo').Value:=StrtoInt(lbCodigo.Text);
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
ExecSQL;
end;
WebApplication.ShowMessage('Cliente alterado com sucesso',smSameWindow);

Intraweb 295

except
WebApplication.ShowMessage('Houve
smSameWindow);
end;
Hide;

um

problema

na

alterao

do

cliente',

Vamos analisar o cdigo. Nesta primeira parte, iniciamos um bloco protegido.


try
Em seguida, estamos atribuindo parmetros ao objeto SQLAltera do DataModule1.
{Inclui Cliente}
with DataModule1.SQLAltera do
begin
ParamByName('pcodigo').Value:=StrtoInt(lbCodigo.Text);
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
E finalmente executando a operao e apresentando a mensagem de sucesso na opero.
ExecSQL;
WebApplication.ShowMessage('Cliente incluido com sucesso',smSameWindow);
Em caso de erro, estamos criando o bloco except.
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;

um

problema

na

incluso

do

cliente',

E apresentando a mensagem do problema.


Embora o Intraweb fornea objeto com conexo direta a DataSets, estamos utilizando os objetos convencionais, sem nenhum
vnculo com DataSet. Quando trabalhamos com Internet, complicado disponibilizar objeto de conexo direta com DataSets,
justamente porque no sabemos o que poder ocorrer com a conexo. Sugiro adotar este modelo de desenvolvimento pela
segurana.
Ento, para que nossos campos sejam preenchidos automaticamente com as informaes do banco de dados, vamos utilizar o
TDataSource e TSQLDataSet.

296 Delphi 7 Internet e Banco de Dados

OBJETO
TSQLDataSet
Objeto
SQLDataSet1

Propriedade
Name
SQLConnection

Valor
SQLDataSet1
DataModule1.ConexaoBD

CommandText

select * from TBCLIENTE


WHERE
COD_CLIENTE=:pCodigo

CommandType

Query

Defina o parmetro pCodigo como Integer.

OBJETO
TDataSource
Objeto
DataSource1

Propriedade
Name
DataSet

Valor
DataSource
SQLDataSet1

Pronto, agora conclumos o nosso formulrio de alterao de clientes. A figura 12.44 ilustra o nosso formulrio.

Figura 12.44 Formulrio alterao de clientes

Criando o Formulrio de Manuteno


Atravs das opes File/New/Other..., selecione a seo Intraweb e escolha o modelo Application Form (figura 12.45).

Intraweb 297

Figura 12.45 Criando um novo formulrio


Altere a propriedade Name do formulrio para FmManutencao e BackGroundColor para $00DDFFFF. . Grave a unit com o
nome un_manutencao.
Insira os componentes que seguem no FmManutencao..

OBJETO
TIWRectangle
Objeto
IWRectangle1

Propriedade
Name
Align
Color
Font.Color
Font.Size
Font.Style.fsBold
Text

Valor
IWRectangle1
alTop
clNavy
clWhite
16
True
Cadastro de Clientes
(Manuteno)

OBJETO
TIWRegion1
Objeto
IWRegion1

Propriedade
Name
Align
Color
Height

Com o foco no objeto IWRegion1, insira os componentes que seguem.

Valor
IWRegion1
alTop
clWhite
56

298 Delphi 7 Internet e Banco de Dados

OBJETO
TIWLabel
Objeto
IWLabel1

Propriedade
Name
Caption
Left
Top

Valor
IWLabel1
Razo Social
16
16

OBJETO
TIWEdit
Objeto
edPesquisa

Propriedade
Name
BgColor
Height
Left
Text
Top
Width

Valor
edPesquisa
clYellow
21
112
deixar em branco
16
175

OBJETO
TIWButton
Objeto
btPesquisa

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btPesquisa
Confirma
25
296
16
75

OBJETO
TIWButton
Objeto
btVolta

Propriedade
Name
Caption
Height
Left
Top
Width

Valor
btVolta
Menu Principal
25
384
16
122

Intraweb 299
Em nosso formulrio iremos utilizar objetos de acesso a dados. Insira um objeto do tipo TDataSource e outro do tipo
TSQLQuery (dbExpress), configurando as propriedades que seguem.

OBJETO
TSQLQuery
Objeto
SQLPesquisa

Propriedade
Name
SQLConnection

Valor
SQLPesquisa
DataModule1.ConexaoBD

SQL

select * from TBCLIENTE

OBJETO
TDataSource
Objeto
DS1

Propriedade
Name
DataSet

Valor
DS1
SQLPesquisa

Repare que estamos colocando o comando SELECT * na propriedade SQL do objeto SQLPesquisa. Fazemos isso apenas para
nos auxiliar na montagem do Grid.
Com o foco no formulrio, insira um objeto do tipo TIWDBGrid e altere as propriedades que seguem.

OBJETO
TIWDBGrid
Objeto
IWDbGrid1

Propriedade
Name
DataSource
Rollover
RollOverColor

Valor
IWDbGrid1
DS1
True
$00E1FFE1

Atravs do duplo-clique na propriedade Columns, insira os campos conforme a figura 12.46.

Figura 12.46 Campos do grid.

300 Delphi 7 Internet e Banco de Dados

Curiosidade
Repare que estamos repetindo o campo COD_CLIENTE diversas vezes. Fazemos isto para
substituir os mtodos de chamada de operaes, devido a um BUG no Intraweb. At a
verso 5.51 (que vem junto com o D7), o BUG de vnculo com controles (Control) ainda
no estava corrigido. Existe uma maneira de associar um objeto, como por exemplo, um
boto, a um evento do Grid. Iramos fazer isso para disparar as rotinas de alterao e
excluso, mas infelizmente, devido ao BUG, estamos substituindo por outro mtodo.

Vamos configurar as colunas inseridas.

Coluna [ 0 ] Cod_Cliente
Objeto
Propriedade
IWDbGrid1>Columns[0]
DataField
LinkField
Title.Text
Coluna [ 1 ] Razao_Social
Objeto
Propriedade
IWDbGrid1>Columns[1]
DataField
Title.Text
Coluna [ 2 ] EMAIL
Objeto
IWDbGrid1>Columns[2]

Valor
Cod_Cliente
Cod_Cliente
Cdigo
Valor
Razao_Social
Razo Social

Propriedade

Valor

DataField
Title.Text

email
e-Mail

Coluna [ 3 ] Cod_Cliente
Objeto
Propriedade
IWDbGrid1>Columns[3]
DataField
LinkField
Title.Text
Coluna [ 4 ] Cod_Cliente
Objeto
Propriedade
IWDbGrid1>Columns[4]
DataField
LinkField
Title.Text

Valor
Cod_Cliente
Cod_Cliente
Altera
Valor
Cod_Cliente
Cod_Cliente
Exclui

Agora vamos codificar o nosso formulrio. Na clusula uses insira as seguintes units.
uses
ServerController, DataModuleUnit, un_alteracao;

Intraweb 301
Em seguida devemos criar uma procedure pblica para auxiliar no posicionamento do registro, de maneira que possamos
atribuir o contedo do banco de dados, aos campos do formulrio fmAltera. Defina a procedure LOCALIZA, como segue.
public
procedure Localiza(Cliente: integer);
E na seo implementation, insira o cdigo a seguir.
procedure Tfmmanutencao.Localiza(Cliente:integer);
begin
SQLPesquisa.Locate('cod_cliente', Cliente, []);
end;
Neste cdigo estamos apenas posicionando o ponteiro do registro de acordo com a seleo do usurio. Agora vamos codificar
o objeto btPesquisa. Insira o cdigo que segue no evento OnClick.
SQLPesquisa.SQL.Clear;
SQLPesquisa.SQL.Add('SELECT
*
FROM
'+''''+'%'+edPesquisa.Text+'%'+'''');
SQLPesquisa.Open;

TBCLIENTE

WHERE

RAZAO_SOCIAL

LIKE

Neste cdigo estamos preparando uma consulta SQL, baseada na informao do usurio, extrada do objeto edPesquisa. As
informaes so apresentadas no Grid, devido ao vnculo com o objeto. Coloque o cdigo a seguir, no evento OnClick do
objeto btVolta.
Hide;
Agora vamos codificar a operao de alterao do Grid.
Atravs da propriedade Columns do IWDBGrid1, selecione a coluna 3 (Altera) e insira o cdigo que segue no evento OnClick.
var
fmAltera:TfmAltera;
begin
fmAltera:=TFmAltera.Create(WebApplication);
{Atribui o cdigo a Query}
with fmAltera do
begin
FmAltera.SQLDataSet1.Params[0].Value:=StrtoInt(AValue);
fmAltera.SQLDataSet1.Open;
edRazao.Text:=SQLDataSet1RAZAO_SOCIAL.AsString;
edEndereco.Text:=SQLDataSet1ENDERECO.AsString;
edCidade.Text:=SQLDataSet1CIDADE.AsString;
edCEP.Text:=SQLDataSet1CEP.AsString;
edUF.ItemIndex:=edUF.Items.IndexOf( QLDataSet1ESTADO.AsString);
edEmail.Text:=SQLDataSet1EMAIL.AsString;
{Atribui os valores}
fmAltera.lbCodigo.Caption:=Avalue;
fmAltera.Show;
end;
Vamos analisar o cdigo. No bloco a seguir, estamos definindo um objeto do tipo TfmAltera, para que possamos manipular o
objeto.
var

302 Delphi 7 Internet e Banco de Dados


fmAltera:TfmAltera;
No bloco que segue, instanciamos o objeto FmAltera.
begin
fmAltera:=TFmAltera.Create(WebApplication);
Em seguida atribumos o cdigo do cliente, extrado da varivel AValue (constante da procedure), ao objeto SQLDataSet1.
with fmAltera do
begin
FmAltera.SQLDataSet1.Params[0].Value:=StrtoInt(AValue);
fmAltera.SQLDataSet1.Open;
O bloco a seguir atribui as informaes do SQLDataSet1 aos campos do objeto fmAltera, apresentando o formulrio de
alterao de clientes.
edRazao.Text:=SQLDataSet1RAZAO_SOCIAL.AsString;
edEndereco.Text:=SQLDataSet1ENDERECO.AsString;
edCidade.Text:=SQLDataSet1CIDADE.AsString;
edCEP.Text:=SQLDataSet1CEP.AsString;
edUF.ItemIndex:=edUF.Items.IndexOf( QLDataSet1ESTADO.AsString);
edEmail.Text:=SQLDataSet1EMAIL.AsString;
{Atribui os valores}
fmAltera.lbCodigo.Caption:=Avalue;
fmAltera.Show;
Agora vamos codificar a operao de excluso do Grid.
Atravs da propriedade Columns do IWDBGrid1, selecione a coluna 4 (Exclui) e insira o cdigo que segue no evento OnClick.
try
with DataModule1.SQLExclui do
begin
ParamByName('pcodigo').Value:=StrtoInt(AValue);
ExecSQL;
end;
WebApplication.ShowMessage('Cliente Excluido com sucesso',smSameWindow);
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;

um

problema

na

exclusao

do

cliente',

Vamos analisar o cdigo. No cdigo que segue estamos criando um bloco protegido; atribuindo um parmetro para o objeto
SQLExclui e finalmente apresentando uma mensagem ao usurio, em caso de sucesso da operao.
try
with DataModule1.SQLExclui do
begin
ParamByName('pcodigo').Value:=StrtoInt(AValue);
ExecSQL;
end;
WebApplication.ShowMessage('Cliente Excluido com sucesso',smSameWindow);
No bloco a seguir estamos tratando a exceo, apresentando para o usurio uma mensagem de alerta.

Intraweb 303
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;

um

problema

na

exclusao

do

cliente',

Grave a unit un_manutencao e selecione o formulrio principal. A figura 12.47 ilustra o nosso formulrio de manuteno.

Figura 12.47 Formulrio de manuteno


Vamos codificar o formulrio principal, para concluir a aplicao.
Na clusula uses do formulrio principal (formMain), insira as units que seguem.
uses
ServerController, un_Inclusao, un_manutencao;
Agora vamos codificar a opo Incluso de Clientes do Menu Principal. No evento OnClick da opo, insira o cdigo a seguir.
var
fmInclusao:TFmInclusao;
begin
fmInclusao:=TFMInclusao.Create(WebApplication);
fmInclusao.Show;
end;
Neste cdigo estamos instanciando o objeto FmInclusao e apresentando ao usurio. E agora, vamos codificar a opo
Manuteno/Consulta.Coloque o cdigo que segue no evento OnClick da opo.
var
fmManutencao:TFmManutencao;
begin
fmManutencao:=TFMManutencao.Create(WebApplication);
fmManutencao.Show;
end;
Com isso conclumos o nosso projeto de Cadastro de Clientes. As figuras 12.48 a 12.53 ilustram nossa aplicao em tempo de
execuo.

304 Delphi 7 Internet e Banco de Dados

Figura 12.48 Menu principal

Figura 12.49 Formulrio de incluso

Figura 12.50 Informaes sobre a aplicao

Intraweb 305

Figura 12.51 Manuteno


Repare que na tela de manuteno existe um rollover passeando entre os registros. Para que voc possa fazer qualquer tipo de
operao, clique no cdigo do cliente, correspondente operao (altera ou exclui).
Voc poder digitar apenas uma parte da razo social do cliente. Por exemplo: digitando Facunte, so apresentados todos os
registros que contm a palavra Facunte, independente da posio.

Figura 12.52 Alterao de clientes

Figura 12.53 Finalizando a aplicao

306 Delphi 7 Internet e Banco de Dados

Listagem 12.12 IWUnit1.pas (FormMain)


unit IWUnit1;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, Menus, Classes, Controls, IWControl,
IWCompMenu, jpeg, IWExtCtrls, IWCompLabel;
type
TformMain = class(TIWAppForm)
MainMenu1: TMainMenu;
Arquivo1: TMenuItem;
InclusodeClientes1: TMenuItem;
Manuteno1: TMenuItem;
Finaliza1: TMenuItem;
IWMenu1: TIWMenu;
Sobre1: TMenuItem;
Informaessobreaaplicao1: TMenuItem;
IWImage1: TIWImage;
IWLabel1: TIWLabel;
procedure InclusodeClientes1Click(Sender: TObject);
procedure Finaliza1Click(Sender: TObject);
procedure Informaessobreaaplicao1Click(Sender: TObject);
procedure Manuteno1Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController, Un_Inclusao, un_manutencao;
procedure TformMain.InclusodeClientes1Click(Sender: TObject);
var
fmInclusao:TFmInclusao;
begin
fmInclusao:=TFMInclusao.Create(WebApplication);
fmInclusao.Show;
end;
procedure TformMain.Finaliza1Click(Sender: TObject);
begin
WebApplication.Terminate('At logo !');
end;
procedure TformMain.Informaessobreaaplicao1Click(Sender: TObject);
begin
WebApplication.ShowMessage('Cadastro de Clientes'+#13#10+'Verso 1.0',smAlert);
end;
procedure TformMain.Manuteno1Click(Sender: TObject);
var
fmManutencao:TFmManutencao;

Intraweb 307
begin
fmManutencao:=TFMManutencao.Create(WebApplication);
fmManutencao.Show;
end;
end.

Listagem 12.13 un_inclusao.pas (FmInclusao)


unit un_inclusao;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompLabel, Classes, Controls,
IWControl, IWCompEdit, IWCompListbox, IWCompButton, IWCompRectangle;
type
TfmInclusao = class(TIWAppForm)
edRazao: TIWEdit;
IWLabel2: TIWLabel;
edEndereco: TIWEdit;
IWLabel3: TIWLabel;
edCidade: TIWEdit;
IWLabel4: TIWLabel;
IWLabel5: TIWLabel;
edUF: TIWComboBox;
IWLabel6: TIWLabel;
edEmail: TIWEdit;
btConfirma: TIWButton;
btDesiste: TIWButton;
IWRectangle1: TIWRectangle;
edCep: TIWEdit;
IWLabel1: TIWLabel;
procedure btDesisteClick(Sender: TObject);
procedure btConfirmaClick(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController, DatamoduleUnit;
procedure TfmInclusao.btDesisteClick(Sender: TObject);
begin
Hide;
end;
procedure TfmInclusao.btConfirmaClick(Sender: TObject);
begin
try
{Inclui Cliente}

308 Delphi 7 Internet e Banco de Dados


with DataModule1.SQLInclui do
begin
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
ExecSQL;
end;
WebApplication.ShowMessage('Cliente incluido com sucesso',smSameWindow);
except
WebApplication.ShowMessage('Houve um problema na incluso do cliente',
smSameWindow);
end;
Hide;
end;
end.

Listagem 12.14 un_alteracao (FmAltera)


unit un_alteracao;
{PUBDIST}
interface
uses
IWAppForm, IWApplication, IWTypes, IWCompRectangle, IWCompButton,
IWCompListbox, IWCompLabel, Classes, Controls, IWControl, IWCompEdit,
FMTBcd, DB, SqlExpr, IWDBStdCtrls, DBClient, SimpleDS, SysUtils;
type
TfmAltera = class(TIWAppForm)
IWButton1: TIWButton;
IWButton2: TIWButton;
IWRectangle1: TIWRectangle;
IWLabel7: TIWLabel;
lbCodigo: TIWLabel;
DataSource1: TDataSource;
SQLDataSet1: TSQLDataSet;
edRazao: TIWEdit;
IWLabel2: TIWLabel;
edEndereco: TIWEdit;
IWLabel3: TIWLabel;
edCidade: TIWEdit;
IWLabel4: TIWLabel;
IWLabel5: TIWLabel;
edUF: TIWComboBox;
IWLabel6: TIWLabel;
edEmail: TIWEdit;
edCep: TIWEdit;
IWLabel1: TIWLabel;
SQLDataSet1COD_CLIENTE: TIntegerField;
SQLDataSet1RAZAO_SOCIAL: TStringField;

Intraweb 309
SQLDataSet1ENDERECO: TStringField;
SQLDataSet1CIDADE: TStringField;
SQLDataSet1ESTADO: TStringField;
SQLDataSet1CEP: TStringField;
SQLDataSet1EMAIL: TStringField;
procedure IWButton2Click(Sender: TObject);
procedure IWButton1Click(Sender: TObject);
public
end;
implementation
{$R *.dfm}
uses
ServerController, DataModuleUnit;
procedure TfmAltera.IWButton2Click(Sender: TObject);
begin
Hide;
end;
procedure TfmAltera.IWButton1Click(Sender: TObject);
begin
try
{Altera Cliente}
with DataModule1.SQLAltera do
begin
ParamByName('pcodigo').Value:=StrtoInt(lbCodigo.Text);
ParamByName('prazao').Value:=edRazao.Text;
ParamByName('pendereco').Value:=edEndereco.Text;
ParamByName('pcidade').Value:=edCidade.Text;
ParamByName('pestado').Value:=edUf.Items[edUf.ItemIndex];
ParamByName('pcep').Value:=edCep.Text;
ParamByName('pemail').Value:=edEmail.Text;
ExecSQL;
end;
WebApplication.ShowMessage('Cliente Alterado com sucesso',smSameWindow);
except
WebApplication.ShowMessage('Houve um problema na alteracao do cliente',
smSameWindow);
end;
Hide;
end;
end.

Listagem 12.15 un_manutencao (FmManutencao)


unit un_manutencao;
{PUBDIST}
interface

310 Delphi 7 Internet e Banco de Dados


uses
IWAppForm, IWApplication, IWTypes, Classes, Controls, IWControl,
IWCompRectangle, Forms, IWContainer, IWRegion, FMTBcd, DB, SqlExpr,
IWGrids, IWDBGrids, IWCompLabel, IWCompButton, IWCompEdit, SysUtils,
IWHTMLControls;
type
TfmManutencao = class(TIWAppForm)
IWRectangle1: TIWRectangle;
IWRegion1: TIWRegion;
IWDBGrid1: TIWDBGrid;
SQLPesquisa: TSQLQuery;
Ds1: TDataSource;
edPesquisa: TIWEdit;
btPesquisa: TIWButton;
IWLabel1: TIWLabel;
btVolta: TIWButton;
procedure btPesquisaClick(Sender: TObject);
procedure btVoltaClick(Sender: TObject);
procedure IWDBGrid1Columns3Click(ASender: TObject;
const AValue: String);
procedure IWDBGrid1Columns4Click(ASender: TObject;
const AValue: String);
public
procedure Localiza(Cliente: integer);
end;
implementation
{$R *.dfm}
uses
ServerController, DataModuleUnit, un_alteracao;
procedure Tfmmanutencao.Localiza(Cliente:integer);
begin
SQLPesquisa.Locate('cod_cliente', Cliente, []);
end;
procedure TfmManutencao.btPesquisaClick(Sender: TObject);
begin
SQLPesquisa.SQL.Clear;
SQLPesquisa.SQL.Add('SELECT
*
FROM
TBCLIENTE
WHERE
'+''''+'%'+edPesquisa.Text+'%'+'''');
SQLPesquisa.Open;
end;
procedure TfmManutencao.btVoltaClick(Sender: TObject);
begin
Hide;
end;
procedure TfmManutencao.IWDBGrid1Columns3Click(ASender: TObject;
const AValue: String);
var
fmAltera:TfmAltera;
begin

RAZAO_SOCIAL

LIKE

Intraweb 311
fmAltera:=TFmAltera.Create(WebApplication);
{ Atribui o cdigo a Query }
with fmAltera do
begin
fmAltera.SQLDataSet1.Params[0].Value:=StrtoInt(AValue);
fmAltera.SQLDataSet1.Open;
edRazao.Text:=SQLDataSet1RAZAO_SOCIAL.AsString;
edEndereco.Text:=SQLDataSet1ENDERECO.AsString;
edCidade.Text:=SQLDataSet1CIDADE.AsString;
edCEP.Text:=SQLDataSet1CEP.AsString;
edUF.ItemIndex:=edUF.Items.IndexOf(SQLDataSet1ESTADO.AsString);
edEmail.Text:=SQLDataSet1EMAIL.AsString;
{ Atribui os valores }
fmAltera.lbCodigo.Caption:=Avalue;
fmAltera.Show;
end;
end;
procedure TfmManutencao.IWDBGrid1Columns4Click(ASender: TObject;
const AValue: String);
begin
try
with DataModule1.SQLExclui do
begin
ParamByName('pcodigo').Value:=StrtoInt(AValue);
ExecSQL;
end;
WebApplication.ShowMessage('Cliente Excluido com sucesso',smSameWindow);
except
WebApplication.ShowMessage('Houve
smSameWindow);
end;

um

problema

end;
end.

Listagem 12.16 DataModuleUnit.pas


unit DatamoduleUnit;
interface
uses
{$IFDEF Linux}QForms, {$ELSE}Forms, {$ENDIF}
SysUtils, Classes, DBXpress, DB, SqlExpr, FMTBcd;
type
TDataModule1
ConexaoBD:
SQLInclui:
SQLAltera:
SQLExclui:
private

= class(TDataModule)
TSQLConnection;
TSQLQuery;
TSQLQuery;
TSQLQuery;

na

exclusao

do

cliente',

312 Delphi 7 Internet e Banco de Dados


public
end;
// Procs
function DataModule1: TDataModule1;
implementation
{$R *.dfm}
uses
IWInit,
ServerController;
// Since we are threaded we cannot use global variables to store form / datamodule
references
// so we store them in WebApplication.Data and we could reference that each time, but
by creating
// a function like this our other code looks "normal" almost as if its referencing a
global.
// This function is not necessary but it makes the code in the main form which
references this
// datamodule a lot neater.
// Without this function ever time we would reference this datamodule we would use:
//
TDataModule1(WebApplication.Data).Datamodule.<method / component>
// By creating this procedure it becomes:
//
TDataModule1.<method / component>
// Which is just like normal Delphi code.
function DataModule1: TDataModule1;
begin
Result := TUserSession(RWebApplication.Data).Datamodule1;
end;
end.

Intraweb 313

Anotaes de Dvidas

?
Preciso Revisar

Anotaes Gerais

Você também pode gostar