ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Como Recriar componente destruído em tempo de execução??
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
VelhoMonge
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007
Mensagens: 158
Localização: Paraíba - Brasil

MensagemEnviada: Seg Jan 07, 2008 9:21 am    Assunto: Como Recriar componente destruído em tempo de execução?? Responder com Citação

Bom dia, cavalheiros,

Destruí um Dbgrid em run-time (Dbgrid1.Destroy) e preciso criá-lo novamente (em run-time também). Como faço isso?

Detalhe: O DBgrid tem que voltar do mesmo jeito que eu projetei em design-time.


Muítissimo grato a todos. Very Happy
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Seg Jan 07, 2008 9:48 am    Assunto: Responder com Citação

1º - Não use o destroy, chame o free...

help do delphi

Citação:
A destructor should therefore check for nil values before operating on class-type or pointer-type fields. Calling the Free
method (defined in TObject), rather than Destroy, offers a convenient way of checking for nil values before destroying an object.


2 º - Supoe-se que seja o mesmo objeto, no mesmo escopo, entao pra que destrui-lo? Pq tem que instanciar + 1 vez?
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
VelhoMonge
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007
Mensagens: 158
Localização: Paraíba - Brasil

MensagemEnviada: Seg Jan 07, 2008 10:09 am    Assunto: Responder com Citação

DonOctavio, obrigado pelo seu retorno.

Preciso destruí-lo (ou dar o free) porque eu trabalho com um DBgrid incomum, o DBADVGRID (www.tmssoftware.com).

Este DBgrid, ao trocar o dataset, dá uns defeitos visuais nojentos (as colunas do dataset anterior se sobrepõe às do novo dataset. Já tentei dar um DBgrid.refresh, dbgrid.repaint, entre outras coisas, mas não resolve.

Além disso, eu trabalho com um programa com conceito de abas, como no firefox. Se não foste isto, seria mais fácil destruir o form inteiro e recriar o form novamente.

Daí, pensei em destruir o componente e recriá-lo em tempo de execução.

E então, você sabe como instancio ele novamente? igual como eu fiz em design-time.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Jan 07, 2008 11:07 am    Assunto: Responder com Citação

só chamar o crete da classe!
exemplo:

DBADVGRID1 := TDBADVGRID.Create(Self);
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Jan 07, 2008 11:09 am    Assunto: Responder com Citação

só chamar o crete da classe!
exemplo:

DBADVGRID1 := TDBADVGRID.Create(Self);
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Seg Jan 07, 2008 11:49 am    Assunto: Responder com Citação

gilsonnrodrigues

se fizer assim...

DBADVGRID1 := TDBADVGRID.Create(Self);
DBADVGRID1 := TDBADVGRID.Create(Self);

ele vai alocar o grid em 2 lugares ou no mesmo lugar?
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
VelhoMonge
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007
Mensagens: 158
Localização: Paraíba - Brasil

MensagemEnviada: Seg Jan 07, 2008 12:41 pm    Assunto: Responder com Citação

GilsonRodrigues, o código resolve parcialmente o problema...

Primeiro, que eu preciso setar dbgrid1.parent:= (o nome do fom pai) para o dbgrid aparecer...

e o segundo, é que o Dbgrid criado não é idêntico ao que eu projetei em design-time....eu tenho que personalizar ele todinho ainda...o que é inviável para mim, pois esse dbgrid tem muitas características para personalizar (tamanho das colunas, fonte, cor, glyph, captions, field, searchfooter, htmlformat, showmemofields, showbooleanfields, look, style, etc, etc)

Como resolvo isto? tem como recriar este componente igual ao que era em design time?

Aliás tenho uma dúvida, o delphi quando cria a instância de um controle visual, onde é que ele vai para pegar todas as preferências que a gente criou em design-time? Como ele sabe que um bitbtn terá fonte Tahoma, o tamanho do botão será 30x100 pixels, na cor verde, etc. ?? onde o delphi vai atrás destas informações???

Obrigado a todos!!! Cool
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Seg Jan 07, 2008 1:49 pm    Assunto: Responder com Citação

vc ja tentou só deixar como nil ao inves de criar e recriar de novo?


Citação:
onde é que ele vai para pegar todas as preferências que a gente criou em design-time?


isso já vem compilado...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
VelhoMonge
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007
Mensagens: 158
Localização: Paraíba - Brasil

MensagemEnviada: Seg Jan 07, 2008 3:45 pm    Assunto: Responder com Citação

Tentei. Não surtiu efeito. Preciso realmente destruir esse form (com Destroy ou Free), isso aí eu tô conseguindo, o problema é na hora de criar ele de novo (consigo criar um novo DBgrid, mas ele é diferente do que eu fiz em design-time - é uma instância totalmente nova, e não aquela que fiz...)

Alguém me ajude.... Embarassed
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Seg Jan 07, 2008 4:08 pm    Assunto: Responder com Citação

GridReserva := Grid1;

Grid1.Free;

Grrid1.Create;

Grid1 := GridReserva...

Assim mantem as configuraceos

mas...

Seria mais facil criar 2 grids nao?
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
VelhoMonge
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007
Mensagens: 158
Localização: Paraíba - Brasil

MensagemEnviada: Seg Jan 07, 2008 4:32 pm    Assunto: Responder com Citação

DonOctavio, tua criatividade é incrível.... Very Happy

O dito resolve o problema, mas fica com cara de gambiarra....mesmo assim, muitissimo obrigado por sua atenção. Não é todo mundo que se dispõe a ajudar...

Infelizmente, continuo tentando aprender como instanciar um controle do jeito que criei em design-time....se alguém tiver uma dica, agradeço muito. Very Happy
_________________

"Por que vocês acham que eu programo em Delphi?" - "Hein? A CodeGear também utiliza isto??"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Seg Jan 07, 2008 5:06 pm    Assunto: Responder com Citação

Citação:
mas fica com cara de gambiarra


claro... pq na verdade os 2 grids já estao lá!

só que um vai ficar invisivel...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
CarneiroDelphi
Experiente
Experiente


Registrado: Sexta-Feira, 5 de Agosto de 2005
Mensagens: 417

MensagemEnviada: Seg Jan 07, 2008 8:26 pm    Assunto: Responder com Citação

Para criar em como se fosse em design time, é como o que o delphi faz nos seus bastidores, ou seja, vou dar um simples exemplo:

Código:

var Objeto: TObjeto;

procedure CriaObjeto;
begin
  Objeto := TObjeto.Create( Self );
  Objeto.Parent := Self;
  Objeto.Visible := False;
  Ojeto.SetBouns( Left, Top, With, Height );
  Objeto.propriedade := Valor;
  Objeto.eventoClick := ClickObjeto;
  Objeto.eventoKeyPress := KeyPressObjeto;
  Objeto.Visible := True;
end;


Amigo, essa é uma forma bem clásica, o Delphi por trás faz quase isso, apesar de ser bem mais complexo, além do mais o Delphi pega as informações do arquivo com a estenssão .dfm, exemplo: form1.dfm.

Esse arquivo contém todas as informações de design time que é controlada pelo objeto TPersistent, que representa persistencia.

Existem outras formas de instanciar um objeto, por exemplo, por meio de referencia a classes, mais isso complica mais ainda esse tópico, e seria necessário até um artigo inteiro sobre tal assunto.

De qualquer forma, uma referencia a uma classe pode ser declarada assim:

Código:

type TObjetoClass = class of TObjeto;


Esse assunto você pode procurar no google, acredito que vai encontrar bastante coisa sobre tal.


Espero ter contribuido.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
micheus
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 22 de Junho de 2005
Mensagens: 225
Localização: Blumenau

MensagemEnviada: Seg Jan 07, 2008 10:37 pm    Assunto: Responder com Citação

DonOctavioDelFlores escreveu:
GridReserva := Grid1;
Grid1.Free;
Grrid1.Create;
Grid1 := GridReserva...

Assim mantem as configuraceos


VelhoMonge escreveu:
O dito resolve o problema, mas fica com cara de gambiarra....

DonOctavioDelFlores, apesar de seu código estar apenas "prototipado", o que consigo entender (acho) é que o Grid1 é atribuído à variável GridReserva. E depois, a atual instância do Grid1 é liberada da memória e novamente alocada. E, por fim, a variável GridReserva é atribuída à Grid1.

Então, me desculpe pela falta de lógica, mas se ao atribuir GridReserva := Grid1 dizemos que os dois são a mesma coisa. Assim, como entender que após liberada a instância de DBGrid1 a variável GridReserva ainda terá um conteúdo válido?
Normalmente, com esta atribuição, o que fizermos com GridReserva se refletiria em DBGrid1 - por ex., alterar a sua posição no form.

Será que dá para explicar melhor com isto está funcionando?

Grato.
_________________
"Há sempre, pelo menos, dois modos de fazer uma mesma coisa.
Mesmo que sejam: certo e errado."
(Micheus)

micheus.4Shared.com Exemplos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Ter Jan 08, 2008 9:16 am    Assunto: Responder com Citação

Citação:
Normalmente, com esta atribuição, o que fizermos com GridReserva se refletiria em DBGrid1 - por ex., alterar a sua posição no form.


eu nao testei pra ver o que acontece mas...

GridReserva e Grid1 sao obj diferentes, em locais diferentes da memoria, quando eu faco a atribuicao eu espero que os valores sejam atribuidos, e nao o endereco de memoria...

eu ja fiz algo parecido (nao lembro direito) uma vez e funcionou...

pra um refletir o que o outro faz só se fosse um ponteiro...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB