- Регистрация
- 1 Мар 2015
- Сообщения
- 1,481
- Баллы
- 155
Одна вещь, которая действительно может добавить блеск вашему приложению, это настроить его так, чтобы, когда поле редактирования получало фокус, оно автоматически появлялось над клавиатурой на мобильных устройствах. Если этого не сделать, клавиатура иногда может закрывать поле редактирования, чтобы вы не могли видеть, что вы печатаете.
Этот проект подходит так же и для iOS
Если у вас что то не получаеться проект прикреплин
Этот проект подходит так же и для iOS
Если у вас что то не получаеться проект прикреплин
Код:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
FMX.Memo, FMX.Edit, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,
FMX.Objects;
type
TForm1 = class(TForm)
Rectangle1: TRectangle;
Rectangle2: TRectangle;
VertScrollBox1: TVertScrollBox;
Layout1: TLayout;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Edit1: TEdit;
Memo1: TMemo;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
procedure FormFocusChanged(Sender: TObject);
procedure FormVirtualKeyboardHidden(Sender: TObject;
KeyboardVisible: Boolean; const Bounds: TRect);
procedure FormVirtualKeyboardShown(Sender: TObject;
KeyboardVisible: Boolean; const Bounds: TRect);
procedure FormCreate(Sender: TObject);
private
FNeedoffset : Boolean; //Тип Boolean обеспечивает перечисление логических True и False значений.
FKBBounds : TRectF; //Обьект для распознование координат
procedure CalcContentBoundsProc (Sender : TObject; var Contentbounds : TRectF);
procedure Restoreposition;
procedure UpdateKBBouns;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses System.math;// подключаем матиматический модуль, где будем использавать Max - выбирает максимальное число из 2 чисел
{$R *.fmx}
//создаем процедуру для прокручивания с первого на последний добавленный кадр
procedure TForm1.FormCreate(Sender: TObject);
begin
VKAutoShowMode := TVKAutoShowMode.Always;// управление виртуальной клавиатурой
VertScrollBox1.OnCalcContentBounds:= CalcContentBoundsProc;
end;
procedure TForm1.FormFocusChanged(Sender: TObject);
begin
UpdateKBBouns;
end;
// Процедура где указывает параметры размеров когда клавиатуру закрываем
procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject;.
KeyboardVisible: Boolean; const Bounds: TRect);
begin
FKBBounds.Create(0,0,0,0);
FNeedoffset :=False;
Restoreposition;
end;
// Процедура где указывает параметры размеров когда клавиатуру показываеться.
procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
KeyboardVisible: Boolean; const Bounds: TRect);
begin
FKBBounds := TRectF.Create(Bounds);
FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
UpdateKBBouns;
end;
//Проводим матиматический разсчет выбирает максимальное число из 2 чисел
procedure TForm1.CalcContentBoundsProc(Sender: TObject;
var Contentbounds: TRectF);
begin
if FNeedOffSet and (FKBBounds.Top > 0) then
begin
ContentBounds.Bottom := Max(ContentBounds.Bottom,2* ClientHeight - FKBBounds.Top); //Функция передаёт координаты вершин объекта типа TRect
end;
end;
//Сбрасывает свойсва компонентов когда клавиатура закрываеться
procedure TForm1.Restoreposition;
begin
VertScrollBox1.ViewportPosition:= PointF(VertScrollBox1.ViewportPosition.X,0);
Layout1.Align:= TAlignLayout.Client;
VertScrollBox1.RealignContent;
end;
//При переключение обьекта меняет размер.
procedure TForm1.UpdateKBBouns;
var
LFocused : TControl;
LFocusRect :TRectF;
begin
FNeedOffSet:= False;
if Assigned(Focused) then
begin
LFocused := TControl(Focused.GetObject);
LFocusRect := LFocused.AbsoluteRect;
LFocusRect.Offset(VertScrollBox1.ViewportPosition);
if (LFocusRect.IntersectsWith(TREctF.Create(FKBBounds)))
and (LFocusRect.Bottom > FKBBounds.Top)then
begin
FNeedOffSet := True;
Layout1.Align:= TAlignLayout.Horizontal;
VertScrollBox1.RealignContent;
Application.ProcessMessages;
VertScrollBox1.ViewportPosition :=
PointF(VertScrollBox1.ViewportPosition.X, LFocusRect.Bottom - FKBBounds.Top);
end;
end;
if not FNeedOffSet then RestorePosition;
end;
end.

