32

Editorial - O maior clube de programadores do Brasil! · especificamente de negócios ligados à consultoria de software, certificações e focará seu ... o diretor comercial e de

  • Upload
    buidien

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

3

THE CLUBAv. Profº Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (14) 3732-3689

Suporte: (14) 3733-1588 - Fax: (14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]

Informações: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem

ser enviados 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 aseção "Tire sua dúvida".

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

armazenamento em banco de dados, sobqualquer forma ou meio, de textos, fotos e

outras criações intelectuais em cada publicaçãoda revista “The Club Megazine” são

terminantemente proibidos sem autorizaçãoescrita dos titulares dos direitos autorais.

Impressão e acabamento:GRAFILAR

Tel.: (14) 3841-2587 - Fax: (14) 3841-3346Rua Cel. Amando Simôes, 779

Cep 18.650-000 - São Manuel - SPTiragem: 5.000 exemplares

Copyright The Club Megazine 2006

Diretor TécnicoMauro Sant’Anna

ColaboradoresMarcelo Nogueira, Mário Bohm,

Aguinaldo P. Silva

EDITORIAL

Editorial

Editorial .................................................................................. 03Borland sai das ferramentas de desenvolvimento ................. 04Net Connection Strings - Guia rápido ..................................... 05Trabalhando com multimídia no Delphi .................................. 07Usando o DataGrid com ASP.Net ........................................... 13Perguntas & Respostas ......................................................... 26Delphi é marca registrada da Borland International,

as demais marcas citadas são registradaspelos seus respectivos proprietários.

Olá amigos,

Você está recebendo mais uma edição da revista The Club Megazinecom várias informações importantes.

A Borland anunciou que prepara a venda de toda sua divisão deferramentas para desenvolvimento de software no mundo. Veja nestaedição as ultimas informações sobre este assunto.

O nosso colaborador Emerson Facunte nos traz informações sobrecomo fazer conexões com banco de dados via código no ambiente .NET.Você verá que é uma tarefa comum, no entanto sempre será precisolembrar a sintaxe completa da string de conexão.

O nosso consultor Claudinei Rodrigues traz um artigo muitointeressante sobre o desenvolvimento de aplicações que envolvem otrabalho com multimídia no Delphi.

Ainda neste edição, você terá mais informações sobre como trabalharcom o DataGrid no Delphi 2006.

Uma boa leitura e até a próxima.

4

Borland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasde desenvolvimentode desenvolvimentode desenvolvimentode desenvolvimentode desenvolvimento

Borland

Borland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasBorland sai das ferramentasde desenvolvimentode desenvolvimentode desenvolvimentode desenvolvimentode desenvolvimento

SÃO PAULO – A Borland anunciou que prepara a venda detoda sua divisão de ferramentas para desenvolvimento desoftware no mundo. O anúncio foi feito nesta quarta-feira (17),em São Paulo, pelo vice- presidente sênior de vendas globais daempresa, Matthew Thompson.

Mattew comunicou que num prazo de 60 a 90 dias, aempresa concluirá reestruturação global que vai dividir acompanhia em duas.

Uma parte, que continuará sob o nome de Borland, cuidaráespecificamente de negócios ligados à consultoria de software,certificações e focará seu negócio em estratégias para maximizaro valor dos aplicativos produzidos por seus clientes.

Toda a divisão que cuida das vendas e desenvolvimento daslinguagens que fizeram a história da companhia, como Delphi,C++ builder, a ferramenta de Jbuilder e de banco de dadosInterbase fará parte da nova empresa, sem nome definido, queserá vendida.

“Fomos procurados por vários grupos de investimentointeressados em nossa divisão de ferramentas dedesenvolvimento. São linguagens fantásticas e com alto poder degerar negócios”, disse Mattew. O novo proprietário dessa divisão eo nome que terá essa empresa ainda não foram definidos, disse oexecutivo.

A reestruturação vale para todos os países onde a Borlandatua e afetará as operações da empresa no Brasil. De acordo como diretor comercial e de marketing da Borland Brasil, JoséEugênio Braga, poucos funcionários da Borland serão deslocadospara a nova empresa que cuidará especificamente de negócioscom ferramentas de desenvolvimento. “Temos uma equipe de 160profissionais no Brasil e uma parte minoritária dela é compostapor desenvolvedores”, disse Braga.

Para o presidente da Borland Brasil e diretor para a AméricaLatina, José Rubens Tocci, a divisão “faz todo o sentido” na

medida em que a empresa atende cada vez mais “dois públicosmuito distintos, com necessidades diferentes”.

“A Borland quer concentrar seus negócios em conversar comCEOs, em apresentar planos de como eles podem melhorar seusaplicativos, ganhar mercado, fazer crescer as exportações.Queremos ajudá-los a economizar recursos e otimizarinvestimentos no desenvolvimento de suas tecnologias”, disseTocci.

“Já a nova companhia quer conversar com gerentes de TI,programadores e gente que deseja saber detalhes de nossaslinguagens. A nova companhia poderá atender muito melhor osdesenvolvedores”, diz Tocci.

Atualmente, cerca de 60% do faturamento global da Borlandconcentra-se em negócios de consultoria e governançacorporativa e assessoria para certificações. Os demais 40% ficamcom a divisão de desenvolvimento, licenças e suporte àslinguagens como Delphi. No Brasil, essa relação é 50% a 50%.

A reestruturação da empresa e a venda da divisão desoftwares no mundo todo tem forte impacto sobre a marcaBorland, desde sua fundação, nos anos 80, ligada às linguagensDelphi e C++. O anúncio, no entanto, não chegou a surpreenderagentes do mercado.

As recentes aquisições da Borland de companhias deconsultoria e gestão eram vistas como indício de que a companhiamudaria seu foco de negócios. Em 2005, a Borland comprou aTeraQuest (consultoria para certificação CMM/CMMI) eLegadero (gerenciamento e governança de TI). Este ano, aempresa comprou a Gauntlet Systems e Segue Software, ambasempresas focadas em suporte ao desenvolvimento de softwares

Fonte: Info Online http://info.abril.com.br/aberto/infonews/052006/17052006-9.shl

Quarta-feira, 17 de maio de 2006 - 17h32

5

.Net Connection Strings.Net Connection Strings.Net Connection Strings.Net Connection Strings.Net Connection Strings

.NET

Salve, salve nobres DotNetianos.

Fazer conexões com banco de dados via código é uma tarefacomum, no entanto sempre precisamos lembrar a sintaxecompleta da string de conexão.

Claro que existem “n” possibilidades de “lembrar” da string deconexão, mas a idéia aqui é apresentar um pequeno guia dereferência.

Vamos lá

SQL Server

SQL Connection (NET)

Standard Security:

”Data Source=dbFacunte;InitialCatalog=pubs;User Id=sa;Password=1234;”

ou”Server=dbFacunte; Database=pubs;UserID=sa; Password=12345;Trusted_Connection=False”

Trusted Connection:

”Data Source=Aron1;InitialCatalog=pubs;Integrated Security=SSPI;”

o u”Server=dbFacunte;Database=pubs;Trusted_Connection=True;”

Connect via an IP address:

”Data Source=192.162.1.18,1433;NetworkLibrary=DBMSSOCN;Initial Catalog=pubs;User;ID=sa;Password=12345;”

