The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de...

30

Transcript of The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de...

Page 1: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior
Page 2: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

Revista The Club Megazine - 09/2002A utilização, reprodução, apropriação, armazenamento em banco de dados,sob qualquer forma ou meio, de textos, fotos e outras criações intelectuaisem cada publicação da revista “The Club” são terminantemente proibidos

sem autorização escrita dos titulares dos direitos autorais.

Copyright© The Club® 2002

Page 3: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 3

EDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ...................................................................................... 03

News ......................................................................................... 04

Aplicação WAP com Banco de Dados ..................................... 05

Quem usa Interbase no Mundo ................................................ 10

Criando Componentes Visuais - Parte 2 ................................. 12

DataSnap - Parte IV - Servidor de Aplicação COM+ ............. 16

O que há de novo no Delphi 7 .................................................. 23

Perguntas & Respostas .............................................................. 28

THE CLUBRua Acre, 950 - Avaré - SP - CEP 18.700-260

Informações: (0xx14) 3732-3689Suporte: (0xx14) 3733-1588

Fax: (0xx14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]ções: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem serenviados ao - THE CLUB, indicando "Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube em

geral, mande a sua correspondência para a seção"Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sob qualquerforma ou meio, de textos, fotos e outras criações

intelectuais em cada publicação da Revista“The Club” são terminantemente proibidos sem

autorização escrita dos titulares dos direitosautorais.

Copyright© The Club® 2002

Impressão e acabamento:Impressos Gril - Gril Gráfica e Repr. Ind. Ltda.

Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259Rua São Paulo, 447 - Cep 18.740-000

Taquarituba - SPTiragem: 5.000 exemplares

Diretor - Presidente

Celso Jefferson M. Paganelli

Diretor Técnico

Mauro Sant’AnnaColaboradores

Mário Camilo Bohm

Emerson Facunte - Oswaldo Salzano Filho

Anderson H. Rodrigues

Delphi é marca registrada da BorlandInternational, as demais marcas citadas são

registradas pelos seus respectivos proprietários.

Olá leitor,

Novamente nos encontramos com mais uma versão do Delphi. Agora naversão 7, com o nome de Delphi Studio, a Borland conseguiu mais uma vezmelhorar e muito o Delphi, principalmente no que se refere à Internet. Agora comum produto de terceiro que foi devidamente incorporado ao Delphi, odesenvolvimento de aplicativos para a Internet ficou fácil demais. Já estamosfazendo alguns exemplos para vocês, de uma loja virtual por exemplo, ondepraticamente não foi necessária digitar nem uma linha de programação. Comcerteza esta nova versão nos ajudará ainda mais no desenvolvimento deaplicações.

Neste mês você já terá o gostinho em conhecer algumas novidades do Delphi7. E a partir desta edição, estará em contato permanente com essas novidades emuitas dicas.

Até o mês que vem !

Page 4: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE4

NEWS

Lançada Versão 6.2 do Banco de Dados ADS –Advantage Database Server

O ADS é gerenciador de banco de dados cliente/servidor(RDBMS) escalonável de alto desempenho, para redes, mono-usuário (standalone), Internet e aplicações móveis, disponível pararedes Linux, Windows NT/2000/XP, Windows 95/98/ME e NovellNetWare.

A versão 6.2 contém melhorias e otimizações significativas,bem como interfaces clientes adicionais que permitemdesenvolvimento de aplicações em novas plataformas. A interfaceAdvantage TdataSet Descendente para Delphi/C++ Builder jásuporta Delphi 7 e C++ Builder 6.

Algumas características do ADS 6.2· Suporte COM e ActiveX DLL com Advantage Extended

Procedures para permitir stored procedures ser escrito usandoVisual Basic adicionalmente com outra plataforma dedesenvolvimento COM.

· Suporte Advantage Extended Procedure quandoacessando dados via Servidor ADS para NetWare.

· Novos Clientes ADS incluindo ambientes dedesenvolvimento Advantage DBI Driver para Perl em ambossistemas operacionais Windows e Linux, ambientes dedesenvolvimento Advantage PHP Extension para PHP em ambossistemas operacionais Windows e Linux, e Advantage ODBCDriver para Linux (o Driver ODBC para Windows já existia).

· Restrições de acesso de usuário em nível de Campo(Field) permitindo segurança neste nível (field-level security).

· Restrições adicionais de acesso de usuário viadicionário de dados (delete, create, insert, select, e execute on table, view, oustored procedure).

· Aumentado o tamanho máximo de dados em campomemo que elimina o limite anterior de 64K.

Em www.renet.com.br/database/evolucao.asp encontra-sedescrição das funcionalidades já implementadas e das previstaspara novas versões.

Efetue o download gratuito das interfaces clientes 6.2 econstrua seu próprio teste. Contate-nos para informações sobre oprocesso de avaliação do servidor ADS, disponível para redesLinux, Windows ou NetWare.

Projetos com Windows DNA e .NET

Fábio CamaraISBN: 85-7502-078-1Número de páginas: 444

Esta obra tem três característicasinéditas em livros técnicos. A primeira éensinar tecnologia do ponto de vista dogerenciador, esclarecendo detalhes sobre oque realmente é, na prática, um projeto dedesenvolvimento.

A segunda é mostrar o ser humanoresponsável por gerenciar projetos, suasgrandezas e fraquezas, Iglórias e decepçõese, acima de tudo, o esforço para sealcançar um resultado.

A terceira é que, no final do livro,reunimos testemunhos de gerentes ediretores de informática de empresasrenomadas, onde cada um, de uma formaprópria e especial, relata suas experiênciasno sentido de orientar todos aqueles que desejam conquistar, emsua carreira, a posição de especialista em tecnologia dainformação (TI).

Sobre o autor:Administrador com especialização em tecnologia da

informação, iniciou ainda jovem a programar em Basic por voltade 1984. Foi professor de Delphi doSENAI -Bahia e professor de Análise deSistemas e Pascal do Colégio Impacto.Atuou como programador na Telebahia ecomo Coordenador de Projetos naStefanini Consultoria. Atualmente,desenvolve soluções baseadas emWindows DNA e Plataforma .Net para aCRK Financial Business, empresa líderno segmento de soluções financeiras, ondeexerce a função de Gerente de TQA(Technical Quality Assurance). Possui ocertificado Borland Delphi ProgrammerMaster e é Microsoft CertifiedProfessional em Sistemas Operacionais eLinguagens de Programação.

Onde comprar:Visual Books EditoraRua Tenente Silveira, 209 Sl 4 CentroFlorianópolis - SC

Fone: (48) 222-1125 -Fax: (48) 224-3225E-mail:[email protected]

Page 5: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 5

DELPHI

Neste segundo artigo, que por sinal, bastante simples, estoudemonstrando o uso do banco de dados com aplicações WAP.

A aplicação que iremos desenvolver, consiste em apresentaruma lista de e-mails que está armazenada em nosso banco dedados.

Veja, que embora o assunto não seja complexo, resolviapresentar uma aplicação bastante simples, ao invés de umapossível troca de mensagens entre o usuário, o celular e a nossaaplicação.

Talvez isso poderá ficar para um próximo artigo. Vocêssugerem alguma aplicação que poderemos desenvolver ao longode uma série de artigos? Poderemos planejar uma aplicaçãocompleta, desde a modelagem de negócios, até a concepção damesma. O que vocês acham? Manifestem-se, escrevam para :[email protected].

Bem, vamos iniciar nossa aplicação.

Para que possamos iniciar o desenvolvimento de nossaaplicação, é necessário a criação de uma base de dados noFirebird ou Interbase. Para facilitar, execute o seguinte script noIbConsole.

SET SQL DIALECT 3;CREATE DATABASE ‘C:\cursoweb\CLIENTES.GDB’ PAGE_SIZE4096DEFAULT CHARACTER SET

Aplicações WAPcom Banco de Dados

CREATE TABLE “TBCLIENTE”( “COD_CLIENTE”INTEGER NOT NULL, “RAZAO_SOCIAL” VARCHAR(50), “ENDERECO” VARCHAR(50), “CIDADE”VARCHAR(50), “ESTADO”VARCHAR(2), “CEP” VARCHAR(8), “EMAIL” VARCHAR(50), PRIMARY KEY (“COD_CLIENTE”));

CREATE GENERATOR “GEN_CLIENTES”;SET TERM ^ ;

/* Triggers only will work for SQL triggers */

CREATE TRIGGER “TG_CLIENTES” FOR “TBCLIENTE”ACTIVE BEFORE INSERT POSITION 0ASBEGIN NEW.COD_CLIENTE = GEN_ID(GEN_CLIENTES,1);END ^

COMMIT WORK ^SET TERM ;^

Criamos um banco de dados simples, com apenas uma tabelae um generator, sem nenhuma regra de negócio, apenas para uso

Amigos, quero agradecer aos inúmeros e-mails que recebi através do artigo anterior (Desenvolvendo Aplicações para Celulares comDelphi), onde além de fazer amigos, pude perceber o grande interesse nesta área. Obrigado.

Page 6: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE6

DELPHI

didático.

Agora, com o nosso amigo Delphi, iremos desenvolver a nossapequena aplicação.

Através das opções File/New..., selecione o item Web ServerApplication (figura 1) e clique em OK.

Figura 1 Item Web Server Application

Em seguida, selecione o tipo de aplicação CGI, e marque a opçãoCross Platform (figura 2). Percebe que com isso poderemos executar amesma aplicação num servidor Linux, sendo que o código deveráser recompilado em Kylix.

Uma boa notícia, é que o Kylix vem junto com o Delphi, apartir da versão 7, na distribuição Enterprise e Architect.

Figura 2 Escolha do tipo da aplicação servidora

Agora, neste ponto, precisamos estabelecer a conexão com onosso banco de dados. Insira um objeto do tipo TSQLConnection,e através do duplo-clique, já na tela de configuração, crie umanova conexão do tipo Interbase, alterando as propriedades queseguem. A figura 3 ilustra o diálogo de propriedades docomponente TSQLConnection.

Altere também a propriedade LoginPrompt para false.Nunca esqueça de fazer esta alteração, pois numa aplicaçãoservidora, não existe a possibilidade do usuário interagir no logindo banco de dados.

Figura 3 Configuração da Conexão

Agora vamos inserir o objeto para manipular nossa tabela declientes. Insira um objeto do tipo TSQLDataSet, e altere asseguintes propriedades:

Oba, já estamos chegando lá.

Agora vamos inserir um objeto do tipo

propriedade valorSQLConnection ConexaoBDCommandText select * from TBCLIENTEActive True

Propriedade ValorCommitRetain False

DatabaseAponte para o caminho do seu banco, e fique atento aodetalhe do nome do servidor. Nunca esqueça de colocar onome do servidor. Em nosso caso LOCALHOST. Veja umexemplo: localhost:c:\cursoweb\clientes.gdb

Password a famosa masterkeyUserName o famoso SYSDBAName ConexaoBD

Page 7: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 7

DELPHI

TdataSetTableProducer. Não confundam comTdataSetPageProducer.

Altere o nome do componente para producerCliente, e apropriedade DataSet para SQLCliente.

Através de um duplo-clique teremos a seguinte tela(assistente de configuração – figura 4).

Figura 4 Assistente de Configuração

Caso não esteja vendo uma tela parecida (perceba que osdados já estão inseridos no banco. você deverá inserir seuspróprios registros), verifique se está tudo certo com a suaconexão.

Deixe somente o campo e-mail, pois iremos listar apenas estainformação em nosso celular. Para realizar a tarefa, selecione osoutros campos e aperte a tecla delete.

Veja o resultado desta operação, na figura 5.

Figura 5

Neste ponto, iremos criar nossa Action para apresentar ainformação no celular.

Crie uma Action com o nome dados, através do duplo-cliqueno WebModule. Veja a figura 6.

Figura 6 – Action dados

No evento OnClick da Action dados, insira o código que segue.

// Abre o SQLCliente SQLCliente.Open;

// Define o tipo do conteúdo Response.ContentType:=’text/vnd.wap.wml’;

// Monta a cabeçalho padrão

Response.Content:=’<?xml version=”1.0"?>’+ ‘<!DOCTYPE wml PUBLIC “-//WAPFORUM//DTD WML 1.1//EM” “http://www.wapforum.org/DTD/wml_1.1.xml”>’+ ‘<wml><card id=”cartaum”><p>’;

// Insere o conteudo da nossa Tabelaproducer_Cliente na resposta e finaliza Response.Content:=Response.Content+

producerCliente.Content+ ‘</p></card></wml>’;

// Fecha o SQLCliente SQLCLiente.Close;

Com base no artigo anterior, fica bastante simples entendereste código.

Primeiro, estamos abrindo o nosso DataSet (SQLCliente).

SQLCliente.Open;

Em seguida estamos atribuindo à resposta, o tipo de

Page 8: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE8

empacotamento WML.

Response.ContentType:=’text/vnd.wap.wml’;

Na próxima instrução, estamos fazendo as definições iniciais,como cabeçalho <?xml...>, card <card>, e inicio de um parágrafo <P>.

Isso é imprescindível.

Response.Content:=’<?xml version=”1.0"?>’+ ‘<!DOCTYPE wml PUBLIC “-//WAPFORUM//DTD WML 1.1//EM” “http://www.wapforum.org/DTD/wml_1.1.xml”>’+ ‘<wml><card id=”cartaum”><p>’;

Agora vem a parte interessante. Estamos adicionando aopacote de resposta (Response.Content), a informação obtidaatravés do componente producer_Cliente, e finalizando oparágrafo<P>, o Card</card> e o documento WML </wml>.

Response.Content:=Response.Content+producerCliente.Content+

‘</p></card></wml>’;

Amigos, agora é só compilar e testar no Deck-It.

http://localhost/wap/wap_bd.exe/dados

Vejam o resultado.

Figura 7. Resultado da aplicação.Amigos, como disse, a aplicação é bastante simples, e aguardo

sugestões para uma aplicação completa, com interatividade dousuário e tudo mais.

Muito sucesso a todos, e nos vemos na Facunte On-Line(www.facunte.com.br).

Emerson FacunteEmerson é Consultor de Tecnologia com diversos livros

publicados, especialista em desenvolvimento de aplicações e-Business utilizando a ferramenta Delphi, baseado em WebSnap,DataSnap, BizSnap e ISAPI/Apache Modules.

DELPHI

Page 9: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 9

Page 10: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE10

Um dos grandes problemas de quem precisa escolher umGerenciador de Banco de Dados Relacional é saber quem e quetipo de aplicações foram desenvolvidas com ele.

Esse conhecimento ajudaria muito na decisão, sobretudo se oproduto for considerado pelo baixo custo ou pela prórpria relaçãoCusto X Benefício.

Quando se trata de um produto famoso é mais fácil. Quemduvidaria das qualidades do Oracle ou SQL Server, uma vez quetemos notícias que pelo menos uma dezena de empresas grandes?(E não raro sabemos os nomes dessas empresas).

Mas porque com Interbase essa dúvida também ocorre, jáque a Borland é sinônimo de qualidade? Que diferença existe jáque por muitos anos a Borland é citada como uma das empresascom o maior grau de satisfação de seus clientes? Sem contar queproduto Borland tem uma taxa muito baixa de “bugs”.

Cremos que isso se atribua pelo fato do Interbase ser umproduto Open Source, que numa grande parcela desses produtos,não fica muito claro quem é responsável pela sua continuidade. Aprópria Borland não sabe bem se continua com o projeto OpenSource ou o transforma num produto comercial. Nos faz crer quedesistiu de continuar com ele. Tudo indica que e o Interbase será

Quem usa Interbase noMundo?

comercial mesmo e seu sucessor Open Source será o Firebirddesenvolvido pela mesma equipe de Interbase e que agora sejunta numa nova empresa.

Enfim, aquela idéia do “quase de graça”, ao mesmo tempo emque é uma vantagem, acaba por trazer uma certa desconfiança eincerteza.

Embora seja certo que o projeto Open Source é mesmo oFirebird (Código Aberto ou seja: você economiza por não investirna compra do produto, que está disponível a quem se interessar,mas se compromete a abrir seu código a todos por reciprocidade,mas abordaremos o assunto em outra oportunidade) a dúvidaque permanece é realmente sobre o futuro (continuidade) eprincipalmente quem dará respaldo a esse futuro usando oproduto.

Nesse artigo tentaremos tranquilizar nossos leitoresapresentando dados que foram tirados da própria Borland e doInterbase Unoffcial Site que poderá ajudar muito o leitor nadecisão.

O Borland apresenta as seguintes empresas como usuáriasdo Interbase:

· Motorola

BANCO DE DADOS

Page 11: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 11

BANCO DE DADOS

· Nokia· MCI· Northern Telecom· Bear Stearns· The Money Store· The US Army· NASA· Boeing

Como vocês podem ter percebido não são empresasdesconhecidas, ao contrário, são poderosas e dignas do maiorcrédito.

Já o Interbase Unoffcial Site vai mais fundo, apresentandoas empresas usuárias e fazendo uma breve descrição de suasaplicações. Põe também a disposição mais informações sobre aempresa usuária, divulgando seus respectivos sites. Interessantenão? Bem, nós achamos que seria útil e ajudaria aos indecisos eaqui publicamos alguns resumos dessas empresas para que vocêavaliasse e até quem sabe pudesse solicitar mais informaçõessobre elas.

Distributel Communications Limited – Canada

Somos uma empresa de telefonia internacional. Fomos aprimeira empresa a vencer a líder Bell na justiça pela aberturade mais mercado abrindo caminho para uma maior competição.

O Interbase é usado por nossa empresa, para prover emtempo real, sistemas bancos de dados 24X7 com mais de 300 GBde dados online, abrangendo dois estados canadenses em trêsescritórios, incluindo uso automático e humano desses dados comequalização por falha e replicação de dados.

Visite: http://www.distributel.ca

U.S. Army, 40th Signal Battalion. (40o. Batalhão deSinalização do Exército Americano)

Nós optamos por migrar para um aplicativo Open Source.Nossa intranet é chamada “The Team 40th WorkWeb” (A Equipede Desenvolvimento WEB do 40º). Embora esteja ainda emdesenvolvimento já se encontra em fase final e será utilizada pormais de 300 usuários. Interbase, foi escolhido pelo seu baixo custooferecido por ser Open Source, multiplataforma, disponibilidadealém de contar com suporte terceirizado.

T.I.P. Group S.A. – France

Usamos o Interbase desde a versão 5.0 e agora

exclusivamente na versão 6.0. Somos desenvolvedores deaplicativos administrativos, financeiros e contábeis integradosvoltados para pequenas e médias empresas. Interbase acomodaperfeitamente as necessidades de nosso mercado.

Visite: http://www.tipgroup.com

Garrett Liners, Inc. – USA

Somos uma empresa fabricante de piscinas em vinil,localizda em Trenton, NJ, USA. Usamos Interbase paraarmazenar todos os nossos dados, desde que migramos do Pradoxhá 1 ano e meio atrás.

