Criação de componentes
Olá amigos,
Estou com um sério problema, que é o seguinte:
Tenho um componente que tem uma propriedade:
property Imagens : TImageList read ListaImagem write ListaImagem;
Então você pode selecionar um TimageList nesta propriedade, para que eu use as figuras no componente, até aí tudo bem.
O problema é quando você(em tempo de projeto)associa u Timagelist ao componente, e depois apaga esse Timagelist, começa a dar violação de memória.
Como posso resolver esse problema.
Estou com um sério problema, que é o seguinte:
Tenho um componente que tem uma propriedade:
property Imagens : TImageList read ListaImagem write ListaImagem;
Então você pode selecionar um TimageList nesta propriedade, para que eu use as figuras no componente, até aí tudo bem.
O problema é quando você(em tempo de projeto)associa u Timagelist ao componente, e depois apaga esse Timagelist, começa a dar violação de memória.
Como posso resolver esse problema.
Sistemald
Curtidas 0
Respostas
Massuda
22/11/2004
Talvez ajude: quando um controle é inserido/removido de um form (ou qualquer derivado de TWinControl), os demais controles contidos no form recebem mensagens do form infomando o fato. Essas mensagens são:
CM_CONTROLLISTCHANGE: WParam indica qual é o controle, LParam incia se está inserindo (1) ou removendo (0)
CM_CONTROLCHANGE: usa uma mensagem do tipo TCMControlChange (definida na unit Messages).
Você poderia processar CM_CONTROLCHANGE em tempo de projeto para detectar quando o TImageList do seu componente é destruído/apagado, atribuir nil na sua propriedade Imagens e assim evitar os AVs.
CM_CONTROLLISTCHANGE: WParam indica qual é o controle, LParam incia se está inserindo (1) ou removendo (0)
CM_CONTROLCHANGE: usa uma mensagem do tipo TCMControlChange (definida na unit Messages).
Você poderia processar CM_CONTROLCHANGE em tempo de projeto para detectar quando o TImageList do seu componente é destruído/apagado, atribuir nil na sua propriedade Imagens e assim evitar os AVs.
GOSTEI 0
Dpolistchuck
22/11/2004
De um override em:
procedure TComponent.Notification(AComponent: TComponent; Operation: TOperation);
E coloque nil na sua referencia interna ao ImageList (campo privado ou coisa parecida), se operation for igual a opRemove.
[]s
Daniel
procedure TComponent.Notification(AComponent: TComponent; Operation: TOperation);
E coloque nil na sua referencia interna ao ImageList (campo privado ou coisa parecida), se operation for igual a opRemove.
[]s
Daniel
GOSTEI 0
Massuda
22/11/2004
De um override em:
procedure TComponent.Notification(AComponent: TComponent; Operation: TOperation);
E coloque nil na sua referencia interna ao ImageList (campo privado ou coisa parecida), se operation for igual a opRemove.
Tinha que ter um jeito mais simples do que eu tinha pensado :D ... valeu Daniel.
Só para complementar... precisa checar se AComponent é o image list usado pelo componente.
GOSTEI 0
Sistemald
22/11/2004
Valeu pela dica, funcionou perfeitamente.
Só falta um detalhe, é um outro problema que só ocorre é tempo de projeto.
Estou fazendo uma variação do DBGrid, e tenho o seguinte código
Este erro ocorre em projeto não salvo e que não foi gerado o executavel.
o ideal é que não executasse esta linha em tempo de projeto.
Só falta um detalhe, é um outro problema que só ocorre é tempo de projeto.
Estou fazendo uma variação do DBGrid, e tenho o seguinte código
destructor TDBGridBoolean.Destroy; begin Columns.SaveToFile(ExtractFilePath(ParamStr(0)) + ´config´ + name + datasource.Name + ´.grid´); inherited; end;
Este erro ocorre em projeto não salvo e que não foi gerado o executavel.
o ideal é que não executasse esta linha em tempo de projeto.
GOSTEI 0
Sistemald
22/11/2004
Galera consegui,
na verdade o problema era o seguinte:
->datasource.name
Quando não havia um datasource ligado ao dbgrid.
na verdade o problema era o seguinte:
destructor TDBGridBoolean.Destroy; begin Columns.SaveToFile(ExtractFilePath(ParamStr(0)) + ´config´ + name + datasource.Name + ´.grid´); inherited; end;
->datasource.name
Quando não havia um datasource ligado ao dbgrid.
GOSTEI 0
Marcelo Saviski
22/11/2004
para que não salve em tempo de projeto vc poderia verificar
if not (csdesigning in ComponentState) then //faz algo que só deve ser feito depois do programa compilado.
GOSTEI 0