Exemplo de Conexão (C#):

using System.Data.SqlClient;string stringConexao =“Server=dbFacunte;Database=pubs;Trusted_Connection=True;”

SqlConnection conexao = new SqlConnection();conexao.ConnectionString= stringConexao;conexao.Open();

OleDB

Standard security:

”Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\caminho\meudb.mdb;UserId=admin;Password=;”

Workgroup (system database):

”Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\somepath\mydb.mdb;Jet OLEDB:SystemDatabase=system.mdw;”

Com senha

”Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\somepath\mydb.mdb;Jet OLEDB:DatabasePassword=MyDbPassword;”

Oracle

Oracle Connection (NET)Apenas para Oracle 8i release 3 ou superior.

Standard Security:

”Data Source=DBFacunter:Integrated Security=yes;”

.Net Connection Strings.Net Connection Strings.Net Connection Strings.Net Connection Strings.Net Connection StringsGuia RápidoGuia RápidoGuia RápidoGuia RápidoGuia Rápido

Emerson Facunte

6

.NET

Especificando Usuario e Senha

”Data Source=DBFacunte;UserId=username;Password=passwd;IntegratedSecurity=no;”

Exemplo de Conexão (C#):

http://theclub.activeinterno.com.br/revista/search.htmusing System.Data.OracleClient;

string stringConexao = “DataSource=DBFacunte;UserId=username;Password=passwd;IntegratedSecurity=no;”

OracleConnection dbConexao= newOracleConnection();dbConexao.ConnectionString = stringConexao;dbConexao.Open();

Firebird

Firebird .Net Data Provider

Standard:

“User=SYSDBA;Password=masterkey;Database=dbFacunte.fdb;DataSource=localhost;Port=3050;Dialect=3;Charset=NONE;Role=;Connectionlifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;PacketSize=8192;ServerType=0”

Exemplo de Conexão (C#):using FirebirdSql.Data.Firebird;

string stringConexao = “User=SYSDBA;” + “Password=masterkey;” + “Database=SampleDatabase.fdb;” + “DataSource=localhost;” + “Port=3050;” + “Dialect=3;” + “Charset=NONE;” + “Role=;” + “Connection lifetime=15;” + “Pooling=true;” +

“MinPoolSize=0;” + “MaxPoolSize=50;” + “Packet Size=8192;” + “ServerType=0”;

FbConnection dbConexao =new FbConnection(stringConexao);

dbConexao.Open();

MySQL

Connector .NET 1.0

(Download em http://dev.mysql.com/downloads/connector/net/1.0.html)

Standard:

”Server=Server;Database=dbFacunte;Uid=UserName;Pwd=12345;”

Especificando a Porta

”Server=Server;Port=1234;Database=dbFacunte;Uid=UserName;Pwd=12345;”

Exemplo de Conexão (C#):

using MySql.Data.MySqlClient;

MySqlConnection dbConexao= newMySqlConnection();

dbConexao.ConnectionString =“Server=Server;Database=dbFacunte;Uid=UserName;Pwd=12345;”dbConexao.Open();

Você poderá conferir exemplos de outros bancos de dados nosite: http://www.connectionstrings.com.

Forte abraço e até a próxima.

Sobre o autorFacunte é MVP Visual Developer ASP/ASP.Net, co-OwnerFramework.Net Microsoft Latam, evangelista de aplicações e-business, publicou 7 livros e mais de 100 artigos, ministroupalestras, cursos e workshops para cerca de 15.000 pessoas emtodo o país .

7

Trabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiano Delphino Delphino Delphino Delphino Delphi

Delphi

O objetivo deste artigo é sanar as dúvidas de alguns sóciossobre o desenvolvimento de aplicações que envolvam multimídiacom o Delphi.

O que é multimídia ?Multimídia é uma associação que decorre do uso de imagens,

sons e movimentos. Os quatro tipos de arquivos que se utilizamdeste formato de aplicação são:

1. AVI - inclui as produções de vídeo.2. MID - arquivos para a produção de música utilizando a

interface de Instrumentos Musicais Digitalizados, ou formatoMIDI.

3. WAV - mais comuns, inclui o registro de sons utilizando atecnologia Microsoft WAVE..

4. MP3 – Arquivos de música mais utilizado hoje em dia.

O principal problema que ocorre com as aplicaçõesmultimídia é o espaço físico ocupado, por exemplo, arquivos dotipo AVI, comparando um filme de apenas um minuto ou menospode ocupar cerca de 5Mb ou até mesmo 10Mb de espaço emdisco.

Componente do DelphiO Delphi tem um componente chamado MediaPlayer que

pode ser encontrado na palheta System. É este componente quepermite o acesso aos arquivos multimídia. A sua utilização émuito simples. É bem fácil criar aplicações que envolvam som ouimagens em movimento com apenas uma ou duas linhas decódigo.

Através deste componente nós podemos acessar e controlar asrotinas internas através da MCI (Media Control Interface). Essasrotinas podem ser programadas para acessar toda a possibilidadedo mundo multimídia. Com este componente estas rotinas setornam muito simples e intuitivas para nossa utilização.

Trabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiaTrabalhando com multimídiano Delphino Delphino Delphino Delphino Delphi

Por Claudinei Rodrigues – [email protected]

Componente MediaPlayerPara criar uma simples aplicação multimídia crie um novo

projeto, e arraste o componente MediaPlayer que está na palhetaSystem para o formulário, automaticamente é criado uma barrade tarefas multimídia, conforme a figura a seguir:

Clique no componente e altere a propriedade FileName paraC:\WINDOWS\MEDIA\TOWN.MID. Esta propriedade associao componente a arquivos tipo AVI, MIDI, WAVE ou MP3. Alteretambém a propriedade AutoOpen para True, esta propriedade iniciaautomaticamente o arquivo.

Feito isto rode o programa. Para ouvir a música basta clicarno botão verde, para parar clique no botão com um quadrado emvermelho.

Se por acaso você não conseguir ouvir a música, o problemapode ser por causa do nome do arquivo inválido, ou o seu sistemade multimídia está com problemas ou ainda a propriedadeAutoOpen do componente está configurada como False.

Alterando as propriedades em tempo de execuçãoDependendo das circunstâncias você pode achar necessário

que o arquivo seja aberto apenas quando o usuário clicar em umdeterminado botão. Isto pode ser feito de forma bem simples.

Para fazer isto deixe a propriedade AutoOpen do componenteMediaPlayer para False e inclua um componente Button no seuformulário. No evento OnClick deste botão insira o seguintecomando:

8

Delphi

procedure procedure procedure procedure procedure TForm1.Button1Click(Sender:TObject);begin MediaPlayer1.Open;endendendendend;

Nós também podemos alterar o arquivo que o componenteMediaPlayer vai executar. Para fazer isto insira um componenteOpenDialog que está na palheta Dialogs e um componenteButton. Fazendo isto a nossa tela ficará da seguinte forma:

Dê um duplo clique no componente Button e inclua o código aseguir:

procedure TForm1.ProcurarClick(Sender:TObject);begin // Desativa o componente MediaPlayer1.Close; // Executa o componente OpenDialog para // localizar o arquivo desejado. if OpenDialog1.Execute then begin // Atribui o arquivo localizado ao // ao componente MediaPlayer MediaPlayer1.FileName :=

OpenDialog1.FileName; // Ativa o componente MediaPlayer1.Open; end;end;

Agora nós vamos ajudar o componente de seleção dearquivos, ou seja, o OpenDialog. Clique sobre o componenteOpenDialog1 e vá até ao Object Inspector.

Vamos fazer com que este componente liste apenas osarquivos com a extensão AVI, WAV, MID e MP3. Isto é bemsimples de ser feito.

Na propriedade Filter do componente OpenDialog1 bastaconfigurar como mostrado na figura seguir.

Explorando ainda mais o componenteAté este momento nós montamos um aplicação bem simples

com o MediaPlayer. Mas não é só isto que este componente faz.Vamos nos aprofundar mais nele.

Inclua no form mais quatro componentes Edit e umcomponente Timer. Fazendo isto você terá uma tela semelhante aque está sendo mostrada a seguir:

Clique no componente MediaPlayer dê uma olhada no ObjetoInspector na página de Events. Lá você encontrará dois eventosbem importantes, são eles OnClick e OnNotify.

O evento OnClick é disparado sempre quando é pressionadoqualquer botão do componente. Este evento recebe um parâmetrochamado Button do tipo TMPBtnType. É através desteparâmetro que podemos saber qual botão do MediaPlayer foipressionado.

No evento OnNotify nós podemos trabalhar com asmensagens do Windows, mais especificamente a mensagemmm_MciNotify. Esta mensagem na verdade é uma chamada do

9

Delphi

Windows para o início ou o término de uma execução, com seuseventuais erros.

Não se preocupe, mas a frente eu vou mostrar um exemplode como utilizar estes eventos.

Como eu já havia dito anteriormente é possível identificar obotão pressionado através do evento OnClick. Veja na tabela aseguir as informações geradas pelo TMPBtnType:

Para iniciar vamos verificar qual foi o botão pressionado.Para isto vá até o evento OnClick do MediaPlayer e inclua ocódigo a seguir.

procedure TForm1.MediaPlayer1Click(Sender:TObject; Button: TMPBtnType; var DoDefault:Boolean);begin case Button of btPlay : Edit1.Text := ‘Tocando’; btPause : Edit1.Text := ‘Pausado’;

btStop : Edit1.Text := ‘Parado’; btNext : Edit1.Text := ‘Próximo’; btPrev : Edit1.Text := ‘Anterior’; btStep : Edit1.Text := ‘Avançando’; btBack : Edit1.Text := ‘Retornando’; btRecord : Edit1.Text := ‘Gravando’; btEject : Edit1.Text := ‘Ejetando’; end;end;

Para saber o que o componente está fazendo nós vamosnecessitar utilizar o evento OnNotify.

Veja na tabela a seguir as mensagens enviadas pelo sistemaoperacional:

Mensagem Descrição

mci_Notify_Successful Comando completado com êxito

mci_Notify_Superseded Comando suspenso por outra função

mci_Notify_Aborted Função corrente foi interrompida

mci_Notify_Failure Algum erro ocorreu

O Delphi não reconhece estas informações mencionadas natabela anterior, mas ele converte para constantes. Veja na tabelaa seguir:

Constante Descrição

nvSuccessful Indicando o êxito

nvSuperseded Indicando que está suspenso,provavelmente por causa de umapausa.

nvAborted Indicando que foi pressionado obotão parar, ou causa devido aofechamento do arquivo.

nvFailure Indica que houve uma falha

Agora vá até o evento OnNotify e inclua o código abaixo:

procedure TForm1.MediaPlayer1Notify(Sender: TObject);

var S: String;begin

10

Delphi

case MediaPlayer1.NotifyValue of nvSuccessful : S := ‘mci_Notify_Successful’; nvSuperseded : S := ‘mci_Notify_Superseded’; nvAborted : S := ‘mci_Notify_Aborted’; nvFailure : S := ‘mci_Notify_Failure’; else S := ‘Não foi possível identificar a mensagem’; end; Edit2.Text := S; if (MediaPlayer1.NotifyValue = nvSuccessful) and

(MediaPlayer1.Mode = mpStopped) then

Edit1.Text := ‘Arquivo finalizado’;end;

Estes eventos verificam os acontecimentos mais importantesque ocorreram com o dispositivo MCI. O modo corrente com que odispositivo MCI é especificado também pode ser utilizado peloobjeto TMediaPlayer.

Aqui uma listagem dos valores mais comuns:

Valores mais comunus

mci_Mode_Not_Ready

mci_Mode_Stop

mci_Mode_Play

mci_Mode_Record

mci_Mode_Seek

mci_Mode_Pause

mci_Mode_Open

Estes valores são auto-explicativos. Por exemplo, se formci_Mode_Stop, o dispositivo está parado. Se for mci_Mode_Play,o dispositivo está tocando.

Agora crie uma nova procedure chamada SetMode como amostrada a seguir.

procedure TForm1.SetMode;begin Edit4.Text := MediaPlayer1.FileName; case MediaPlayer1.Mode of mpNotReady : Edit3.Text :=‘mci_Mode_Not_Ready’;

mpStopped : Edit3.Text := ‘mci_Mode_Stop’; mpPlaying : Edit3.Text := ‘mci_Mode_Play’; mpRecording : Edit3.Text := ‘mci_Mode_Record’; mpSeeking : Edit3.Text := ‘mci_Mode_Seek’; mpPaused : Edit3.Text := ‘mci_Mode_Pause’; mpOpen : Edit3.Text := ‘mci_Mode_Open’; else begin Edit1.Text := ‘Dispositivo inativo’; Edit2.Text := ‘Sem messagens’; Edit3.Text := ‘Não identificado’; Edit4.Text := ‘Não há arquivo selecionado’; end; end;end;

Para que possamos chamar esta rotina, inclua umcomponente TTimer que está na palheta System e no eventoOnClick inclua o código a seguir.

procedure TForm1.Timer1Timer(Sender:TObject);begin SetMode;end;

Por padrão a propriedade Interval deste componente éconfigurada com o valor 1000, isto significa que a cada 1000milisegundos será disparada a rotina de verificação queinformará o estado para o componente TMediaPlayer.

Execute o projeto e verifique o seguinte:

· Toda a vez que você clicar em um botão do componenteMediaPlayer, será disparado o evento OnClick informando o botãoque foi pressionado;

· As mensagens mm_MciNotify que ocorrem durante toda aexecução da aplicação. Faça os testes clicando nos botões Pausa eParar no meio de uma execução.

· Quando for selecionar um novo arquivo, observe asinformações constantes nos campos edit.

Extraindo informações de um arquivo MP3O arquivo do tipo MP3 ficou muito famoso por comprimir o

tamanho de um arquivo de som e manter a qualidade similar ade um CD. Os arquivos MP3 podem ser conseguidos por meio deutilização de softwares de codificação, que extraem as faixas deum CD para o formato Mp3 ou podem ser baixados de páginas dainternet que distribuem arquivos de MP3. Uma coisa tambémbem legal são as informações que contém este arquivo. Nele

11

Delphi

podemos obter algumas informações como Nome do artista, nomedo álbum, etc. desde que estas informações estejam informadasno arquivo obviamente.

Montando um segundo projeto de exemploCrie um novo projeto, e arraste o componente MediaPlayer

que está na palheta System para o formulário. Clique nocomponente MediaPlayer e vá até ao Object Inspector napropriedade VisibleButtons e altere os itensbtNext,btPrev,btStep,btBack,btRecord e btEject para False.Inclua um componente Button que está na palheta Standard,um componente FileListBox que está na palheta Win3.1 paraque possamos ver os arquivos e sete componentes Edits. Na tela aseguir você tem uma sugestão de como pode ficar visualmente oseu formulário.

Veja as configurações dos componentes TEdit utilizados nesteexemplo.

Componente Novo nomeEdit1 EditArquivoEdit2 EditTituloEdit3 EditArtistaEdit4 EditAlbumEdit5 EditAnoEdit6 EditGeneroEdit7 EditComentario

Agora nós temos que configurar o nosso componente Button.Será a partir deste botão que vamos selecionar o diretório onde osarquivos MP3 serão encontrados.

Para selecionar o diretório onde estão os arquivos MP3 nósvamos chamar a função SelectDirectory.

Veja a seguir o código do evento OnClick do componenteButton.

procedure TForm1.Button1Click(Sender:TObject);begin Dir := ParamStr(0); if SelectDirectory(Dir, [],SELDIRHELP) then FileListBox1.Directory := Dir;end;

Veja no código a seguir a rotina que irá extrair asinformações do arquivo MP3.

procedure InfoMP3(Arquivo: string; Titulo,Artista,Album,Ano,Genero,Comentario:TEdit);var

ID3 : TID3Rec; fmp3: TFileStream;begin fmp3:=TFileStream.Create(Arquivo,fmOpenRead); try fmp3.position := fmp3.size-128; fmp3.Read(ID3,SizeOf(ID3)); finally fmp3.free; end; if ID3.Tag <> ‘TAG’ then begin Titulo.Text := ‘’;

Artista.Text := ‘’; Album.Text := ‘’; Ano.Text := ‘’; Genero.Text := ‘’; Comentario.Text:= ‘’; end else begin Titulo.Text := ID3.Title; Artista.Text := ID3.Artist; Album.Text := ID3.Album; Ano.Text := ID3.Year; if ID3.Genre in [0..MaxID3Genre] then Genero.Text :=ID3Genre[ID3.Genre] else Genero.Text :=IntToStr(ID3.Genre); Comentario.Text :=ID3.Comment; end;end;

Agora temos que configurar o componente FileListBox.

12

Delphi

Inclua o código a seguir no evento OnClick deste componente:

procedure TForm1.FileListBox1Click(Sender: TObject);

begin if FileListBox1.Items.Count=0 then exit; arqMP3 := Concat(Dir+’\’, FileListBox1.

Items.Strings[FileListBox1.ItemIndex]); if not FileExists(arqMP3) then begin ShowMessage(‘O arquivo não foi

encontrado em ‘+arqMP3); exit; end; InfoMP3(FileListBox1.FileName, EditTitulo, EditArtista, EditAlbum, EditAno, EditGenero, EditComentario);

MediaPlayer1.Close; MediaPlayer1.FileName := arqMP3; MediaPlayer1.Open;end;

Pronto, agora é só rodar o aplicativo.

ConclusãoEste foi um exemplo bem simples de utilização do componente

MediaPlayer. Espero que esta matéria auxilie a todos aqueles queme ligaram para tirar uma ou outra dúvida a respeito dotrabalho com este componente. Se você tem alguma dúvida arespeito de algum componente em específico, envie um e-mailpara mim. Até a próxima.

Sobre o autorClaudinei Rodrigues,Consultor Técnico do The [email protected]

13

Usando o DataGrid comUsando o DataGrid comUsando o DataGrid comUsando o DataGrid comUsando o DataGrid comASP.NETASP.NETASP.NETASP.NETASP.NET

Delphi

Usando o DataGrid comUsando o DataGrid comUsando o DataGrid comUsando o DataGrid comUsando o DataGrid comASP.NETASP.NETASP.NETASP.NETASP.NET

Para quem está desenvolvendo, ou pensando em desenvolveruma aplicação web utilizando o Delphi, desde a versão 8 queexiste o componente DBWebGrid, que agora na versão 2006 doDelphi já conta com algumas modificações e aperfeiçoamentos,mas que não apresenta a facilidade esperada, infelizmente. Noentanto, temos a nossa disposição o componente de Grid do .NETFramework, que é com o qual vamos trabalhar. Nesta matériavou apresentar este componente para você, juntamente comoutros recursos do Delphi, e se você já conhece o componente,quem sabe possa encontrar informações adicionais que possamauxiliá-lo no seu desenvolvimento daqui por diante. É uma penaque o Delphi ainda não dê suporte ao ASP.NET 2.0, pois estamosperdendo algumas características e novas facilidades.

Para começar nosso exemplo, vamos criar um novo projetoASP.NET Web Application, conforme você pode ver na figura 1.

A seguir o Delphi solicita algumas informações a respeito donovo projeto. Apenas dê um nome ao projeto para facilitar aidentificação posterior deste exemplo, eu dei o nome de TheClub,fique a vontade para escolher o nome que você preferir.

Aqui o Delphi abrirá uma página em branco para você. Nestapágina, vamos adicionar um componente DataGrid. No ToolPalete, em Web Controls, clique e arraste um componente

DataGrid para a página. Obviamente não há dados aserem exibidos, pelo simples motivo de que não há umbanco de dados conectado ao DataGrid.

Então, antes de começarmos a trabalharefetivamente com o DataGrid, vamos criar um conexão aum banco de dados.

Vou usar neste exemplo um banco de dados emAccess, que pode ser encontrado junto com a instalaçãodo Delphi, mas que estará disponível para downloadjuntamente com este exemplo para você no site do TheClub, caso você não encontre o arquivo ou não tenha ele.

Para criar a conexão com o banco de dados énecessário adicionar um componente BdpConnection,que pode ser encontrado na Tool Palete em Borland DataProvider. Clique e arraste um controle BdpConnectionpara a página.

Agora dê um clique com o botão direito do mouse sobre ocomponente e escolha Connection Editor.

Você pode ver como ficará na figura 3.

Figura 1

Figura 2

14

Delphi

Nesta tela iremos fazer a configuração paraacesso ao nosso banco de dados. Escolha emprimeiro lugar em Connections o MSAccessConn1.

Obs: Vamos utilizar o banco chamadodbdemos.mdb. Normalmente ele fica no diretórioC:\Arquivos de programas\Arquivoscomuns\Borland Shared\Data. Eu criei umdiretório “data” dentro de meu projeto e fiz umacópia do arquivo para este diretório para podertrabalhar livremente com o arquivo e poder inserir,deletar, enfim, fazer qualquer coisa que eu desejarcom os dados. Aconselho você fazer a mesma coisa.

Para escolher o banco de dados que será feita aconexão, clique em Database. Um botão com trêspontos (...) aparecerá, clique nele.

Uma janela se abrirá, o arquivo que vamostrabalhar deverá estar dentro do direitórioC:\Inetpub\wwwroot\TheClub\data\dbdemos.mdb.Escolha o arquivo apropriado e depois clique emOK. Ajuste as configurações de usuário para o banco de dados.No Access, o usuário padrão é “Admin” (UserName) e a senhadeve ficar em branco (UserPassword). Para saber se está tudofuncionando a contento, clique em Test, você deverá ver aresposta a seguir:

Nossa conexão está criada e pronta para serusada. Agora precisamos adicionar um controleBdpDataAdapter à página. Arraste o controlepara a página e em seguida clique com o botãodireito do mouse sobre ele e depois em ConfigureData Adapter. Aqui são necessárias poucasalterações a serem feitas. A primeira é a escolhada tabela com a qual vamos trabalhar, no caso“customer”. No restante não é necessário fazernenhum tipo de alteração. Clique em GenerateSQL para que o Delphi gere automaticamente astring do comando SELECT para você. Você deveestar vendo a figura 5. Basta clicar em OK eretornar ao projeto.

Concluído este passo temos que criar um Dataset. Para fazerisso clique com o botão direito do mouse sobre o componenteBdpDataAdapter e depois em Generate Typed Dataset. Aqui não énecessário fazer nenhuma alteração. Basta você clicar em OK.

Figura 3

Figura 4

Figura 5

15

Delphi

Os passos necessários para a configuração do banco de dadosestá finalizada. Agora temos que ligar o DataGrid ao banco dedados, para que os dados da tabela sejam exibidos.

Para fazer isso, basta alterar duas propriedades do DataGrid:DataSource e DataMember.

Em DataSource escolha o DataSet11 e no DataMemberescolha a tabela “customer”. Agora com estas propriedadesajustadas, o DataGrid já está exibindo os dados da tabela paravocê, antes mesmo de executarmos a página. Para exibir os dadosno navegador, basta agora inserir uma pequena linha de códigono evento Page_Load da página. A linha é:

DataGrid1.DataBind;

Por falar nisso, vamos ver como a página ficou até agora.Clique com o botão direito do mouse sobre o nome da página emseu projeto e depois em View in Browser.

A página do seu projeto no momento deve estar parecido coma figura 7.

Figura 6

Figura 7

16

Delphi

O DataGrid já está exibindo as informações do banco dedados, mas ainda está faltando muita funcionalidade naaplicação. O Delphi fornece ferramentas para facilitar o trabalhodo desenvolvedor. Temos diversas opções que podemos escolher, nomomento vamos trabalhar com algumas delas, para que ousuário da página tenha as opções para selecionar, editar oudeletar o registro. Clique com o botão direito do mouse sobre ocontrole DataGrid da página e depois em Criado de Propriedades.

Uma nova janela se abrirá com as opções disponíveis.Escolha “Colunas”. Agora em Lista de Colunas, Colunasdisponíveis, clique em Coluna Button. Observe que temos as trêsopções disponíveis: Selecionar, Editar e Deletar. Clique em cadauma delas e depois no botão com o sinal “>” para adicionar asopções ao DataGrid. Veja a figura 8.

Veja que em Colunas há várias opções disponíveis. Porexemplo, podemos escolher o texto que será exibido no cabeçalho,no rodapé e outros. Temos também a opção “Tipo de botão”, quepor padrão fica com a opção LinkButton. Esta opção faz com queas opções de clique fiquem como um hyperlink, padrão da web.Para ter um visual mais agradável, você pode mudar esta opçãopara PushButton, que desta forma fará as opções seremrepresentadas com botões. No exemplo que estou fazendo aquimudei todas as opções para PushButton, aliás, este é um defeitodo Delphi na minha opinião. Ele poderia mudar todas as opçõesde uma vez ao selecionar esta opção, e deixar aberto a situaçãocaso algum desenvolvedor quisesse usar opções diferentes nomesmo DataGrid, o que ao meu ver, seria algo extremamentehorrível de visualizar na página já em execução, mas vai saber,

tem gosto para tudo.

Quando se usa o DataGrid também é interessante limitar onúmero de itens que são exibidos por página, afinal, imagine se obanco de dados tiver 2.000 registros – normalmente é muito maisque isso – o tamanho da página seria enorme, dificultando avisualização por parte do usuário e também não seria produtiva.Então devemos criar uma paginação para o DataGrid. Podemosfazer isso também no Criador de Propriedades. Chame o Criadorde Propriedades e clique em Paginação. Vaja a figura 9.

Para nossa infelicidade, o Delphi 2006 ainda não tem suporteao .NET Framework 2.0, o que torna a paginação ainda “braçal”.Para que ela funcione adequadamente, temos que fazer algumasalterações, no evento PageIndexChanged:

procedureTWebForm1.DataGrid1_PageIndexChanged(source:System.Object; e:System.Web.UI.WebControls.DataGridPageChangedEventArgs);begin DataGrid1.CurrentPageIndex :=

e.NewPageIndex; DataBind();end;

Com este pequeno código a paginação já está funcionandoadequadamente no DataGrid. Você já pode avançar ou retrocedercom os registros desejados.

A visualização do DataGrid está correta, mas está feia. Paraalterar a aparência dele, clique com o botão direito do mouse

Figura 8

Figura 9

17

Delphi

sobre o DataGrid e em seguida em AutoFormatação. Eu escolhi aProfessional 1, você pode escolher a que melhor convier ao seugosto. Veja a figura 10.

Agora que a paginação já está funcionando, vamos colocar aopção de Editar para funcionar. Clique no DataGrid e depois emEventos. Altere o evento EditCommand para o seguinte código:

procedureTWebForm1.DataGrid1_EditCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs);begin DataGrid1.EditItemIndex :=

e.Item.ItemIndex; DataGrid1.DataBind();end;

O próximo evento a ser alterado é o UpdateCommand, quedeverá ficar com o seguinte código:

procedureTWebForm1.DataGrid1_UpdateCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs);var i : integer;begin BdpConnection1.Open(); BdpDataAdapter1.UpdateCommand. Parameters[‘CustNoOriginal’].Value := DataGrid1.DataKeys[e.Item.ItemIndex].ToString; if (e.Item.Cells[4].Controls[0] as

TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Company’].Value := (e.Item.Cells[4].Controls[0] as TextBox).Text; if (e.Item.Cells[5].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Addr1’].Value := (e.Item.Cells[5].Controls[0] as TextBox).Text; if (e.Item.Cells[6].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Addr2’].Value := (e.Item.Cells[6].Controls[0] as TextBox).Text; if (e.Item.Cells[7].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘City’].Value := (e.Item.Cells[7].Controls[0] as TextBox).Text; if (e.Item.Cells[8].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘State’].Value := (e.Item.Cells[8].Controls[0] as TextBox).Text; if (e.Item.Cells[9].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Zip’].Value := (e.Item.Cells[9].Controls[0] as TextBox).Text; if (e.Item.Cells[10].Controls[0] as TextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Country’].Value := (e.Item.Cells[10].Controls[0] as TextBox).Text; BdpDataAdapter1.UpdateCommand.ExecuteNonQuery; BdpConnection1.Close(); BdpDataAdapter1.Fill(DataSet11); DataGrid1.EditItemIndex := -1; DataBind();end;

Altere o código do evento CancelCommand para o códigoabaixo:

Figura 10

18

Delphi

procedureTWebForm1.DataGrid1_CancelCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);begin DataGrid1.EditItemIndex := -1; DataGrid1.DataBind();end;

Quando o usuário de sua página clicar em Editar, os camposdo DataGrid estarão disponíveis para a edição dos dados e o botãoEditar se transformará no botão Atualizar, que ao ser clicadodisparará o evento UpdateCommand para gravar os dadosdentro da tabela do Access. Note também que um botão Cancelarserá adicionado à coluna para que o usuário da página tenha aopção de desistir das alterações caso ache isso necessário. Jáfizemos essa implementação através do evento CancelCommandlogo acima. Veja na figura 11 como ficará sua página ao clicar nobotão Editar.

Agora vamos fazer a alteração em nosso código para permitirque o usuário possa apagar um registro dentro do DataGrid. Issoserá feito quando o usuário pressionar o botão Excluir e seráexecutado pelo evento DeleteCommand, que deverá ter o seucódigo fonte alterado para o seguinte:

procedureTWebForm1.DataGrid1_DeleteCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);begin BdpConnection1.Open(); BdpDataAdapter1.DeleteCommand. Parameters[‘CustNoOriginal’].Value :=DataGrid1.DataKeys[e.Item.ItemIndex]; BdpDataAdapter1.DeleteCommand.ExecuteNonQuery(); BdpConnection1.Close();end;

Figura 11

19

Delphi

Para evitar dissabores entre o que fiz aqui e o exemplo quevocê está montando, vou colocar todo o código fonte da páginapara você logo a seguir:

unit WebForm1;

interface

uses System.Collections, System.ComponentModel, System.Data, System.Drawing, System.Web,System.Web.SessionState, System.Web.UI, System.Web.UI.WebControls,System.Web.UI.HtmlControls, Borland.Data.Provider, System.Data.Common,Borland.Data.Common, DataSet1Unit, System.Globalization;

type TWebForm1 = class(System.Web.UI.Page) {$REGION ‘Designer Managed Code’} strict private procedure InitializeComponent; procedureDataGrid1_PageIndexChanged(source:System.Object; e: System.Web.UI.WebControls.DataGridPageChangedEventArgs); procedureDataGrid1_SelectedIndexChanged(sender:System.Object; e: System.EventArgs); procedure DataGrid1_EditCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); procedure DataGrid1_DeleteCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); procedure DataGrid1_CancelCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); procedure DataGrid1_UpdateCommand(source:System.Object; e: System.Web.UI.WebControls.DataGridCommandEventArgs); {$ENDREGION} strict private procedure Page_Load(sender:System.Object; e: System.EventArgs);

strict protected DataGrid1:System.Web.UI.WebControls.DataGrid; BdpConnection1:Borland.Data.Provider.BdpConnection; bdpSelectCommand1:Borland.Data.Provider.BdpCommand; bdpInsertCommand1:Borland.Data.Provider.BdpCommand; bdpUpdateCommand1:Borland.Data.Provider.BdpCommand; bdpDeleteCommand1:Borland.Data.Provider.BdpCommand; BdpDataAdapter1:Borland.Data.Provider.BdpDataAdapter; DataSet11: DataSet1Unit.DataSet1; procedure OnInit(e: EventArgs); override; private { Private Declarations } public { Public Declarations } end;

implementation

{$REGION ‘Designer Managed Code’}/// <summary>/// Required method for Designer support/// — do not modify/// the contents of this method with the/// code editor./// </summary>procedure TWebForm1.InitializeComponent;type TArrayOfSystem_Data_Common_DataTableMapping

= array ofSystem.Data.Common.DataTableMapping; TArrayOfSystem_Data_Common_DataColumnMapping

= array ofSystem.Data.Common.DataColumnMapping;begin Self.BdpConnection1 :=Borland.Data.Provider.BdpConnection.Create; Self.bdpSelectCommand1 :=Borland.Data.Provider.BdpCommand.Create;

