Перейти к содержанию
  • Регистрация
  • 0
Axbor

Диалоговое окно на Андроид.

Вопрос

Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:Снимок3.PNGСнимок1.PNG

Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:

Создаем вторую форму, и изменяем следующие свойства:

Transparency = True

Fill->Color = #78000000

Fill->Kind = Solid

Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:

Снимок2.PNG

Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».

Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):

void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point)
{
    Close();
}

Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.

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

 

Demo.zip

Изменено пользователем Andrey Efimov
Переписал сообщение с сохранением всех указанных свойств, кода, настроек. Оригинал могу предоставить всем желающим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 1

krapotkin выкладывал когда-то MyDialogs

Изменения от меня:

  •   Переписан код, удалены лишние компоненты
  •   Подогнал под стандартные диалоги платформ
  •   Смена позиции кнопок "Oк", "Отмена" в зависимости от платформы
  •   Профиксил MaxLength для TEdit (при установке ограничении ввода символов для мобильных платформ)
  •   Возможность использования анонимных методов (TThreadProcedure)

MyDialogs_ZuBy.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 4/27/2016 в 08:09, ZuBy сказал:

krapotkin выкладывал когда-то MyDialogs

Изменения от меня:

  •   Переписан код, удалены лишние компоненты
  •   Подогнал под стандартные диалоги платформ
  •   Смена позиции кнопок "Oк", "Отмена" в зависимости от платформы
  •   Профиксил MaxLength для TEdit (при установке ограничении ввода символов для мобильных платформ)
  •   Возможность использования анонимных методов (TThreadProcedure)

MyDialogs_ZuBy.7z

Можно ли как-то сделать чтобы по нажатию Enter на виртуальной клавиатуре фокус бы убивался?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, Rusland сказал:

Можно ли как-то сделать чтобы по нажатию Enter на виртуальной клавиатуре фокус бы убивался?

наверное вы это имели ввиду

 <TMyInputQuery>.Edits[0].KillFocusByReturn := true;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ZuBy

В 27.04.2016 в 08:09, ZuBy сказал:

krapotkin выкладывал когда-то MyDialogs Изменения от меня: MyDialogs_ZuBy.7z

 

Не могу скачать, вылетает ошибка "Страница, к который вы пытаетесь получить доступ, недоступна для вашего аккаунта Код ошибки: 2C171/1"

Изменено пользователем GASCHE

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Коллеги,
спасибо за проделанную работу. Работает пример как надо!

P.S.: Очень странно, что встроенный InputQueryAsync использует TEdit, а доступ к нему для преднастройки не дает.

P.P.S.: Авторы, krapotkin и ZuBy подскажите пожалуйста, как в DialogEvent узнать количество введенных в TMyInputQuery значений ( (Sender as TMyInputQuery).Values.Length не работает) ? 

Изменено пользователем Pax Beach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 минуты назад, Pax Beach сказал:

P.P.S.: Авторы, krapotkin и ZuBy подскажите пожалуйста, как в DialogEvent узнать количество введенных в TMyInputQuery значений ( (Sender as TMyInputQuery).Values.Length не работает) ? 

Не бейте сильно, но только вот такое безобразие в голову пришло =)

procedure TFormMain.DialogEvent(Sender: TObject);
var
  i: integer;
  s: string;
begin
  s := '';
  try
    for i := 0 to 1000 do
      s := s + (Sender as TMyInputQuery).Values[i] + #13#10;
  finally

  end;

  ShowMessage('TNotifyEvent '#13#10 + s);
end;

UPD:

Отупение прошло. Но класс мне, конечно, надо будет переписать.

procedure TFormMain.DialogEvent(Sender: TObject);
var
  i: integer;
  s: string;
begin
  s := '';
  for i := 0 to (Sender as TMyInputQuery).Edits.count - 1 do
    s := s + (Sender as TMyInputQuery).Values[i] + #13#10;

  ShowMessage('TNotifyEvent '#13#10 + s);
end;

 

Изменено пользователем Pax Beach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

там  есть вызов анонимной процедуры, в нем без танцев можно получить данные

var
  mY: TMyInputQuery;
begin
  mY := TMyInputQuery.Create(['Введите текст'], [''], self,
    procedure
    begin
      ShowMessage('TThreadProcedure ' + mY.Values[0]);
    end);
  mY.Edits[0].Password := true;
  mY.ShowMe;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, ZuBy сказал:

там  есть вызов анонимной процедуры, в нем без танцев можно получить данные

 

Спасибо большое!

Я так понимаю, переход между TEdit по нажатию в виртуальной клавиатуре vkNext или vkReturn не реализовывался?

И кнопка по умолчанию тоже отсутствует?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, Pax Beach сказал:

Спасибо большое!

Я так понимаю, переход между TEdit по нажатию в виртуальной клавиатуре vkNext или vkReturn не реализовывался?

И кнопка по умолчанию тоже отсутствует?

Конечно, полная свобода. Что понадобится все можно прикрутить

        myInput.Edits[0].ReturnKeyType := TReturnKeyType.Done;
        myInput.Edits[0].KillFocusByReturn := true;
        myInput.Edits[1].ReturnKeyType := TReturnKeyType.Done;
        myInput.Edits[1].KillFocusByReturn := true;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Обновленная версия 

  • Более реалистичные диалоги для андроид 5.0 и выше

Screenshot_20160609-221625.png Screenshot_20160609-221629.png

MyDialogs_ZuBy.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Очень полезный компонент. Большое спасибо!
Реализована ли здесь обработка нажатия клавиши "Отмена" касательно TMyInputQuery?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 минут назад, Alex7wrt сказал:

Очень полезный компонент. Большое спасибо!
Реализована ли здесь обработка нажатия клавиши "Отмена" касательно TMyInputQuery?

да, в базовом классе.

желательно обновиться с репозитория, там точно есть такое.

UPD: события на отмену нет, если вы об этом

Изменено пользователем ZuBy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да, об этом.
Уже разобрался. Сделал через bCancel.OnClick.
Появился еще один вопрос - клавиатура в альбомной ориентации перекрывает кнопки ОК и Отмена. Есть ли возможность поместить диалог выше?

UPD: Делаю через свойство TMyInputQuery.Top. Но пока не выходит...

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, Alex7wrt сказал:

Да, об этом.
Уже разобрался. Сделал через bCancel.OnClick.
Появился еще один вопрос - клавиатура в альбомной ориентации перекрывает кнопки ОК и Отмена. Есть ли возможность поместить диалог выше?

такой возможности нет, по вы можете дописать

r1.Margin.Bottom :=  <сложные арифметические действия>;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

День добрый

Воспользовался имеющимся примером MyDialogs для вывода своего диалогового окна. Но вот обнаружилась одна пробллемка. Если во время показа диалога "свернуть" приложение нажатием средней кнопки, а потом через меню запущенных приложений снова вернуться, то до перерисовки экрана выводятся артефакты. Такое наблюдается на двух устройствах с Android 4 и 5, в моём приложении и в примере ZuBy

 

Screenshot_2016-09-26-11-25-04.pngScreenshot_2016-09-26-11-25-11.pngScreenshot_2016-09-26-11-30-10.png

 

Добавлено: если в UBaseDialog убрать прозрачность формы, то и артефакты уходят.

Изменено пользователем sinuke

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, sinuke сказал:

День добрый

Воспользовался имеющимся примером MyDialogs для вывода своего диалогового окна. Но вот обнаружилась одна пробллемка. Если во время показа диалога "свернуть" приложение нажатием средней кнопки, а потом через меню запущенных приложений снова вернуться, то до перерисовки экрана выводятся артефакты. Такое наблюдается на двух устройствах с Android 4 и 5, в моём приложении и в примере ZuBy

  Показать контент

Screenshot_2016-09-26-11-25-04.pngScreenshot_2016-09-26-11-25-11.pngScreenshot_2016-09-26-11-30-10.png

 

Добавлено: если в UBaseDialog убрать прозрачность формы, то и артефакты уходят.

правильней будет скрывать этот диалог при сворачивании, артефактов не будет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
23 минуты назад, ZuBy сказал:

правильней будет скрывать этот диалог при сворачивании, артефактов не будет

так и сделал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

логически это понятно
система не перерисовывает форму под нашей полупрозрачной, и там просто мусор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...