Diagnosticar sobreposição pelo teclado sem aplicar uma altura fixa universal
Tutorial · prática orientada · IntermediárioFormulário FMX com campos de edição e TVertScrollBox
Delphi 11.3 e 13.2 como referência; comportamento depende do dispositivo e não foi executado aquiUma tela de cadastro pode parecer pronta até o usuário tocar no último campo. O teclado ocupa parte da área visível e o botão de confirmação desaparece. A correção começa por entender o espaço disponível, não por adicionar uma margem fixa para todos os aparelhos.
Neste artigo, o objetivo é montar um diagnóstico que você consiga repetir em diferentes dispositivos. A adaptação final deve ser verificada na plataforma e na configuração de janela usadas pelo aplicativo.
Conheça o sinal recebido pelo formulário
FireMonkey oferece os eventos OnVirtualKeyboardShown e OnVirtualKeyboardHidden. O tipo TVirtualKeyboardEvent recebe KeyboardVisible e um retângulo Bounds. A documentação descreve esse retângulo em coordenadas de tela. Consulte TVirtualKeyboardEvent.
Esse detalhe impede uma correção apressada: a dimensão de um retângulo em coordenadas de tela não deve ser aplicada cegamente a todo controle em coordenadas locais. Origem, escala e comportamento da janela precisam ser considerados.
Instrumente antes de mover controles
No formulário, declare FTecladoVisivel: Boolean e FBoundsTeclado: TRect. Inclua System.Types. Associe o mesmo manipulador aos dois eventos citados:
procedure TFormPrincipal.TecladoAlterado(Sender: TObject;
KeyboardVisible: Boolean; const Bounds: TRect);
begin
FTecladoVisivel := KeyboardVisible;
FBoundsTeclado := Bounds;
end;O método registra o estado recebido; ele ainda não resolve a rolagem. Coloque um breakpoint e observe quando os eventos chegam. Confira também se a área útil do formulário já foi ajustada pela configuração da plataforma. Compensar duas vezes pode criar um espaço vazio grande.
Use dados fictícios durante o diagnóstico. Se decidir registrar logs, capture geometria e estado, sem copiar o conteúdo sensível dos campos.
Use uma área que possa se mover
Coloque o formulário de entrada dentro de um TVertScrollBox. Garanta que o conteúdo tenha dimensão suficiente para representar todos os campos e que a rolagem não esteja sendo limitada por um contêiner com altura incorreta.
A amostra oficial de tipos de teclado usa os eventos do teclado para adaptar uma área rolável. Ela é uma referência melhor que uma fórmula única aplicada sem contexto. Veja a explicação da amostra FMX.KeyboardTypes.
Se implementar uma compensação, calcule a interseção entre o espaço efetivamente ocupado e a área do conteúdo após converter as coordenadas de forma apropriada. Faça o ajuste reversível: esconder o teclado deve restaurar o layout, sem acumular deslocamentos.
Teste transições, não só a primeira abertura
| Situação | O que observar |
|---|---|
| Foco no último campo | Campo e contexto continuam visíveis |
| Troca entre campos | Conteúdo não salta nem acumula margens |
| Fechar teclado | Layout retorna ao estado esperado |
| Rotacionar com teclado aberto | Geometria é recalculada |
| Teclado diferente | A solução não depende de uma altura fixa |
| Fonte ampliada | Rótulo e ação continuam legíveis |
Se o usuário precisa fechar o teclado para prosseguir, essa ação deve ser compreensível. Não faça do botão principal um elemento que só aparece por acaso depois de uma rolagem.
Evite correções que escondem outro problema
Não redimensione o formulário inteiro com base apenas em Bounds.Height. Não trate um evento de esconder como prova de que todas as geometrias anteriores continuam válidas. Revise especialmente mudança de orientação e retorno do segundo plano.
Antes de concluir que há um defeito da biblioteca, reduza o caso a um formulário pequeno e registre versão do Delphi, sistema, dispositivo e passos exatos. O relato fica reproduzível e facilita comparar configurações.
Experimento e próxima leitura
Monte uma tela com cinco campos e um botão final. Abra o teclado em cada campo e repita a sequência após rotacionar. Anote qual parte falha antes de alterar o código.
O snippet é apenas de diagnóstico e não foi executado aqui. Continue em Layouts responsivos no FireMonkey para revisar a estrutura da tela.
Matriz de geometria por dispositivo
- Registre versão, plataforma, escala e orientação.
- Capture Bounds do teclado, campo em coordenadas da cena e viewport.
- Converta para o mesmo sistema antes de calcular interseção.
- Repita campo superior/inferior, teclado alternativo, rotação e fechamento.
| Ensaio | Esperado | Estado |
|---|---|---|
| Campo inferior | Campo/ação alcançáveis por rolagem | Pendente em dispositivo |
| Rotação | Viewport/conversão recalculados | Pendente |
| Fechamento | Espaço original restaurado | Pendente |
Plano exportável. Não existe fórmula universal de altura. .fmx/.pas integrados e capturas reais permanecem pendentes, sem selo de execução.
Projeto de estudo disponível
Baixar fonte FMX com .pas e .fmx. Inclui layout rolável, registro de geometria e tarefa local com contexto de entrega e geração. O worker captura valores; o contexto perde o destino antes da destruição e respostas de gerações antigas são descartadas.
Compilado para Win32 com DCC32 37.0 em 08/10/2026. Relatório. Não executado visualmente: testes de dispositivo, geometria/rotação e corridas de encerramento permanecem pendentes. A referência anterior a projeto pendente se refere à integração validada no alvo; este pacote entrega fonte de estudo, sem alegar esse teste.