20

Delphi

Self.bdpInsertCommand1 :=Borland.Data.Provider.BdpCommand.Create; Self.bdpUpdateCommand1 :=Borland.Data.Provider.BdpCommand.Create; Self.bdpDeleteCommand1 :=Borland.Data.Provider.BdpCommand.Create; Self.BdpDataAdapter1 :=Borland.Data.Provider.BdpDataAdapter.Create; Self.DataSet11 :=DataSet1Unit.DataSet1.Create; (System.ComponentModel.ISupportInitialize

(Self.BdpDataAdapter1)).BeginInit; (System.ComponentModel.ISupportInitialize

(Self.DataSet11)).BeginInit; Include(Self.DataGrid1.PageIndexChanged,

Self.DataGrid1_PageIndexChanged); Include(Self.DataGrid1.CancelCommand,

Self.DataGrid1_CancelCommand); Include(Self.DataGrid1.EditCommand,

Self.DataGrid1_EditCommand); Include(Self.DataGrid1.UpdateCommand,

Self.DataGrid1_UpdateCommand); Include(Self.DataGrid1.DeleteCommand,

Self.DataGrid1_DeleteCommand); Include(Self.DataGrid1.SelectedIndexChanged,

Self.DataGrid1_SelectedIndexChanged); // // BdpConnection1 // Self.BdpConnection1.ConnectionOptions :=

