Форма ввода пароля после загрузки главной формы
Модератор: Модераторы
- Unvictis
- новенький
- Сообщения: 48
- Зарегистрирован: 17.07.2015 17:59:12
- Откуда: Kokshetau, Kazakshtan
- Контактная информация:
Форма ввода пароля после загрузки главной формы
Здравствуйте коллеги! Хочу сделать что-бы сразу же после загрузки главной формы моего приложения (СУБД) вылазила форма ввода пользователя и пароля (тоесть сразу же после того как основная форма прорисовалась). Никак не могу разобраться как же это надёжнее и правильнее всего реализовать. Например когда кидаешь метод ShowModal в OnActivate иногда форма просто не успевает полностью прорисоваться. Пробовал ставить на главную форму таймер организующий задержку, - но это на мой взгляд попахивает быдлокодерством. Что скажете, кто как решает эти вопросы?
Стартуй с формы пароля, потом открывай главную форму..
-- назначь в закрывающей "Вход" кнопке свойство ModalResult = mrOK оно будет сигнализировать об завершении модальной формы и давать результат if ModalResult=mrOK then
-- и в закрывающей "Отмена" кнопке назначить свойство ModalResult = mrCancel оно будет сигнализировать об завершении модальной формы..
в файле *.lpr
Код: Выделить всё
TFormLogin = class(TForm)
private
{ private declarations }
public
{ public declarations }
class function open():boolean;
end;
implementation
class function TFormLogin.open: boolean;
begin
with TFormLogin.Create(nil) do begin
Result:=false;
ShowModal;
if ModalResult=mrOK then begin
//if (Login.text=fLogin) and (Password.text=fPassword) then
Result:=true;
end;
end;
end;
-- назначь в закрывающей "Вход" кнопке свойство ModalResult = mrOK оно будет сигнализировать об завершении модальной формы и давать результат if ModalResult=mrOK then
-- и в закрывающей "Отмена" кнопке назначить свойство ModalResult = mrCancel оно будет сигнализировать об завершении модальной формы..
в файле *.lpr
Код: Выделить всё
begin
RequireDerivedFormResource:=True;
Application.Initialize;
if TFormLogin.open() then
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
- Unvictis
- новенький
- Сообщения: 48
- Зарегистрирован: 17.07.2015 17:59:12
- Откуда: Kokshetau, Kazakshtan
- Контактная информация:
Также пробовал прописать LoginForm.ShowModal в коде проекта между всех Application.CreateForm(..) и Application.Run - иногда этот метод работает, иногда нет. Что-то подсказывает мне что так всё-таки правильней, но не пойму почему он работает через раз?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Unvictis
Проблема в том, что форма создается в два этапа. 1) собственно создание 2) ее показ (активация) и неизвестно на каком этапе заблокирует главную форму, если создать модальную форму в CreateForm.
Лучше вообще запустить таймер при создании главной формы и в форме авторизации его остановить. Тогда точно все прорисуется. Особенно если поиграть со временем срабатывания.
Проблема в том, что форма создается в два этапа. 1) собственно создание 2) ее показ (активация) и неизвестно на каком этапе заблокирует главную форму, если создать модальную форму в CreateForm.
Лучше вообще запустить таймер при создании главной формы и в форме авторизации его остановить. Тогда точно все прорисуется. Особенно если поиграть со временем срабатывания.
Выводить форму запроса пароля через таймер, запускаемый в обработчике главной формы OnShow...
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
svk12, плохая идея. Если так сделать, то при сворачивании/разворачивании окна придется снова вводить пароль. Если только для секьюрности подойдет.
- Unvictis
- новенький
- Сообщения: 48
- Зарегистрирован: 17.07.2015 17:59:12
- Откуда: Kokshetau, Kazakshtan
- Контактная информация:
Лекс Айрин
Спасибо за подробный ответ! Хотелось бы узнать, а событие OnActivate происходит до или после прорисовки формы?
Добавлено спустя 1 минуту 43 секунды:
Я это к тому что если на форме относительно немного компонентов, то для этой задачи OnActivate подходит идеально, только проверку на то, залогинен ли уже пользователь или нет надо вставлять.
Спасибо за подробный ответ! Хотелось бы узнать, а событие OnActivate происходит до или после прорисовки формы?
Добавлено спустя 1 минуту 43 секунды:
Я это к тому что если на форме относительно немного компонентов, то для этой задачи OnActivate подходит идеально, только проверку на то, залогинен ли уже пользователь или нет надо вставлять.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Unvictis писал(а):а событие OnActivate происходит до или после прорисовки формы?
После. Но тут та же проблема, что и в случае onShow, только пароль будете вводить как только уйдете с главной формы... (откроется диалоговое окно, окно настроек, поработаете с другой прогой...)
Лекс Айрин писал(а):Если так сделать, то при сворачивании/разворачивании окна придется снова вводить пароль.
OnShow не вызывается при сворачивании/разворачивании окна.
Только один раз - после создания, перед показом. Я туда всегда сую
всяческую инициализацию : подключение к БД, загрузку сохранённых настроек,
перевод интерфейса и т.п.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
svk12, даже если так, то оно может быть вызвано несколько раз за сеанс работы. Например, при сворачивании в трей. Что не очень хорошо.
Лекс Айрин писал(а):Например, при сворачивании в трей.
Да, при при показе после сворачивания в трей тоже вызывается.
Это следует учитывать.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
svk12, а , по хорошему, должен.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
В моем приложении реализовано так:
- Все нужные формы создаются между Application.Initilize и Application.Run, в том числе форма для ввода пароля и главное окно. Главное окно первым, конечно.
- В событии метода OnShow прописываются действия для запуска, связанные с визуальными компонентами и в том числе появляется окошко для ввода пароля. Единственно, вначале перед процедурой запуска формы с паролем проверяю флаг FOnCreate, который после сбрасывается. В противном случае, эти процедуры будут постоянно вызывается при возникновении события OnShow, к примеру, при разворачивании главного окна из трея.
- Перед выполнением процедуры ShowModal, блокирую главное окно
Enable := false
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
svk12, сорри, я неправильно понял твой крайний пост.
почему не использовать TFormLogin.open() ? он универсален и его можно применять везде на любых местах..
общая программа зависает на вызове функции где вызывается TFormLogin.open() и ждет когда ShowModal завершится с результатом и вернет результат уже главной программе..
Такой подход лучше, с моей стороны, что позволяет запускать много модальных окон, допустим: открытия контрагента(1-е модальное окно) -> открытия населенного пункта (2-е модальное окно) -> город, улица дом (3-е модальное окно) ..
при этом я точно контролирую ввод, пользователь ограничен, он не может выбрать уйти..
и унифицировать данные - одна и та же форма ввода данных используется во многих местах..
поясните, что не так?
общая программа зависает на вызове функции где вызывается TFormLogin.open() и ждет когда ShowModal завершится с результатом и вернет результат уже главной программе..
Такой подход лучше, с моей стороны, что позволяет запускать много модальных окон, допустим: открытия контрагента(1-е модальное окно) -> открытия населенного пункта (2-е модальное окно) -> город, улица дом (3-е модальное окно) ..
при этом я точно контролирую ввод, пользователь ограничен, он не может выбрать уйти..
и унифицировать данные - одна и та же форма ввода данных используется во многих местах..
Unvictis писал(а):Также пробовал прописать LoginForm.ShowModal в коде проекта между всех Application.CreateForm(..) и Application.Run - иногда этот метод работает, иногда нет. Что-то подсказывает мне что так всё-таки правильней, но не пойму почему он работает через раз?
поясните, что не так?
