terça-feira, 14 de fevereiro de 2012

Delphi - Limpando a lixeira pela API do windows


Segue abaixo uma rotina para limpar a lixeira do Windows.

procedure EmptyRecycleBin;
const
  SHERB_NOCONFIRMATION = $00000001;
  SHERB_NOPROGRESSUI = $00000002;
  SHERB_NOSOUND = $00000004;
type
  TSHEmptyRecycleBin = function(Wnd: HWND;
                                pszRootPath: PChar;
                                dwFlags: DWORD): HRESULT;  stdcall;
   var
    SHEmptyRecycleBin: TSHEmptyRecycleBin;
    LibHandle: THandle;
      begin 
        LibHandle := LoadLibrary(PChar('Shell32.dll'));
          if LibHandle <> 0 then @SHEmptyRecycleBin :=
           GetProcAddress(LibHandle, 'SHEmptyRecycleBinA')
         else
          begin
           MessageDlg('Failed to load Shell32.dll.', mtError, [mbOK], 0);
           Exit;
      end;
 if @SHEmptyRecycleBin <> nil then
 SHEmptyRecycleBin(Application.Handle,nil,SHERB_NOCONFIRMATION or    SHERB_NOPROGRESSUI or SHERB_NOSOUND);
  FreeLibrary(LibHandle); @SHEmptyRecycleBin := nil;
end;
//Chamando a Procedure
procedure TForm1.Button1Click(Sender: TObject);
begin
  EmptyRecycleBin;
end;

Delphi - Verificando se o programa está sendo executado no VMWARE.


function IsInsideVMWare: Boolean;
var
  rc: Boolean;
begin
  rc := False;
   try
    asm
    push   edx
    push   ecx
    push   ebx
    mov    eax, 'VMXh'
    mov    ebx, 0      
    mov    ecx, 10
    mov    edx, 'VX'
    in     eax, dx
    cmp    ebx, 'VMXh'
    setz   [rc]
    pop    ebx
    pop    ecx
    pop    edx
 end;
  except
    on EPrivilege do rc := False;
  end;
  Result := rc;
end;
begin
  Write(' Dentro do VMWare:');
      sInsideVMWare then
  WriteLn('Sim’);
 else
  WriteLn('Não');
end.

Delphi - Descobrindo o último acesso de um arquivo


Function GetFileLastAccessTime(sFileName : string ) : TDateTime;
var ffd : TWin32FindData;
      dft : DWord;
       lft : TFileTime;
       h : THandle;
begin
  h := Windows.FindFirstFile(PChar(sFileName), ffd);
    if(INVALID_HANDLE_VALUE <> h)then
       begin
        Windows.FindClose( h );
        FileTimeToLocalFileTime(ffd.ftLastAccessTime, lft );
        FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
       Result := FileDateToDateTime(dft);
     end;
end;

Para Utilizá-la:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  caption:= datetostr(GetFileLastAccessTime('C:\Teste.txt'));
end;

Delphi - Apagar arquivos temporários da internet


//Declare a unit WinInet
uses

WinInet;
procedure DeleteIECache;
var
  lpEntryInfo: PInternetCacheEntryInfo;
  hCacheDir: LongWord;
  dwEntrySize: LongWord;
begin
  dwEntrySize := 0;
  FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
  GetMem(lpEntryInfo, dwEntrySize);
    if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
       hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
    if hCacheDir <> 0 then
      begin
        repeat
          DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
          FreeMem(lpEntryInfo, dwEntrySize);
         dwEntrySize := 0;
         FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
        GetMem(lpEntryInfo, dwEntrySize);
          if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
        until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize);
    end;
     FreeMem(lpEntryInfo, dwEntrySize);
     FindCloseUrlCache(hCacheDir);
end;

Delphi - Testando se o diretório está vazio


function DirectoryIsEmpty(Directory: string): Boolean;
var SR: TSearchRec;
          i: Integer;
begin
Result := False;
FindFirst(IncludeTrailingPathDelimiter(Directory) + '*', faAnyFile, SR);
  for i := 1 to 2 do
     if (SR.Name = '.') or (SR.Name = '..') then
         Result := FindNext(SR) <> 0;
         FindClose(SR);
end;

Para utilizá-la adicione um botão no formulário com o seguinte código:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   if DirectoryIsEmpty('C:\test') then
      Caption := 'Este diretório está vazio!'
  
else
     Caption := 'Este diretório não está vazio!';
end;


Firebird - Como posso apagar um Generator?


DELETE
FROM  RDB$GENERATORS
WHERE RDB$GENERATOR_NAME = 'NOME_DO_SEU_GENERATOR';

Obs: O Firebird possui o comando DROP GENERATOR para remover um generator do banco de dados.

Delphi - Criando uma Procedure para transformar BMP em ÍCONE


procedure Tform1.bmp2ico(Image: TImage; FileName: TFilename);
var
  Bmp: TBitmap;
  Icon: TIcon;
  ImageList: TImageList;
begin
  Bmp  := TBitmap.Create;
  Icon := TIcon.Create;
  try
    Bmp.Assign(Image.Picture);
    ImageList := TImageList.CreateSize(Bmp.Width, Bmp.Height);
    try
      ImageList.AddMasked(Bmp, Bmp.TransparentColor);
      ImageList.GetIcon(0, Icon);
      // Save it to a file
      Icon.SaveToFile(FileName);
    finally
      ImageList.Free;
    end;
  finally
    Bmp.Free;
    Icon.Free;
  end;
end;

Para chamá-la utiliza um botão, segue abaixo o código.

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   bmp2ico(Image1, 'c:\Teste\icone.ico');
end;

sábado, 4 de fevereiro de 2012

Windows Forms - Enviando Emails utilizando o Visual Studio

Neste artigo montaremos um exemplo bem simples de envio de E-mails com a possibilidade de enviar anexos e utilizando autenticação. Construiremos este exemplo utilizando os denominados “Windows Forms” com o Visual Studio 2005 junto com a linguagem C#.

Para isto abra o Visual Studio 2005 e em File/ New/ Project em Project Types deixe como “Visual C#” em “Templates” escolha “Windows Application” e na região inferior colocaremos um nome para nossa “solution” e escolheremos uma pasta para ser salvo, Veja Figura 01 para melhores detalhes.

Figura 01. Iniciando o projeto.

 Criando o formulário

Iremos alterar as seguintes propriedades do Formulário.

Name: FmEnvia
StartPosition: CenterScreen
Text: Windows Forms - Envio de E-mails
  
Em seguida colocaremos quatro componentes Textbox, quatro Labels, um Listbox e dois Buttons. 

O formulário deverá ficar parecido com o da figura 02. É importante ressaltar que no Textbox da Mensagem a propriedade Multiline foi deixada como true, ou seja, possibilita mais de uma linha.
  
Figura 02. Formulário de Envio.

Depois de montarmos o Layout de nosso exemplo iremos colocar mão na massa, vamos para a codificação do mesmo.

Trabalharemos com as classes contidas nos seguintes Namespaces:

using System.Net.Mail;
using System.Net;
  
Basta declará-las logo no início do programa para assim podermos utilizá-las!

Criaremos dois métodos simples, um para limpar os componentes após o Envio do E-mail e outro para habilitar e desabilitar os botões.
  
/* Limpar os componentes*/
private void Limpar()
  {
      textBox1.Clear();
      textBox2.Clear();
      textBox3.Clear();
      textBox4.Clear();
      listBox1.Items.Clear();
      textBox1.Focus();
  }


/* Habilitando e Desabilitando os botões*/
private void Hab_Des()
  {
     button1.Enabled = !button1.Enabled;
     button2.Enabled = !button2.Enabled;
  }


Codificando o botão Enviar

Agora, vamos para a implementação do código para envio do e-mail no evento Click do botão Enviar, confira abaixo. 