‘transaction isolation=ReadCommit’ + ‘ted;blobsize=1024’; Self.BdpConnection1.ConnectionString := ‘assembly=Borland.Data.Msacc,Versi’ + ‘on=2.5.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b; vendorclient=m’ + ‘sjet40.dll;pooling=True;grow on demand=True;database=\\Marcos\TheClub\dat’ + ‘a\dbdemos.mdb;username=Admin;max pool size=100;password=;provider=MSAcces’ + ‘s;min pool size=0’; // // bdpSelectCommand1 //

Self.bdpSelectCommand1.CommandOptions :=nil;

Self.bdpSelectCommand1.CommandText := ‘SELECT CustNo, Company, Addr1, Addr’ + ‘2, City, State, Zip, Country, Phone, FAX, TaxRate, Contact, LastInvoiceDa’ + ‘te FROM customer’; Self.bdpSelectCommand1.CommandType := System.Data.CommandType.Text; Self.bdpSelectCommand1.Connection := Self.BdpConnection1; Self.bdpSelectCommand1.ParameterCount := (SmallInt(0)); Self.bdpSelectCommand1.SchemaName := nil; Self.bdpSelectCommand1.Transaction := nil; Self.bdpSelectCommand1.UpdatedRowSource := System.Data.UpdateRowSource.None; // // bdpInsertCommand1 // Self.bdpInsertCommand1.CommandOptions := nil; Self.bdpInsertCommand1.CommandText := ‘INSERT INTO customer (CustNo, Compa’ + ‘ny, Addr1, Addr2, City, State, Zip, Country, Phone, FAX, TaxRate, Contact’ + ‘, LastInvoiceDate ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)’; Self.bdpInsertCommand1.CommandType := System.Data.CommandType.Text; Self.bdpInsertCommand1.Connection := Self.BdpConnection1; Self.bdpInsertCommand1.ParameterCount := (SmallInt(13)); Self.bdpInsertCommand1.Parameters.Add( Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ustNo’, Borland.Data.Common.BdpType.Double, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, ‘CustNo’,System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ompany’,

21

Delphi

Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown,30, System.Data.ParameterDirection.Input, False, (Byte(30)), (Byte(0)), 30, Company’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘A’ + ‘ddr1’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 30, System.Data.ParameterDirection.Input, False, (Byte(30)), (Byte(0)), 30, ‘Addr1’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘A’ +‘ddr2’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 30, System.Data.ParameterDirection.Input,False, (Byte(30)), (Byte(0)), 30, ‘Addr2’,System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ +‘ity’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘City’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘S’ + ‘tate’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20, ‘State’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘Z’ + ‘ip’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 10, System.Data.ParameterDirection.Input, False, (Byte(10)), (Byte(0)), 10, ‘Zip’,

System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ountry’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20,‘Country’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘P’ + ‘hone’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘Phone’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘F’ + ‘AX’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘FAX’,System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘T’ + ‘axRate’, Borland.Data.Common.BdpType.Double, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, ‘TaxRate’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ontact’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20,‘Contact’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘L’ + ‘astInvoiceDate’,

22

Delphi

Borland.Data.Common.BdpType.DateTime, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, ‘LastInvoiceDate’, System.Data.DataRowVersion.Current, nil)); Self.bdpInsertCommand1.SchemaName := nil; Self.bdpInsertCommand1.Transaction := nil; Self.bdpInsertCommand1.UpdatedRowSource := System.Data.UpdateRowSource.None;

// // bdpUpdateCommand1 //

Self.bdpUpdateCommand1.CommandOptions := nil; Self.bdpUpdateCommand1.CommandText := ‘UPDATE customer SET Company = ?, Ad’ + ‘dr1 = ?, Addr2 = ?, City = ?, State = ?, Zip = ?, Country = ?, Phone = ?,’ + ‘ FAX = ?, TaxRate = ?, Contact = ?, LastInvoiceDate = ? WHERE CustNo = ?’; Self.bdpUpdateCommand1.CommandType := System.Data.CommandType.Text; Self.bdpUpdateCommand1.Connection := Self.BdpConnection1; Self.bdpUpdateCommand1.ParameterCount := (SmallInt(13)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ompany’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 30,System.Data.ParameterDirection.Input, False,(Byte(30)), (Byte(0)), 30, ‘Company’,System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘A’ + ‘ddr1’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 30, System.Data.ParameterDirection.Input,

False, (Byte(30)), (Byte(0)), 30, ‘Addr1’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘A’ + ‘ddr2’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 30, System.Data.ParameterDirection.Input, False, (Byte(30)), (Byte(0)), 30, ‘Addr2’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ity’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘City’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘S’ + ‘tate’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20, ‘State’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘Z’ + ‘ip’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 10, System.Data.ParameterDirection.Input, False, (Byte(10)), (Byte(0)), 10, ‘Zip’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ +‘ountry’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20,‘Country’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘P’ + ‘hone’,

23

Delphi

Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘Phone’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘F’ + ‘AX’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 15, System.Data.ParameterDirection.Input, False, (Byte(15)), (Byte(0)), 15, ‘FAX’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘T’ +‘axRate’, Borland.Data.Common.BdpType.Double, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, ‘TaxRate’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ontact’, Borland.Data.Common.BdpType.&String, Borland.Data.Common.BdpType.Unknown, 20, System.Data.ParameterDirection.Input, False, (Byte(20)), (Byte(0)), 20, Contact’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘L’ + ‘astInvoiceDate’, Borland.Data.Common.BdpType.DateTime, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, LastInvoiceDate’, System.Data.DataRowVersion.Current, nil)); Self.bdpUpdateCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ustNoOriginal’,Borland.Data.Common.BdpType.Double,Borland.Data.Common.BdpType.Unknown,0,System.Data.ParameterDirection.Input, False,(Byte(0)), (Byte(0)), 0, ‘CustNo’,

System.Data.DataRowVersion.Original, nil)); Self.bdpUpdateCommand1.SchemaName := nil; Self.bdpUpdateCommand1.Transaction := nil; Self.bdpUpdateCommand1.UpdatedRowSource :=System.Data.UpdateRowSource.None; // // bdpDeleteCommand1 // Self.bdpDeleteCommand1.CommandOptions :=

nil; Self.bdpDeleteCommand1.CommandText := ‘DELETE FROM customer WHERE CustNo =’ + ‘ ?’; Self.bdpDeleteCommand1.CommandType := System.Data.CommandType.Text; Self.bdpDeleteCommand1.Connection := Self.BdpConnection1; Self.bdpDeleteCommand1.ParameterCount := (SmallInt(1)); Self.bdpDeleteCommand1.Parameters. Add(Borland.Data.Common.BdpParameter.Create (‘C’ + ‘ustNoOriginal’, Borland.Data.Common.BdpType.Double, Borland.Data.Common.BdpType.Unknown, 0, System.Data.ParameterDirection.Input, False, (Byte(0)), (Byte(0)), 0, ‘CustNo’,System.Data.DataRowVersion.Original, nil)); Self.bdpDeleteCommand1.SchemaName := nil; Self.bdpDeleteCommand1.Transaction := nil; Self.bdpDeleteCommand1.UpdatedRowSource :=System.Data.UpdateRowSource.None; // // BdpDataAdapter1 // Self.BdpDataAdapter1.Active := True; Self.BdpDataAdapter1.DataSet :=

Self.DataSet11; Self.BdpDataAdapter1.DataTable :=

Self.DataSet11.customer; Self.BdpDataAdapter1.DeleteCommand :=

Self.bdpDeleteCommand1; Self.BdpDataAdapter1.InsertCommand :=

Self.bdpInsertCommand1; Self.BdpDataAdapter1.SelectCommand :=

Self.bdpSelectCommand1;

24

Delphi

Self.BdpDataAdapter1.StartRecord := 0; Self.BdpDataAdapter1.TableMappings.AddRange (TArrayOfSystem_Data_Common_DataTableMapping. Create(System.Data.Common.DataTableMapping.Create (‘T’ + ‘able’, ‘customer’, TArrayOfSystem_Data_Common_DataColumnMapping. Create(System.Data.Common.DataColumnMapping.Create (‘C’ + ‘ustNo’, ‘CustNo’), System.Data.Common.DataColumnMapping.Create (‘C’ + ‘ompany’, ‘Company’), System.Data.Common.DataColumnMapping.Create (‘A’+ ‘ddr1’, ‘Addr1’), System.Data.Common.DataColumnMapping.Create (‘A’ + ‘ddr2’, ‘Addr2’), System.Data.Common.DataColumnMapping.Create (‘C’ + ‘ity’, ‘City’), System.Data.Common.DataColumnMapping.Create (‘S’ + ‘tate’, ‘State’), System.Data.Common.DataColumnMapping.Create (‘Z’ +‘ip’, ‘Zip’), System.Data.Common.DataColumnMapping.Create (‘C’ + ‘ountry’, ‘Country’), System.Data.Common.DataColumnMapping.Create (‘P’ +‘hone’, ‘Phone’), System.Data.Common.DataColumnMapping.Create (‘F’ + ‘AX’, ‘FAX’), System.Data.Common.DataColumnMapping.Create (‘T’ + ‘axRate’, ‘TaxRate’), System.Data.Common.DataColumnMapping.Create (‘C’ + ‘ontact’, ‘Contact’), System.Data.Common.DataColumnMapping.Create (‘L’ + ‘astInvoiceDate’, LastInvoiceDate’))))); Self.BdpDataAdapter1.UpdateCommand :=Self.bdpUpdateCommand1; // // DataSet11 // Self.DataSet11.DataSetName := ‘DataSet1’; Self.DataSet11.Locale :=System.Globalization.CultureInfo.Create(‘pt-BR’); Self.DataSet11.Namespace := ‘http://www.changeme.now/DataSet1.xsd’; Include(Self.Load, Self.Page_Load);

(System.ComponentModel.ISupportInitialize (Self.BdpDataAdapter1)).EndInit; (System.ComponentModel.ISupportInitialize (Self.DataSet11)).EndInit;end;{$ENDREGION}procedure TWebForm1.Page_Load(sender:System.Object; e: System.EventArgs);begin // TODO: Put user code to initialize thepage here if not page.IsPostBack then DataGrid1.DataBind();end;

procedure TWebForm1.OnInit(e: EventArgs);begin // // Required for Designer support // InitializeComponent; inherited OnInit(e);end;

procedureTWebForm1.DataGrid1_UpdateCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);var i : integer;begin BdpConnection1.Open(); BdpDataAdapter1.UpdateCommand. Parameters[‘CustNoOriginal’].Value :=DataGrid1.DataKeys[e.Item.ItemIndex].ToString; if (e.Item.Cells[4].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand.Parameters[‘Company’].Value:= (e.Item.Cells[4].Controls[0] asTextBox).Text; if (e.Item.Cells[5].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Addr1’].Value :=(e.Item.Cells[5].Controls[0] as

25

Delphi

TextBox).Text; if (e.Item.Cells[6].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Addr2’].Value :=(e.Item.Cells[6].Controls[0] asTextBox).Text; if (e.Item.Cells[7].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘City’].Value :=(e.Item.Cells[7].Controls[0] asTextBox).Text; if (e.Item.Cells[8].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘State’].Value :=(e.Item.Cells[8].Controls[0] asTextBox).Text; if (e.Item.Cells[9].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Zip’].Value :=(e.Item.Cells[9].Controls[0] asTextBox).Text; if (e.Item.Cells[10].Controls[0] asTextBox).Text <> ‘’ then BdpDataAdapter1.UpdateCommand. Parameters[‘Country’].Value :=(e.Item.Cells[10].Controls[0] asTextBox).Text; BdpDataAdapter1.UpdateCommand.ExecuteNonQuery; BdpConnection1.Close(); BdpDataAdapter1.Fill(DataSet11); DataGrid1.EditItemIndex := -1; DataBind();end;procedureTWebForm1.DataGrid1_CancelCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);begin DataGrid1.EditItemIndex := -1; DataGrid1.DataBind();end;

procedureTWebForm1.DataGrid1_DeleteCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);begin BdpConnection1.Open(); BdpDataAdapter1.DeleteCommand. Parameters[‘CustNoOriginal’].Value :=DataGrid1.DataKeys[e.Item.ItemIndex]; BdpDataAdapter1.DeleteCommand.ExecuteNonQuery(); BdpConnection1.Close();end;procedureTWebForm1.DataGrid1_EditCommand(source:System.Object; e:System.Web.UI.WebControls.DataGridCommandEventArgs);begin DataGrid1.EditItemIndex :=e.Item.ItemIndex; DataGrid1.DataBind();end;procedureTWebForm1.DataGrid1_SelectedIndexChanged(sender:System.Object; e: System.EventArgs);beginend;procedureTWebForm1.DataGrid1_PageIndexChanged(source:System.Object; e:System.Web.UI.WebControls.DataGridPageChangedEventArgs);begin DataGrid1.CurrentPageIndex :=e.NewPageIndex; DataBind();end;

end.

É interessante que você olhe atentamente o código fonteacima para ir se acostumando e aprendendo como é a interaçãodo .NET Framework com o Delphi 2006. Todos estamos torcendotambém para que a Borland atenda aos pedidos dos usuáriosDelphi e faça uma adaptação rapidamente para que o Delphisuporte a versão 2.0 do Framework que facilita muito todo estetrabalho que tivemos até aqui.

26

Perguntas & Respostas

Pergunta: Tenho um sistema rodando com Delphi 7.0 e osistema operacional é Windows XP com tabelas Paradox. Namáquina servidora contém a base de dados. Quando acessamosalguns relatórios aparece a seguinte mensagem:FLOATING POINT DIVISION BY ZERO.

Sendo que em dois equipamentos com o mesmo sistemaoperacional mas que acessam a base do primeiro equipamentonão aparece nenhuma mensagem de erro, saindo os relatórioscorretamente.Vocês saberiam o que pode estar acontecendo?

Resposta: Esta exceção matemática ocorre na divisão deum valor por zero. Assim como elas estão aparecendo emrelatórios sugiro que você verifique se nestes relatórios não estãorealizando algum tipo de divisão. Nestas divisões inclua umavalidação que não permita a divisão de valores por um divisorcom valor igual a zero. Embora este erro não esteja ocorrendo emtodas asmaquinas, vale lembra que é possível que os dados usados nosrelatórios não sejam as mesmas, pois filtros diferentes podem serusados.

Dúvida enviada por Armando, Guarulhos – SP

Pergunta: Tenho um sistema rodando com Delphi 7.0 nosistema operacional Windows XP, mas estou encontrando umproblema. Eu tenho um formulário inicial e partir dele eu mostro2 formulários onde seleciono intervalos de impressão. A partirdisto é exibido uma mensagem (ShowMessage) informando paraposicionar um formulário na impressora, só que quando esteformulário é exibido ele fica atrás do formulário que foi exibidoanteriormente, não mostrando a mensagem ao usuário, mas seque se teclarmos Alt-Tab ele será exibido, e o formulário será

posicionado novamente corretamente. Este problema só estaaparecendo no Windows XP, no Windows 98 não aparece oproblema.

Resposta: Este problemas possivelmente estejam ocorrendopor uma de suas janelas ser configurada com a propriedadeFormStyle igual a fsStayOnTop, que é o mesmo valor da janelado Showmessage, assim pode continuar a chamar a janela comomodal, altere a propriedade FormStyle para fsNormal que iráresolver o problema.

Dúvida enviada por Armando, Guarulhos – SP

Pergunta: Estou com um problema na utilização deformulários MDI. Tenho um formulário que é meu Menuprincipal cuja propriedade FormStyle é fsMDIForm.Tenho 2formulários (FFichaPac e FAgenda) que são chamados peloMenu cujas as propriedades FormStyle são fsMDIChild.

Estou chamando cada formulário da seguinte forma:

procedure TFMenu.FichaPaciente1Click(Sender: TObject);

var FFichaPac : TFFichaPac; begin FFichaPac := TFFichaPac.Create(Self); FFichaPac.Show; end; e procedure TFMenu.Agenda1Click

(Sender: TObject); var

27

Perguntas & Respostas

FAgenda : TFAgenda; begin FAgenda := TFAgenda.Create(Self); FAgenda.Show; end;

Quando chamo pela segunda vez (por ex.: FAgenda), eleinicializa outro Form (Forma correta de trabalho de Forms dotipo Mdi para se utilizar o método cascata ou lado a lado).Se eu fecho o Form ele minimiza. Se eu dou caFree no OnCloseele fecha e eu perco o conteúdo que estava nele.Entretanto eu preciso ter uma segunda opção. Gostaria dealternar entre a abertura de outro Form ou simplesmentemostrar aquele já aberto.

Neste caso eu poderia ter dois itens no MainMenu: (Ex.: AbrirAgenda e Visualizar Agenda).Quando eu quiser abrir novo formulário eu utilizaria o item AbrirAgenda executaria a procedure acima mostrada.E para o item Visualizar Agenda, no qual eu colocaria em focoaquela Agenda já aberta não estou conseguindo fazer.Como seria os comandos necessários para isso?No momento estou tendo que minimizar (via mouse) um Formaberto (Ex. FichaPac) e maximizando o outro (Ex.: FAgenda), oque, para o usuário é um transtorno devido a quantidade deForms abertos. O ideal seria ele clicar na opção no MainMenu.

Resposta: Veja abaixo a rotinas que utilizamos em nossosprojetos para o controle de abertura de formulários. Observe quechamamos os formulários pela função CriaForm, onde o primeiroparâmetro é a classe do formulário, o segundo é o formulário e oterceiro é um booleano (true/false) que indica se o formulário seráaberto como modal ou não:

function AchaForm(NomeForm: TComponentClass):Boolean;var i: integer;begin Result := False; for i := 0 to Screen.FormCount - 1 do if Screen.Forms[i].ClassType = NomeFormthen begin Result := True; Break; end;end;

procedure CriaForm(ClasseForm:TComponentClass; var NomeForm; const Modal:

Boolean = True);begin if not AchaForm(ClasseForm) then begin Application.CreateForm

(ClasseForm, NomeForm); if Modal then begin try TForm(NomeForm).ShowModal; finally TForm(NomeForm).Free; end; end else TForm(NomeForm).Show; end else begin ShowWindow(TForm(NomeForm).Handle,

SW_RESTORE); TForm(NomeForm).Show; end;

end;

Dúvida enviada por Luiz, Vitória – ES

Pergunta: Acabei de fazer uma aplicação de automaçãocomercial, e um sistema interno para a empresa. Eu gostaria decolocar no sistema, a forma de pagamento dos meus clientes emboletos bancários. Vocês tem alguma coisa que possa enviar-me,ou tem algum material disponível, no site sobre boletos.

Resposta: Para desenvolver boletos bancários em suaaplicação recomendamos a utilização do componente gbboleto quepode ser baixado no site:

http://sourceforge.net/projects/gbboleto

“Componente Delphi para emissão de boletos bancários. Tempor objetivo poder emitir os boletos e tratar os arquivos deremessa e retorno para todos os bancos brasileiros. “

Dúvida enviada por Ricardo, São Paulo – SP

Pergunta: Existe o comando chr(65) que retorna o caracterAsc “A”. Como faço para fazer o contrario?

28

Perguntas & Respostas

Resposta: Para retornar o valor ASC de um caracter use afunção Ord, veja abaixo o exemplo do delphi:

var S: string; begin S := ‘The ASCII code for “c” is ‘ + IntToStr(Ord(‘c’)) + ‘ decimal’; MessageDlg(S, mtInformation, [mbOk], 0,

mbOK); end;

Dúvida enviada por Alex, Americana – SP

Pergunta: Eu gostaria de executar vários comandosWinExec. Um após o outro, mas enquanto o primeiro nãoterminar não pode ser executado o segundo e assim por diante.

Uso isto para apagar um diretório, depois copio váriosarquivos criando este diretório novamente, apago algunsarquivos desnecessários, compacto eles e mando para o disquete.

Resposta: Veja abaixo o exemplo onde uso a APIFindWindow para saber se uma janela está sendo executadanão permitindo que a próxima seja chamada antes de fechar aprimeira, no seu caso isto pode ser feito usando o nome da janelasdos programas em execução do seu procedimento:var App:HWND;begin WinExec(‘Calc.exe’,SW_SHOWNORMAL); while FindWindow(nil,’Calculadora’) <> 0 do begin Caption := ‘Excutando a 1° vez a calculadora - Hora: ‘+TimeToStr(Time); Sleep(200); Application.ProcessMessages; end; WinExec(‘Calc.exe’,SW_SHOWNORMAL); while FindWindow(nil,’Calculadora’) <> 0 do begin Caption := ‘Excutando a 2° vez a calculadora - Hora: ‘+TimeToStr(Time); Sleep(200); Application.ProcessMessages; end; Caption := ‘Processo Finalizado’;end;

Dúvida enviada por Bruno, Três Pontas – MG

