AulaBD – Modelagem de dados MER

23 02 2010

O material da aula de modelagem de dados do dia 22/02/2010 está disponível no link

Anúncios




Webcast sobre DBA

11 02 2010

No dia 26/02/2010, vai haver um Web cast sobre profissão de DBA, as 12:oo horas.





Aula de BD

8 02 2010

Pessoal,

Segue o link para download do material da aula 01 de banco de dados





Class helper – adicionando funcionalidades sem utilizar de herança

28 11 2009

Algumas vezes precisamos adicionar novas funcionalidades a uma classes, porém não podemos utilizar herança pois parte do projeto está pronto ou mesmo é um projeto que já está em produção e não há como alterar em vários lugares para utilizar a nova classe herdada.

Eu não tenho nada contra herança, na verdade acho muito importante utilizar herança nas situações em que são necessárias, porém o uso exagerado de herança pode deixar o código complexo e difícil de dar manutenção, portanto antes de herdar uma classes e sair programando podemos analisar outras soluções e verificar qual será melhor.

A partir do Delphi 2009 podemos utilizar o recurso chamado Class Helper, permitindo ao programador adicionar novos recursos a classes existentes. Com isso podemos criar novos métodos ou propriedades para classes já existentes e utilizar imediatamente.

Algumas regras tem que ser seguidas para utilizar class helper, por exemplo não podemos acessar métodos privados da classes que estamos fazendo referência, eu também não consegui utilizar em classes que utilizam o recurso generics como TList<T>, mais fiz um exemplo que pode dar um visão boa do que é possível fazer utilizando class helper.

Neste projeto de exemplo foi criado um class helper adicionando dois novos métodos na classe TWinControl e em todos os descendentes de TWinControl. Foi criado um método para habilitar e outro para desabilitar todos os componentes TEdit que são filhos do objeto.

O código fonte da aplicação exemplo para download está disponível neste link.

Foi criado uma classe chamada TWinControlHelper com a seguinte interface.

type
  TWinControlHelper = class helper for TWinControl
  protected
    procedure ChangeEnabled(WinControl: TWinControl; Enabled: boolean);
  public
    procedure DisableTEdit();
    procedure EnabledTEdit();
  end;

A implementação dos métodos também é fácil de entender segue abaixo.

procedure TWinControlHelper.ChangeEnabled(WinControl: TWinControl;
  Enabled: boolean);
var
  I: Integer;
  Control: TControl;
begin
  for I := 0 to WinControl.ControlCount - 1 do
  begin
    Control := WinControl.Controls[I];
    if Control is TEdit then (Control as TEdit)
      .Enabled := Enabled;
    if Control.InheritsFrom(TCustomPanel) then
      ChangeEnabled(Control as TCustomPanel, Enabled);
    if Control.InheritsFrom(TCustomGroupBox) then
      ChangeEnabled(Control as TCustomGroupBox, Enabled);
  end;
end;

procedure TWinControlHelper.DisableTEdit;
begin
  ChangeEnabled(Self, False);
end;

procedure TWinControlHelper.EnabledTEdit;
begin
  ChangeEnabled(Self, True);
end;

Para testar a utilização dos novos métodos adicionados foi criado um aplicação simples com um formulário e alguns componentes adicionados a esse formulário.

Segue abaixo os métodos adicionados ao evento OnClique de cada botão.

uses uWinControlHelper;  
{$R *.dfm}

procedure TForm1.btnDisableClick(Sender: TObject);
begin
  Self.DisableTEdit();
end;

procedure TForm1.btnEnableClick(Sender: TObject);
begin
  Self.EnabledTEdit();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.DisableTEdit();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Panel1.EnabledTEdit();
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  GroupBox1.DisableTEdit();
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  GroupBox1.EnabledTEdit();
end;

Uma ultima dica é importante notar que para funcionar corretamente é necessário adicionar na cláusula uses do formulário a unit que contém a class helper, no meu caso a unit se chama uWinControlHelper.

Com isso podemos testar as novas funcionalidades adicionada. Agora já dá para perceber como esse novo recurso pode ajudar.





Unit aliases Delphi

24 11 2009

O Delphi tem um recurso que pode ser útil quando estamos fazendo teste na aplicação ou quando temos duas units com nomes iguais.

Esse recurso é chamado de unit aliases, ou seja você pode dar um apelido para uma unit. suponha que você tenha criado um unit chamada classes.pas, só que o delphi também tem uma unit chamada classes.pas, com esse recurso é possível continuar com o arquivo classes.pas só que na aplicação aonde faz referência a sua unit classes.pas ser adicionada MyClasses.pas mesmo não sendo esse o nome correto do arquivo

No Delphi 2009 ou inferior é só acessar Project|Options e selecionar o item Directories/Conditionals e no campo UnitAliases adicionar “;MyClass=[dir]Classes”, [dir] é o diretório correto aonde está o arquivo.

No Delphi 2010 essa opção está no item Delphi Compiler também em Projet|Options.





Ligando objetos de negócio aos campos de um fomulário via RTTI

18 11 2009

O Delphi 2010 tem muitos novos recursos que provam que a ferramenta está evoluindo muito. Uma nova feature que eu estou achando muito interessante é a nova RTTI e os novos recursos adicionados a ela.

A RTTI existe deste as primeiras versões do Delphi porém era muito mais complexo utilizar e dava um bom trabalho pois o uso de ponteiro a meu ver era exagerado.

Agora ficou mais fácil procurar campo ou propriedades em classes, chamar métodos em Run time e várias coisas legais.

Eu estava procurando na internet achei um blog muito bom do Cobus Kruger que é desenvolvedor em Delphi há muito tempo e postou um artigo interessante e bem prático mostrando como fazer a ligação entre um objeto de negócio e os campos de um formulário neste link.

Com o exemplo mostrado no post podemos separar as regras de negócio da camada visual em nossa aplicação, deixando nosso código mais modularizado e mais fácil de reutilizar nossa camada de negócio.





Copiando arquivo usando API do windows

11 11 2009

Quem desenvolve com delphi há algum tempo pode ter tido a necessidade de realizar cópia de um arquivo via programação, o delphi tem funções de copiar aquivo que funcionam perfeitamente, porém não mostra para o usuário o progresso da cópia do arquivo e se esse arquivo for grande pode causar uma sensação ruim para o usuário, pois ele não sabe se sua aplicação travou.

Pesquisando um pouco eu encontrei uma função da API do windows que mostra para o usuário o progresso da cópia, essa função da API chamada SHFileOperation tem diversos parâmetro e serve para copiar, mover, renomear ou deletar arquivo com diversar opções de configuração, fiz um programinha de exemplo e deixei neste link ProjCopyFile, porém neste exemplo somente a opção de cópia de arquivo está habilitada, porém com a descrição das possibilidades, é fácil adaptar para novas situações.

Ele funciona de forma bem simples e não vou entrar em detalhes de como foi feito, vou apenas demonstrar a principal função chamada de CopyFile

function TfrmPrincipal.CopyFile(Orign, Destiny: AnsiString; FailOnExists: Boolean = false): boolean;
var
  Dados: TSHFileOpStruct;
begin
  Result := False;
  // Preenche os campo
  FillChar(Dados, SizeOf(Dados), 0);
  // Função para copiar ou renomear arquivo
  Dados.wFunc  := FO_COPY;
  Dados.pFrom  := PChar(Orign);
  Dados.pTo    := PChar(Destiny);
  Dados.fFlags := FOF_ALLOWUNDO;
  if not FailOnExists then
    Dados.fFlags := Dados.fFlags or FOF_NOCONFIRMATION;
  Result := SHFileOperation(Dados) = 0;
end;

Tem dois paramentro que podem receber vários valores wFunc e fFlags, procurando no help pode ver os possiveis valores.

wFunc
Valor que indica qual operação será realizada. Pode ter um dos seguintes valores
FO_COPY
 Copia o(s) arquivo(s) especificado(s) no parâmetro pFrom para o local especificado no parâmetro pTo.
FO_DELETE
 Delete o(s) arquivo(s) especificado no parâmetro pFrom.
FO_MOVE
 Move o(s) arquivo(s) especificado(s) no parâmetro pFrom para o local especificado no parâmetro pTo.
FO_RENAME
 Renomeia os arquivo especificado no parâmetro pFrom para o nome especificado no parâmetro pTo. Usando essa função, não pode ser utilizado o flag de multiplos arquivos.

 fFlag
Este parâmetro pode ser utilizado um ou diversos valores ao mesmo tempo, porém alguns não funcionam em conjunto, utilize OR para ligar mais de um flag.
FOF_ALLOWUNDO
 Permite desfazer a operação chamada.
FOF_CONFIRMMOUSE
 Não utilizada.
FOF_FILESONLY
 A operação será realizada apenas em arquivos quando utilizar o coringa (*.*), irá ignorar pastas.
FOF_MULTIDESTFILES
 Permite operação em multiplos arquivos, se o parâmetro pTo for uma pasta ele ira entender utilizar o nome do arquivo de pFrom com a pasta de pTo.
FOF_NOCONFIRMATION
 Assume como padrão “Sim para todos” para qualquer tela de confirmação para sobreescrever arquivo.
FOF_NOCONFIRMMKDIR
 Não cria automaticamente a pasta de destino caso ela não exista.
FOF_NO_CONNECTED_ELEMENTS
 Versão 5.0. Não move arquivos conectados de grupo, somente arquivos especificados.
FOF_NOCOPYSECURITYATTRIBS
 Versão 4.71. Não copia atributos de segurança para o novo arquivo.
FOF_NOERRORUI
 Não mostra tela de erro se algum ocorrer.
FOF_NORECURSION
 Somente executa em diretório local, não executa nos subdiretórios.
FOF_NORECURSEREPARSE
 
FOF_RENAMEONCOLLISION
 Em o arquivo pTo já existir, dá um novo nome para o arquivo no destino.
FOF_SILENT
 Não mostra tela de progresso da cópia do arquivo.
FOF_SIMPLEPROGRESS
 Mostra tela de progresso, porém não mostra o(s) nome(S) do(S) arquivo(s).
FOF_WANTMAPPINGHANDLE
 
FOF_WANTNUKEWARNING
 
FOF_NO_UI
 

Depois para utlizar essa função é só chama-la da seguinte maneira

procedure TfrmPrincipal.btnCopiarClick(Sender: TObject);
begin
  if Self.CopyFile(edtOrigem.Text, edtDestino.Text, chkErroExiste.Checked) then
    ShowMessage('Arquivo copiado com sucesso');
end;

Só isso, podem testar e verão a tela padrão do windows de cópia de arquivo quando executar a cópia de arquivo. Teste com arquivo de tamanho grande para ver o resultado.