Usamos programas desenvolvidos em Delphi, acessando abase de dados para emitir Ordens de Produção, dados técnicos deprodutos, administrativo e financeiro e controle de estoque.

Visite: http://www.garrettliners.com/

Estes e outros depoimentos estão no endereçohttp://www.cvalde.com/WhoUsesIB.htm do Interbase UnoffcialSite. Dá uma chegadinha lá, é um site bem simples masinteressante.

Leia mais depoimentos e informações detalhadas sobre essase outras empresas. Se achar interessante, coloque o seudepoimento também, para que outros usuários tambémconheçam seu trabalho.

Infelizmente o conteúdo está todo em inglês, por issotraduzimos alguns que achamos interessantes.

Se desejarem, numa próxima ocasião podemos traduzir maisalguns. Pretendemos também buscar as empresas que seutilizam no Brasil e divulgá-las em artigos futuros.

Bem por hoje é só, esperamos que gostem.

Oswaldo Salzano Filho

[email protected] Salzano Filho é diretor da Automatech, onde é

responsável pelos cursos profissionais. É DBA há oito anos utilizando Oracle, SQL Server e

Interbase.Profissional experiente com passagens em empresas como

Citibank N.A., Rede Record e Indústrias Villares.É também um dos responsáveis pelo site

www.devclub.com.br, voltado a comunidade de alta tecnologia.

Page 12: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE12

SANT’ANNA

Na primeira parte desta série de dois artigos vimos comocriar componentes na plataforma .NET em C#. Neste artigoveremos como acrescentar propriedades e eventos aoscomponentes.

Recomendamos que o leitor leia a primeira parte deste artigo.

Propriedades e atributos

Podemos acrescentar uma propriedade ao componente criadoanteriormente para permitir campos em branco. Note algunsatributos para controlar seu comportamento em tempo de edição:

using System;using System.Windows.Forms;using System.ComponentModel;. . .// TextBox que valida dataspublic class DataTextBox: TextBox {// Campo que armazena o valor da propriedadeprivate bool FAceitaBranco = true;// Controla comportamento no editor de propriedades[DefaultValue(typeof(string), “True”),

Description(“Aceita campos em branco”),Category(“Validação”)]

public bool AceitaBranco {get {return FAceitaBranco;

}set {FAceitaBranco = value;

}}

// Intercepta eventoprotected override void OnLeave(System.EventArgs e) {

base.OnLeave(e);try {if ((this.Text == “”) && FAceitaBranco) {return;

}else {Convert.ToDateTime(this.Text);

}}catch (FormatException) {// Segura o foco em caso de errothis.Focus();

}}

}

No exemplo acima adicionamos os seguintesatributos:

· DefaultValue(typeof(string), “True”): Indica o valor default dapropriedade. Quando a propriedade tem o valor default, ela não éarmazenada no código criado pelo Visual Studio no métodoInitializeComponents. Além disto, a opção de menu Reset, disponívelquando você clica com o botão direito sobre o valor no editor depropriedades, estará sempre desabilitada;· Description(“Aceita campos em branco”): Texto que aparece na parteinferior do editor de propriedades quando a propriedade éselecionada;· Category(“Validação”): Categoria da propriedade, quando o editorestá ordenado por categoria; caso não seja suprido a categoriaserá Misc.

Existem diversos outros atributos para facilitar a interaçãodo componente com o ambiente de desenvolvimento, como porexemplo definição de propriedade default, editores de propriedadese editores de componente.

Criando Componentes VisuaisParte 2

Por Mauro Sant’Anna ([email protected]). Mauro é um “MSDN Regional Director”, consultor e instrutor da MASInformática (www.mas.com.br), tendo ministrado treinamentos na arquitetura .NET desde outubro de 2000.

Page 13: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 13

SANT’ANNA

Temos também uma propriedade para indicar se um campovazio pode ser aceito.

Delegates e Events

Delegates

Um delegate é uma espécie de “ponteiro de função orientado aobjetos”. Na verdade, um delegate pode conter uma lista demétodos a serem chamadas. Os delegates são usados pelo .NETFramework para associar “acontecimentos” nos componentes amétodos que os tratam.

Veja o método InitializeComponent mantido pelo Visual Studio eobserve o uso de delegates:

#region Windows Form Designer generated code/// <summary>///Required method for Designer support-do not modify/// the contents of this method with the code editor./// </summary>private void InitializeComponent() {. . .//// button1//this.button1.Location = new System.Drawing.Point

(8, 8);this.button1.Name = “button1”;this.button1.TabIndex = 0;this.button1.Text = “button1”;this.button1.Click += new

System.EventHandler(this.button1_Click);//// button2//this.button2.Location = new System.Drawing.Point

(88, 8);this.button2.Name = “button2”;this.button2.TabIndex = 1;this.button2.Text = “button2”;this.button2.Click += new

System.EventHandler(this.button2_Click);this.button1});

. . .}#endregion

Os delegates são tipos.Podemos criar instâncias destes tipos para gerenciar a

associação de acontecimentos a métodos.

Events

Uma variável de um tipo delegate não aparece no editor depropriedades. Para que ele apareça, ele deve ser um event, comomostrado a seguir. A palavra reservada event é que permite que ocampo seja gerenciado em tempo de desenvolvimento como umevento.

Veja em exemplo de um componente com um event. Note que otipo de um event é sempre um delegate, no caso um já existente:

using System;using System.Windows.Forms;using System.ComponentModel;. . .// TextBox que valida dataspublic class DataTextBox: TextBox {// Evento. Estamos usando um delegate existente[Description(“Chamado em caso de erro de

validação”), Category(“Validação”)]public event EventHandler ErroConversao = null;private bool FAceitaBranco = true;// Controla comportamento no editor de propriedades[DefaultValue(typeof(string), “True”),

Description(“Aceita campos em branco”),Category(“Validação”)]

public bool AceitaBranco {get {return FAceitaBranco;

}set {FAceitaBranco = value;

}}

virtual protected void OnErroConversao(EventArgs e) {// Verifica se o delegate foi associadoif (ErroConversao != null) {// Chama o delegateErroConversao(this, e);

}}// Intercepta evento

protected override void OnLeave(System.EventArgs e) {base.OnLeave(e);try {if ((this.Text == “”) && FAceitaBranco) {return;

}else {

Page 14: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE14

Convert.ToDateTime(this.Text);}

}catch (FormatException) {// Segura o foco em caso de errothis.Focus();// Chama método que dispara delegateOnErroConversao(new EventArgs());

}}

}

Podemos criar um novo tipo de delegate para passar os dadosdos tipos que desejarmos:

// Delegate que passa informações quando do erro de// validaçãopublic delegate void ErroValidacao(object sender,

string Msg);public class DataTextBox: TextBox {[Description(“Chamado em caso de erro de

validação”), Category(“Validação”)]public event ErroValidacao ErroConversao = null;private bool FAceitaBranco = true;// Controla comportamento no editor de propriedades[DefaultValue(typeof(string), “True”),

Description(“Aceita campos em branco”),Category(“Validação”)]

public bool AceitaBranco {get {return FAceitaBranco;

}set {FAceitaBranco = value;

}}virtual protected void OnErroConversao(string Msg) {if (ErroConversao != null) {ErroConversao(this, Msg);

}}// Intercepta evento

protected override void OnLeave(System.EventArgs e) {base.OnLeave(e);try {if ((this.Text == “”) && FAceitaBranco) {return;

}else {Convert.ToDateTime(this.Text);

}}catch (FormatException) {// Segura o foco em caso de errothis.Focus();OnErroConversao(“Data inválida”);

}}

}

O delegate acima não segue a convenção da .NET Frameworkde passar os dados adicionais sempre em uma classe derivada deSystem.EventArgs. Na verdade, sugerimos que esta convenção sejaseguida, o que nos leva ao seguinte código:

// Classe para conter dados adicionais do eventopublic class MeusArgs: System.EventArgs {// Cria instânciapublic MeusArgs(string Msg) {this.Msg = Msg;

}// Dado adicional do eventopublic string Msg;

}// Delegate que passa informações quando do erro de// validaçãopublic delegate void ErroValidacao(object sender,

MeusArgs e);// TextBox que valida dataspublic class DataTextBox: TextBox {[Description(“Chamado em caso de erro de

validação”), Category(“Validação”)]public event ErroValidacao ErroConversao = null;private bool FAceitaBranco = true;// Controla comportamento no editor de propriedades[DefaultValue(typeof(string), “True”),

Description(“Aceita campos em branco”),Category(“Validação”)]

public bool AceitaBranco {get {return FAceitaBranco;

}set {FAceitaBranco = value;

}}virtual protected void OnErroConversao(MeusArgs e) {// Verifica se o delegate foi associadoif (ErroConversao != null) {// Chama delegate

SANT’ANNA

Page 15: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 15

ErroConversao(this, e);}

}// Intercepta evento

protected override void OnLeave(System.EventArgs e) {base.OnLeave(e);try {if ((this.Text == “”) && FAceitaBranco) {return;

}else {Convert.ToDateTime(this.Text);

}}catch (FormatException) {// Segura o foco em caso de errothis.Focus();OnErroConversao(new MeusArgs(“Data inválida”));

}}

}

Nota aos programadores DelphiQuem tem experiência no desenvolvimento de componentes

para Delphi deve estar achando as similaridades surpreendentes.De fato, o modelo de desenvolvimento de componentes no .NETFramework é praticamente idêntico ao do Delphi. Na verdade, o.NET Framework pegou o modelo o Delphi e o melhorou emvários aspectos:· Os eventos em .NET podem chamar uma lista de métodos enão apenas um único método como no Delphi;· Existe um controle bem fino da interação do componentecomo a ferramenta de desenvolvimento através de atributos;· A palavra reservada event “liga” o mecanismo de edição deeventos; no Delphi precisávamos definir uma propriedade de umtipo procedural.

ConclusãoA criação de componentes no .NET Framework não é

nenhum bicho de sete cabeças. Ela exige algum conhecimento deOOP, mas ainda assim é relativamente fácil modificarligeiramente um componente para atender às nossasnecessidades.

SANT’ANNA

Page 16: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE16

DELPHI

DataSnapServidor de Aplicação COM+

Parte IVAnderson Haertel Rodrigues

IntroduçãoIremos nesse 4o artigo dar início a criação do servidor de

aplicação COM+ para o nosso estudo e implementação. Após 2artigos ensinando e mostrando conceitos, um artigo de iniciação,apresentação e estudo de Interfaces, iremos finalmente iniciar acriação de uma aplicação DataSnap.

Antes de iniciarmos os nossos estudos sobre DataSnap devopedir para você ler o arquivo sobre as licenças do DataSnap, quepode ser encontrado no Deploy.txt no diretório do Delphi e ouverificar no site da Borland - www.borland.com. Está documentaçãoé valida para as versões anteriores ao Delphi 7. No Delphi 7, oDataSnap (Ex-MIDAS) é free, isto é, não é mais necessário opagamento de licença por servidor.

Iniciaremos nossos estudos e criação com o protocolo COM+.Mãos a obra e vamos abrir o Delphi 6 Update Pack 2 e ou Delphi7, conforme Figura (1).

Figura 1: Delphi 6 Upate Pack 2. O exemplo pode ser feitotambém no Delphi 7.

Servidor de Aplicação

Como já citado, o servidor de aplicação é a camada do meioescrita no DataSnap com suporte aos protocolos já apresentadosno 2o artigo.

Servidor de Aplicação COM+

Vá até o menu File|New|Other, veremos a seguinte Figura (2):

Figura 2: Guia Multitier com Transactional Data Module(COM+).

Após escolher a opção Transactional Data Module vamos tera Figura (4).

Nota: Se tivermos com um projeto aberto, mesmo que vazio,será mostrada a seguinte mensagem na tela:

Page 17: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 17

DELPHI

Figura 3: Mostra uma mensagem dizendo que o projeto atualnão é uma Library ActiveX. Clicando em OK, você estaráfechando o projeto atual e o Delphi criará um novo projetodemonstrado na figura 4.

Figura 4: Formulário com os parâmetros para criação doservidor de aplicação COM+.

Escolha as opções apresentadas acima e clique em Ok. Mais afrente eu explicarei com detalhes o que é cada opção demonstradana Figura (4).

Antes de iniciar as explicações sobre as opções acima, vamoscriar nossa estrutura de diretórios para os nossos exemplos deServidor COM+ e mais adiante, do Cliente COM+. Tambémcriaremos o diretório da Base de Dados:

C:\DataSnap\ServidorC:\DataSnap\BancodeDadosC:\DataSnap\Cliente

Peço para você salvar o projeto e a unit com os seguintesnomes: Projeto = ServerCOMPlus.dpr e a Unit =RDMConexao.pas no diretório C:\DataSnap\Servidor.

Type Library

Neste momento também é gerado um arquivo com o nome donosso projeto+_TLB.pas (ServerCOMPlus_TLB.pas). Onde nessearquivo se encontram as declarações da Type Library, as

Interfaces, as Interfaces de despacho, as GUID´s geradas pela Delphi,etc. Não é recomendada a manutenção direta desse arquivo. Omesmo deve ser feito através da Type Library do Delphi. Com onosso servidor de aplicação ativo, devemos ir até: View|TypeLibrary para encontrarmos a Type Library no Delphi. A mesmase encontra na Figura (5): Nessa figura vemos a Interface e aCoClass que definimos na criação do nosso servidor COM+.

Figura 5: A Type Library do Delphi.

Através da utilização da Type Library que o Delphi irádeterminar quais os objetos e as interfaces que estão sendoexpostas pelo Servidor de Aplicação para que outros objetospossam utilizá-los. A Type Library contém a referência para o(s)objeto(s) que um servidor COM está expondo, qual(is) a interface(s)e qual(is) a(s) interface(s) de despacho que cada objeto expõe,qual(is) o(s) método(s) e propriedade(s) que cada interface possui,qual(is) o(s) parâmetro(s) e o(s) tipo(s) de parâmetro(s) e, oretorno que este(s) método(s) possui(em).

As opções disponíveis na figura 4.

CoClassÉ a classe que herda de TMtsDataModule e implementa a

interface IServer_COMPlus.Ela é que implementa a Interface COM+. É essa interface que

interage com o nosso Objeto. Não utilize espaços no nome daClasse. A mesma é demonstrada sucintamente na Listagem 1:

TServer_COMPlus = class(TMtsDataModule,IServer_COMPlus)

Listagem 1: A declaração da Classe e a implementação daInterface do nosso servidor COM+.

A Interface IServer_COMPlus;

A CoClass Server_COMPlus;

Page 18: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE18

DELPHI

A Interface IServer_COMPlus está declarada em:ServerCOMPlus_TLB.pas, do qual, já foi citado que não devemosmodificá-la diretamente. Antes de olharmos a opção ThreadingModel, devo explicar de forma sucinta o que é uma Thread.

Thread

Para explicar Thread devo explicar o que é um processo.Processo é algo que está sendo executado pelo S.O. e queobrigatoriamente contém um ou mais Threads. Sendo que, omesmo sempre conterá pelo menos um Thread, chamado deThread Principal. Pense em processo como uma nova instânciado seu aplicativo!

Ta, mas o que é Thread afinal?

R: Thread é um fluxo de controle em um programa.Um exemplo é a carga do Windows 2000, enquanto o mesmocarrega a Interface gráfica, outras Threads são responsáveis porinstanciar serviços, fazendo com que a carga do S.O. fique maisrápida. Nesse processo não são alocados maiores recursos, já queo mesmo, estará usando a CPU e não o IO Bound.

Normalmente nossos sistemas são escritos usando apenas aThread Principal.

Threading Model - da Figura 4

Determina como serão as chamadas feitas pelo Cliente(execução dos métodos) para o servidor. Veremos as três opçõessuportadas pelo COM+: Single, Apartment e Both:

√ Single - Neste caso, não há suporte a processamentobackground (Thread). As solicitações são serializadas peloservidor de aplicação e executadas uma de cada vez.Neste caso, não podem existir dois ou mais clientes requisitandoinformações e só haverá uma instância do RDM;

√ Apartment - O Cliente só pode realizar uma operação por vez,mas, o servidor de aplicação pode receber várias solicitações declientes distintos.Nesta opção, uma instância do RDM não enxergará as outrasinstâncias RDM;

√ Both - Indica que o nosso RDM poderá receber váriassolicitações de vários clientes ao mesmo tempo e poderão existirmais de uma instância do RDM ao mesmo tempo conversandouma(s) com a(s) outra(s).É com essa opção que também trabalhamos com Pooling deobjetos;

Transaction Model

√ Requires a Transaction - Indica que o Objeto requer umatransação. Se houver uma transação ele inclui o objeto nessatransação, caso não haja, ele cria uma nova;

√ Requires a new Transaction - Objeto requer sempre umanova transação;

√ Support Transactions - O Objeto suporta transações. Seexistir uma transação já criada o objeto é inserido nela, casocontrário, não é criada uma nova transação para o mesmo. Isto é,rodará sem transação. A responsabilidade do mesmo rodar emtransação neste caso é da chamada do Cliente;

√ Does not support transaction - O Objeto não suportatransações. Mesmo que o Objeto seja instanciado através de umatransação, o mesmo rodará fora do contexto de uma transação;

√ Ignore Transactions - Semelhante a Does not SuportTransaction, mas, para suporte a COM+;

Conforme a figura 4, para o nosso exemplo será escolhido(a)as seguintes opções:

CoClass = Server_COMPlus;Threading Model = Both;Transaction Model = Required a new transaction;

Figura 6: O RDM que é responsável pela conexão com o Banco deDados.

A Figura 6 mostra o RDM com o componente SQLConnectionda dbExpress que se encontra na guia dbExpress do Delphi 6 eou do Delphi 7.

Nota: A dbExpress é a nova engine de acesso a dados daBorland apartir do Delphi 6. Ela veio para substituir a BDE.

Remote DataModule

Um RDM é um DataModule. Opa?!, na verdade um RDM éum objeto COM em formato de DataModule, onde, o mesmousará os recursos do COM+. O RDM estará em outro computadore neste cenário já temos o que chamamos de aplicação 3

Page 19: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 19

DELPHI

Camadas. Nesse momento entram em ação os protocolos citadosno 2o artigo (DCE/RPC-RFC-Stack). É no RDM que colocamostodas as nossas regras de negócios, seja um cálculo de juros deuma conta a receber, constraints e o acesso a Base de Dados.Lembre-se do que foi explicado no 2o artigo, o Servidor deAplicação faz o acesso de via mão dupla tanto para o Servidor deBanco de Dados quanto para o Cliente e, o cliente acessa apenas oServidor de Aplicação.

É no RDM que se encontra todos os componentes de acesso aDados, no caso da dbExpress o SQLDataSet, SQLStoredProc,SQLQuery, SQLMonitor e o DataSetProvider que não faz parteda dbExpress e que é encontrado na Guia DataAccess do Delphi 6e ou Delphi 7.

DataSetProvider

