quarta-feira, 15 de fevereiro de 2012

Procedure para enviar email com programa padrão do SO.

Bom dia pessoal,
Tive um problema com o envio do outlookexpress e com o novo tambem na questão de anexos e decidi correr atrás mais pro lado do thunderbird, foi meio chato , mas consegui fazer funcionar, e pelo o que sei , a procedure abaixo funcionara com qualquer cliente de email, desde que ele esteja como padrão do sistema operacional.
Vocês vão precisar :
-Componentes Jedi.
-Unit JclMapi.

Passos:
1 - Criar uma aplicacação nova.
2 - Inserir um button na mesma.
3 - Declarar na secao uses a unit JclMapi.
4 - Declarar a função

procedure EnviarEmailPadrao(sListaEmail:TStringList;sListaAnexos:TStringList;sAssunto:string;sTextoEmail:string);
Acima da seção private.

5 - Implementar ela :

procedure TForm1.EnviarEmailPadrao(sListaEmail:TStringList;sListaAnexos:TStringList;sAssunto:string;sTextoEmail:string);
var TmpEmail: TjclEmail;
var i:integer;
begin
  TmpEmail := TjclEmail.Create;
  //Adicionando Emailas
  for I := 0 to sListaEmail.Count-1 do
    TmpEmail.Recipients.Add(sListaEmail[i]);
  //Adicionando Anexos
  for I := 0 to sListaAnexos.Count-1 do
    TmpEmail.Attachments.Add(sListaAnexos[i]);
  TmpEmail.Subject := sAssunto;
  TmpEmail.Body    := sTextoEmail;
  TmpEmail.Send(True);
end;

6 - O evento onClick do Button deverá ficar assim:


procedure TForm1.btn1Click(Sender: TObject);
var sListaEmail:TStringList;
var slistaAnexos:TStringList;
var sAssunto,sTextoEmail:string;
begin
  //Cria as 2 String List pois a procedure EnviaEmail varre as stringlist em busca de email's e anexos.
  sListaEmail := TStringList.Create();
  slistaAnexos := TStringList.Create();
  //Populando a lista de emails
  sListaEmail.Clear();
  sListaEmail.Add('gustavo@taltal.com.br');
  sListaEmail.Add('outro@taltal.com.br');
  //Populando a lista de anexos
  slistaAnexos.Clear();
  slistaAnexos.Add('C:\Temp\gustavo.txt');
  slistaAnexos.Add('C:\Temp\gustavo.sql');
  //Adicionando o Assunto a email
  sAssunto := 'Teste de Email';
  //Adicionando o Texto do email
  sTextoEmail := 'Programa para envio de email padrao para sistemas que tenham algum programa de email padrao instalado.';
  //Enviando o Email pela Procedure
  EnviarEmailPadrao(sListaEmail,slistaAnexos,sAssunto,sTextoEmail);

Pronto Galera!
O que ele faz?
Voce vai adicionar tantos seus destinatarios de emails, quanto seus anexos de email , em 2 stringList, adicionar o assunto e o texto do email e enviá-los para a procedure, o trabalho sujo, ela faz... hahaha!

Obs :
-Testei somente com o thunderbird, mas deverá funcionar com qualquer cliente que esteja como PADRÃO no SO.
- Compilado pelo Delphi Xe2.
- Cliente de Email padrão : Thunderbird v. 10.0.1, released: February 12th, 2012.

DOWNLOAD EXEMPLO AQUI

quarta-feira, 14 de dezembro de 2011

Completar string com algum caracter até determinado tamanho.

Bom dia,
Segue abaixo uma função bem simples, mas que dá uma mão bem grande quando não estamos em dias bons de lógica. hahahaha.
Ela consiste em completar um string ate determinado tamanho com uma outra string a ser mandada, tanto para o lado direito , quanto para o lado esquerdo.
Exemplo:
Tenho o numero 1 e quero completálo com zeros a esquerda, quero completar com tamanho máximo de 10 a string final. 
PreencheCaracter('0','1','E';'10').
A mesma coisa pode ser feita com o lado direito, apenas mudando uma variavel da função.
PreencheCaracter('0','1','D';'10').

Passos:
1 - Declarar a função na seção desejada , private,public ... etc :
   function PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
2 - Implementar a função abaixo da seção "Iimplementation".
   Obs:Foi utilizado um form chamado FrmTeste.



function TfrmTeste.PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
var i:Integer;
begin
  if Length(sTexto) > iTamanho then Begin
     sTexto := Copy(sTexto, 1, iTamanho);
  End
  else if sLado='E' then begin
    sTexto := StringofChar(sCaracter, iTamanho-length(sTexto))+sTexto;
  end
  else if sLado='D' then begin
    sTexto := sTexto+ StringofChar(sCaracter, iTamanho-length(sTexto));
  end;
  Result := sTexto ;
end;

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