Вопрос:
Я пытаюсь создать форму входа для моего основного приложения Android, и делаю это следующим образом:
var
CanGo: Boolean;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
loginfrm := Tloginfrm.Create(nil);
try
loginfrm.ShowModal;
CanGo := loginfrm.LoginSuccess = true;
finally
FreeAndNil(loginfrm);
end;
if CanGo then
Application.Run;
end;
Этот код отлично работает в моем приложении Win32, но когда я пытаюсь сделать то же самое в приложении Android, приложение останавливается при прикосновении к экрану и не показывает форму входа. Разве ShowModal работает иначе в Android? Что я делаю не так?
Ответ:
Существует много похожих вопросов на этом сайте. Прочитайте документацию:
Внимание: Модальные диалоговые окна не поддерживаются в приложениях Android. Вместо вызова ShowModal вы должны вызвать Show, и форма должна вернуться и вызвать ваше событие. Рекомендуется не использовать модальные диалоговые окна ни на одной из мобильных платформ (iOS и Android), так как это может привести к непредсказуемому поведению. Отказ от использования модальных диалоговых окон исключает потенциальные проблемы при отладке и поддержке ваших мобильных приложений.
С тех пор, как были введены мобильные платформы, Embarcadero предложила разные способы вызова ShowModal. Все они имели недостатки, и теперь документация говорит вам не использовать их вообще.
Комментарии:
Должен ли я создавать свою форму входа так, чтобы она была первой автоматически созданной формой?
Этот пост, похоже, отвечает на этот вопрос: Показать форму входа перед основной формой.
Пример кода на Object Pascal (Delphi) для создания формы входа и отображения ее перед основной формой:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, FMX.Classes, FMX.Controls, FMX.Forms, FMX.Graphics,
FMX.Types, FMX.Menus, FMX.StdCtrls;
type
TForm1 = class(TForm)
btnLogin: TButton;
edtUsername: TEdit;
edtPassword: TEdit;
procedure btnLoginClick(Sender: TObject);
private
{ Private declarations }
FLoginSuccess: Boolean;
public
{ Public declarations }
property LoginSuccess: Boolean read FLoginSuccess write FLoginSuccess;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.btnLoginClick(Sender: TObject);
begin
if (edtUsername.Text = 'username') and (edtPassword.Text = 'password') then
begin
FLoginSuccess := True;
Hide;
MainForm.Show;
end
else
ShowMessage('Неверное имя пользователя или пароль');
end;
end.
В данном примере форма входа отображается при запуске приложения, и при нажатии кнопки входа проверяется правильность имени пользователя и пароля. Если они верны, то форма входа скрывается, и отображается основная форма (MainForm). Если имя пользователя или пароль неверны, то показывается сообщение об ошибке.
Разработчик столкнулся с проблемой отображения формы входа в приложении Android, используя метод ShowModal в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS