Olá pessoal, neste artigo será demonstrado como configurar uma conexão carregando os parâmetros de um arquivo INI com extrema simplicidade. Será utilizado como exemplo uma base de dados no MySQL e para acessá-la vamos configurar componentes de conexão do ZEOS e DBExpress. É interessante mencionar que para o perfeito entendimento do artigo é necessário que o leitor tenha a suíte dos componentes ZEOS Lib instalado no Delphi.

A utilização de arquivos INI contendo parâmetros de conexão para um determinado banco de dados se tornou muito comum entre os desenvolvedores. Essa prática traz muita flexibilidade para aplicação, pois podemos alterar o local do banco, user, password, porta e etc., sem a necessidade de recompilar aplicação, sendo apenas necessário abrir o arquivo em um editor de texto comum e editá-lo conforme sua necessidade.

Esse tipo de dúvida é muito comum, principalmente envolvendo a engine de conexão ZEOS, pois a maioria dos exemplos na internet sempre é voltada para engine DBExpress. As rotinas que serão demonstradas abaixo tem como objetivo serem as mais simples possíveis, mas se for da vontade do leitor pode-se customizar essas rotinas criando uma classe específica para ler e manipular informações do arquivo INI.

Para esse artigo somente será demonstrado funções de leitura das informações do INI focando na simplicidade. Mesmo sendo apenas para leitura, existem diferentes funções recebendo os mesmos parâmetros, mas retornando diversos tipos de dados, para esse exemplo vamos utilizar somente 2 funções.

  • ReadString (Retorna uma string)
  • ReadInteger (Retorna um integer)

Essas funções recebem 3 parâmetros que visam mapear as informações contidas no arquivo INI:

  1. Nome da Seção
  2. Identificação da variável
  3. Valor padrão

Nesse exemplo foi criado um arquivo “String_Conexao.ini” para carregar informações do DBExpress e ZEOS, essas informações serão diferenciadas pelo nome da seção.

Layout do arquivo INI.

Figura 1: Layout do arquivo INI.

Observem que existem 2 seções que estão entre colchetes, “[Conexao_DBX]” e “[Conexao_ZEOS]”, cada uma possui configurações específicas para conexão com as diferentes engines de acesso (DBExpress e ZEOS). Abaixo das seções estão as variáveis seguidas dos seus respectivos valores. É interessante gravar esse arquivo no mesmo diretório onde está localizado o arquivo executável da aplicação, facilitando assim sua leitura e a criação de scripts de instalação.

Como exemplo foi criado uma base de dados “devmedia” no MySQL 5.5, essa base contém apenas uma tabela meramente ilustrativa, pois a mesma não será utilizada em nenhum ponto desse artigo.

Listagem 1: Instrução SQL para criar a base de dados.

CREATE DATABASE IF NOT EXISTS `devmedia` 

CREATE TABLE IF NOT EXISTS `tb_cliente` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `NOME` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Para nossa aplicação no Delphi será utilizado um Data Module e um Form apenas, sendo que o componente Data Module serve para dar mais aderência ao exemplo, pois o mesmo é amplamente utilizado nos dias atuais. O Form só terá a responsabilidade de solicitar a ABERTURA e o FECHAMENTO da conexão com o banco de dados.

O Data Module será renomeado para “dmConexao” e serão incluídos 2 componentes de conexão, segue abaixo:

Componentes Configurações das Propriedades
1 - TSQLConnection Name = Conexao_DBExpress
1 - TZConnection Name = Conexao_ZEOS

Tabela 1: Lista de componentes do Data Module.

Data Module com os componentes de conexão.

Figura 2: Data Module com os componentes de conexão.

Observações: Observem que nos componentes de conexão só foram alteradas as respectivas propriedades “Name”, o restante das configurações serão carregadas a partir do arquivo INI.

Vamos trabalhar com o evento “BeforeConnect” dos 2 componentes, esse evento é disparado “antes” que uma conexão seja aberta em ambos os componentes, ou seja, quando a propriedade “Connected” é modificada para TRUE, antes de ser aberta a conexão é executado todos os códigos que estão no evento “BeforeConnect”, nesse caso vamos carregar as configurações antes da conexão.

Para podermos trabalhar com arquivos INI é necessário declarar a unit “IniFiles” na cláusula uses Data Module.

Basicamente todas as configurações que geralmente são digitadas no Object Inspector para configurar as conexões serão carregadas direto do arquivo INI.

Listagem 2: Código “BeforeConnect” componente Conexao_DBExpress .

var
  Ini: TIniFile;
begin
    Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'String_Conexao.ini');
    try
        Conexao_DBExpress.Connected     := false;
        Conexao_DBExpress.LoginPrompt   := false;
        Conexao_DBExpress.DriverName    := Ini.ReadString('Conexao_DBX', 'Drivername', '');
        Conexao_DBExpress.GetDriverFunc := Ini.ReadString('Conexao_DBX', 'GetDriveFunc', '');
        Conexao_DBExpress.LibraryName   := Ini.ReadString('Conexao_DBX', 'LibraryName', '');
        Conexao_DBExpress.VendorLib     := Ini.ReadString('Conexao_DBX', 'VendorLib', '');
        Conexao_DBExpress.Params.Clear;
        Conexao_DBExpress.ParamsLoaded  := True;
        Conexao_DBExpress.Params.Add('servercharset='+ Ini.ReadString('Conexao_DBX', 'Charset', ''));
        Conexao_DBExpress.Params.Add('hostname='+      Ini.ReadString('Conexao_DBX', 'Hostname', ''));
        Conexao_DBExpress.Params.Add('user_name='+     Ini.ReadString('Conexao_DBX', 'User_name', ''));
        Conexao_DBExpress.Params.Add('password='+      Ini.ReadString('Conexao_DBX', 'Password', ''));
        Conexao_DBExpress.Params.Add('port='+          IntToStr(Ini.ReadInteger('Conexao_DBX', 'Port', 0)));
        Conexao_DBExpress.Params.Add('Database='+      Ini.ReadString('Conexao_DBX', 'Database', ''));
    except
         on E:Exception do
         MessageDlg('Erro ao conectar!'#13'Erro: ' + e.Message, mtError, [mbOK], 0);
    end;
end; 

Listagem 3: Código “BeforeConnect” componente Conexao_ZEOS.

var
  Ini: TIniFile;
begin
    Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'String_Conexao.ini');
    try
        Conexao_ZEOS.Connected       := False;
        Conexao_ZEOS.HostName        := Ini.ReadString('Conexao_ZEOS', 'Hostname', '');
        Conexao_ZEOS.Port            := Ini.ReadInteger('Conexao_ZEOS', 'Port', 0);
        Conexao_ZEOS.Protocol        := Ini.ReadString('Conexao_ZEOS', 'Protocol', '');
        Conexao_ZEOS.LibraryLocation := Ini.ReadString('Conexao_ZEOS', 'LibraryLocation', '');
        Conexao_ZEOS.User            := Ini.ReadString('Conexao_ZEOS', 'User', '');
        Conexao_ZEOS.Password        := Ini.ReadString('Conexao_ZEOS', 'Password', '');
        Conexao_ZEOS.Database        := Ini.ReadString('Conexao_ZEOS', 'Database', '');
        Conexao_ZEOS.ClientCodepage  := Ini.ReadString('Conexao_ZEOS', 'Charset', '');
    except
         on E:Exception do
         MessageDlg('Erro ao conectar!'#13'Erro: ' + e.Message, mtError, [mbOK], 0);
    end;
end;

Observações: Para utilizar as funções de leitura foi necessário instanciar um objeto do tipo TIniFile. No Create desse objeto temos que informar caminho do arquivo INI, nesse exemplo está sendo passado o caminho do executável mais o nome do arquivo. Só para fins ilustrativos os códigos estão dentro de um bloco try..except..end, mas as exceptions não são tratadas somente exibidas, caso sejam disparadas.

Agora vamos construir o formulário que vai solicitar as conexões através de 2 botões, 1 para conexão usando DBExpress e outro para conexão usando ZEOS. Abaixo segue lista de componentes e suas configurações:

Lista de componentes do Formulário.

Tabela 2: Lista de componentes do Formulário.

Layout do Formulário.

Figura 3: Layout do Formulário.

O caption dos botões foi inserido apenas para melhor identificação em tempo de desenvolvimento, pois será criado um procedure “VerificaStatus” para alterar o caption dos botões e dos labels conforme o status da conexão, isso quando aplicação estiver sendo executada.

Listagem 4: Código procedure “Verifica Status”.

procedure TfrmPrincipal.VerificaStatus;
begin
    if not dmConexao.Conexao_DBExpress.Connected then
    begin
        btnConectaDBX.Caption   := 'Conectar DBExpress';
        lblStatusDBX.Caption    := 'Status: Desconectado';
        lblStatusDBX.Font.Color := clRed;
    end
    else
    begin
        btnConectaDBX.Caption   := 'Desconectar DBExpress';
        lblStatusDBX.Caption    := 'Status: Conectado';
        lblStatusDBX.Font.Color := clGreen;
    end;

    if not dmConexao.Conexao_ZEOS.Connected then
    begin
        btnConectaZEOS.Caption   := 'Conectar ZEOS';
        lblStatusZEOS.Caption    := 'Status: Desconectado';
        lblStatusZEOS.Font.Color := clRed;
    end
    else
    begin
        btnConectaZEOS.Caption   := 'Desconectar ZEOS';
        lblStatusZEOS.Caption    := 'Status: Conectado';
        lblStatusZEOS.Font.Color := clGreen;
    end;
end;

Essa procedure verifica a propriedade booleana “Connected” dos componentes de conexão que retorna TRUE caso o componente esteja conectado e FALSE caso não esteja, conforme o valor altera os captions e muda a cor do texto do label.

Quando for executada aplicação será verificado o status das conexões no evento OnShow do formulário e posteriormente no evento OnClick de cada botão.

Listagem 5: Código evento “OnShow” do formulário.

procedure TfrmPrincipal.FormShow(Sender: TObject);
begin
    VerificaStatus;
end;

No evento Onclick dos botões serão abertas ou fechadas conexões, conforme o status atual da mesma e posteriormente será verificado o status da conexão.

Listagem 6: Código evento “OnClick” btnConectaZEOS.

procedure TfrmPrincipal.btnConectaZEOSClick(Sender: TObject);
begin
    dmConexao.Conexao_ZEOS.Connected := not dmConexao.Conexao_ZEOS.Connected;
    VerificaStatus;
end;

Listagem 7: Código evento “OnClick” btnConectaDBX.

procedure TfrmPrincipal.btnConectaDBXClick(Sender: TObject);
begin
    dmConexao.Conexao_DBExpress.Connected := not dmConexao.Conexao_DBExpress.Connected;
    VerificaStatus;
end;

Pronto, agora vamos executar e testar as conexões carregando as configurações direto do arquivo INI. Observem que inicialmente os labels de status serão preenchidos em vermelho e com o caption “Status: Desconectado” e os botões com caption iniciando com a palavra “Conectar”, pois ainda não foram pressionados os botões de conexão.

Formulário sem conexão aberta.

Figura 4: Formulário sem conexão aberta.

Formulário com a conexão DBX aberta.

Figura 5: Formulário com a conexão DBX aberta.

Formulário com a conexão ZEOS aberta.

Figura 6: Formulário com a conexão ZEOS aberta.

Formulário com as 2 conexões abertas.

Figura 7: Formulário com as 2 conexões abertas.

Conclusão

Bom pessoal neste artigo foi demonstrado um exemplo simples e prático para carregar parâmetros de configuração a partir de um arquivo INI. Para exemplificar melhor o status da conexão foi criada uma procedure, mas o objetivo principal do artigo era demonstrar a simplicidade das funções de leitura da INI. Talvez um ponto fraco desse tipo de arquivo seja a segurança, pois qualquer usuário pode alterar esses parâmetros, existem formas nada convencionais de se criptografar esses dados, mas acabam gerando um grande trabalho para o desenvolvedor.

Caso surja alguma dúvida meu e-mail é wllfl@ig.com.br. Fiquem à vontade também para usar a seção de comentários.

Abraço a todos!