Erro usando o Screen.OnActiveControl

Delphi

26/08/2005

Estou a usar o seguinte código para quando entro numa Edit mude a cor de fundo, está a funcionar bem mas quando fecho o Form dá me erro
´Project Aplicacao.exe Raise exception class EaccessViolation with ´Access violatio..´

 public
    { Public declarations }
    campoAnt : TEdit;
    procedure controlChange(sender : TObject);
  end;
  ......

procedure TFrMenus.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := controlChange;
end;

procedure TFrMenus.controlChange(sender : TObject);
begin
   if Assigned(campoAnt) then
    campoAnt.Color := clWindow;
   if ActiveControl is TEdit then
    begin
     TEdit(ActiveControl).Color := clBackground; //clInfoBk;
     campoAnt := TEdit(ActiveControl);
    end
   else
    campoAnt := nil;
end;



Porty

Porty

Curtidas 0

Respostas

Rjun

Rjun

26/08/2005

É que você esta tentando acessar um controle q ja foi destruido pelo Form. Coloque essa linha no evento OnClose do Form.

Screen.OnActiveControlChange := nil;
;


GOSTEI 0
Massuda

Massuda

26/08/2005

Você precisa testar se o ActiveControl é diferente de nil porque um form inativo tem ActiveControl = nil. Além disso, é recomendável que você desinstale o tratador do evento no OnDestroy do seu form já que tudo dentro do form está sendo destruído.
procedure TFrMenus.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := controlChange;
end;

procedure TFrMenus.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;

procedure TFrMenus.controlChange(sender : TObject);
begin
  // não sei bem onde o teste deveria ser feito...
 if Assigned(ActiveControl) then begin

   if Assigned(campoAnt) then
    campoAnt.Color := clWindow;
   if ActiveControl is TEdit then
    begin
     TEdit(ActiveControl).Color := clBackground; //clInfoBk;
     campoAnt := TEdit(ActiveControl);
    end
   else
    campoAnt := nil;

 end;
end;



GOSTEI 0
Porty

Porty

26/08/2005

É que você esta tentando acessar um controle q ja foi destruido pelo Form. Coloque essa linha no evento OnClose do Form.
Screen.OnActiveControlChange := nil;
;


Coloquei esse código no OnDestroy é já funciona sem erros.
Se eu quiser usar esse código para todas a aplicação com faria? Pois estar a repetir este código em todos os forms é um pouco chato, claro que podia usar a herança mas como já tenho muitos forms já criados não queria estar a mexer.


GOSTEI 0
Porty

Porty

26/08/2005

[quote:13b03239b0=´Rjun´]É que você esta tentando acessar um controle q ja foi destruido pelo Form. Coloque essa linha no evento OnClose do Form.
Screen.OnActiveControlChange := nil;
;


Coloquei esse código no OnDestroy é já funciona sem erros.
Se eu quiser usar esse código para todas a aplicação com faria? Pois estar a repetir este código em todos os forms é um pouco chato, claro que podia usar a herança mas como já tenho muitos forms já criados não queria estar a mexer.[/quote:13b03239b0]


GOSTEI 0
Mysys

Mysys

26/08/2005

e ai gurizada tudo na santa ..??

seguinte esse codigo funciona perfeitamente em forms normais mais eu uso MDI e ele nao funciona ..

[b:92b8a58d51]
alguem sabe de algum codigo prar mudar a cor do edit,DBEdit focado para form MDI..???[/b:92b8a58d51]


GOSTEI 0
POSTAR