private void button1_Click(object sender, EventArgs e)
   {
           
     this.Cursor = Cursors.WaitCursor;
     Hab_Des();

     MailMessage mailMsgMensagem = new MailMessage(textBox1.Text, textBox2.Text);

     mailMsgMensagem.Subject = textBox3.Text;

     mailMsgMensagem.Body = textBox4.Text;
  
Nesta parte do código deixaremos o cursor do mouse como uma ampulheta (para dar a impressão do envio) em seguida chamaremos o método Hab_Des para assim desabilitarmos os botões.

A próxima linha utilizaremos a classe MailMessage para inserirmos o remetente e o(s) destinatário(s) respectivamente. Através das propriedades Subject e Body definimos o Assunto e o Corpo do E-mail respectivamente.
  
  • Configurando os anexos
 Para adicionarmos anexos ao nosso exemplo é muito simples, faremos um laço para pegarmos todos os itens contidos no Listbox e em seguida pelo método Attachments.Add da classe MailMessage iremos adicionando os anexos.

    for (int i = 0; i < listBox1.Items.Count; i++)
       {
           Attachment Anexo = new Attachment(@listBox1.Items[i].ToString());
           mailMsgMensagem.Attachments.Add(Anexo);
       }
  
  • Configurando as credenciais
É importante ressaltar que existem servidores de E-mails que solicitam autenticação no envio de E-mails , e isto é facilmente resolvido utilizando a classe NetworkCredential, confira logo abaixo:

   /* Configurando Credenciais (senha e usuário) */
   NetworkCredential Email = new NetworkCredential();

   Email.Password = "sua_senha";
   Email.UserName = "sua_conta";

Utilizaremos as proriedades Password e Username para definir Senha e usuário respectivamente.

  • Definindo o Servidor SMTP
Para definirmos o servidor SMTP usaremos a classe SmtpClient, logo em seguida adicionamos as credenciais definidas acima, veja abaixo o código simples.

SmtpClient ClientSMTP = new SmtpClient("smtp.seuprovedor.com.br");
ClientSMTP.Credentials = Email;

  • Enviando o E-mail
Criaremos um bloquinho Try... Catch... para tratarmos o envio do email, ou seja caso ocorra algum problema no envio levantaremos uma excessão e emitiremos uma mensagem ao usuário, caso contrário o e-mail será enviado com sucesso.
  
           try
             {
               ClientSMTP.Send(mailMsgMensagem);             
               MessageBox.Show("Email enviado com sucesso!");
             }
           catch (Exception Ex)
            {
              MessageBox.Show("Ocorreu algum problema ao enviar o Email Erro: " + Ex.Message);      
             }

            this.Cursor = Cursors.Default;
            Hab_Des();
            Limpar();
     }

Para enviarmos o E-mail basta utilizar o Método Send tendo como parâmetro o objeto oriundo da classe MailMessage, no nosso caso este objeto chama-se mailMesgMensagem.
           
Em seguida deixaremos o cursor como padrão, habilitaremos os botões e limparemos os componentes através do método Limpar.
  
Codificando o botão Anexar

Utilizaremos um componente chamado OpenFileDialog, encontrado na paleta Dialogs, ele servirá para escolher o arquivo a ser anexado.

private void button2_Click(object sender, EventArgs e)
        {
          if (openFileDialog1.ShowDialog() = = DialogResult.OK)
              listBox1.Items.Add(openFileDialog1.FileName);
        }

O método ShowDialog servirá para escolhermos o arquivo e o Listbox1.Items.Add para adicionarmos o path (caminho) dos arquivos escolhidos anteriormente.

Figura 03. Enviando E-mail.  

Conclusão

Vimos neste artigo como enviar E-mails com anexo e autenticação no servidor utilizando Windows Forms mas poderíamos utilizar Web Forms sem muitas alterações no código. Espero que tenham gostado, sucesso a todos e até a próxima! 

Firebird - Extraindo o Metadata