Pergunta: Como conecto a minha aplicação em Delphi emum num banco MySQL 5.0.16. Utilizo o BDE ou ODBC?

Resposta: Existe um componente opensource chamadoZeosLib e você pode encontrá-lo no link http://sourceforge.net/projects/zeoslib/.

Temos informações que é muito bom, mas ainda nãorealizamos testes.

Dúvida enviada por Márcio, São José do Rio Preto – SP

Pergunta: Tenho uma máquina com um banco servidor, eoutras três máquinas (ou n maquinas), cada uma com um bancolocal com a mesma estrutura do banco servidor. Preciso rodar umScript qualquer no servidor e o mesmo tem que ser rodado nasoutras estações. Gostaria de um exemplo baseado em Thread’s,que eu consiga rodar algum script no banco servidor e disparareste mesmo script nas outras estações simultaneamente, sem euprecisar fazer um laço de repetição. Seria exatamente como oIBEvent funciona quando recebe um evento do banco, e algumarotina é disparada para todas as aplicações simultaneamente, eesta rotina no meu caso seria o script. Lembrando que cadaestação terá seu banco de dados específico.

Resposta: Analisando seu problema, pudemos detectar quepode ser feito o seguinte procedimento:

Use o IBEvent na sua aplicação, mas apontando para umbanco auxiliar único no servidor, crie neste banco um tabela decontrole onde irá ser inserido uma trigger de afterinsert com oMétodo PostEvent para executar no IBEvent. Assim suaaplicação deverá ter uma conexão com este banco para que seuIBEvent esteja ligado a ele e possa gerar o evento em todas asestações.

Desta forma basta apenas inserir um registro na tabela decontrole para que todos os terminais executem o evento doIBEvent.

Um segundo passo será executar o script, para isto poderáusar o componente IBScript.Desta forma não vejo a necessidadede utilizar uma Thread, mas pode ver um exemplo da mesma noseguinte diretório:

C:\Arquivos de programas\Borland\Delphi7\Demos\Threads

Dúvida enviada por Hugo, Três Pontas – MG

Pergunta: Desenvolvi uma trigger no FireBird, queguarda uma determinada data (TIMESTAMP), num campo tipo

29

Perguntas & Respostas

BLOB ( BLOB SUB_TYPE 0 SEGMENT SIZE 80), e esta dataesta sendo gravada no seguinte formato “aaaa-mm-dd<espaço>hh:mm:ss.0000”, através do seguinte comando datrigger “NEW.DATA”. Pelo Delphi estou fazendo a seguinteconversão StrToDateTime(aaaa-mm-dd<espaço>hh:mm:ss.0000), e esta me retornado um erro,alegando não ser um formato de data time válido. Comotransformar esta string em um TDateTime válido, para poderpassá-la como parâmetro em um Script a ser rodado no bancoFireBird?

Resposta: Este erro vai ocorrer se o formato da data nãoseja o mesmo que da mascara da data definida na máquina, porexemplo, a data deveria ser a seguinte se a mascara fosse ‘dd/MM/yyyy’:

var D:TDate;begin D := StrToDateTime

(’17/06/2006 12:30:00:0000');end;

Assim sugiro para este caso gravar a data em um campoTimestamp do Firebird, ou então então que gravasse o valor“Real/numerico” da data, pois a data nada mais é que um valornumérico, assim não teria problemas com relação a conversão:

var D:TDate;begin D := StrToDateTime

(’17/06/2006 12:30:00:0000'); Caption := FloatToStr(D);end;

Dúvida enviada por Hugo, Três Pontas – MG

Pergunta: Eu gostaria que quando clicasse no botão PDF,já fosse gerado arquivo. (Sem perguntar o nome, nem local ondeserá salvo).

No caso, o nome do arquivo seria por exemplo : ‘CX’ + onúmero do documento+ ‘.pdf’ .

Preciso disso, para poder enviar este arquivo como anexo dee-mail automaticamente após ele ser criado.

Resposta: Naquele botão PDF que existe no formulárioinclua o seguinte código .

Relato:= TRelatoriodeEntrada.Create(Application);

Relato.QEntrada.Prepare; Relato.QEntrada.close; Relato.QEntrada.Parambyname(‘Doc’). AsInteger:= TabEntradasDocumento.value; Relato.QEntrada.open; Relato.quickrep1.Prepare; ExportQR1.Report := Relato.quickrep1; ExportQR1.ExportQRPDF(‘NovoArquivo’,TRUE);

// <- a linha que grava direito é esta.

Dúvida enviada por Márcia,

Pergunta: Eu tenho um arquivo em que o campo Nome,tem acentos e Ç e eu preciso na hora da impressão, imprimir semacento e sem Ç. Você tem alguma rotina que possa estarenviando como exemplo?

Resposta: A rotina a seguir irá resolver o seu problema.

procedure TForm1.Button1Click(Sender: TObject);

var Str: string; Str2: Array[0..255] of Char; F: TextFile;begin Str := ‘áéíóúçÇãô’; { Troca o ã pelo â, pois o DOS não aceita o ã } Str := StringReplace (Str, ‘ã’, ‘â’, [rfReplaceAll]); { Troca os demais acentos } AnsiToOem(PChar(Str), Str2); AssignFile(f, ‘/LPT1’); Rewrite(f); Writeln(f, Str2); Writeln(f, #12); CloseFile(f);

end;

Dúvida enviada por Waldemar, Barretos – SP

Pergunta: No Oracle nós podemos definir uma variável daseguinte forma:

30

Perguntas & Respostas

DECLARE Minha_VariavelMINHA_TABELA.CAMPO%TYPE

Neste caso o tipo da variável é igual ao tipo do campo. Casoum dia este campo sofra alteração, Não precisarei alterar nadana programação das stored procedures ou trigger que a elefizerem referência. Existe algo similar no FireBird?

Resposta: No Firebird tem o que chamamos de Domains.No Domain você define um tipo, por exemplo, varchar(50).Quando você for criar um novo campo ao invés de informar o tipodo campo você informa o nome d Domain.

Dúvida enviada por Roberto, Salvador – BA

Pergunta: Gostaria de saber como fazer uma sql usandoum like junto com um edit e tudo isso usando o componentequery

Resposta: Veja o exemplo a seguir.

procedure TForm1.BitBtn1Click (Sender: TObject); begin // Fecha o componente Query Query1.Close; // Limpa a propriedade SQL Query1.Sql.Clear; // Nome dos campos Query1.Sql.Add (‘Select Teste1.Codigo, Teste1.Nome’); // Nome do banco de dados Query1.Sql.Add(‘From Teste1 ‘); // Condições do Filtro Query1.Sql.Add(‘Where ‘); // :Nome1 é a variável que receberá o // parâmetro. // O nome desta variável não importa, // pode ser usado qualquer nome. Query1.Sql.Add (‘(Teste1.Nome like :Nome1) ‘); // Passagem do parâmetro para a variável // criada acima Query1.Params[0].AsString := ‘%’+Edit1.Text+’%’; // Abre o componente Query Query1.Open;end;

Dúvida enviada por Ives, Santo Antonio da Platina – PR

Pergunta: Gostaria de indexar um campo de umClientdataSet. O campo é Qtd (Quantidade = Float), tem comoordenar por ele, via fonte?

Resposta: Veja abaixo como criar um índice noClientDataSet.

procedure TForm1.Button1Click (Sender: TObject); begin ClientDataSet1.AddIndex(‘CapitalDesc’, ‘Capital’, [ixDescending, ixCaseInsensitive]); ClientDataSet1.IndexName := ‘CapitalDesc’;end;

Dúvida enviada por Luis, Santo Antonio da Platina – PR

Pergunta: Dentre as formas mostradas a seguir para secriar um formulário, qual seria a melhor?

a) Application.CreateForm(TForm1, Form1);Cria o Form; o proprietário é a aplicação.b) Form1 := TForm.Create(self);Cria o Form; o proprietário é ele mesmo.c) Form1 := TForm.Create(Application);Cria o Form; o proprietário é a aplicação.d) Form1 := TForm.Create(nil);Cria o Form; teoricamente sem proprietário; na prática é a

aplicação.

Poderiam me informar a diferença entre elas?

Resposta: Quando você cria um Form acontece o seguinte:Se você criar através de CreateForm, que é um método de

TApplication, você passa como parâmetro a instância da classe eo nome do seu objeto (TForm1, Form1);

Se você criar através de Create, método de TForm, entreoutros - você passa como parâmetro o proprietário do componentecriado, no caso o Form. Se o proprietário for a aplicação, o Formsó será destruído quando você finalizar o aplicativo ou se vocêdeclarar Free ou Destroy no seu programa.

Se o proprietário for ele mesmo (self), o form terá que serdestruído por você. Quanto à melhor maneira, depende de comovocê quer controlar a aplicação, mas leve em conta que enquantoum objeto não é destruído, ele está na memória.

Dúvida enviada por José Antonio, Curitiba – PR