Fórum Criação de componentes #259457

22/11/2004

0

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.


Sistemald

Sistemald

Responder

Posts

22/11/2004

Massuda

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.


Responder

Gostei + 0

22/11/2004

Dpolistchuck

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


Responder

Gostei + 0

22/11/2004

Massuda

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.


Responder

Gostei + 0

23/11/2004

Sistemald

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

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.


Responder

Gostei + 0

23/11/2004

Sistemald

Galera consegui,

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.


Responder

Gostei + 0

23/11/2004

Marcelo Saviski

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.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar