DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da ClubeDelphi ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!


Video: Curso Online-Dominando a Orientação a Objetos e Componentes em Delphi (Avançado)-Parte IX-Continuando a aprimorar nossa camada de persistência TTable (não é o TTable do BDE)

Nesta vídeo-aula, usaremos eventos da VCL como TNotifyEvent e em seguida criaremos nossos próprios eventos.

Título:  Curso Online-Dominando a Orientação a Objetos e Componentes em Delphi (Avançado)-Parte IX-Continuando a aprimorar nossa camada de persistência TTable (não é o TTable do BDE)


Tempo: 23:27 min

 

Mini Resumo: Na vídeo-aula de hoje iremos continuar aprimorando a nossa camada de persistência TTable (não é o TTable do BDE) aprendendo a fazer a interação da mesma com o objeto chamador por meio de eventos. Começaremos usando eventos padrões da VCL como TNotifyEvent e em seguida iremos a aprender a criar os nossos próprios eventos segundo as nossas necessidades, adicionando a esses novos parâmetros. Trabalhar como Eventos é um bom recurso da orientação a objetos porque nos possibilita a troca de informações bem como a alteração do comportamento dos métodos das classes sem necessidade de se utilizar recursos não recomendados como variáveis globais. Se você esta habituado a trabalhar de forma procedural em seus aplicativos, eis uma oportunidade de aprender a organizar o seu código fonte e melhorar o seu Know How.

 

Tecnologias utilizadas: Borland Delphi 6


Palavras chaves: Borland Delphi 6, Orientação a Objetos, Pascal.





    6 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Jose Carlos Castelli Junior
Parabens!!!
 
Muito boa a aula, muito boa a didatica tambem!!!
[há +1 ano] - Responder

 

Alexandre Do Amaral E Silva Neto
Olá Renato, blz?
 
Estou com uma dúvida aqui e gostaria de sua ajuda. Como contornar este problema ?
 
 
 
      published
        property Items[index: integer]: TFone read GetFones write SetFones;
 
 
uma vez que propriedades publicadas não podem ser do tipo array.
Preciso dela Published para poder serializá-la.
 
Abração,
Alexandre.
[há +1 ano] - Responder

 

[autor] Renato Matos

Irei começar com a seguinte abordagem:

1) published: propriedades declaradas nesse escopo aparecem no Object Inspector, caso a classe tenha sido declarada com intuito de transforma-la em um componente que terá propriedades configuradas em Design pelo desenvolvedor. Somente essa a vantagem.
 
2) public: a visibilidade sera comum a membros da subclasse e objetos. A diferença é que nesse escopo as propriedades não ficam no Object Inspector.
 
3) As propriedades podem ser do tipo Array assim como do tipo de objetos Auxiliares. O que esta faltando é que eu ainda não abordei Editores de Propriedades. Por exemplo: Qdo vc cria uma propriedade do tipo TStrings automaticamente uma caixa de texto é aberta quando o cara clica nos "3 pontinhos" (...). De forma similar podemos mudar o comportamento para quando o cara clicar na sua propriedade Items abrir um form para o cara entrar com os fones. Irei abordar Editores de Propriedades ainda para concluir o curso.
 
Caso vc queira mais informações, antes de esperar pelos próximos videos, você pode pesquisar por "DesignEditors"
Espero que tenha lhe ajudado.
[há +1 ano] - Responder
 

Alexandre Do Amaral E Silva Neto
Olá Renato,
 
Me tire uma dúvida, como eu irei trabalhar com a IPersist no caso por exemplo de ter uma relacionamento 1:N em minhas tabelas? Digamos, uma Pessoa pode ter vários telefones, eu teria que criar uma lista de objetos TTelefones e varrer esta lista aplicando o método Insert?
 
[]'s
AASN
[há +1 ano] - Responder
 

[autor] Renato Matos

Em resumo é isso mesmo!

Mas você ainda tem uma alternativa de no método doInsert da classe Pessoa fazer essa gerencia.
Por exemplo:
 
function Pessoa.doInsert(): boolean;
begin
  StartTransacation();
  try
   
    // inclui os dados da pessoa no banco
    // aqui vc chama a Persistencia de pessoa
    doInternalInsert();
 
    // inclui todos os telefones no banco
    // o metodo doInsert de telefone chama a persistencia dele
    for i := 0 to Count -1 do
      Telefone(Item[i]).doInsert();
 
    result := true;
 
    Commit();
 
  except
    on e: exception do
      begin
      Rollback();
      TratamentoDeErro(e);
      result := false;
      end;
 
  end;
 
end;
 
 
 
 
 
[há +1 ano] - Responder
 

[autor] Renato Matos
Isso mesmo!
A regra de negocio fica a cargo da classe de pessoa
E um detalhe!
Para controle da transação você poderá fazer o seguinte:
 
nas suas classes Pessoa, Telefone, etc.... sempre que um método do tipo Insert, Update ou Delete
for chamado, seria bom voce verificar se existe uma transacao aberta. Por exemplo:
 
telefone.insert()
begin
  abre_transacao();
  try
    salva_dados();
    commit();
  except
    rollback();
  end;
end;
 
O método acima não está usando uma boa prática! Pois veja o exemplo abaixo:
 
pessoa.insert()
begin
  abre_transacao();
  try
    salva_dados();
    
    se no codigo Insert da classe telefone a transacao esta sendo fechada, entao
   voce ira ferrar com tudo. Pois nao ira adiantar abrir uma transacao na classe pessoa.
   logo! as classes precisam saber se ja existe uma transacao aberta.
 
    for 1 := 0 to telefones.count -1 do
      telefone[i].insert();
 
    commit();
  except
    rollback();
  end;
end;
 
 
//////////////////// ******************************* /////////////////////////////////////////
 
Agora vai uma melhoria do codigo acima
 
 
telefone.insert()
var
   existe_transacao_externa: boolean;
begin
  // para saber se existe uma outra transacao aberta
  existe_transacao_externa := conn.Intransacation();
 
  if not existe_transacao_externa then
     abre_transacao();
 
  try
    salva_dados();
 
    if not existe_transacao_externa then
       commit();
 
  except
    if not existe_transacao_externa then
       rollback();
  end;
end;
 
Agora vamos para a classe pessoa
 
pessoa.insert()
var
   existe_transacao_externa: boolean;
begin
  // para saber se existe uma outra transacao aberta
  existe_transacao_externa := conn.Intransacation();
 
  if not existe_transacao_externa then
      abre_transacao();
 
  try
    salva_dados();
    
    os telefones serao salvos sem fechar a transacao
    for 1 := 0 to telefones.count -1 do
      telefone[i].insert();
 
     if not existe_transacao_externa then
        commit();
 
  except
     if not existe_transacao_externa then
        rollback();
  end;
end;
 
Espero ter ajudado!
 
 
[há +1 ano] - Responder
 



Publicidade
Curso Online
Autor
Devmedia [renato Matos]

12 anos de experiência em desenvolvimento de software.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
8   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03