 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
willrosa123 Novato

Registrado: Sexta-Feira, 31 de Mai de 2019 Mensagens: 3
|
Enviada: Sex Mai 31, 2019 6:14 pm Assunto: erro: Cannot focus a disabled or invisible window |
|
|
Prezados, boa noite!!
Acredito que meu tópico não é complicado, mas não estou entendendo o pq do erro. Tenho um sistema de treinamento q após entrar e acessar um botão visualizo um grid com informações. Ao clicar nesse grid um botão habilta e clicando nele, acesso uma outra tela e trabalho normalmente. Entretanto, ao fechar essa tela e tentar acesso novamente aparece um erro "Cannot focus a disabled or invisible window". Mas somente na segunda vez q acesso essa tela.
Percebi que o erro acontece na linha abaixo
Application.CreateForm(TEficacia, FEficacia);
FEficacia.Showmodal;
E o meu form FEficacia está dentro de Available forms na opção de menu project options. e preciso q esteja lá pq se não acontece o erro em outra parte do programa. Caso eu coloque ele em Auto-create forms o erro não acontece nessa parte, mas dá erro em abertura de banco, por exemplo
DMbancos.QEficacia.open;
Tenho imagens do código se precisarem.
Poderiam me dar dicas de como resolver esse problema?
Desde já Agradeço
Wilson
[[/img] |
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Sáb Jun 01, 2019 10:29 am Assunto: |
|
|
Acho que você está embaralhando algumas coisas no seu projeto.
"Cannot focus a disabled or invisible window" ocorre quando você tenta dar foco a uma janela invisível, como por exemplo forçar um ShowModal() em uma janela que você fechou, mas não liberou da memória.
Se você quer criar seu formulário em runtime, precisa liberar da memória após seu fechamento.
Tente assim:
Código: | Application.CreateForm(TEficacia, FEficacia);
FEficacia.Showmodal;
FreeAndNil(FEficacia); |
ou, como eu prefiro, sem usar variáveis globais:
Código: | with TEficacia.Create(Application) do
try
ShowModal;
finally
Free;
end; |
Ou ainda, implemente o método OnClose do form para que libere a memória ao fechar:
Código: | procedure TEficacia.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree; // ao fechar, libere da memória
FEficacia := nil; // limpa a referência da variável
end; |
E uma dica:
Citação: | E o meu form FEficacia está dentro de Available forms na opção de menu project options. e preciso q esteja lá pq se não acontece o erro em outra parte do programa. |
Isso é sinal de algum problema sério. Nenhum erro acontece por acaso. Fazer workarounds para que não apareçam no momento só postergam sua solução. _________________ "Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!" |
|
Voltar ao Topo |
|
 |
willrosa123 Novato

Registrado: Sexta-Feira, 31 de Mai de 2019 Mensagens: 3
|
Enviada: Sáb Jun 01, 2019 12:44 pm Assunto: |
|
|
marcieldeg escreveu: | Acho que você está embaralhando algumas coisas no seu projeto.
"Cannot focus a disabled or invisible window" ocorre quando você tenta dar foco a uma janela invisível, como por exemplo forçar um ShowModal() em uma janela que você fechou, mas não liberou da memória.
Se você quer criar seu formulário em runtime, precisa liberar da memória após seu fechamento.
Tente assim:
Código: | Application.CreateForm(TEficacia, FEficacia);
FEficacia.Showmodal;
FreeAndNil(FEficacia); |
ou, como eu prefiro, sem usar variáveis globais:
Código: | with TEficacia.Create(Application) do
try
ShowModal;
finally
Free;
end; |
Ou ainda, implemente o método OnClose do form para que libere a memória ao fechar:
Código: | procedure TEficacia.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree; // ao fechar, libere da memória
FEficacia := nil; // limpa a referência da variável
end; |
E uma dica:
Citação: | E o meu form FEficacia está dentro de Available forms na opção de menu project options. e preciso q esteja lá pq se não acontece o erro em outra parte do programa. |
Isso é sinal de algum problema sério. Nenhum erro acontece por acaso. Fazer workarounds para que não apareçam no momento só postergam sua solução. |
Boa Tarde Marciel,
Primeiro obrigado pelas respstas. Entretanto, nenhuma delas funcionou, o mesmo erro acontece mesmo eu escrevendo como solictou para liberar a memoria. Sinceramente, não consigo entender, pq nunca tive um erro parecido em outros projetos.
Qdo digo q acontece o mesmo erro em outro form qdo mudo o forme EFicacia de availables para auto-create o erro acontece na linha abaixo, mas no form CadastroTreinamento, qdo prepare pra gerar um registro novo no banco usando a QEficacia. Dá erro logo qdo abro a query, no open.
DMBancos.QEficacia.Open; //abre tabela eficacia
DMBAncos.QEficacia.Append; //gera registro novo
Se vc tiver alguma dica para sanar esse problema eu tento manter o FEficacia em auto-create.
Caso contrário, to qse refazendo esses formularios, pq não sei como corrigir esse erro.
Só mais um dado, já isolei os forms e mantive somente aqueles q fazem com que eu acesse o form eficacia. Fiz isso pra saber se eu abria o form Eficacia em algum outro form e não fechava. Mas mesmo assim, com três formularios o mesmo erro aparece e o interessante q aparece somente na segunda vez q tento abrir o form eficacia, na primeira funciona e qdo fecho faço o q me pediu pra liberar a memoria, mas ao abrir novamente vem "Cannot focus a disabled or invisible window"
Muito Obrigado pela força
Wilson |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jun 03, 2019 9:31 am Assunto: |
|
|
Bom dia,
Acho que para descobrir exatamente em que linha de código está ocorrendo o erro é melhor você executar a sua aplicação com debug passo a passo colocando um Breakpoint na linha do ShowModal e utilizando o F7 depois para prosseguir linha por linha até o erro ocorrer.
Esse erro deve estar ocorrendo em algum linha de código que está sendo executada dentro de algum evento que está ocorrendo após o ShowModal.
Espero que ajude
_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Ter Jun 18, 2019 11:22 am Assunto: |
|
|
Sempre que for dar foco a um objeto, teste se é possível, assim não terá este problema.
Exemplo:
Código: |
if objeto.canfocus then
objeto.Sefocus;
|
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
Voltar ao Topo |
|
 |
willrosa123 Novato

Registrado: Sexta-Feira, 31 de Mai de 2019 Mensagens: 3
|
Enviada: Sex Jun 21, 2019 11:45 pm Assunto: |
|
|
johnny-walker escreveu: | Sempre que for dar foco a um objeto, teste se é possível, assim não terá este problema.
Exemplo:
Código: |
if objeto.canfocus then
objeto.Sefocus;
|
bye |
Prezados,
Primeiro obrigado pelas respostas. Refiz o formulário inteiro, por isso a demora em voltar pro tópico. Bom, embora o problema ainda persista, agora ele está ocorrendo na segunda vez q o formulario é invocado. Qdo abro o programa, e acesso o formulario, consigo fazer as operações necessárias. Porém, ao fechá-lo e tentar abrir novamente, o erro acontece.
Estou abrindo da forma como me falaram:
Application.CreateForm(TFEfic, FEfic);
FEfic.Showmodal;
Freeandnil(FEfic) ;
O erro acontece bem em cima da linha Application, na segunda vez q abro o form, mas confesso que não consigo enxergar onde está errado.
Ativei o debug dcu´s e fui passo a passo e qdo da segunda vez q abro o form em questão, aparece o erro e o programa me remete para essa linha de codigo, não sei se isso ajuda
procedure TCustomForm.SetFocus;
begin
if not FActive then
begin
if not (Visible and Enabled) then
raise EInvalidOperation.Create(SCannotFocus);
SetWindowFocus;
end;
end;
Qualaquer idéia será bem vinda.
Obrigado |
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Sáb Jun 22, 2019 8:42 am Assunto: |
|
|
Verifique se seu formulário está no Auto Create. Se estiver, remova. _________________ "Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!" |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|