• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

FAQ Delphi FMX Virtual Keyboard in Android covers control by Lomanu4

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Одна вещь, которая действительно может добавить блеск вашему приложению, это настроить его так, чтобы, когда поле редактирования получало фокус, оно автоматически появлялось над клавиатурой на мобильных устройствах. Если этого не сделать, клавиатура иногда может закрывать поле редактирования, чтобы вы не могли видеть, что вы печатаете.
Этот проект подходит так же и для 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.
 

Вложения

Hi. Can i share your sample and link in a Turkish Delphi form. Your sample is very useful for me. Thanks.
 
Вверх Снизу