Excessão StackOverflow ao fechar formulário

Delphi

11/11/2007

Tenho um formulário onde nele possui os seguintes componentes:

1 dbGrid lincado a tabela EMPRESAS
1 Edit chamado edProcEmpresa

Neste formulário há os seguintes códigos:

procedure TFrmProcEmpresa.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Close;
end;

procedure TFrmProcEmpresa.grdEmpresaCellClick(Column: TColumn);
begin
Try
FrmLanContratos.edEmp.Text := dmRC.dsEmpresaRAZAOSOCIAL.AsString;
FrmLanContratos.lbEmp.Caption := ´Empresa: ´+inttostr(dmRc.dsEmpresaCODEMPRESA.AsInteger);
Close;
Except
begin
BEEP;
if Messagedlg(´Deseja fechar a janela?´,mtConfirmation,[MbYes,mbNo],0)=mrYes then
FrmProcEmpresa.Close;
end;
end;
end;

procedure TFrmProcEmpresa.FormShow(Sender: TObject);
begin
if dmRC.Banco.Connected = false then
dmRC.Banco.Connected := true;

if dmRc.Transacao.Active = false then
dmRc.Transacao.Active := true;

if dmRc.dsEmpresa.Active = false then
dmRc.dsEmpresa.Active := true;
end;

Utilizo banco de dadosFirebird 1.5, Delphi 7 e a paleta Interbase

No evento onChange do Edit há o código:

procedure TFrmProcEmpresa.edProcEmpresaChange(Sender: TObject);
begin
with dmRC.dsEmpresa do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add(´select * from EMPRESAS´);
SelectSQL.Add(´Where RAZAOSOCIAL =:PARAMETRO´);
ParambyName(´PARAMETRO´).AsString := (Trim(edProcEmpresa.Text)+´¬´);
Prepare;
Open;
end;
end;

Porém a consulta retorna em branco, e ao tentar fechar o formulário aparece o seguinte erro:

Project RC.exe raised class EStackOverflow with message ´Stack overflow´. Process stopped. Use Step or Run to continue.

Alguém pode me ajudar a resolver esse problema?


Lightshine

Lightshine

Curtidas 0

Respostas

Micheus

Micheus

11/11/2007

procedure TFrmProcEmpresa.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Close;
end; 
esta parte está errada. Possivel causa do StackOverflow.
O evento OnClose é gerado justamente por um close, então significa que vc vai ficar rechamando o evento. Se vc precisa fazer algo aqui, então deve ser definir o tipo de ação (Action) a ser executada quando o evento é chamado normalmente vc faria algo como:
procedure TFrmProcEmpresa.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;  // diz para liberar o form
end;
mas, nem sempre é necessário fazer isto. Depende de como vc construiu o form. Se vc o cria dinamicamente e o chama com um ShowModal, e depois deste showmodal vc chama o método Free (ou release) ou ainda se usa a função FreeAndNil, então não tem necessidade. Já se estiver mostrando o form utilizando um Show ou se ele for um MDIChild, pode ser interessante utilizar este evento.

... SelectSQL.Add(´Where RAZAOSOCIAL =:PARAMETRO´); ParambyName(´PARAMETRO´).AsString := (Trim(edProcEmpresa.Text)+´¬´); ...
quando vc pretende fazer uma busca por aproximação, vc utiliza um LIKE e não o ´=´. Inclusive porque vc está concatenando um ´¬´ no seu parâmetro, o que praticamente insinua que vc quer utilizar o like.

Este provavelmente é o motivo pelo qual vc não encontra nada. Então o certo seria:
... SelectSQL.Add(´Where RAZAOSOCIAL LIKE :PARAMETRO´); ParambyName(´PARAMETRO´).AsString := (Trim(edProcEmpresa.Text)+´¬´); ...


Abraços


GOSTEI 0
POSTAR