32

THE CLUB · 7 IBReplicator Uma visão prática e objetiva Interbase Diversas vezes vi meus caros colegas desenvolvedores “quebrando a cabeça” para replicarem ou sincronizarem

  • Upload
    leque

  • View
    223

  • Download
    1

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

ColaboradoresAlexandre Tarifa

EDITORIAL

Editorial

Editorial .................................................................................. 03Personalizando aplicações Windows Forms......................... 04IBReplicator - Uma visão prática e objetiva ............................ 07Instalando a versão gratuita do SQL Server 2005 .................. 11Perguntas & Respostas ......................................................... 20Dicas & Truques .................................................................... 25Delphi é marca registrada da Borland International,

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

Olá amigos,

Vocês estão recebendo mais uma edição da revista The ClubMegazine. Neste edição estamos trazendo informações muitointeressantes.

O nosso colaborador Alexandre Tarifa está trazendo uma matériaque fala sobre como podemos personalizar aplicações Windows Forms.

O nosso consultor Marcos César Silva traz uma matéria que falasobre uma solução que é procurada por diversos programadores. Areplicação de dados.

Com o lançamento das versões express dos banco de dados, o nossoconsultor Claudinei Rodrigues nos mostra nesta edição como instalar oSQL Server 2005 Express e também como criar uma aplicação simplesde acesso a este banco de dados.

E como não poderia faltar estamos trazendo a seção de Perguntas eRespostas com algumas das solicitações feitas ao nosso suporte técnico etambém estamos trazendo a seção de Dicas e Truques que informaçõesbem interessantes.

Tenham todos uma boa leitura e até a próxima.

4

Personalizando aplicaçõesWindows Forms

Visual Studio .NET

Personalização é a palavra da moda principalmente emaplicações Web, onde é feito um esforço tremendo para conseguiragradar a todos que utilizam uma determinada aplicação. Asaplicações Windows não poderiam ficar de fora e por isso queforam adicionados no Windows Forms 2.0 recursos que facilitamo armazenamento de informações personalizadas de acordo com ousuário.

Temos a opção de armazenar estes valores no que chamamose Settings, que são chaves armazenadas no arquivo deconfiguração app.Config que podem ser tipadas e o principal:categorizada por escopo. São dois tipos de escopos:

User: pode ser alterado por usuárioApplication: fixo durante a execução da aplicação.

Para personalizarmos as aplicações devemos então sempreutilizar o escopo como User.

Na prática

Crie um novo projeto no Visual Studio 2005 com o templateWindows Forms e a linguagem de programação VB.Net. Vamosmontar um exemplo simples no formulário Form1 já adicionado noprojeto.

No Form1 adicione os controles conforme a imagem abaixo:

Personalizando aplicaçõesWindows Forms

No Solution Explorer dê um duplo clique em My Project eselecione a aba Settings. (figura 2)

Adicione 3 settings: (figura 3)

Figura 1

São os valores que vamos exibir no formulário criado, o códigoé muito simples.

Adicione no Form Load o código abaixo:

Me.txtAplicacao.Text =My.Settings.Aplicacao

Me.txtCor.Text =My.Settings.CorFundo.ToString

Me.txtNome.Text =My.Settings.Nome

Com isso recuperamos os valores através da classe My.

Para atribuir os valores, funciona da mesma forma, no botãogravar adicione o código atribuindo um novo nome:

My.Settings.Nome =Me.txtNome.Text

My.Settings.Save()

Note que o evento Save é responsável por alterar os valores noarquivo de configuração.

Como testar?

O Visual Studio toda vez que executamos uma aplicação égerado um novo executável e um novo arquivo de configuração.Por isso se testarmos diretamente pelo Visual Studio dá aimpressão de que os valores não foram alterados.

Entre na pasta que você criou o projeto: (figura 4)

por Alexandre TarifaSobre o autor

Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) eMCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciênciada Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreveartigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.

5

Figura 3

Figura 4

Visual Studio .NET

Figura 2

6

Em seguida entre no diretório Bin/Debug (Figura 5)

Rode então o executável e altere o nome e clique no botãogravar.

Ver figura 6.

Abra então o arquivo Personalização.exe.config no notepad, eveja o resultado da alteração do valor.

Conclusão

Criar uma aplicação personalizável é uma tarefa muitosimples, com isso podemos criar aplicações mais criativas e comum resultado mais interessante ao usuário.Figura 6

Figura 5

Visual Studio .NET

7

IBReplicatorUma visão prática e objetiva

Interbase

Diversas vezes vi meus caros colegas desenvolvedores“quebrando a cabeça” para replicarem ou sincronizarem seusbancos de dados, esta necessidade de replicação pode ocorrer emdiversos casos, como empresas que possuEm filiais e deseja queos dados cadastrados na filial sejam refletidos na matriz, ou quea atualização de cadastros da matriz seja também feita na filial,ou em uma situação mais simples ainda, quando se tem anecessidade de atualizar uma tabela de preço disponível no siteda empresa a partir do banco local na empresa. Para estes casosvi diversas soluções, como criação de WebServices, Exportação eImportação de arquivo .txt entre outras complicação.

No caso do banco Interbase/Firebird a solução práticaencontrada para estes casos é a utilização do IBReplicator, umaferramenta apropriada para realizar de forma bastante simples atarefa de sincronização entre banco de dados.

Instalação e característicasO IBReplicator pode ser baixado no site http://

www.ibphoenix.com/ encontrando se até este momento na versão2.1.7. Após sua instalação observamos que três ferramentasforam instaladas em Iniciar -> Programas -> IBReplicator, sendo elas:

· Configure Services: responsável por instalar e darmanutenção o para Servidor de Replicação e para o Agendador deReplicação como serviço do Windows;

· Replication Server: sendo este o gatilho para a replicaçãomanual ou agendada em intervalos de tempos;

· Replicator Manager: Ferramenta onde toda configuração dereplicação entre os bancos são feitas;

Nosso exemploConsideraremos a situação de termos que atualizar o banco

de dados onde fica a tabela de preços de nossa empresa, estebanco é utilizado para consulta de preços no Website da empresa,

IBReplicatorUma visão prática e objetiva

que se encontra em outro servidor que não o da empresa, e possuiainda uma estrutura diferente do banco de produção da empresa,mas podemos considerar que seria o mesmo que uma matriz(banco local) e a sua filial (banco no servidor web).

Vamos criar agora os dois bancos, o banco local da empresa eo banco de preços de produtos para consulta no site, assim iremosexecutar os dois Scripts abaixo em qualquer ferramenta demanutenção de banco como no IBconsole ou IBExpert:

a) Banco da empresa

SET SQL DIALECT 3;

CREATE DATABASE ‘D:\Loja.gdb’USER ‘SYSDBA’ PASSWORD ‘masterkey’PAGE_SIZE 4096DEFAULT CHARACTER SET WIN1251;

/* Tables definitions */

CREATE TABLE PRODUTOS ( ID_PRODUTO INTEGER NOT NULL, COD_BARRAS VARCHAR (15), DESCRICAO VARCHAR (255), PERC_IPI NUMERIC (6, 2), PERC_ICMS NUMERIC (6, 2), PRECO_CUSTO NUMERIC (18, 2), PRECO_VENDA NUMERIC (18, 2));

/* Primary keys definition */ALTER TABLE PRODUTOS ADD CONSTRAINTPK_PRODUTOSPRIMARY KEY (ID_PRODUTO);

Por Marcos César Silva

8

b) Registros

Registros que serão inseridos na tabela de produtos do bancoda loja, onde serão replicados posteriormente no banco de tabelade preços:

INSERT INTO PRODUTOS (ID_PRODUTO,COD_BARRAS,DESCRICAO,PERC_IPI,PERC_ICMS,PRECO_CUSTO,PRECO_VENDA)VALUES (1,’123456',’CAMISETA REGATASPORT’,0,18,22.4,NULL);INSERT INTO PRODUTOS (ID_PRODUTO,COD_BARRAS,DESCRICAO,PERC_IPI,PERC_ICMS,PRECO_CUSTO,PRECO_VENDA)VALUES (2,’321654',’BERMUDA SOCIAL’,0,18,35,NULL);INSERT INTO PRODUTOS (ID_PRODUTO,COD_BARRAS,DESCRICAO,PERC_IPI,PERC_ICMS,PRECO_CUSTO,PRECO_VENDA)VALUES (3,’951487',’CALÇA JEANS’,0,18,43,NULL);INSERT INTO PRODUTOS (ID_PRODUTO,COD_BARRAS,DESCRICAO,PERC_IPI,PERC_ICMS,PRECO_CUSTO,PRECO_VENDA)VALUES (4,’654987',’CAMISA SOCIAL’,0,18,38.9,4);

c) Banco para Consulta de Preços

SET SQL DIALECT 3;

CREATE DATABASE ‘D:\TABELA_PRECO.gdb’USER ‘SYSDBA’ PASSWORD ‘masterkey’PAGE_SIZE 4096DEFAULT CHARACTER SET WIN1251;

/* Tables definitions */

CREATE TABLE PRODUTOS ( ID_PRODUTO INTEGER NOT NULL, DESCRICAO VARCHAR (255), PRECO_CUSTO NUMERIC (18, 2));

/* Primary keys definition */

ALTER TABLE PRODUTOS ADD CONSTRAINTPK_PRODUTOS PRIMARY KEY (ID_PRODUTO);

Com os bancos Tabela_Precos.gdb e Loja.gdb criados o eIBreplicator instalado no mesmo servidor onde está o Loja.gdb,iremos agora configurar o Replication Manager, para isto vamosabrí-lo e selecionar no menu File a opção New Configuration, ajanela Create a new Configuration Database será exibida. Estatela tem a finalidade que criar o banco de dados que iráarmazenar as configurações da replicação que deseja realizar,assim configure-a com mostro na Imagem 1:

Imagem 1

Uma observação importante é que esta versão da ferramentaé trial, assim para utilizá-la deveremos informar a chave deregistro para esta avaliação.

Informe então em Tools | Licence Manager| Add o valor‘Eval ‘ em Licence ID, e verá que será criada uma Licence Keyvalida por 14 dias a partir deste registro.

Registrando os BancosAgora iremos registrar na ferramenta os dois bancos que irão

fazer parte da replicação, na aba Databases do ReplicationManager clique com o botão direito na opção Registereddatabases e selecione a opção Add, para as propriedades (Imagem2) do novo database que será registrado, informe os seguintesvalores (Tabela 1), salve e repita o procedimento para o banco detabela de preços onde os dados serão replicados:

Propriedades Valor

Descriptive name Lojaz

Server 127.0.0.1:D:\LOJA.GDB

Administrative user name sysdba

Administrative password Masterkey

Interbase

Tabela 1

9

Imagem 2

Definindo o “Schema” da replicaçãoDevemos agora definir como será feito esta

replicação a partir de um esquema onde serãoconfigurados quais tabelas e campos serãoreplicados, assim na aba Replications clique como botão direito em Defined Replication Schematae selecione a opção New, e em Schema Namedaremos um nome para o esquema, onde emnosso exemplo chamará Loja_TabelaPrecos. Emnossa Treeview do esquema observaremos doisnós, sendo o primeiro o Source Database, ou seja,o banco de dados de origem dos dados, podendoser apenas um por esquema, e o segundo oTarget databases, onde poderá ter definidosvários bancos que receberão os dados.

Clique com o botão direito Source Database eselecione a opção Add para registrarmos o bancode origem, na aba connection na propriedadeRegistered database selecione o banco Loja,informe o usuário e senha (Imagem 3), não hánecessidade de alterar outras propriedadespodendo manter os valores padrão.

Repetiremos o procedimento para o Target databases Imagem 3

Interbase

10

Imagem 4

Imagem 5

informando o banco Tabela de Preços.

O próximo passo será “mapear” as tabelas e campos que serãoreplicados, embora em nosso exemplo os bancos não tenham amesma estrutura, a tabela e os campos que desejamos replicarexistem tanto na banco origem como no destino, assimselecionado Replicated Table and Procedures do banco destinopoderemos criar automaticamente o mapeamento clicando emGenerate Tables, Keys and Fields (Imagem 4) .

Veja que foi criado todo o mapeamento da tabela e banco quecoexistem tanto na origem como nos destino (Imagem 5).

Agora para que a replicação funcione deverão ser criados nobanco os objetos responsáveis pela replicação, estes objetos nadamais são do que tabelas de controles que serão criados no banco.Desta forma selecione o banco origem e clique na opção CreateSystem Objects.

A Replicação

Primeiramente vamos definir que esteesquema de replicação que criamos serápadrão, defina isto em Configuration | Setas Default no menu do próprio ReplicationManager.

Agora sim podemos abrir o ReplicationServer, para que possamos fazer a replicaçãode forma manual ou através de umagendamento.

Para executarmos de forma manualbasta clicar no botão Replicate na barra de

ferramentas do Replication Server, caso deseje agendar asreplicações clique no botão Replication Timer, que executará areplicação nos intervalos de tempo definido na propriedade TimerInterval.

Conclusão

Vimos neste artigo que a replicação de dados em banco dedados Interbase/Firebird pode ser bastante simples de serimplementado, sem a necessidade da criação de procedimentostrabalhosos, rebuscados e de difícil manutenção.

Ao longo deste artigo o leitor deve ter observado inúmerosrecursos adicionais que a ferramenta oferece e que nãomencionei neste artigo para não fugir da simplicidade doexemplo, mas acredito que tenha ficado claro o potencial e aflexibilidade da ferramenta para outros tipos de situações quepoderemos nos deparar cotidianamente.

Aquele abraço a todos e bons projetos.

Sobre o autorMarcos César Silva, Consultor de Sistemas e ConsultorTécnico do The Club, Bacharel em Ciência da Computação,MCAD (Microsoft Certified Application Developer) eMCSD.NET (Microsoft Certified Solution Developer .NET)[email protected]

Interbase

11

Instalando a versão gratuitado SQL Server 2005

Instalando a versão gratuitado SQL Server 2005

Por Claudinei Rodrigues – [email protected]

Para quem ainda não sabe a Microsoft lançou no final do anopassado o SQL Server 2005. Existem várias versões deste bancode dados, mas nesta matéria eu vou falar sobre a versão Express,ou seja, a versão gratuíta. Como eu já havia adiantado em Julhode 2004 nesta mesma revista, o SQL Server Express é umaversão light e gratuíta do SQL Server 2005 que veio parasubstituir o MSDE e é destinada à construção de aplicaçõessimples e dinâmicas.

Esta nova versão é bem mais leve e bem mais fácil de usar. OSQL Server Express é gratuíto para download, gratuíto para serredistribuído. Mas não é por ele ser uma versão light do SQLServer que ele é menos seguro que qualquer outro banco dedados. Segundo a Microsoft esta versão foi projetada para darmaior escalabilidade, disponibilidade e segurança para asaplicações e também tornar mais fáceis de serem criadas,implementadas e gerenciadas.

O SQL Server Express é baseado no SQL Server 2005. Eletem suporte completo a T-SQL e integração com o CLR (CommonLanguage RunTime) e você pode criar stored procedures, views,triggers e cursores. Suporta dados XML, dados estruturados esemi-estruturados e esquemas XML.

Antes de proceder a instalaçãoAntes de começarmos a instalação do SQL Server 2005

Express, vamos baixar o pacote de componentes redistribuíveisMicrosoft .NET Framework versão 2.0. Para baixá-lo acesse olink, http://www.microsoft.com/downloads/details.aspx?displaylang=pt-br&FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5. Esta versão que estamosinstalando é a versão em português. Não é possível instalar duasversões de idioma diferentes do .NET Framework no mesmocomputador. Se você tentar instalar uma segunda versão deidioma, o .NET Framework exibirá a seguinte mensagem de erro:“Não é possível instalar o Microsoft .NET Framework porque já

existe uma outra versão do produto instalada”. Se você deseja veros recursos do .NET Framework em outro idioma, você deverábaixar a versão do idioma apropriado do pacote de idioma do.NET Framework. No link anterior você encontrará informaçõesmais detalhadas sobre o .NET Framework.

Para fazer o download do SQL Server 2005 Express, acesse olink http://msdn.microsoft.com/vstudio/express/sql/download/. Euaconselho que você faça o download do SQL Server 2005 ExpressEdition with Advanced Services SP1. Neste pacote além do SQLServer 2005 Express você também terá acesso a ferramentas dedesenvolvimento adicionais, como:

SQL Server Management Studio Express: Esta é umaferramenta de gerenciamento gráfico que torna muito mais fácilo gerenciamento e manutenção da sua base de dados.

Reporting Services: Um ambiente de design para a criação derelatórios

Full-Text Search: Uma poderosa ferramenta para pesquisade textos.

Você ainda pode baixar o Microsoft SQL Server 2005 ExpressEdition Toolkit SP1, ele fornece ferramentas e recursos paragerenciar o SQL Server 2005 Express, como criar relatóriosusando o SQL Server 2005 Reporting Services. Este toolkit incluiainda componentes de conectividade, o Business IntelligenceDevelopment Studio com o qual você pode criar relatórios noReporting Services. Mas não vamos neste momento nosaprofundar muito. Vamos trabalhar em cima do próprio SQLServer Express 2005.

InstalandoPara iniciar a instalação do SQL Server 2005 Express,

execute o arquivo SQLEXPR_ADV.EXE. Feito isto você teráacesso a tela de licença. Como mostrado na figura 1.

SQL

12

Figura1: Tela de licença

O SQL Server Component Update é executado, comomostrado na figura 2, e instala os requisitos necessários para ainstalação do SQL Server 2005 Express como o Microsoft SQLNative Client e Microsoft SQL Server 2005 Setup Support Files.

Agora clique no botão Next.

Agora na janela Welcome to the Microsoft SQL Server

Installation Wizard clique no botão Next para prosseguir.

Feito isto SQL Express apresenta uma tela SystemConfiguration Check, como mostrado na figura 3. Ele faz umaverificação em busca de possíveis problemas, verifica requisitosmínimos de hardware e software que possam impedir ainstalação do SQL Server Express. Caso algum problema sejaencontrado você terá a opção de visualizar o relatório sobre oproblema encontrado e uma possível solução.

Figura 3: Checando configuração

Agora clique no botão Next. Na janela RegistrationInformation, figura 4, entre com as informações solicitadas.

Muita atenção! Neste ponto existe uma observação muitoimportante.

Se você selecionar a opção Hide advanced configurationoptions, o SQL Server Express será instalado com suaconfiguração padrão. Mas neste caso nós vamos desmarcar estaopção. (figura 4)

Clique em Next. Na próxima tela, figura 5, selecione todas asopções disponíveis. Vamos instalar a ferramenta completa. Edepois clique em Next. (figura 5)

A próxima janela é a Instance Name. Esta janela permite quevocê selecione uma Instancia Default ou uma InstanciaNomeada para a instalação do SQL Server.

Quando o SQL Server 2005 Express é instalado como Default

SQL

Figura 2: Instalação de pré-requisitos

13

Figura 5: Opções de instalação

Figura 4: Informações para registro

Instance ele não solicita que o cliente especifique o nome dainstância para fazer a conexão. O cliente apenas precisa saber onome do servidor SQL ao qual deseja se conectar.

Um Named Instance é formado pelo nome do servidor mais onome da instância que você informou durante a instalação. Ocliente precisa conhecer o nome do servidor e o nome da instânciapara se conectar.

Por padrão, o SQL Server é instalado como Default Instancea menos que você especifique um nome de instância durante ainstalação. Ao contrário do SQL Server, o SQL Server Express épor default instalado como Named Instance, tendo como nomepadrão para a instância o nome “SQLExpress”. Se você nãoinformar um nome para a instância durante a instalação ou nãodesmarcar a opção Hide Advanced configuration options, onome padrão será usado. Neste caso, você deverá acessar o SQLExpress como NomedoComputador\SQLExpress.

Você também pode instalar o SQL Express como DefaultInstance permitindo que apenas o nome do servidor sejainformado durante a conexão se nenhuma outra versão do SQLServer já estiver instalada no servidor como default instance.Para fazer isto, instale o SQL Express como named instanceusando como nome para a instância o nome MSSQLSERVER.

Figura 6: Nome das instâncias.

No nosso caso eu estou usando o Named instance porque eujá tenho o SQL Server 2000 instalado no meu computador. Agoraclique no botão Next.

Agora estamos na janela Service Account. Esta janela nospermite definir qual conta de usuário que será usada para iniciaro servidor SQL Server Express. É através dela que podemosatribuir a conta local system (local system account) ou umaconta de usuário de domínio (domain user account) para iniciaros serviços SQL Server Express. Por padrão o SQL ServerExpress é instalado tendo a conta de sistema Network Servicecomo conta para a inicialização dos serviços. Mas é recomendado

SQL

14

que se use uma conta de domínio ou então criar uma conta localespecífica para a inicialização dos serviços. Neste caso vamosutilizar uma conta local como mostrada na figura 7. Depois deselecionar a conta local clique em Next.

Figura 7: Configurando contas

A próxima janela, figura 8, é a Authentication Mode.Informe nesta janela o modo de segurança que deverá serutilizado para se conectar ao SQL Express.

Eu aconselho que você clique na opção Mixed Mode. Poisneste caso você poderá acessar o SQL Server Express tanto pelasua conta local, quanto pelo o usuário sa e a senha que vocêinformar nesta janela.

Depois de digitar a senha, clique em Next. (figura 8)

A próxima janela, figura 9, é a Collation Settings. Estajanela permite informar qual Collation e Code Page que o SQLServer Express irá utilizar. Por padrão o SQL Server Express éinstalado como case-insensitive, accent-sensitive. Ou seja, nãofaz restrição a maiúsculas e minúsculas, mas faz restrição aacentuação. Com isso, durante uma pesquisa, ”José” e “josé” sãoa mesma coisa mas “José” e “Jose” ou “josé” e “jose” não são. Paraevitar futuros problemas com acentuação ou caracteresmaiúsculos e minúsculos, eu recomendo que você selecione oCollate conforme está sendo mostrado na figura 9. A não ser quevocê precise manter a compatibilidade de Collate com outrosservidores. Neste caso, selecione o Collate conforme suanecessidade.

Figura 8: Modo de autenticação

Figura 9: Informações do collation

Clique no botão Next também na próxima tela que é a UserInstances. Deixe a opção Enable User Instances habilitada.

A próxima janela é do Report Service. Deixe como está.Apenas clique no botão Next.

A próxima janela é a Error and Usage Report Settings,

SQL

15

selecione se você deseja reportar erros do SQL Server Express eseus componentes para a Microsoft. Depois clique em Next. Napróxima janela, figura 10, clique em Install.

Figura 10: Iniciar a instalação.

Pronto, agora o seu SQL Server Express será instalado.

Configurando o SQL Server Express para rodar na RedePara se conectar a uma instância do SQL Express através da

rede, existem algumas considerações que você deve estar ciente:

1 - Por razões de segurança, os protocolos de rede sãodesabilitados por padrão. Você pode habilitar os protocolosindividualmente durante a instalação ou após a instalação, que éo que vamos fazer daqui a pouco.

2 - O SQL Express é instalado como named instance porpadrão.

3 - O serviço SQL Browser é usado por alguns protocolos derede para associar instâncias nomeadas com números de portas

TCP/IP. Entretanto, se o SQL Server Express é instalado nomesmo computador que uma versão anterior ao SP3 do MSDEou SQL Server 2000, pode ocorrer alguns conflitos.

Como eu já disse anteriormente, os protocolos de rede sãodesabilitados por padrão. Isto faz com que após a instalação oSQL Server Express não aceite conexões vindas de outrasestações de uma rede.

Apenas a conexão local (na própria máquina onde o SQLServer Express foi instalado) será permitida.

Para permitir que o SQL Server Express se comunique comsuas aplicações através da rede, você deve primeiro habilitar umdos protocolos de rede e então reiniciar o serviço SQL Browser.

O SQL Express suporta os seguintes protocolos de rede. (vertabela abaixo)

Habilitando os protocolos de RedeVamos ver agora como habilitar e configurar o protocolo TCP/

IP no SQL Server Express usando o utilitário SQL ServerConfiguration Manager.

Atenção! Você deverá reiniciar o serviço do SQL ServerExpress após fazer alterações para os protocolos de rede. Tambémé recomendado a reinicialização do serviço SQL Browser.

Para habilitar o protocolo TCP/IP siga os passos abaixo:

1- No menu Iniciar, selecione Programas, depois MicrosoftSQL Server 2005, depois em Configuration Tools e então cliqueem SQL Server Configuration Manager.

2- Expanda SQL Server 2005 Network Configuration e cliquesobre Protocols for SQLExpress (ou o nome da sua instância). Nopainel do lado direito, clique com o botão direito sobre o protocoloTCP/IP e selecione Enable. Como está sendo mostrado na figura11 (próxima página).

Protocolo de rede Descrição Padrão

Shared Memory Permite conectar a uma instância do SQL Server Express rodando no mesmo computador.Não pode ser usado para acesso de outras estações da rede. Habilitado

TCP/IPPermite que outras estações se conectem ao SQL Server Express por especificar o nomedo servidor e o nome da instância (default SQLExpress) ou o endereço IP e o nome dainstância

Desabilitado

Named PipesPermite que outras estações se conectem ao SQL Server Express por suportar váriosprotocolos de rede, incluindo NetBEUI, TCP/IP e IPX/SPX. Ele seleciona o protocolo derede automaticamente baseado na configuração do cliente.

Desabilitado

SQL

16

Figura 11: SQL Server Configuration Manager.

Configurando o protocolo TCP/IP1 - No SQL Server Configuration Manager, clique com o botão

direito sobre TCP/IP e selecione Propriedades.2 - Na guia IP Addresses, vá até a opção IPAll que fica no

final da tela e coloque 1433 em TCP Port. Como mostrado nafigura 12.

Mas muita atenção. Se você já tiver instalado qualquer outraversão do SQL Server, altere este numero para 1434.

3 - Clique em OK para fechar a janela e salvar as alterações.(figura 12)

O procedimento que acabamos de realizar configurou a porta1433 para todos os IPs configurados em sua máquina. Caso vocêdeseje configurar uma porta apenas para um IP específico,localize o IP desejado (IP1, IP2...) e siga o mesmo procedimento.

Reiniciando o serviço SQL BrowserPara reiniciar o serviço SQL Browser, estando ainda no SQL

Server Configuration Manager faça o seguinte:

1 - Selecione SQL Server 2005 Services2 - No painel da direita, clique com o botão direito sobre o

serviço SQL Server Browser e selecione Restart3 - Para fazer com que o serviço seja iniciado

automaticamente, clique com o botão direito e selecionePropriedades

4 - Na guia Services, em Start Mode selecione Automatic5 - Clique em OK para fechar a janela e salvar as alterações.

Figura 12: Propriedades do TCP/IP.

Bom pessoal, até aqui já temos o nosso banco de dadosinstalado. Agora vamos criar um banco de dados.

Criando um banco de dadosPara criar um banco de dados, vamos utilizar a ferramenta

SQL Server Management Studio Express que eu comentei noinício desta matéria. Para executá-lo, vá até o menu Iniciar do

SQL

17

Windows, depois em Microsoft SQL Server 2005, depois em SQLServer Management Studio Express.

Figura 13: Conectando ao servidor

Feito isto você terá acesso a uma tela semelhante a mostradana figura 13. Existem duas formas de se conectar desde que vocêtenha escolhido a opção Mixed Mode na janela AuthenticationMode conforme eu havia mencionado anteriormente. Basta agoraque você clique no botão Connect.

Você verá no lado direito, o Object Explorer. Clique com obotão direito do mouse em Databases e depois New Database....Como está sendo mostrado na figura 14.

Figura 14: Criando um banco de dados.

Na próxima tela informe no campo Database name o nome do seubanco de dados. Por exemplo, EXEMPLOREVISTA. Agora cliqueno botão Ok. Volte ao Object Explorer e expanda o ítemEXEMPLOREVISTA e depois clique com o botão direito emTables. No menu clique em NewTable...

Vamos criar uma tabela simples com os campos CODIGO,

NOME, CIDADE e ESTADO, como mostrado na figura 15. Dê onome Tabela1 para esta tabela.

Figura 15: Tabela do banco de dados.

Como todo mundo sabe, deve-se criar uma chave primáriapara cada tabela. Para isto selecione o campo código, vá até aspropriedades da coluna que fica na parte de baixo da tela.Expanda a propriedade Identity Specification e altere apropriedade Is Identity para True. Como está sendo mostrada nafigura 16.

Figura 16: Configurando o auto preenchimento.

Isto vai fazer com que o campo receba um autopreenchimento incremental. Depois disto clique no botão .Isto fará com que o campo seja uma chave primária. Nãoesqueça de salvar a tabela, através do menu File | Save... Agoracom a nossa tabela pronta, vamos criar um exemplo.

Criando um exemploAgora que já temos um banco de dados pronto, vamos

montar uma aplicação bem simples que irá acessar esta base dedados. Para isto vamos utilizar os componentes da palheta ADO.

Chame o seu Delphi 7 e crie uma nova aplicação. Vá até apalheta de componentes na aba ADO e arraste um componenteADOConnection e um componente ADODataSet. Vamos

SQL

18

configurar o acesso ao banco de dados, para isto dê um duploclique no componente ADOConnection. Feito isto você terá umatela igual a tela mostrada na figura 17. Clique no botão Build.

Figura 17: Configurando conexão

