quarta-feira, 23 de novembro de 2011

Conexão Delphi com banco de dados Mysql 5.1 - Delphi

Bom dia galera,
Hoje vou mostrar uma conexão do delphi com o banco de dados Mysql versão 5.1, mas que pode ser adaptado para a conexão em outras versões.
Primeiramente a conexão vai ser feita em um datamodule chamado dmConexao, onde contera um componente TSQLConnection e quantas TSQLQuery acharem necessárias, no meu caso, so coloquei uma query.
vamos la ...

Passos:
1 - Criar um datamodule com o nome dmConexao.
2 - Colocar um Componente de conexão ao banco do  tipo TSQLConnection e uma query do tipo TSQLQuery, ambos da aba DBExpress.
3 - Configurar o componente de conexão ao banco, conforme o print:
 
4 - Colocar os arquivos libmysql.dll,qtintf70.dll,dbxopenmysql50.dll na pasta corrente do projeto e caso for colocar o exe em outra pasta, copiar para la também.
5 - Criar uma procedure igual abaixo:
procedure TdmConexao.ConectaBanco();
var
   sIp,sBase,sUser,sPassword:string;
begin
   Try
      sIp       := 'localhost';
      sBase     := 'nome_banco';
      sUser     := 'nome_usuario_banco';
      sPassword := 'senha_usuario_banco';
      SQLConnection.Connected := False;
      SQLConnection.Params.Clear();
      SQLConnection.DriverName    := 'MySQL (Core Lab)';
      SQLConnection.GetDriverFunc := 'getSQLDriverMYSQL50';
      SQLConnection.LibraryName   := 'dbxopenmysql50.dll';
      SQLConnection.VendorLib     := 'libmysql.dll';
      SQLConnection.LoginPrompt   := False;
      SQLConnection.Params.Append('Database='+sBase);
      SQLConnection.Params.Append('User_Name='+sUser);
      SQLConnection.Params.Append('Password='+sPassword);
      SQLConnection.Params.Append('HostName='+sIp);
      SQLConnection.Connected := True;
      except
         On E:exception do begin
            Application.MessageBox(PChar('Não foi possivel conectar a base'+#13#10+
                                         E.Message),
                                         'Configurações de Conexão',MB_ICONERROR);
              Application.Terminate();
         end;
   end;
end;
6 - Chamar a procedure ConectaBanco no evento on Create do datamodule:
procedure TdmConexao.DataModuleCreate(Sender: TObject);
begin
   ConectaBanco();
end;

Observações :
  - Caso ocorra alguma mensagem de erro ao conectar, verifique:
      - Se as dlls estao na pasta de output do exe.
      - Se as variaveis sIp,sBase,sUser,sPassword estao com valores corretos.
##ATENÇÃO ##
O zip com os codigo fontes do datamodule e as dlls , seguem abaixo :

quinta-feira, 10 de novembro de 2011

Procedure para fechar aplicação e remover software da memória - Delphi

Boa Tarde,
Me deparei essa semana com um problema, no Windows 7 e Windows server 2008, ao fechar a aplicação com os Comandos : Close, ou Application.Terminate, a mesma continuava em memória, por isso efetuei a procedure abaixo .
Considerando um form chamado frmTeste.


procedure frmTeste.FechaAplicacao();
Var
h : HWND;
Begin
   h:= FindWindow( nil, 'Caption da Tela onde a procedure vai ser chamada.' );
   {Exemplo
   h:= FindWindow( nil, 'Menu Principal' );}
   if h <> 0 then begin
      PostMessage( h, WM_CLOSE, 0, 0 );
   end
End;

{Chamar a funcao diretamente como FechaAplicacao() , no local desejado.
By
Gustavo Luís H.
}

Arredondamento Inteligente por Casa Decimal - Delphi

Função de Arredondamento.
Considerando ...um form chamado frmTeste.
A sintaxe Basica dela é ArredondaPorDecimal(valorAserArredondado,CasaDecimalQueSeraArredondado).
Caso o valor decimal a ser arredondado seja >=5 entao arredondara, caso contrario não.
Exemplos :
ArredondaPorDecimal(14,987,2).
Retorno := 14,99

ArredondaPorDecimal(14,924,2).
Retorno := 14,92



function frmTeste.ArredondaPorDecimal(valor:Real;casasDecimais:integer):Real;
var
Fator, Fracao: Extended;
begin
{Eleva o Valor 10 ao expoente mandado na variavel casasDecimais} 
Fator:= IntPower(10, casasDecimais);
  { Multiplica o valor pelo fator e faz a conversao de string e depois para float novamente para evitar arredondamentos. }
  valor:= StrToFloat(FloatToStr(valor* Fator));
{Pega a Parte Inteira do Numero}
  Result := Int(valor);
{Pega a Parte Fracionaria}
  Fracao:= Frac(valor);
{Faz a regra de arredondamento} 
if Fracao >= 0.5 then
    Result := Result + 1
else if Fracao <= -0.5 then
    Result := Result - 1;
{O valor Final inteiro divide por 100 para transformar em decimal novamente.}
  Result := Result / Fator;
end;

{By
Gustavo Luis H.
}

terça-feira, 8 de novembro de 2011

Criação e permissões de Usuários - MYSQL

- Neste primeiro comando criamos e damos permissões totais a um usuario com acesso local.
GRANT ALL PRIVILEGES ON *.* TO usuario@localhost IDENTIFIED BY 'senha' WITH GRANT OPTION;

- Neste segundo comando criamos e damos permissões totais a um usuario com acesso remoto.
GRANT ALL PRIVILEGES ON *.* TO usuario@'%' IDENTIFIED BY 'senha' WITH GRANT OPTION;

quinta-feira, 3 de novembro de 2011

Leitura e Gravação de Arquivos INI - Delphi

Bom dia Pessoal,
Posto abaixo 1 rotina  para a leitura de arquivos INI, que são muito úteis para as configurações de um sistema, considerando um form chamado FrmLogin.

{-----------------------------}
{LEITURA DO ARQUIVO }
{-----------------------------}

procedure TFrmLogin.LeArquivoIni();
var sCaminho,sArquivo,sUsuario,sIp:string;
config: TIniFile;
begin
  {Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
    sCaminho := ExtractFilePath(Application.ExeName);
{Concatena o nome do arquivo com o caminho dele, nome do arquivo  'Config.ini'}
    sArquivo  := sCaminho + '\config.ini';
{Cria o ini em tempo de execucao}
   config    := TIniFile.Create(sArquivo);
{Le do cabecalho default , com a linha de nome usuario e carrega na variavel sUsuario}
   sUsuario  := config.readstring('default', 'usuario', 'teste');
//O 3° parametro acima, é o valor default, caso a linha usuario, esteja vazia ou não exista.
{Le do cabecalho conexao , com a linha de nome ip e carrega na variavel sIp}
  sIp  := config.readstring('conexao', 'ip', '192.168.0.37');
//O 3° parametro acima, é o valor default, caso a linha ip, esteja vazia ou não exista.
{
Poderiamos tambem utilizar
config.ReadInteger();
config.ReadBool();
config.ReadDate();
config.ReadTime();
config.ReadDateTime();
config.ReadFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;

{-----------------------------}
{GRAVACAO DO ARQUIVO }
{-----------------------------}
procedure TFrmLogin.gravaArquivoIni();
var sArquivo, sCaminho: string;
  config: TIniFile;
begin
  {Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
  sCaminho := ExtractFilePath(Application.ExeName);
 {Concatena o nome do arquivo com o caminho dele, nome do arquivo  'Config.ini'}
  sArquivo  := sCaminho + '\config.ini';
 {Cria o ini em tempo de execucao}
  config    := TIniFile.Create(sArquivo);
  config.WriteString('configuracoes', 'Usuario', Trim(edUsuario.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag usuario.
  config.WriteString('configuracoes', 'ip', Trim(edConexao.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag ip.
 
{
Poderiamos tambem utilizar
config.WriteInteger();
config.WriteBool();
config.WriteDate();
config.WriteTime();
config.WriteDateTime();
config.WriteFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;

Nome do arquivo Ini utilizado : config.ini.
Conteudo do arquivo Ini Utilizado :
[conexao]
ip=192.168.0.137
[default]
usuario=1