Fórum Access Violation ao fechar MDI #196860

24/11/2003

0

Pessoal, estou com o seguinte problema ao fechar um formulário MDI filho: Conforme o código abaixo, eu coloquei um SpeedButton para fechar o form e nele coloquei um rotina chamadora do evento OnClose do mesmo form. A intuito disso é que, se o usuário clicar no botão fechar ou no ´X´ do canto superior direito da janela a ser fechada, o programa executará a mesma rotina de fechamento. Só que quando eu clico no ´X´ o programa fecha sem problemas, mas quando clico no botão (SpeedButton) aparece um Access Violation.

procedure Tform1.SpeedButton3Click(Sender: TObject);
Var Action : TCloseAction;
begin
   Action := caNone;
   FormClose(nil,Action);
end;

procedure Tform1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   frmPrincipal.spbAddVal.Enabled := True;
   freeandnil(frmAddValores);
end;


Alguém pode dar uma ajuda para resolver o problema?
Grato
wbb


Wbb

Wbb

Responder

Posts

24/11/2003

Wbb

Apenas uma correção no código:

procedure Tform1.SpeedButton3Click(Sender: TObject); 
Var Action : TCloseAction; 
begin 
   Action := caNone; 
   FormClose(nil,Action); 
end; 

procedure Tform1.FormClose(Sender: TObject; 
  var Action: TCloseAction); 
begin 
   freeandnil(form1); 
end;



Responder

Gostei + 0

24/11/2003

Yankleber

Olá,

Tente substituir o caNone por caFree.


Responder

Gostei + 0

24/11/2003

Gbastos

É isso que o yankleber falou, pra fechar um MDIChild tem que ser com o caFree...
Outra coisa q eu aconselharia por experiência própria, seria ao invés de passar nil como parametro no Sender do formclose, passar o próprio sender do speedbuttonclick..


Responder

Gostei + 0

25/11/2003

Wbb

Eu agradeço a atenção tanto do yankleber quanto do GBastos, porém já fiz todas as combinações possíveis com o Sender e com o Action e ainda assim ao fechar o form pelo botão, dá erro. Se fechar pelo ´X´ do form, tudo bem, funciona OK.

Na 1ª e 2ª formas, o form pode ser fechado pelo ´X´ sem problemas, mas dá erro através do botão. Na 3ª forma também fecha pelo ´X´, mas não faz nada se apertar o botão.


As formas como já tentei foram:


procedure Tform1.SpeedButton3Click(Sender: TObject);
Var Action : TCloseAction;
begin
   Action := caFree;
   FormClose(SpeedButton3,Action);
end;

procedure Tform1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   freeandnil(form1);
end;


procedure Tform1.SpeedButton3Click(Sender: TObject);
Var Action : TCloseAction;
begin
   Action := caNone;
   FormClose(SpeedButton3,Action);
end;

procedure Tform1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   freeandnil(form1);
end;


procedure Tform1.SpeedButton3Click(Sender: TObject);
Var Action : TCloseAction;
begin
   Action := caNone;
   FormClose(SpeedButton3,Action);
end;

procedure Tform1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
Action := caFree;
frmAddValores := Nil;
end;


Até tentei outras maneras, mas davam Stack Overflow ou erros semelhantes aos anteriores. Tá F... !

De qualquer maneira obrigado pela ajuda. Vou continuar tentando.
wbb


Responder

Gostei + 0

25/11/2003

Wbb

Não precisa mais pessoal. Já foi resolvido pelo colega [b:eea5764793]BAMPavao [/b:eea5764793] que mais uma vez se dispoz a me ajudar, e foi resolvido de uma forma super simples que por sinal eu ainda não havia tentado.


procedure Tform1.SpeedButton3Click(Sender: TObject);
Var Action : TCloseAction;
begin
   Close;
end;

procedure Tform1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   Action := caFree;
   frmAddValores := Nil;
end;


Obrigado a todos.
wbb


Responder

Gostei + 0

26/11/2003

Gbastos

Beleza, eu ia sugerir tirar o caFree do evento do SpeedButton e colocar no FormClose q é onde deve ficar, e o parametro do FormClose vc podia passar como Sender mesmo, algo como:
procedure Tform1.SpeedButton3Click(Sender: TObject); 
Var Action : TCloseAction; 
begin 
   FormClose(Sender, Action); 
end; 

procedure Tform1.FormClose(Sender: TObject; 
  var Action: TCloseAction); 
begin 
   Action := caFree; 
end;


Mas se já resolveu, beleza..
Abraço


Responder

Gostei + 0

22/02/2017

Vinicius Simoes

Meus caros, para quem não conseguiu resolver ainda, vale dar uma olhada no evento OnDataChage dos DataSources do Form.
Estava com o mesmo problema e identifiquei que (não sei se é bug do Delphi7) existia um tratamento de Enable de alguns botoes no evento
de um dos meus DataSources. Mesmo depois de executar o "Action:=cafree" minha aplicação estava acionando este evendo e causando
o erro em questão.
O que fiz foi setar o evento para "nil", antes de executrar a linha "Action:=cafree"
Exemplo:
DataSource.OnDataChange := nil;

Até mais.
Responder

Gostei + 0

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

Aceitar