Após clicar no botão Build... você terá acesso a próxima tela.Na aba Provedor selecione o item Microsoft OLE DB Provider forSQL Server e depois clique no botão Next >>, como mostrado nafigura 18.

Figura 18: Selecionado provedor de acesso

Na próxima tela nós vamos configurar a nossa conexão.Selecione no item 1 o nome do seu servidor.

No meu caso você está vendo que aparece o nome da minhamáquina e em seguida o nome do meu SQL Server Express.

Conforme eu já expliquei anteriormente eu tenho umaversão do SQL Server anterior instalada e por isto estáaparecendo o nome da minha máquina seguida do nome do meuservidor.

Se eu não tivesse outra versão instalada no meu computador,apareceria apenas o nome da minha máquina. No item 2selecione Usar a segurança integrada do Windows NT.

Se você quiser, você pode informar o nome de usuário esenha, mas aqui vamos montar da forma mais simples. No item3 vamos selecionar o nosso banco de dados.

Figura 19: Configurando a conexão

Agora você pode testar a conexão, para isto você deve clicarno botão Testar conexão. Se tudo estiver ok, você receberá uma tela

SQL

19

de mensagem informando que a conexão com o banco foi feitacom sucesso. Clique no botão OK, vá até o Object Inpector e alterea propriedade Login Prompt para False e altere a propriedadeConnected para True.

Agora vamos acessar a nossa tabela.

Vá até ao componente ADODataSet e clique na propriedadeConnection e informe o nome do componente de conexão com obanco de dados, ou seja, o ADOConnection1.

Agora acesse a propriedade CommandText. Quando vocêacessar esta propriedade, você verá que ao acessá-la apareceráum botão com três pontinhos.

Clique neste botão e você terá acesso a uma tela semelhante amostrada na figura 20.

Figura 20: Configurando a tabela a ser acessada.

Como você pode ver, esta tela nos está mostrando a tabelaque temos em nosso banco de dados e os campos da tabela. Nocampo SQL digite a instrução igual a que está sendo mostradana figura. Obviamente partindo do princípio que você tenha feitotudo exatamente como foi descrito anteriormente. Depois distoclique em OK. Altere a propriedade Active do componenteADODataSet para True.

A nossa conexão com o banco de dados já está pronta. Agorainclua um componente DataSource que está na aba Data Accesse ligue a propriedade DataSet deste componente ao componenteADODataSet1.

Agora vá até a aba Data Controls e inclua um componenteDBGrid e um componente DBNavigator. Ligue estescomponentes ao componente DataSource1. Feito isto o nossoexemplo está pronto. Você terá uma tela na figura 21.

ConclusãoNeste artigo eu mostrei a forma correta de se instalar o

Microsoft SQL Server Express, que é a versão gratuíta do SQLServer 2005, e também um exemplo bem simples de comopodemos acessar o banco de dados. Um forte abraço a todos e atéa próxima.

Download do exemplo em : http://www.theclub.com.br/revista/download/ExSqlExpress.zip

Figura 21

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

SQL

20

Pergunta: Como faço para criar um arquivo XML apartir do DBExpress?

Resposta: A forma mais simples é utilizando ocomponente ClientDataSet. Depois que o ClientDataSet estiveraberto com os dados que você precisa, basta que você utilize oseguinte comando:

procedure TForm1.Button1Click(Sender:TObject);begin ClientDataSet1.SaveToFile(‘c:\novoarquivo.xml’,dfXML);end;

Dúvida enviada por Roberto, São Paulo - SP

Pergunta: Eu quero saber como fazer o “pack” em umatabela Paradox.

Resposta: Para dar um pack ou seja remover osregistros deletados de uma tabela paradox você terá queutilizar APIs da BDE. Veja abaixo a rotina que faz este tipo detrabalho.

Você deve declarar a Unit BDE

procedure PackTable(Table: TTable);var Props: CURProps; hDb: hDBIDb; TableDesc: CRTblDesc;

begin if Table.Active = False then raise EDatabaseError.Create (‘Tabela precisa estar aberta para

executar o pack’); if Table.Exclusive = False then raise EDatabaseError.Create

(‘Tabela precisa estar aberta em modoexclusivo’);

// Pega as propriedades da tabela // para determinar o seu tipo Check(DbiGetCursorProps

(Table.Handle, Props)); // Se a tabela é do tipo Paradox, // você tem que chamar DbiDoRestructure... if Props.szTableType = szPARADOX then begin // Em branco fora a estrutura... FillChar(TableDesc, sizeof

(TableDesc), 0); // Obtem o handle do banco de

// dados da tabela Check(DbiGetObjFromObj(hDBIObj

(Table.Handle), objDATABASE,hDBIObj(hDb)));

// Põe o nome da tabela na// descrição da tabela...

StrPCopy(TableDesc.szTblName,Table.TableName);

// Põe o tipo da tabela na// descrição da tabela...

StrPCopy(TableDesc.szTblType,Props.szTableType);

Perguntas & Respostas

21

// Jogo a opção de pack na descrição // da tabela para TRUE...

TableDesc.bPack := True; // Fecha a tabela assim que terminar

// a restruturação... Table.Close; // Chama o DbiDoRestructure... Check(DbiDoRestructure(hDb, 1,

@TableDesc, nil, nil, nil, FALSE)); end else // Se a table for do tipo dBase,

// apenas chame o DbiPackTable... if Props.szTableType = szDBASE then Check(DbiPackTable(Table.DBHandle,

Table.Handle, nil, szDBASE, TRUE)) else // Pack só pode ser

// utilizado em tabelas //Paradox ou dBASE; //nada mais...

raise EDatabaseError.Create(‘Tabela deve ser do tipoParadox ou dBASE ‘);

Table.Open; end;

Dúvida enviada por Sérgio, JI PARANA – RO

Pergunta: Estou com o seguinte problema! Estou utilizandoo Inno Setup 5.0 para gerar os instaladores aqui da empresa,porém após gerar o instalador vou fazer os testes e o software éinstalado na mesma pasta do executável instaladoanteriormente. Eu desabilitei a opção para que o usuário finaldefina em qual pasta o executável deva ser instalado paramanter padronizado em nossos clientes, mas com isso oinstalador ignora o diretório padrão que coloquei no Script einstala na mesma pasta do executável instalado anteriormente.Existe algum arquivo temporário que guarda a informação doúltimo software instalado?

Como posso resolver esta situação?

Resposta: Sugerimos neste caso que você desabilite a opção“Utilizar diretório Prévio da Aplicação” que encontra-se nasopções de Setup do instalador, para isto insira a seguinte “Tag”na seção Setup:

UsePreviousAppDir=false

Dúvida enviada por André, JAGUARIUNA – SP

Pergunta: Eu estou criando um atalho no desktop, umgrupo no menu iniciar e itens no grupo. Está tudo funcionandomuito bem. Só que agora eu gostaria de clicar em outro botão eexcluir tudo que eu criei, ou seja, o atalho no desktop, o grupo e ositens deste grupo mas não sei como fazer. Vocês teriam algumaidéia de como devo proceder?

Resposta: Nós temos as rotinas com as quais você poderárealizar as tarefas que está precisando. Veja a seguir as rotinas.

function Apaga_Folder(Foldername: string; aLocation:integer):Boolean;

var pIdl: PItemIDList; hPath: PChar;begin Result := False; if SUCCEEDED(SHGetSpecialFolderLocation

(0, aLocation, pidl)) then begin hPath := StrAlloc(max_path); SHGetPathFromIDList(pIdl, hPath); SetLastError(0); Result := DeleteALL(hPath + ‘\\’ +

Foldername); StrDispose(hPath); end;end; function DeleteALL(cFileSpec: string):Boolean;var F: TSHFileOpStruct; pFromc: array[0..255] of char; ResultVal: integer;begin FillChar(pFromc, SizeOf(pFromc),0); StrPcopy(pFromc,ExpandFileName(cFileSpec)+#0#0); F.wnd := 0; F.wFunc := FO_DELETE; F.pFrom := pFromC; F.pTo := nil; F.fFlags:= FOF_ALLOWUNDO orFOF_NOCONFIRMATION or FOF_SIMPLEPROGRESSor FOF_FILESONLY; F.fAnyOperationsAborted := False;

Perguntas & Respostas

22

F.hNameMappings := nil; Resultval := ShFileOperation(F); Result := (ResultVal = 0);end; procedure Apaga_Atalho

(aNome: string; aLocation: integer);var PIDL : PItemIDList; InFolder : array[0..MAX_PATH] of Char; LinkName,s : WideString;begin SHGetSpecialFolderLocation

(0, aLocation, PIDL); SHGetPathFromIDList(PIDL, InFolder); s := InFolder; LinkName := s + ‘\’ + aNome + ‘.LNK’; if FileExists(LinkName) then DeleteFile(LinkName);end;

procedure TForm1.BitBtn2Click(Sender:TObject);begin Apaga_Folder(‘Meu grupo’,CSIDL_PROGRAMS); Apaga_Atalho(‘Meu atalho’, CSIDL_DESKTOP);end;

Dúvida enviada por Ricardo, Rio de Janeiro - RJ

Pergunta: Gostaria de saber como verificar se umaplicativo já está sendo executado, se já tiver sendo executadoapenas mostra o formulário principal, se o aplicativo tiver apenasminimizado restaura para o tamanho padrão do formulárioprincipal.

Resposta: Veja a rotina a seguir. Ela executa a calculadora

do Windows, fazendo o procedimento desejado de executar oaplicativo ou apenas exibí-lo caso o mesmo já esteja carregado.Basta que agora você adapte as suas necessidades.

procedure TForm1.Button1Click(Sender:TObject);var TheWindow: HWND;begin {find a handle to the Windows Explorerwindow} TheWindow:=FindWindow(nil,’Calculadora’);

if TheWindow <> 0 then // Chama calculadora se já estiver

// carregada SetForegroundWindow(TheWindow) else // Carrega calculadora se estiver

// fechada ShellExecute(Handle, ‘Open’,‘Calc.exe’, nil, ‘c:\windows’, sw_shownormal);end;

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

Pergunta: Tenho um formulário com um painel. Precisoque independente do tamanho do formulário eu consiga semprevisualizar o painel no centro do formulário.

O painel é de tamanho fixo e o formulário poderá variar.

Tem como fazer isso ?

Resposta: Isto tem jeito sim. Monte um simples projeto e coloque um panel em qualquer

lugar. Vá até o evento OnResize do Form e inclua o código abaixo:

Panel1.Left := (ClientWidth-Panel1.Width) div 2;Panel1.Top := (ClientHeight-Panel1.Height) div 2;

Agora vá no evento OnShow deste mesmo form e inclua estalinha:

FormResize(Sender);

Pronto. Agora rode a aplicação e veja o efeito.

Dúvida enviada por Marcelo, São Paulo - SP

Pergunta: Gostaria a partir do menu, escolher a música eimediatamente esta música tocar em uma área definida pormim?

Resposta: Nós publicamos uma matéria na revista n. 140de Maio de 2006 explicando sobre o trabalho com multimídia noDelphi. Com base no que foi explicado nesta matéria você poderámontar a rotina que está precisando.

Dúvida enviada por Marcelo Borges, Rio de Janeiro - RJ

Perguntas & Respostas

23

Pergunta: Eu tenho um projeto que tem um componenteDBlookupcombobox. Quando mando abrir a lista destecomponente ele abre com apenas uma linha de tamanho e não setrata do valor setado em DropDownCount. O que pode causaristo? Como resolver?

Resposta: Isto é um bug do Delphi e para resolver vocêdeve incluir no evento OnEnter do mesmo o seguinte comando:

DBLookupComboBox1.Update;

Dúvida enviada por Vicente do Carmo, Bauru - SP

Pergunta: Estou desenvolvendo uma rotina para desativare ativar os índices de um determinado banco. > Vocês teriamalgum projeto ou exemplo para pesquisa?

Resposta: Você pode realizar estas tarefas através de umcódigo SQL. Veja o exemplo a seguir:

/* Ativar um indice. */ALTER INDEX NOME_INDICE ACTIVE;/*Desativar um indice.*/ALTER INDEX NOME_INDICE INACTIVE;

Dúvida enviada por Everson, ARARANGUA – SC

Pergunta: Eu tenho um relatório que na coluna mêsaparece 1,2,3,4,5 (mês em números). Eu preciso mostrar norelatório o mês por extenso como JANEIRO, FEVEREIRO,conforme o mês numeral vindo do dataset.

Resposta: A forma mais simples de fazer esta mudança éadicionar os TFields do ClientDataset e no evento OnGetTextalterar os números pelos respectivos meses, na aplicação existe avariável de sistema LongMonthNames que retorna um Array destring com os nomes(literal) de cada mês, sendo que o índice decada nome é seu respectivo número, veja abaixo o exemplo decomo deve ficar usa rotina:

procedure TfrmControleInfRend.cdsIRMESGetText(Sender: TField; var Text: String; DisplayText: Boolean);begin Text := LongMonthNames[Sender.asInteger];end;

Dúvida enviada por Abinálio, São Paulo, SP

Pergunta: Eu tenho uma imagem jpg e ela está muitogrande. Existe alguma rotina em Delphi que possa diminuir otamanho desta imagem?

Resposta: Existe sim uma forma que podemos fazer umacompressão no arquivo JPG. Veja a seguir rotina para compactaro JPG.

procedure SetJPGCompression(ACompression:integer; const AInFile: string; const AOutFile: string);var iCompression: integer; oJPG: TJPegImage; oBMP: TBitMap;begin { Forcar a Compressão para a faixa entre1..100 } iCompression := abs(ACompression); if iCompression = 0 then iCompression := 1;if iCompression > 100 then iCompression := 100; { Cria as classes de trabalho Jpeg e Bmp } oJPG := TJPegImage.Create; oJPG.LoadFromFile(AInFile); oBMP := TBitMap.Create; oBMP.Assign(oJPG); {Fazer a Compressão e salva o novo arquivo}

oJPG.CompressionQuality := iCompression; oJPG.Compress; oJPG.SaveToFile(AOutFile); { Limpar } oJPG.Free; oBMP.Free;end;

Veja abaixo como chamar a rotina

SetJPGCompression(50, origem, destino); O primeiro parâmetro é a taxa de compressão, o segundo é o

caminho e o nome do arquivo de origem e o terceiro é o caminho eo nome do arquivo de destino.

Dúvida enviada por Amauri, São Paulo - SP

Perguntas & Respostas

24

Pergunta: Qual é o comando que posso utilizar para tocaruma música MP3 ou tocar um clip?

Resposta: Caso deseje apenas tocar um arquivo de MP3 ouum Vídeo Clipe poderemos utilizar apenas a API ShellExecutepara chamar o Windows Media Player para abrir o arquivodesejado, veja o exemplo abaixo:

implementation uses ShellApi; {$R *.dfm} var M : String;begin M := ExtractShortPathName(‘D:\Musicas\U2 -Elevation.mp3’); ShellExecute(Handle, ‘Open’,‘wmplayer.exe’, Pchar(M), nil,

sw_shownormal);end;

Dúvida enviada por Luiz Antonio , Rio de Janeiro - RJ

Pergunta: Desenvolvi um software e desejo distribuí-lo paravárias empresas.Como faço para garantir meus direitos autoraislegalmente? Em qual órgão devo registrá-lo/patenteá-lo? Não seise usei os termos corretos, mas sei que dá para entender o que eupreciso.

Resposta: O órgão brasileiro responsável sobre patentes é aINPI (Instituto Nacional da Propriedade Industrial), mas comono seu caso é software que deseja registrar, sugiroprimeiramente que entre em contato com a ABES (AssociaçãoBrasileira das Empresas de Software) :

http://www.inpi.gov.br/ http://www.abes.org.br

Dúvida enviada por Andrea, Pompeu - MG

Perguntas & Respostas

25

Baixando arquivos da internetEsta dica serve para quem quer baixar arquivos de um site

ou de algum lugar qualquer da rede. Veja só como é simples fazerisso:

function DownloadFile(Source, Dest: string):Boolean;begin try Result:= UrlDownloadToFile(nil,

PChar(source),PChar(Dest), 0, nil) = 0; except Result:= False; end;end;

Para usar esta função é preciso declarar a unit UrlMon naseção uses da unit. Depois basta utilizar da seguinte forma:

if DownloadFile(‘http://www.origemarquivo.com/arq.zip’,’c:\arquivo.zip’) then ShowMessage(‘Download concluído.’);

Chamar um site utilizando o seu browse padrãoEsta dica serve para chamar o seu browse padrão passando

uma endereço de internet. Não esqueça de declarar a unitUrlMon

uses UrlMon; procedure TForm1.Button1Click(Sender:TObject);begin HlinkNavigateString(nil,’http://www.theclub.com.br’);end;

Coloração gradiente no formulário

// Este código deve ser incluído// no evento OnPaint do formulárioprocedure TForm1.FormPaint(Sender: TObject);var altura, coluna: Word;begin altura := (ClientHeight + 255) div 256; for coluna := 0 to 255 do with Canvas do begin Brush.Color := RGB(coluna, 0, 0); FillRect(Rect(0, coluna * altura,

Dicas & Truques

26

ClientWidth, (coluna + 1) * altura)) ; end;end; // Evento OnResizeprocedure TForm1.FormResize(Sender: TObject);begin Invalidate;end;

Como controlar o fechamento de um formulárioPara controlar o fechamento de um formulário, basta que

você inclua o código abaixo no evento OnCloseQuery doformulário.

Caso você não queira que o formulário seja fechado bastaatribuir False para a variável CanClose como mostrado na rotinaa seguir.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin if MessageDlg ( ‘Você tem certeza quedeseja fechar o form?’, mtConfirmation,[mbYes, mbNo], 0) = idNo then CanClose:=False;end;

Como descobrir o código de uma teclapressionada?

Na maioria dos componentes existem eventos que ocorremquando o teclado é acionado.

Num form, por exemplo, existem os eventos OnKeyDown queresponde quando a tecla é pressionada , OnKeyUp que respondequando a tecla é solta e OnKeyPress que também respondequando a tecla é pressionada.

Este três eventos retornam o valor da tecla pressionadaatravés da variável Key. Aqui vamos trabalhar com o eventoOnKeyDown. Este evento tem três parâmetros, mas neste caso oque nos interessa é a variável Key. Veja abaixo como utilizá-la.

procedure TForm1.FormKeyDown

(Sender: TObject; var Key: Word;Shift:TShiftState);Begin ShowMessage(‘O nº da tecla:‘+Char(Ord(Key))+’ é => ‘+IntToStr(Key));End;

Como impedir de apagar um registro em umDBGRID através das teclas CTRL+DEL?

Inclua no evento OnKeyDown do DBGRID a seguinteinstrução

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin if (Shift = [ssCtrl]) and (Key = 46) Then Key := 0;end;

Como impedir que o formulário seja arrastadopara fora das margens da tela

Na seção Private declare a procedure abaixo:

private procedure WMMove(var Msg: TWMMove); message WM_MOVE;

Abaixo da palavra implementation escreva a procedureabaixo:

procedure TForm1.WMMove(var Msg: TWMMove);begin if Left < 0 then Left := 0; if Top < 0 then Top := 0; if Screen.Width - (Left + Width) < 0 then Left := Screen.Width - Width; if Screen.Height - (Top + Height) < 0 then Top := Screen.Height - Height;end;

Dicas & Truques

27

Para testar execute o programa e tente arrastar o formuláriopara fora das margens da tela e veja o que acontece.

Simular o pressionamento de uma combinação deteclas, por exemplo: Ctrl+F2

Você deve declarar na seção uses a unit Windows

// Aqui mantemos a tecla CTRL pressionadakeybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY or 0, 0); // Aqui pressionamos a tecla F2keybd_event(VK_F2, 0, 0, 0); // Aqui liberamos a tecla CTRLkeybd_event(VK_CONTROL, $45,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

Atenção! Neste exemplo pressionamos as teclas Ctrl+F2. Nãose esqueça das teclas que precisam manter pressionadas: Ctrl,Alt, Shift.

Simular a tecla Print ScreenUma coisa que pode ser muito útil em suporte a distância, ou

até mesmo para outros objetivos, é a realização de um “print-screen”.

Coisa que muitas vezes um usuário não dá conta de realizare fica complicado, de certa maneira, explicar o problema atravésdo telefone.

Por este motivo podemos criar uma rotina que simula a teclaPrintScreen. A seguir veja a rotina de como realizar esteprocesso:

procedure TForm1.Button1Click(Sender:TObject);begin // Aqui pega o desktop inteiro keybd_event(VK_SNAPSHOT,0,0,0) // Aqui pega só a arte ativa do desktop keybd_event(VK_SNAPSHOT,1,0,0)end;

Ativando / Desativando botões da barra de título

//Para desabilitar o “X” do FormulárioEnableMenuItem( GetSystemMenu( handle,False ),SC_CLOSE, MF_BYCOMMAND orMF_GRAYED );//Para habilitar:EnableMenuItem( GetSystemMenu( handle, False), SC_CLOSE, MF_BYCOMMAND or MF_ENABLED );

Traduzindo a mensagem “DELETE RECORD?”Quando clicamos sobre o botão de deleção no DBNavigator (o

do sinal de menos) surge uma tela com a mensagem “DeleteRecord?” com botões Ok e Cancel.

Para fazer aparecer a mensagem em português você deveráselecionar o componente DBGrid e alterar a propriedadedgConfirmDelete para False e no evento da tabela BeforeDeletedo componente Table incluir o seguinte código.

procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);

var Button: Integer;begin Button := Application.MessageBox (‘Deseja deletar o registro?’, ‘THE CLUB - Nós falamos a sua

língua’, MB_YESNO +mb_DefButton1+MB_ICONQUESTION);

if Button = IDNO then Abort;end;

Como obter o diretório onde o programa estáinstalado

Crie uma variável do tipo string e insira a seguinte linha noevento ou função desejada do formulário:

ExtractFilePath(Application.Exename);

Retornará o path atual do arquivo .EXE do seu programa.

Dicas & Truques

28

Como deletar os arquivos de um diretório com ocaractere *

procedure TForm1.Button2Click(Sender: TObject);var SearchRec: TSearchRec; Result: Integer;begin Result:=FindFirst(‘c:\teste\*.*’,faAnyFile, SearchRec); while result=0 do begin DeleteFile(‘c:\teste\’+SearchRec.Name); Result:=FindNext(SearchRec); end;end;

Configurações internacionaisNormalmente o Delphi busca os formatos de data/hora,

moeda e formato numérico da Configuração Internacional doPainel de Controle. Isto pode levar a erros quando avaliandodatas, números ou listas.

Para evitar estes erros, você pode mudar as constantesdefinidas no Delphi, como DecimalSeparator, ShortFormatDate eoutros desta maneira:

DecimalSeparator :=’.’;ShortFormatDate :=’mm/dd/yy’;

Isto terá precedência sobre a configuração padrão. Para umalista completa das variáveis, procure em Currency FormatingVariables no Help do Delphi.

Como mapear um drive de rede

procedure TForm1.Button3Click(Sender:TObject);var NRW: TNetResource;begin with NRW do

begindwType := RESOURCETYPE_ANY;

lpLocalName := ‘N:’;lpRemoteName := ‘\\servidor\c’;lpProvider := ‘’;end;WNetAddConnection2(NRW, ‘Senha’, ‘Usuario’,CONNECT_UPDATE_PROFILE);

end;

Os comandos INC e DECExiste uma forma bem simples de incrementar uma variável

ao invés do que estamos acostumados, por exemplo:Variavel:=Variavel+1;

O comando INC e DEC permitem agilizar o processamento doseu sistema. Para isso substitua o exemplo que mostramos por

INC(Variavel);

ou se você quiser diminuir ao invés de aumentar 1 utilize

DEC(variavel);

Abrir os configuradores do Painel de ControleVeja como abrir a configuração do vídeo, do modem e do

firewall, mas você poderá fazer alterações para abrir outrasconfigurações como teclado, veja código abaixo e a figura queilustra o exemplo em execução.

//Configuracao de Videoprocedure TForm1.btnVideoClick(Sender: TObject);begin WinExec(‘RunDLL32.exe Shell32.DLL,Control_RunDLL Desk.cpl’, SW_Show);end;

//Configuracao de Firewallprocedure TForm1.btnFIrewallClick(Sender:TObject);begin WinExec(‘RunDLL32.exe Shell32.DLL,Control_RunDLL Firewall.cpl’, SW_Show)end;

Dicas & Truques

29

Copiando conjuntos de arquivos com animaçãoO exemplo a seguir demonstra como você pode utilizar a

função SHFileOperation para copiar arquivos e exibir uma janelade diálogo de progresso. Como por exemplo:

implementation Uses ShellAPI;{$R *.DFM}

procedure TForm1.Button1Click(Sender:TObject); var F : TShFileOpStruct; Origem, Destino : string; vTo, vFrom : PCHAR; begin Origem:=FileListBox1.FileName; IF FileExists(Origem) then begin Destino:=Edit2.Text; F.Wnd := Handle; F.wFunc := FO_COPY; Destino := Destino+’\’+

ExtractFileName(Origem); F.pFrom := PChar(Origem+#0); F.pTo := PChar(Destino); F.fFlags := FOF_ALLOWUNDO OR

FOF_RENAMEONCOLLISION; if ShFileOperation(F) <> 0 then ShowMessage(‘Arquivo não foi

copiado com sucesso!’); end else ShowMessage

(‘Arquivo Origem não encontrado’);end;

Como alterar as cores do ProgressBarO componente ProgressBar mostra uma barra de progresso

simples. As barras de progresso dão aos usuários um feedbackvisual a respeito do progresso de um procedimento em umaaplicação.

Por padrão, as cores de uma barra de progresso sãodeterminadas pelo Windows. Aqui você poderá ver como alterar a

cor do fundo e a cor da barra em tempo de execução:

procedure TForm1.Button5Click(Sender: TObject);begin //Altera a cor do fundo ProgressBar1.Brush.Color := clYellow; //Altera a cor da barra SendMessage(ProgressBar1.Handle,PBM_SETBARCOLOR, 0, clGreen);end;

Passar parâmetros entre dois FormsCrie um projeto com dois formulários. Coloque as linhas

abaixo na Unit1 do Form1:

// Listagem da Unit1implementationuses Unit2;{$R *.DFM}// Fazer a chamada do Form2, no eventoOnClick de um BitBtnprocedure TForm1.BitBtn1Click(Sender:TObject);var Nome : string;begin Nome := ‘Teste’ ; { Passar um variávelcomo parâmetro } Form2.Show( nome ); { Chamada do Form2,passando um parâmetro } Caption := Nome; { Recebe o retorno doparâmetro e atribui ao Caption }end;

// Listagem da Unit2unit Unit2;interfaceuses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs;type TForm2 = class(TForm) // Criar uma procedure para receber osparâmetros desejados

Dicas & Truques

30

procedure Show( var nome : string );

private { Private declarations } public { Public declarations } end;

var Form2: TForm2;implementation{$R *.DFM}

{ Procedure para receber o parâmetro }procedure TForm2.Show( var nome : string );begin inherited Show; { Libera a chamadado Form } Caption := Nome; { Atribui a variávelde parâmetro recebido ao Caption } Nome := ‘OK’; { Atribuir outro valor avariável de parâmetro }end;

Criando e Excluindo TFields em tempo deexecução

Objetos TField podem ser criados em tempo dedesenvolvimento através do Fields Editor. O Fields Editor éacionado quando damos um clique duplo no componente deacesso a dados, ou seja, TTable, TQuery, TClientDataSet. Masnós podemos fazer isto em tempo de execução também.

Descendentes do TField (como TStringField, TIntegerField,etc.) são criados para que possamos chamar o método Createpara o tipo de campo desejado. Após criar o componente,precisamos especificar algumas propriedades para que a conexãocom os dados funcione e assim poderemos alterar dados dastabelas.

São eles:FieldName: nome do campo na tabela.Name: nome do componente, usado pelo Delphi.Index: É um número de identificação para o campo. Este

número nunca é repetido, é controlado automaticamente peloDelphi.

DataSet: O componente TTable ou TQuery ao qual queremos

associar o campo.O código abaixo mostra a criação de um campo String.

Usaremos o objeto TQuery para nos referenciarmos ao DataSet.

procedure TForm1.Button2Click(Sender:TObject);var T: TStringField;begin Query1.Close; T := TStringField.Create(Self); T.FieldName := ‘CO_NAME’; T.Name := Query1.Name + T.FieldName; T.Index := Query1.FieldCount; T.DataSet := Query1; Query1.FieldDefs.UpDate; Query1.Open;end;

Note que é necessário fechar o DataSet(Query1) antes deadicionarmos o novo campo.

Usamos a propriedade “Fieldcount” para definir o número dachave do campo criado. Usando esta propriedade obteremos onúmero de TFields que o DataSet(Query1) possui no momento,assim sempre estaremos criando um campo novo, pois se oprimeiro começa com 0 o último é FieldCount -1 e FieldCountseria o número do novo campo.

Para excluir um campo é bem mais simples, para isto bastacriar um instância do tipo TComponent, e usar a funçãoFindComponent para referenciá-lo ao objeto, para isto bastasabermos o nome do Objeto. A exclusão é feita através do métodoFree.

procedure TForm1.Button1Click(Sender:TObject);var TC: TComponent;begin TC := FindComponent(‘Query1CO_NAME’); if not (TC = nil) then begin Query1.Close; TC.Free; Query1.Open; end;end;

Dicas & Truques