 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
VelhoMonge Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007 Mensagens: 158 Localização: Paraíba - Brasil
|
Enviada: Seg Jan 07, 2008 9:21 am Assunto: Como Recriar componente destruído em tempo de execuçã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.  |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Seg Jan 07, 2008 9:48 am Assunto: |
|
|
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 |
|
 |
VelhoMonge Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007 Mensagens: 158 Localização: Paraíba - Brasil
|
Enviada: Seg Jan 07, 2008 10:09 am Assunto: |
|
|
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 |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Jan 07, 2008 11:07 am Assunto: |
|
|
só chamar o crete da classe!
exemplo:
DBADVGRID1 := TDBADVGRID.Create(Self); |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Jan 07, 2008 11:09 am Assunto: |
|
|
só chamar o crete da classe!
exemplo:
DBADVGRID1 := TDBADVGRID.Create(Self); |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Seg Jan 07, 2008 11:49 am Assunto: |
|
|
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 |
|
 |
VelhoMonge Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007 Mensagens: 158 Localização: Paraíba - Brasil
|
Enviada: Seg Jan 07, 2008 12:41 pm Assunto: |
|
|
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!!!  |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Seg Jan 07, 2008 1:49 pm Assunto: |
|
|
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 |
|
 |
VelhoMonge Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007 Mensagens: 158 Localização: Paraíba - Brasil
|
Enviada: Seg Jan 07, 2008 3:45 pm Assunto: |
|
|
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....  |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Seg Jan 07, 2008 4:08 pm Assunto: |
|
|
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 |
|
 |
VelhoMonge Aprendiz


Registrado: Sexta-Feira, 23 de Março de 2007 Mensagens: 158 Localização: Paraíba - Brasil
|
Enviada: Seg Jan 07, 2008 4:32 pm Assunto: |
|
|
DonOctavio, tua criatividade é incrível....
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.  _________________
"Por que vocês acham que eu programo em Delphi?" - "Hein? A CodeGear também utiliza isto??" |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Seg Jan 07, 2008 5:06 pm Assunto: |
|
|
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 |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Seg Jan 07, 2008 8:26 pm Assunto: |
|
|
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 |
|
 |
micheus Aprendiz


Registrado: Quarta-Feira, 22 de Junho de 2005 Mensagens: 225 Localização: Blumenau
|
Enviada: Seg Jan 07, 2008 10:37 pm Assunto: |
|
|
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 |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Ter Jan 08, 2008 9:16 am Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|