O DataSetProvider é um dos alicerces de uma aplicação 3Camadas. Na verdade, eu também posso utilizar oDataSetProvider no desenvolvimento de sistemas Cliente/Servidor.

É ele o responsável em prover dados as requisições dasaplicações Clientes e atualizar os dados ao DataSet associado noServidor de Banco de Dados. Este processo é conhecido comoDataPacket. Um pacote de dados é um bloco de dados que vai doservidor de aplicação para o Cliente e do Cliente para o Servidorde Aplicação. É também do DataSetProvider a responsabilidadede empacotar e desempacotar os dados que serão recebidos daaplicação Cliente. Para esclarecer mais escrevo o seguinte:

√ O DataSetProvider executa a consulta no Servidor de Bancode Dados e atualiza os Dados no Servidor de Banco de Dados;

√ O DataSetProvider envia os DataPackets para o Cliente erecebe o DataPackets do Cliente;

O Cliente nesse caso (além do nosso executável) é o famosoClientDataSet que será explicado com mais detalhes na hora decriarmos a aplicação Cliente.

O RDM que acabamos de criar irá servir para a conexão como Banco de Dados. Iremos criar um outro RDM para fazermosrealmente a consulta e a atualização aos Dados no Banco deDados.

Nota: O Outro RDM iremos criar no próximo artigo.

Nesse momento iremos criar a nossa conexão com o Banco de

Dados FireBird 1.0 (FireBird é a continuação do InterBase OpenSource e é mantido pela comunidade FireBird. Você obtémmaiores detalhes sobre o produto no seguinte site:www.ibphoenix.com). Podemos também utilizar o InterBase 6.0para o nosso exemplo.

Os nossos exemplos também podem ser criados usando outroBanco de Dados, seja ele o Oracle e ou SQL-Server 2000, pois, oScript de criação dos Objetos do Banco de Dados deve funcionarem Qualquer um dos dois Bancos de Dados citados, por que, euusarei o SQL-Ansi para a criação dos Objetos. O exemplo citado,não rodará apenas no SQL-Server 7, pois, o mesmo, não oferecesuporte a Foreign Keys em Cascata. Esse recurso, foiimplementado na Versão 2000 do Produto. Para criarmos oexemplo usando Oracle, devemos escolher o Oracle na criação daconexão com o Banco de Dados. Para criarmos o exemplo usandoo SQL-Server 2000, devemos procurar pelos Drivers de Acesso doSQL-Server a dbExpress escrito por terceiros para o Delphi 6 ou,usarmos o novo Drive de acesso ao SQL-Server 2000 que veiojunto com o Delphi 7.

Criando nosso Banco de Dados de Exemplo

Antes de continuarmos com o nosso estudo e exemplo deDataSnap necessitamos criar o nosso Banco de Dados deexemplo. Abra o IBConsole (ferramenta de Administração queacompanha o InterBase e ou o FireBird), crie um Banco de Dadoscom o nome de: ExemploCOMPlus.GDB (Dialect 3) e coloque omesmo no seguinte diretório: C:\DataSnap\BancodeDados, apósisso, execute o script abaixo para a criação das tabelasnecessárias para os nossos exemplos, conforme Listagem 2:

CREATE TABLE TAB_ATIVIDADES ( ID INTEGER NOT NULL, DESCRICAO VARCHAR(50));

CREATE TABLE TAB_PARCEIROS ( ID_PARC INTEGER NOT NULL, NOME VARCHAR(50), CNPJ CHAR(18), INSC_EST CHAR(11));

CREATE TABLE TAB_PARCEIROS_CONT ( ID_PARC INTEGER, ID SMALLINT NOT NULL, NOME_CONTATO VARCHAR(50) NOT NULL, TEL_CONTATO VARCHAR(25), EMAIL_CONTATO VARCHAR(35));

CREATE TABLE TAB_PARCEIROS_REFER (

Page 20: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE20

DELPHI

ID_PARC INTEGER NOT NULL, TP_REF CHAR(1), ID SMALLINT NOT NULL, NOME_REF VARCHAR(30) NOT NULL, COM_DT_ULT_COMPRA DATE, COM_VL_TT_COMPRA NUMERIC(18,2), COM_VL_PRESTACAO NUMERIC(18,2), COM_DT_VCTO_ULT_PARC DATE, BCO_AGENCIA VARCHAR(25), BCO_DT_ABERT_CONTA DATE, BCO_CHEQUE_ESP CHAR(1));

ALTER TABLE TAB_ATIVIDADES ADD CONSTRAINTPK_TAB_ATIVIDADES PRIMARY KEY (ID);

ALTER TABLE TAB_PARCEIROS ADD CONSTRAINTPK_TAB_PARCEIROS PRIMARY KEY (ID_PARC);

ALTER TABLE TAB_PARCEIROS_CONT ADD CONSTRAINTPK_TAB_PARCEIROS_CONT PRIMARY KEY (ID,NOME_CONTATO);

ALTER TABLE TAB_PARCEIROS_REFER ADD CONSTRAINTPK_TAB_PARCEIROS_REFER PRIMARY KEY (ID,NOME_REF);

ALTER TABLE TAB_PARCEIROS_CONT ADD CONSTRAINTFK_1014_1013 FOREIGN KEY (ID_PARC) REFERENCESTAB_PARCEIROS (ID_PARC) ON DELETE CASCADE;

ALTER TABLE TAB_PARCEIROS_REFER ADD CONSTRAINTFK_1015_1013 FOREIGN KEY (ID_PARC) REFERENCESTAB_PARCEIROS (ID_PARC) ON DELETE CASCADE;

COMMIT;

Listagem 2: A estrutura de tabelas para o nosso Banco de Dadosde Exemplo.

Com a estrutura de tabelas apresentadas acima poderemosexemplificar no lado Cliente as duas situações mais procuradaspor leitores:

Um cadastro simples (TAB_ATIVIDADES) e um cadastroMaster-Detail(TAB_PARCEIROS, TAB_PARCEIROS_CONT eTAB_PARCEIROS_REFER).

A estrutura indicada acima, será explicada com maioresdetalhes quando necessitarmos usar a mesma.

Conexão com o Banco de Dados

Com um duplo clique no componente SQLConnection que seencontra no nosso RDM de conexão irá aparecer a seguinteFigura (7):

Figura 7:O formulário onde iremos configurar a nossa conexão com oBanco de Dados.

Vamos ir até a opção com a imagem de um botão com sinal de

(+) neste momento irá aparecer a seguinte Figura (8):

Figura 8: O formulário onde criaremos um nome de conexãoe a escolha do driver para acessar o Banco de Dados.

Na opção Driver Name vamos escolher: Interbase e na opçãoConnection Name vamos colocar: ServidorIB_COMPlus.Conforme explicado mais acima, você pode escolher outro Driverpara acesso ao seu Banco de Dados. Clique em Ok.

Após isso, executamos um duplo clique no componente deconexão novamente para podermos modificar a opção Database ecolocarmos o seguinte caminho de diretório:C:\DataSnap\BancoDados\ExemploCOMPlus.gdb teremos nossaconexão com a dbExpress pronta conforme a Figura (9):

Page 21: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 21

DELPHI

Figura 9: Nossa conexão com a dbExpress pronta.

Clique em Ok. Vamos até o Componente SQLConnection quese encontra no nosso RDM e configuremos a opção LoginPromptpara False e Connected para True. Pronto! Temos nossa conexãocom Banco de Dados InterBase conforme a Figura (10):

Figura 10: O Object Inspector mostrando a nossa Conexão com oBanco Ok.

Finalizando

No evento OnCreate() do nosso RDM escreva as seguinteslinhas, Listagem 3:

procedure TServer_COMPlus.MtsDataModuleCreate(Sender:TObject);

begin Pooled := True; SQLCnctnBASE.LoadParamsFromIniFile(‘dbxconnections.ini’);end;

Listagem 3: O evento OnCreate do RDM de Conexão.

Setando a propriedade Pooled para True, estamos indicandoque o nosso RDM oferece suporte a Pooled. Para isso temos defazer o seguinte também:

View|Type Library escolher nossa CoClass e ir até a GuiaCOM+, devemos ter a seguinte Figura (11):

Figura 11: A configuração do nosso Objeto COM+.

Marque a opção Object Pooling e digite (apenas um exemplo)10000 para Creation Timeout e para Call Syncronization escolha:Required

Feche a janela. Note que não existe uma confirmação dasmodificações feitas, mas, tudo foi salvo!

A segunda linha de código da Listagem 3 indica a dbExpressque estamos fazendo o Load das configurações do Banco de Dadosem Runtime. Podemos com essa linha modificar o lugar do nossoBanco de Dados sem a necessidade de re-compilar o nossosistema.

Saliento que, para sistemas 3 Camadas, o arquivodbxconnections.ini deve estar no mesmo diretório onde seencontra o seguinte arquivo: DLLHOST.EXE

Feito tudo isso, necessitamos agora criar nosso Objeto COM+no Component Services do Windows 2000 e ou Windows XP. Paraisso, vá em: Run|Install COM+ Objects que deve aparecer aseguinte Figura (12):

Figura 12: A instalaçãodo nosso Objeto COM+.

Page 22: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE22

DELPHI

Marque a opção mostradaapós isso irá aparecer maisuma Figura (13):

Figura 13: O nome doObjeto e informaçõesadicionais.

Escolha a guia Install into new Application. Em ApplicationName coloque: Exemplo_COMPlus e se você quiser fornecer umadescrição do objeto o faça no Memo Description. Clique em OK,em OK novamente, e o nosso objeto deve ter sido criado comsucesso no Component Services do Windows 2000 e ou XP. AFigura (14) mostra nosso Objeto criado no Component Services:

Figura 14: O Objeto COM+ criado com sucesso no ComponentServices

Conclusão

Criamos nesse 4o artigo o nosso servidor de aplicação COM+.Foi mostrado também, o que significa cada opção da criação doServidor de Aplicação e também foi mostrado e explicado osprincipais conceitos envolvidos no processo de criação do nossoservidor de Aplicação COM+.

No próximo artigo, iremos mesclar as coisas, isto é, daremosenfoque na criação da parte Cliente, mas, também irei mostrar oque significa todos os componentes da Guia DataSnap do Delphi6 e 7, criaremos o Login de Conexão com o Banco de DadosFireBird.

Sucesso e Saúde a todos!Um Abraço.

Anderson Haertel Rodrigues

Consultor em desenvolvimento de Sistemas Client/Server-MultiCamadas/DataSnap.

Oferece treinamentos para empresas em: InterBase, SQL-Server,Delphi e COM+.

[email protected] - [email protected]ópolis - Santa Catarina - Brasil.

Page 23: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 23

O que há de novo noDELPHI 7

DELPHI

O Delphi 7 inclui novas características e atualizações nasseguintes áreas:

� Mudanças no IDE� Mudanças na tecnologia Web (Nas versões Professional eEnterprise)� Mudanças no COM� Mudanças na tecnologia de Banco de dados� Mudanças no Runtime Library� Mudanças no compilador� Suporte ao Rave Reports� Suporte ao ModelMaker� Mudanças na documentação

Se você está fazendo uma atualização de outra versão doDelphi, veja “Compatibilidade e atualização” neste artigo.

Mudanças no IDE

O IDE tem novas características nas seguintes áreas:

Mensagens de compilação� O novo View | Additional Message Info mostra a janelaMessage Hints na qual você pode fazer download e visualizarinformações sobre as mensagens do compilador a partir do site daBorland.� O novo Project | Options | Compiler Messages dá a você umgrande controle sobre quais mensagens de aviso do compilador

serão geradas.Mudanças na paleta de componentes

� Aqui há uma nova versão do CLX na página de sistemaquando você abre uma aplicação CLX no Delphi. Ela inclui váriosdiretórios e componentes de arquivos. Em versões anteriores, apágina System era exibida somente para aplicações VCL eincluía componentes de acesso a nível de sistema.� As novas páginas Indy Intercepts e Indy I/O Handlersfornecem componentes de protocolo Internet de código aberto.(Nas versões Professional e Enterprise)� As novas páginas IW Standard, IW Data, IW Client Side, eIW Control fornecem componentes IntraWeb paradesenvolvimento de aplicações para Web.� A nova página Rave fornece componentes para adicionar ageração de relatórios em suas aplicações.� Se uma página de componentes pode ser roladahorizontalmente para mostrar ícones adicionais, um novo menudrop-down pode também ser usado para listar os itens adicionais.

Mudanças no Code Insight

� A complementação do código está mais rápida e deixa no seubrowser a declaração dos itens na lista de complementação docódigo pelo uso do Ctrl+click ou qualquer identificador na lista.� Novo código de complementação HTML mostraautomaticamente elementos válidos do HTML e atributos noeditor de código. (Somente nas versões Professional e Enterprise).

Page 24: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE24

� Você pode criar complementação de código personalizada pelouso das APIs OpenTools. Veja “Extending the IDE” no help onlinedo Delphi para maiores informações.� A página Tools | Editor Options | Code Insight deixa vocêajustar as cores para os símbolos mostrados nos utilitários doCode Insight.

Mudanças no Debugger

� O Watch List agora tem:� - Múltiplos tabs, permitido que você organize os watches emgrupos distintos para fácil depuração. Para adicionar um grupo,clique com o botão direito no Watch List e selecione Add Group.� - Uma coluna Watch Name e uma coluna Value. Paraesconder/mostrar o cabeçalho das colunas, clique com o botãodireito no Watch List e selecione Show Column Headers.� - Um checkbox para habilitar/desabilitar watchesindividuais.� A página Tools | Debugger Options | Event Log tem asseguintes novas opções:� O uso de Event Log Colors deixa você mostrar diferentes tiposde mensagens de evento com cores no log.� O módulo de mensagens escreve uma mensagem no log cadavez que um módulo (exe, dll, ocx, etc) é lido ou descarregado peloprocesso que você está depurando. Previamente, a opção demensagens Process controla quais destes eventos serão logados.� O dialog Box Run Parameters tem uma nova opção, WorkingDirectory, que permite que você especifique o nome do diretóriousado para o processo de depuração.

Melhorias adicionais

� A partir do Project Manager, você pode compilar parcialmenteprojetos com um grupo clicando com o botão direito em qualquerprojeto e escolhendo Make All from Here ou Build All from Here.� O Message View tem tabs múltiplos para mostrar diferentestipos de mensagens (Build, Search, e assim por diante).� Co comando View | Component List deixa você selecionarvários componentes pressionando a tecla control.� A nova página Tools | Editor Options | Source Options deixavocê:� - Ajustar diferentes opções do editor para diferes tipos defontes, como Pascal, C++, C#, HTML e XML.� - Mostra os caracteres tab e space no editor de código.� - Edita os modelos de código� Várias destas novas opções estão formalmente na páginaGeneral, Display e Code Insight no dialog Box do EditorProperties.� A página Tools | Editor Options | Color tem duas novasopções, Foreground Color e Background Color, no lugar de um

color grid, para ajuste de cores no editor de código.� Pressionando Alt+Page Down e Alt+Page Up cria-se umcírculo através de visualizações como o editor de código, WatchWindow e Message View. Estas teclas de atalho estão incluídas nomapeamentos de teclas de Default, IDE Classic e Brief.� O Delphi agora mostra um menu de dois tons.

Mudanças na tecnologia de Web (Professional eEnterprise)

� O Delphi agora inclui o IntraWeb da AtoZed Software. Vocêpode usar o IntraWeb para desenolver aplicações Web usandoutilitários form padrão. Você também pode usar o IntraWeb paradesenvolver páginas para o Web Broker e aplicações WebSnap.Para maiores informações veja “Creating Web Serverapplications using IntraWeb” no Developer’s Guide ou no helponline. A edição Enterprise do Delphi inclui o produto IntraWebcompleto. A edição Professional inclui um subset do produtoIntraWeb.� O Delphi aogra suporta o Apache 2 para o Web Broker,WebSnap e SOAP.

Web Services

Novo browser UDDI� O WSDL Import Wizard tem um novo Universal Description,Discovery, e Integration (UDDI) que permite que você procureum registro UDDI para um Web Service e importe o endereçopara o documento WSDL.

Soap Headers

� Novas classes e interfaces permitem que você leia ou insiracabeçalhos dentro de envolpes SOAP que transmitem mensagensentre clientes e servidores. Para maiores informações veja“Defining and using SOAP headers” e “Processing headers inclient applications” no Developer’s Guide ou no help online.

Attachments� Aplicações Web Services (ambas cliente e servidor) podemagora apontar anexos. Anexos (descendentes TSOAPAttachment)são enviados com mensagens codificadas SOAP como parte deum formulário multiparte. Quando uma aplicação recebe oanexo, ela salva em um arquivo temporário, o qual é entãodisponibilizado para sua aplicação.

Suporte de tipos

� Você pode agora customizar a conversão entre classesremotas e sua representação SOAP anulando dois novos métodos

DELPHI

Page 25: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 25

virtuais que foram adicionados o TRemotable: ObjectToSOAP eSOAPToObject.� Objetos de exceção para exceções que ocorrerem quandoresponderem a um requisição de Web Service (instânciasERemotableException) agora contém mais informações sobre opacote SOAP com falha.� As definições de tipos são automaticamente registradas com otipo removível do registro quando você registra interfaceinvocável.� O TXSDecimal tem uma nova propriedade AsBcd para fácilconversão entre o XML e tipos nativos.Similarmente, o TXSHexBinary tem uma nova propriedadeAsByteArray.As classes removíveis que representam os valores de tempo aograpermitem que você trabalhe com segundos fracionais ao invés demilisegundos.

Outras atualizações

� Novos eventos no THTTPReqResp permite que vocêintercepte a mensagem http antes dela ser enviada, e monitore oprogresso enquanto envia o recebe longas mensagens.� O THTTPSoapPascalInvoker agora publica eventos quepermitem que você crie códigos para execução antes ou depois deinvocar a execução de método de chamada.� Você agora tem mais controle sobre o mapeamento entreinterfaces invocáveis e documenos WSDL. OTWSDLHTMLPublish agora publica vários eventos quepermitem que você controle o WSDL. Você também podeidentificar o mapeamento entre funções com o retorno de valorese o nome dos parâmetros, e o uso de namespaces, e as açõespadrão do SOAP. No lado cliente, codificação literal agora ésuportada bem como codificação no estilo RPC.� Uma nova interface, IRIOAccess permite que você acesse oobjeto da interface remota que implemntou a interface invocável.� A interface IOPConvert tem uma nova propriedade:Encoding. Isto permite que você especifique o conjunto decaracteres que será usado para codificar mensagens que sãopassadas entre o cliente e provedor de Web Service.� Não há mudanças no Web Services que afetem as aplicaçõesDataSnap. Para maiores informações veja “Database tecnologychanges (Professional e Enterprise Edtions)” na página 5.� O construtor TLinkedRIO agora automaticamente geraarquivos com nomes separados para cada método que vocêchama, tornando a depuração mais fácil.� O TOPToSoapDomConvert agora tem dois novos eventos quevocê pode usar quando está depurando ou deserializando pacotesSOAP.� Você pode agora usar métodos de anulação em interfacesinvocáveis que você definir.

Mudanças no COM (Professional e Enterprise Editions)Você pode usar o dialog box Import Type Library (Project |

Import Type Library) para criar uma CoClass para o .NET. Vocêpode usar o resultado como um servidor COM ordinário, usandoas características de interoperabilidade do Microsoft .NETFramework.

Mudanças na tecnologia de banco de dados

� Os drivers dbExpress tiveram uma atualização paraInformix SE, Oracle 9i, DB2 7.2, Interbase 6.5, e MySQL 3.23.49.Um novo driver está disponível para o MSSQL 2000.� Existem vários componentes novos e atualizados para bancode dados.� A Borland desaprovou o SQL Links: não serão feitasmelhorias para o SQL Links e ele não estará mais incluso noDelphi após 2002. A Borland recomenda que você use odbExpress para o acessar o banco de dados SQL Server comDelphi.

DataSnap (somente Enterprise Edition)

� Em aplicações DataSnap, o uso do IAppServer foi mudadopara IAppServerSOAP, o qual rompe muitas ambigüidades coma interfae IAppServer.A propriedade UseSOAPAdapter do TSoapConnection pode serusada para escrever clientes para servidores escritos em versõesanteriores do Delphi. O TSoapConnection também publica váriosnovos eventos para você customizar suas aplicações clientes emvários pontos do processo na execução de uma requisição de umWeb Service.� Você pode agora definir um módulo de dados específico emuma aplicação servidor que tenha vários módulos de dados. Use apropriedade SOAPServerIID ou adicione os módulos de interfacede dados no final da URL.� Você pode agora usar a conexão SOAP para chamarextensões da interface da aplicação servidora. Use a propriedadeSOAPServerIID e o método GetSOAPServer.� O DataSnap não suporta mais as conexões CORBA.

Mudanças no Component Library

Suporte aos temas do Windows XP (Professional e EnterpriseEditions)

As aplicações VCL agora incluem componentes que habilitamo suporte para controles comuns do Windows da versão 6. Suaaplicação irá usar automaticamente estes novos controles nossistemas com Windows XP se ela encontrar um arquivo de trocasde manifesto. Para maiores informações, veja o “Commoncontrols and XP themes” no Developer’s Guide ou no Help online.

DELPHI

Page 26: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE26

Nova unit

A nova unit DBClientActns contém três novos componentesde ação que trabalham com clientes de datasets:TClientDataSetApply, TClientDataSetUndo eTClientDataSetRevert.

Novos componentes

� A página dbExpress da paleta Component inclui oTSimpleDataSet para uar com aplicações de banco de dadossimples, e two-tier (o TSimpleDataSet substitui oTSQLClientDataSet).� A página Dialogs da paleta component inclui oTPageSetupDialog para fornecer uma página de ajuste dialogBox do Windows.� A página Additional da paleta Component inclui oTXPColorMap, TStandardColorMap e TTwilightColorMap paracolorir menus e barras de ferramentas.� A nova versão CLX da página System da paleta Componentfornece protocolos da Internet (Professional e Enterprise).

Componentes mudandos

� As versões do CLX de TOpenDialog e TSaveDialog foramexpandidas para suportar características adicionais como opreview de arquivos.� A versão VCL do TCustomForm tem duas novaspropriedades, ScreenSnap e SnapBuffer, as quais controlam seum formulário está na extremidade da tela quando o form émovido.� O TCustomComboBoxEx tem uma nova propriedadeAutoCompleteOptions que habilita um combo Box pararesponder as teclas do usuário.� Os objetos dialog do CLX que descendem do TOpenDialog eTQtDialog podem agora usar os Windows Common Dialogs nolugar de Qt Dialogs. Este comportamento é controlado pelapropriedade UseNativeDialog, o qual o padrão é true.

Mudanças no Runtime Library

Unit Classes� Uma nova classe de exceção, EFileStreamError, foiadicionada. EFileStreamError e EFOpenError descendem destaclasse. Esta nova classe talvez tenha o parâmetro FileName.Com resultado, a mensagem de exceção agora contém o nome doarquivo onde ocorreu o erro.� A classe TStrings tem duas novas propriedades,ValueFromIndex e NameValueSeparator.� Os métodos TThread.CheckThreadError foram promovidos

de privados para visibilidade protegida.

Unit Math A unit Math tem um novo parâmetro default, RaisePending,

na procedure ClearExceptions.

Unit StdConvsA unit StdConvs agora inclui “Stone” nas unidades de

medidas suportadas.

Unit StrUtils� A unit StrUtils contém as seguintes mudanças relacionadasao conjunto de caracteres multi-byte (MBCS):� - Anteriormente, cada um - LeftStr, RightStr, e MidStr –tinham um tipo de parâmetro AnsiString que retornava o tipo enão suportava strings MBCS. Cada uma destas funções foramsubstituídas por um par de funções de anulação, uma que pega eretorna AnsiString, e uma que pega e retorna WideString. Anova função aponta corretamente strings MBCS. Esta mudançaquebra o código que usam estas funções para guardar e recebervalores byte em AnsiStrings. Assim o código deve ser atualizadopara usar a as novas funções a nível de byte descritas abaixo.� - Novas funções LeftBStr, RightBStr, e MidBStr fornecemmanipulação a nível de byte antriormente fornecido por LeftStr,RightStr e MidStr.� - Novas funções AnsiLeftStr, AnsiRightStr e AnsiMidStr sãoas mesmas funções AnsiStr, LeftStr, RightStr e MidStr, excetoque elas não são anuláveis com funções WideString equivalentes.� A unit StrUtils tem novas funções de pesquisa de stringchamada PosEx.

Unit SysUtilsA unit SysUtils agora inclui overloads thread-safe das

rotinas que formatam e analisam números, valores de datas edinheiro. A novas rotinas são thread-safe porque elas obtém alocalização de informações de uma estrutura de dadosTFormatSettings ao invés de variáveis globais. A estrutura dedados deve ser publicada antes de ser usada; uma nova função,GetLocaleFormatSettings é fornecida para publicar a estruturade dados de um local específico.

Unit VarCmplxA unit VarCmplx tem novas funções: VarComplexLog2,

VarComplexLog10, VarComplexLogN,VarComplexTimesImaginary e VarComplexTimesReal.

Unit Variants� As funções VarIsError e VarAsError foram adicionadas.� A exceção EVariantError é agora a classe base para refinaras clasess que são lançadas de códigos variados.

DELPHI

Page 27: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 27

� Várias novos controles globais Variant foram adicionados:NullEqualityRule, NullMagnituderule, NullStrictConvert,NullAsStringValue e PackVarCreation.

Mudanças no compilador

O compilador do Delphi agora suporta três mensagensadicionais de aviso: Unsafe_Type, Unsafe_Code e Unsafe_Cast.Estes avisos são desabilitados por padrão, porém podem serhabilitados com a diretiva do compilador {$WARNUNSAFE_CODE ON}, chave de linha de comando do compilador(dcc32 –W+UNSAFE_CODE), e, no IDE, em Project | Options |Compiler Messages.

Estas características tem como intenção nos ajudar a portarnosso código para o ambiente de execução gerenciado daplataforma .NET da Microsoft. Em um ambiente de execuçãogerenciada, “unsafe” parece uma operação que não pode serverificada durante a analise estática feita pelo compilador JIT(Just In Time). O código pode representar algum risco, uma vezque não há informação para o compilador JIT verificar ocomportamento em tempo de execução. Exemplos de código nãoseguros incluem operações com ponteiros e anulação de memória.

Suporte ao Rave Reports (Professional e Enterprise)O Delphi agora inclui o Rave Reports de Nevrona. Com a

adição dos componentes do Rave Reports em sua aplicação, vocêpode habilitar os usuários para gerar relatórios com suaaplicação. Para maiores informações veja “Creating reports withRave Reports” no Developer’s Guide ou no help online.

Suporte ao ModelMaker (Professional e Enterprise)Os utilitários do ModelMaker podem simplificar o projeto,

construção e manutenção das classes e interfaces. O ModelMakertambém inclui utilitários para a criação de diagramas de estiloUML, que podem ser usados para criar e modificar os códigosfontes de seu projeto. Para maiores informações veja “designingclasses and components with ModelMaker” no Developer’s Guideou no help online.

A versão Enterprise do Delphi inclui o ModelMaker dosoftware ModelMaker, a versão Professional inclui uma versãotrial do ModelMaker. A funcionalidade do ModelMaker é igual emambas as versões.

Mudanças na documentação

� Todos os arquivos de documentação (PDF, HTML e INT) sãoagora distribuídos no CD Delphi Companion Tools ao invés do CDde instalação. Você pode acessar a documentação diretamente doCD ou copiar para o diretório de sua preferência. O CDCompanion Tools inclui a seguinte documentação:

� Devido ao tamanho do material impresso do Developer’sGuide, parte V, “Creating Custom components”, foi removidodeste livro para criar o novo Component Writer’s Guide.� O novo livro está dipsonível no help online e como arquivoPDF no CD Companion Tools.� A linguagem Object Pascal agora é chamada de linguagemDelphi. O help online e a documentação foram atualizadas deacordo.� O Object Pascal Language Guide é agora o novo DelphiLanguage Guide� Para ter certeza das informações contidas nos tutoriais doDelphi, eles foram removidos do Quick Start e do Devloper’sGuide. Os tutoriais estão disponíveis com arquivos PDF no CDDelphi Companion Tools.� Muitos tópicos do help online incluem a sintaxe em C++ eexemplos de código para usuários C++ e Kylix. Para odesenvolvimento em Delphi, por favor desconsidere estesexemplos.

Assuntos de compatibilidade e atualizaçãoPara atualizar a linguagem Delphi (formalmente chamada

de Object Pascal) de uma versão prévia do Delphi, abra-a nanova versão. O projeto é automaticamente atualizado para a novaversão.

Detalhes das mensagens Fault são agora adicionadas no nó<detail> ao invés do nó filho <detail>. Isto traz o apontamentodas falhas do SOAP para as especificações do SOAP, porémquebra a compatibilidade com outros códigos.

Mudanças na unit StrUtils, LeftStr, RightStr e MidStr talveznecessitem uma atualização do seu código para que estas funçõesfuncionem. Veja “Mudanças no Runtime Library” para maioresdetalhes.

Para o Apache 2, a variável ContentType foi mudada para“handler” na unit ApacheUnit.

O DataSnap não suporta mais conexões CORBA.

DELPHI

Documentação sobre: Olhe no CD Companion ToolsUsing Delphi (the Quick Start,Devoloper's Guide, Component Writer'sGuide, Delphi Language Guide, eobject hierarchy posters)

Online + PDF Docs\Borland

Instruções para criar aplicações Delphipassoa-a-passo

Online + PDFDocs\borland\Tutorials

IDL2Pas Online + PDFDocs\borland\IDL2Pas

Interfaces Online + PDFDocs\borland\interface docs

IntraWeb Online + PDF Docs\IntraWebModelMaker Online + PDF Docs\ModelMakeerRave Reports Online + PDF Docs\Rave

Page 28: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE28

Perguntas & Respostas

Pergunta: Gostaria de obter um exemplo de como retornartodos os IPs de uma máquina, vocês poderiam me ajudar?

Resposta: Sim, existem APIs do Windows masprecisamente na área de Sockets que possibilitam retornar estasinformações. Veja abaixo um simples exemplo:

implementationuses WinSock;{$R *.DFM}

function GetLocal_IP_List(pHostInfo: PHostEnt):String;type pPInAddr = array[0..10] of PInAddr; PaPInAddr = ^pPInAddr;var pptr : PaPInAddr; I : Integer; cIPs : string;begin pptr := PaPInAddr(pHostInfo^.h_addr_list); I:=0; while pptr^[I] <> Nil do begin cIPs := cIPs + ‘,’ +

StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end;

Result := cIPs;end;

function Client_IP_Address: string;var wVersionRequested : WORD; wsaData: TWSAData; pHostInfo: PHostEnt; cHostName: array[0..128] of char;begin {Inicializa WinSock} wVersionRequested := MAKEWORD(1, 1); WSAStartup(wVersionRequested, wsaData);

{pega o nome do computador atual} GetHostName(@cHostName, 128); pHostInfo := GetHostByName(@cHostName);

{Pega a lista de IPs} WSACleanup; Result := GetLocal_IP_List(pHostInfo)end;

Page 29: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE 29

{ evento OnClick de um Botão, atribuindo o resultado da função para um ListBox }procedure TForm1.Button1Click(Sender: TObject);begin ListBox1.Items.CommaText := Client_IP_Address;end;

Dúvida enviada por Rodrigo, FoxData Informática, Goiânia/GO.

Pergunta: Achei muito interessante a matéria sobre Wap/Delphi publicada na revista de Agosto/2002, porém tenteiimplementar o exemplo sugerido, mas ao executar o teste noDeck-It, recebi a seguinte mensagem de erro:

Unhandled content type application/octet stream Estou usando o Apache 1.3.14, e tenho o executável do projeto

gravado em c:\apache\htdocs. O que poderia estar ocorrendo?

Resposta: O problema está na configuração do httpd.conf,onde por um erro na diagramação da revista incluímos uma“barra” a mais. Altere a seguinte linha:

ScriptAlias /wap/ “C:\DelphiWAP”

Para:

ScriptAlias /wap “C:\DelphiWAP”

Com isso irá funcionar perfeitamente!

Dúvida enviada por Maiquel de Brito, Progestor InformáticaLtda, Três Coroas/RS.

Pergunta: Estou querendo criar uma máscara paravisualização do PIS/PASEP. Este campo é do tipo String(20) noOracle. Estou usando o componente TDBEdit do Delphi e napropriedade EditMask do TField a seguinte máscara9999999999-9;0; e retorna 1234567891-1. Porém, se o tamanhodo PIS digitado for menor que o tamanho da máscara, quero quealinhe a direita.

Ex: O número do PIS é 123, deve-se armazenar no Oracleexatamente ‘123’, porém, na hora da visualização, ficaria: 12-3

Resposta: Poderá fazer um tratamento no eventoOnGetText de seu campo, e neste fazer uma rotina para geraruma máscara dinâmica:

implementationuses Mask;{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);begin Edit2.Text := FormatMaskText(StringOfChar(‘9’,Length(Edit1.Text)-1)+’-9;0', Edit1.Text);end;

// No evento OnGetText:

Text := FormatMaskText(StringOfChar(‘9’,Length(Sender.AsString)-1)+’-9;0', Sender.AsString);

Com isso, independente do valor armazenado em seu bancode dados a máscara será apresentada corretamente.

Dúvida enviada por Luciana Ichihara, Cia. InformáticaBelém, Belém/PA.

Pergunta: Gostaria de receber uma rotina para mudar decampo com Enter genéricamente em todos os formulários deminha aplicação, porém minha aplicação possui arquiteturaCLX, vocês teriam alguma dica a respeito?

Resposta:

implementationuses Unit2;{$R *.xfm}

{ procedure que irá fazer o tratamento das mensagens da aplicação }procedure TForm1.AppEventFilter(Sender: QObjectH;

Event: QEventH; var Handled: Boolean);var Key: Integer; KeyText: WideString;begin if (Screen.ActiveForm.ActiveControl is TCustomMemo)or (Screen.ActiveForm.ActiveControl is TCustomGrid)then Exit; if QEvent_type(Event) = QEventType_KeyPress then begin Key := Key_Tab; KeyText := Chr(Key); case QKeyEvent_Key(QKeyEventH(Event)) of

Perguntas & Respostas

Page 30: The Club Megazine - Setembro 2002 · uma lista de e-mails que está armazenada em nosso banco de dados. ... quero agradecer aos inúmeros e-mails que recebi através do artigo anterior

MeGAZINE30

Key_Return, Key_Enter, Key_Down: { próximocampo;} QApplication_SendEvent(Screen.ActiveForm.Handle,QKeyEvent_Create(QEventType_KeyPress, Key, Key,Integer(ButtonState_NoButton), PWideString(@KeyText),False, 1));

Key_Up: // campo anterior; QApplication_SendEvent(Screen.ActiveForm.Handle,QKeyEvent_Create(QEventType_KeyPress, Key, Key,Integer(ButtonState_ShiftButton),PWideString(@KeyText), False, 1)); end; end;end;

procedure TForm1.FormCreate(Sender: TObject);begin { liga a os eventos da aplicação a nossa procedure de tratamento de mensagens } Application.OnEvent := AppEventFilter;end;

Dúvida enviada por Anivaldo A.Garcia, São Gotardo/MG.

Pergunta: Peço a possibilidade de enviar rotinas paraconectar/desconectar unidades de rede, assim como tambémhabilitar acesso a determinadas pastas.

Resposta: Para conectar uma unidade de rede poderáutilizar a API WNetAddConnection2 informando os parâmetrosnecessários, tais como caminho, usuário e senha. Veja abaixo umsimples exemplo:

var Username, Password: String; NetResource: TNetResource;begin Username := ‘servidor’; Password := ‘abc.456.123’; with NetResource do begin NetResource.dwType := RESOURCETYPE_DISK; NetResource.lpLocalName := ‘Y:’; NetResource.lpRemoteName := ‘\\SERVIDOR\C’; NetResource.lpProvider := nil; end; if WNetAddConnection2(NetResource, PChar(Password),PChar

(Username), 0) <> 0 then ShowMessage(SysErrorMessage(GetLastError));end;

{Para desconectar uma unidade de rede utilize a APIWNetCancelConnection2, como mostra o simples exemploabaixo:}procedure TForm1.Button1Click(Sender: TObject);begin WNetCancelConnection2(‘I:’, CONNECT_UPDATE_PROFILE,True);end;

Dúvida enviada por Edson, A.Posto Manções Ltda, CampoGrande/MS.

Pergunta: Existe alguma forma de executar uma macro doMicrosoft Access dentro de um aplicativo Delphi? Se existe vocêsteriam um exemplo?

Resposta: Através da OLEAutomation suportada peloMicrosoft Access conseguimos praticamente acessar todos osobjetos do mesmo, porém este assunto não é muito bemdocumentado o que demanda um pouco de estudo muitas vezesno próprio Access, porém no caso da macro, segue abaixo umsimples exemplo:

implementationuses ComObj;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);var clsAccess: OleVariant; strDatabaseFile: String;begin strDatabaseFile := ‘d:\theclub\theclub.mdb’; clsAccess := CreateOleObject(‘Access.Application’); try clsAccess.Visible := True; { caso não queiravisualizar o Access, basta atribuir “False”} clsAccess.OpenCurrentDatabase(strDatabaseFile,True); clsAccess.DoCmd.RunMacro(‘MinhaMacro’); finally clsAccess := null; end;end;

Dúvida enviada por Claudir, Alcool Ferreira S/A, Osasco/SP.

Perguntas & Respostas