CS Coder
FireMonkey / Mobile

Teclado virtual no FireMonkey: mantenha o campo e a ação acessíveis

Entenda os eventos do teclado, o cuidado com coordenadas e um roteiro para testar formulários mobile sem esconder campos ou botões.

· 5 min de leitura
Objetivo e formato

Diagnosticar sobreposição pelo teclado sem aplicar uma altura fixa universal

Tutorial · prática orientada · Intermediário
Antes de experimentar

Formulá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 aqui

Uma 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:

delphi
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

  1. Registre versão, plataforma, escala e orientação.
  2. Capture Bounds do teclado, campo em coordenadas da cena e viewport.
  3. Converta para o mesmo sistema antes de calcular interseção.
  4. 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.