Chamar formulário dentro da função

05/02/2010

1

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?
Responder

Posts

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

05/02/2010

Marcos Iwazaki

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;   
Responder

05/02/2010

Thiago Santana

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 ñ!
Responder

05/02/2010

Alison Bissoli

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

05/02/2010

Marcos Iwazaki

Então eu uso desse jeito que eu passei.

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

flw. 
Responder

05/02/2010

Thiago Santana

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...   
Responder
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.
Responder

08/02/2010

Wilson Junior

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.
Responder