Erro no ModalResult

Delphi

20/06/2013

Galera, seguinte...

Tenho um form que busca um determinado cadastro e no código do botão de pesquisa está:
if FrmPesqCliF.ModalResult = mrOK then // Debug marcado
    begin
      {sCod := FrmPesqCliF.dbgPesquisa.Columns[0].Field.AsString;
      if sCod = '' then
        begin
          ...
        end;


Aí é aberto o form de pesquisa. Faço a pesquisa normalmente. Quando clicado no botão OK(ModalResult = mrOK) ou no Cancelar(ModalResult = mrCancel), a minha aplicação exibe um AccessViolation.

No form de pesquisa é herdado o seguinte código:
OnClose:
Action := caFree;

OnCreate:
ShowModal;


E no OnDestroy do FrmPesqCliF
FrmPesqCliF := nil;


Usando debug na linha, ele apresenta erro. Se comento, nada de erro.
Thiago Santos

Thiago Santos

Curtidas 0

Respostas

Jaime Junior

Jaime Junior

20/06/2013

Tenta substituir o ShowModal por simplesmente show.

Sei que as vezes usamos o showmodal para bloquear os outros form, mas como trabalhamos com Janelas pais e filho dar este erro e utilizo o show para chamar o form que quero e o bloqueio faço manualmente, lembrando é claro de liberar na hora que morre.
GOSTEI 0
Thiago Santos

Thiago Santos

20/06/2013

Então, com o Show, quando o FrmPesqCliF é mostrado, já exibe o AccessViolation.
Mas utilizando o Show, o ModalResult não irá funcionar, certo?
GOSTEI 0
Marco Salles

Marco Salles

20/06/2013

tire oAction := caFree;
e libere os recursos do Form após consumi-los

{sCod := FrmPesqCliF.dbgPesquisa.Columns[0].Field.AsString;


FrmPesqCliF.free;
GOSTEI 0
Thiago Santos

Thiago Santos

20/06/2013

MARCO, tirei o caFree mas descobri o erro.
Na minha aplicação, tenho uma procedure de criação de Form.
procedure CriarForm(FormClass: TFormClass; Form: TForm);
begin

if Assigned(Form) then
  begin
    Form.WindowState := wsNormal;
    Form.BringToFront;
  end
else
  Application.CreateForm(FormClass, Form);    

end;


E no no onExecute do ActionManager do FrmPesqCliF tinha o código:
procedure TFrmPrincipal.amFuncoesCargosExecute(Sender: TObject);
begin

  // Criar Form de Funções -> Cargo
  CriarForm(TFrmPesqCliF,FrmPesqCliF);

end;


Substitui por:
  if Assigned(FrmPesqCliF) then
    begin
      FrmPesqCliF.WindowState := wsNormal;
      FrmPesqCliF.BringToFront;
    end
  else
    Application.CreateForm(TFrmPesqCliF, FrmPesqCliF);  


Parou de exibir o AccessViolation. Mas ainda queria continuar utilizando uma procedure, para a criação de Form.
Mas obrigado a todos !
GOSTEI 0
Marco Salles

Marco Salles

20/06/2013

calma , que a sua dúvida é conceitual

existe alguma coisas pequenas por trás

eu não entendi .. vc trocou


E no no onExecute do ActionManager do FrmPesqCliF tinha o código:



procedure TFrmPrincipal.amFuncoesCargosExecute(Sender: TObject);
begin
 
  // Criar Form de Funções -> Cargo
  CriarForm(TFrmPesqCliF,FrmPesqCliF);
 
end;


procedure TFrmPrincipal.amFuncoesCargosExecute(Sender: TObject);
begin
if Assigned(FrmPesqCliF) then
  begin
    FrmPesqCliF.WindowState := wsNormal;
    FrmPesqCliF.BringToFront;
  end
else
  Application.CreateForm(TFrmPesqCliF, FrmPesqCliF);  


quer dizer que o Action:=cafrre Não fez nenhuma diferença ???? é isto ???

como e onde esta definido a Variavel FrmPesqCliF ?????????

[]sds
GOSTEI 0
Thiago Santos

Thiago Santos

20/06/2013

Troquei e funcionou.
Então, eu tenho um Form Padrão, e o Action := caFree está no OnClose do Form Padrão.

Estava dando erro se eu utilizar o a procedure CriarForm.
Tinha criado esta procedure para não ficar digitando "if Assigned..." em todos os eventos OnExecute as Actions.

Mas não até hoje, não conseguir criar uma procedure padrão para criação dos forms.
Se souber de algum jeito, ficarei feliz em saber. :]

Mas obrigado pela ajuda !
GOSTEI 0
Marco Salles

Marco Salles

20/06/2013

Bem ainda não entendi direito ..

se quiser fazer um exemplo e enviar para mim

marcosalles.wordpress.com

Agora quando a procedures e funções para criar método eu aconselho o uso de Padrões

veja um bom exemplo em


http://forum.devmedia.com.br/viewtopic.php?t=74823&highlight=form+nome
GOSTEI 0
POSTAR