Neste artigo irei dar uma dica muito importante em se tratando de Banco de Dados Firebird, como extrair o Metadata, ou seja, gerar o Script de uma base de dados.
Utilizaremos a ferramenta de gerenciamento Ibexpert Completa Trial, válida por 45 dias, encontrada no seguinte endereço: www.ibexpert.com.
Devido ao fato desta ferramenta possuir um processo de instalação rápido e fácil não iremos abordar isso no artigo, focaremos apenas na exportação do Banco de Dados.

Para eventuais testes utilizaremos o Banco de Dados Employee, encontrado por padrão na pasta:

C:\Arquivos de programas\Firebird\Firebird_1_5\examples\Employee.fdb

Depois de registrado o Banco de Dados, deixe-o como ativo e na região superior iremos acessar o menu Tools/Extract Metadata. Aparecerá uma janela chamada “Extract Metadata”, veja Figura 01.

Figura 01. Extraindo o Metadata.

Em Meta Objects encontramos os objetos do Banco de Dados, como por exemplo os domínios, as tabelas, visões, entre outras coisas, no nosso caso específico iremos extrair o Banco de Dados inteiro, para isto escolheremos a opção “Extract All”. Na próxima aba, denominada Data Tables, selecionaremos todas as tabelas envolvidas, na realidade são os registros envolvidos. Para isto clique no botão onde possui duas setinhas para podermos selecionar tudo. (Figura 02)

Figura 02. Extraindo o Metadata.

Em “Where Clause For” podemos definir uma condição para extrairmos os dados de determinadas tabelas, neste caso não definiremos nada, iremos gerar o script de todos os registros encontrado no Banco de Dados.

Na aba Options encontramos várias opções, em File Name defina um lugar para ser salvo o script, no meu caso defini como:

D:\Thiago\Script.sql

Em seguida configuraremos conforme abaixo:

General Options (Opções gerais)

- Generate ‘create database’ statement.
- Include Password in ‘connect’ and ‘create database’ statements.

Metadata Options (Opções de Metadados)

- Set Generators
- Include Objects Descriptions
- Decode Domains

Data Options (Opções de Data)

Deixe o formato da data como: YYYY-MM-DD e da Data/Hora como: YYYY-MM-DD HH:NN:SS

É importante marcar a opção “Extract Blobs”, para assim podermos extrair os registros de campos do tipo BLOB (uma das funcionalidades encontradas apenas na versão completa do Ibexpert).(Figura 03)

Figura 03. Salvando o Metadata.

Após seguir estes passos pressione a tecla F9 para iniciar o processo. Como o Banco de Dados Employee tem poucas tabelas e registros o processo será bem rápido. Caso não ocorra nenhum erro aparecerá uma mensagem parecida com a da Figura 04, pedindo para ler o Script, escolha a opção “No” e em seguida feche a janela.

Figura 04. Extração Completada Com sucesso.
  
Recuperando o Metadata

A ferramenta Ibexpert é muito fácil e intuitiva de se trabalhar, para rodarmos o script basta escolhermos a opção Tools/Script Executive e na opção “Load From File” carregaremos o Script do Banco de Dados. (Figura 05)

Figura 05. Rodando o Script.
  
Na linha CREATE DATABASE definimos o caminho e o nome do Banco Dados onde  será criado.
Com isto estaremos criando todos os objetos e inserindo todos os registros no Banco de Dados. Após realizar estes passos pressione a tecla F9 e se não ocorrer nenhum problema aparecerá uma janela parecida com a Figura 06 dizendo que o Script foi gerado com sucesso!

Figura 06. Script Executado com sucesso.
  
Pronto, agora precisamos apenas registrar o banco de dados criado em nosso Ibexpert, para isto escolha Database/ Register Database, em Database File coloque o caminho do mesmo, defina o usuário, senha e não esqueça de escolher a DLL fbclient em “Client Library File”. Veja Figura 07 para maiores detalhes.

Figura 07. Registrando o Banco de Dados.

Conclusão

Vimos que com facilidade conseguimos extrair o Metadata de um Banco de Dados Firebird utilizando a ferramenta Ibexpert. Muitos problemas de corrupções de Banco de Dados são corrigidos desta maneira.