Chamar formulário dentro da função

Delphi

05/02/2010

Boa tarde pessoal estou desenvolvendo uma aplicação para exportar os dados do Paradox diretamente do firebird formatando os campos como eu desejar! Até aí tudo bem! Criei uma função para exportar as cidades e quando não encontrar a cidade irei chamar um formulario onde o usuário irá buscar a cidade que ele deseja. Aqui abaixo a função:   function TFrmExportar.BuscaCidade(fNome, fEstado: string ) : integer;
begin
  Result := -1;
  with Dm.QrConsulta do begin
     Close;
     SQL.Clear;
     SQL.Add('SELECT * FROM GER_CIDADES WHERE C_CIDADE = '+QuotedStr(RemoveAccent(fNome))+ 'AND C_UF = '+QuotedStr(RemoveAccent(fEstado)));
     Open;
     if RecordCount = 0 then begin
        FrmBuscaCidade:= TFrmBuscaCidade(Self);
        FrmBuscaCidade.ShowModal;
        FrmBuscaCidade.Free;
     end;
     if RecordCount = 1 then
        Result := FieldByName('C_CODCIDADE').AsInteger;
     if RecordCount > 1 then begin
        // Varias cidades pedir para o usuario selecionar
     end;
  end;
end;
O problema é quando está exportando a cidade qu ele não encontra a cidade desejada ele deveria abrir o formulário FrmBuscaCidade, mas ao inves disso está gerando este erro aqui:   First chance exception at $75B49617. Exception class EInvalidOperation with message 'Cannot make a visible window modal'. Process ExportParadoxFire.exe (112)   Será que vocês podem mim ajudar?
Thiago Santana

Thiago Santana

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

05/02/2010

     if RecordCount = 0 then begin
        FrmBuscaCidade:= TFrmBuscaCidade(Self);
        FrmBuscaCidade.Visible := False;
        FrmBuscaCidade.ShowModal;
        FrmBuscaCidade.Free;
     end;
GOSTEI 0
Marcos Iwazaki

Marcos Iwazaki

05/02/2010

Seria interessante usar try finally
E tbm eu libero os forms de uma outra maneira, mas isso é opcional.

    if RecordCount = 0 then begin
        FrmBuscaCidade:= TFrmBuscaCidade(Self);
        try
          FrmBuscaCidade.Visible := False;
          FrmBuscaCidade.ShowModal;
        finally
          FrmBuscaCidade.release;
          FrmBuscaCidade := nil;
        end;//try
    end;   
GOSTEI 0
Thiago Santana

Thiago Santana

05/02/2010

Socram poe um exemplo de como vc libera os teu forms aí! Porque do jeito em que vc mim passou no tópico anterior não deu certo ñ!
GOSTEI 0
Alison Bissoli

Alison Bissoli

05/02/2010

Costuma dar esse erro quando alteramos incorretamente o tipo do formulário, por exemplo pra mdichild em aplicação SDI. 
GOSTEI 0
Marcos Iwazaki

Marcos Iwazaki

05/02/2010

Então eu uso desse jeito que eu passei.

Qual erro que deu?
Cola o bloco do seu codigo ae.

flw. 
GOSTEI 0
Thiago Santana

Thiago Santana

05/02/2010

Consegui desse jeito aqui:   if RecordCount = 0 then begin
        try
          FrmBuscaCidade:= TFrmBuscaCidade.Create(Self);
          FrmBuscaCidade.lblCidade.Caption := fNome;
          FrmBuscaCidade.ShowModal;
        finally
          Result := FrmBuscaCidade.CodCidadeFB;
          FrmBuscaCidade.Free;
        end;//try
No teu código tava faltando o Create! Valeu pela ajuda...   
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/02/2010

só uma dica: evite o uso de recordcount. utilize somente se você quiser saber exatamente quantos registros há na tabela (para preencher um contator, por exemplo).
no seu caso, use IsEmpty.
GOSTEI 0
Wilson Junior

Wilson Junior

05/02/2010

Ao invés de usar FrmBuscaCidade.Free utilize FreeAndNil(FrmBuscaCidade). Assim ele libera da memória e seta o FrmBuscaCidade como NIL.

Espero ter colaborado.
GOSTEI 0
POSTAR