Заметки
Metropolis - нюансы мобильной разработки

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Metropolis – технология, позволяющая приводить VCL приложения к виду Windows 8 по средствам стилизации интерфейса, доступна начиная с релиза XE3. Поскольку речь идет имеено о стилизации, а не использовании нового API, созданные при помощи Metropolis приложения будут запускаться не только Windows 8, но и на более ранних версиях. К сожалению, как это не редко бывает, имитация оказалась немного хуже оригинала.

До этого мне не приходилось разрабатывать софт с расчетом на планшеты, так что я заранее настроился на то, что по ходу разработки буду спотыкаться о подводные камни. И, к сожалению, я не ошибся...

Первое, с чем пришлось столкнуться – экранная клавиатура не появляется автоматически при получении фокуса ввода элементом, отвечающим за редактирование текста. По большому счету это вполне ожидаемо, ведь такое поведение не свойственно десктопным приложениям (а именно такими и являются приложения Metropolis), но попробуйте объяснить это пользователям. Исправить ситуацию несложно, но об этом как-нибудь в следующий раз, так как и тут не обошлось без подводных камней.

Второе – эффект смещения окна, если в нем есть скроллируемый контент. Чтобы стало понятнее, что я имею ввиду, посмотрите на следующее изображение:



В самом эффекте нет ничего плохого, пока речь не заходит о полноэкранных приложениях (а именно такими и являются приложения Metropolis). Посмотрите на следующее изображение, вы когда-нибудь видели подобное поведение у приложений Windows 8?



К счастью эта проблема легко устраняется. Мне непонятно только одно, почему разработчики из Embarcadero не предусмотрели этого в шаблонах приложений Metropolis и не добавили в них несколько строчек кода?

Решение проблемы:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure WMWindowPosChanging( var Msg: TWMWindowPosChanging ); message WM_WINDOWPOSCHANGING;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

var
  X, Y: Integer;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
   Randomize;
   for i := 1 to 250 do
      ListBox1.Items.Add( IntToStr( Random( 1000 ) ) );
end;

procedure TForm1.FormShow(Sender: TObject);
begin
   X := Left;
   Y := Top;
end;

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
   Msg.WindowPos.x := X;
   Msg.WindowPos.y := Y;
   inherited;
end;

end.

Всего лишь запоминаем координаты приложения при старте, а при попытке сдвинуть окно возвращаем его на место.

P.S.

Есть еще один вопрос относительно приложений Metropolis, которым я задаюсь уже давно. При попытке конвертировать VCL приложение в Metropolis среда разработки предупреждает нас о якобы необратимых изменениях (такой функционал есть, например, в XE7, а вот 10 Seattle мне его найти не удалось).



Однако сделать “откат” совсем не сложно, буквально в несколько шагов:
  • Установить свойству формы BorderStyle значение, отличное от bsNone (например bsSizeble);
  • Установить свойству формы WindowState значение wsNormal;
  • В настройках проекта (Project Options) на вкладке “Application” – “Appearance” снять все галочки в группе Custom Style (поле Default Style должно принять значение “Windows”);
  • В файле проекта (*.dpr) удалить строчки, относящиеся к Metropolis (например Application.UseMetropolisUI; и (если есть) TStyleManager.TrySetStyle('Metropolis UI Dark');).
Обратный переход работает не только для сконвертированных приложений, но и для тех, которые изначально создавались как Metropolis.

P.P.S.

С момента выхода XE3 прошло уже много времени, а возможности создавать приложения Windows 8 (а не их имитацию) как не было, так и нет. А не помешало бы...

На этом все, поменьше подводных камней!

При использовании материала - ссылка на сайт обязательна