Você está na página 1de 3

Configurar o Teclado Virtual para não sobrepor o TEdit - Em 13 passos

INÍCIO
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Obs.: vsbPaci é o nome do TVertScrollBox

uses //Sessão interface


System.Math;

---------------------------------------------------------------------------------------------------------------------------------------------------------------

private
{ Private declarations }
//============================================================================== // PASSO 1 – Criando Procedures juntas, ctrl cria junto.
//===> INICIO - Controles para teclado virtual

FKBBounds: TRectF; //Variável - Controles para teclado virtual // PASSO 1


FNeedOffset: Boolean; //Variável - Controles para teclado virtual // PASSO 2

Procedure CalcContentBounds(Sender: TObject; var ContentBounds: TRectF); //Criada função(Classe) CalcContentBounds - CTRL SHIFT C // PASSO 3
Procedure RestorePosition; // CTRL SHIFT C (ou seta para baixo) para implementar procedure/função // PASSO 7
Procedure UpdateKBBounds; // CTRL SHIFT C (ou seta para baixo) para implementar procedure/função // PASSO 9

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

Implementation //Sessão implementation

{$R *.fmx}

uses untPrincipal, untSolicitante, untRemocao, System.Math; // Controles para teclado virtual (System.Math) // PASSO 5

//============================================================================== // PASSO 4 - CTRL SHIFT C - acima criou


//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.CalcContentBounds(Sender: TObject;


var ContentBounds: TRectF);
begin
if FNeedOffset and (FKBBounds.Top > 0) then
begin
ContentBounds.Bottom := Max(ContentBounds.Bottom, 2 * ClientHeight - FKBBounds.Top);
end;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//============================================================================== // PASSO 6
//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.FormCreate(Sender: TObject); // Evento Create do formulário - Controles para teclado virtual
Begin
VKAutoShowMode:= TVKAutoShowMode.Always; //VER ???
vsbPaci.OnCalcContentBounds := CalcContentBounds;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//============================================================================== // PASSO 13
//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.FormFocusChanged(Sender: TObject); // Evento FocusChanged - Controles para teclado virtual


begin
UpdateKBBounds;
end;
//===> FIM - Controles para teclado virtual
//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//============================================================================== // PASSO 11
//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.FormVirtualKeyboardHidden(Sender: TObject; // Evento VirtualKeyboardHidden - Controles para teclado virtual


KeyboardVisible: Boolean; const [Ref] Bounds: TRect);
begin
FKBBounds.Create(0, 0, 0, 0);
FNeedOffset := False;
RestorePosition;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//============================================================================== // PASSO 12
//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.FormVirtualKeyboardShown(Sender: TObject; // Evento VirtualKeyboardShown - Controles para teclado virtual


KeyboardVisible: Boolean; const [Ref] Bounds: TRect);
begin
FKBBounds := TRectF.Create(Bounds);
FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
UpdateKBBounds;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//============================================================================== // PASSO 8
//===> INICIO - Controles para teclado virtual

procedure TfrmPaciente.RestorePosition; // CTRL SHIFT C (ou seta para baixo) para implementar procedure/função - Controles para teclado virtual
begin
vsbPaci.ViewportPosition := PointF(vsbPaci.ViewportPosition.X, 0);
lytPaciLayout.Align := TAlignLayout.Client;
vsbPaci.RealignContent;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

//==============================================================================
//===> INICIO - Controles para teclado virtual - Criada função CalcContentBounds - CTRL SHIFT C // PASSO 10

procedure TfrmPaciente. UpdateKBBounds;


var
LFocused : TControl;
LFocusRect: TRectF;
begin
FNeedOffset := False;
if Assigned(Focused) then
begin
LFocused := TControl(Focused.GetObject);
LFocusRect := LFocused.AbsoluteRect;
LFocusRect.Offset(vsbPaci.ViewportPosition);
if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and (LFocusRect.Bottom > FKBBounds.Top) then
begin
FNeedOffset := True;
lytPaciLayout.Align := TAlignLayout.Horizontal;
vsbPaci.RealignContent;
Application.ProcessMessages;
vsbPaci.ViewportPosition := PointF(vsbPaci.ViewportPosition.X, ((LFocusRect.Bottom - FKBBounds.Top) + 40));
end;
end;
if not FNeedOffset then
RestorePosition;
end;

//===> FIM - Controles para teclado virtual


//==============================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------

Configurar o Teclado Virtual para não sobrepor o TEdit


FINAL

---------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------