Форма ввода пароля после загрузки главной формы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Форма ввода пароля после загрузки главной формы

Сообщение Unvictis » 09.12.2016 02:40:02

Здравствуйте коллеги! Хочу сделать что-бы сразу же после загрузки главной формы моего приложения (СУБД) вылазила форма ввода пользователя и пароля (тоесть сразу же после того как основная форма прорисовалась). Никак не могу разобраться как же это надёжнее и правильнее всего реализовать. Например когда кидаешь метод ShowModal в OnActivate иногда форма просто не успевает полностью прорисоваться. Пробовал ставить на главную форму таймер организующий задержку, - но это на мой взгляд попахивает быдлокодерством. Что скажете, кто как решает эти вопросы?
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Форма ввода пароля после загрузки главной формы

Сообщение olegy123 » 09.12.2016 10:18:05

Стартуй с формы пароля, потом открывай главную форму..

Код: Выделить всё
  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.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Форма ввода пароля после загрузки главной формы

Сообщение Unvictis » 09.12.2016 14:55:36

Также пробовал прописать LoginForm.ShowModal в коде проекта между всех Application.CreateForm(..) и Application.Run - иногда этот метод работает, иногда нет. Что-то подсказывает мне что так всё-таки правильней, но не пойму почему он работает через раз?
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 16:22:11

Unvictis
Проблема в том, что форма создается в два этапа. 1) собственно создание 2) ее показ (активация) и неизвестно на каком этапе заблокирует главную форму, если создать модальную форму в CreateForm.
Лучше вообще запустить таймер при создании главной формы и в форме авторизации его остановить. Тогда точно все прорисуется. Особенно если поиграть со временем срабатывания.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение svk12 » 09.12.2016 16:25:57

Выводить форму запроса пароля через таймер, запускаемый в обработчике главной формы OnShow...
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 16:31:30

svk12, плохая идея. Если так сделать, то при сворачивании/разворачивании окна придется снова вводить пароль. Если только для секьюрности подойдет.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение Unvictis » 09.12.2016 16:34:14

Лекс Айрин
Спасибо за подробный ответ! Хотелось бы узнать, а событие OnActivate происходит до или после прорисовки формы?

Добавлено спустя 1 минуту 43 секунды:
Я это к тому что если на форме относительно немного компонентов, то для этой задачи OnActivate подходит идеально, только проверку на то, залогинен ли уже пользователь или нет надо вставлять.
Аватара пользователя
Unvictis
новенький
 
Сообщения: 48
Зарегистрирован: 17.07.2015 18:59:12
Откуда: Kokshetau, Kazakshtan

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 17:01:47

Unvictis писал(а):а событие OnActivate происходит до или после прорисовки формы?

После. Но тут та же проблема, что и в случае onShow, только пароль будете вводить как только уйдете с главной формы... (откроется диалоговое окно, окно настроек, поработаете с другой прогой...)
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение svk12 » 09.12.2016 17:06:48

Лекс Айрин писал(а):Если так сделать, то при сворачивании/разворачивании окна придется снова вводить пароль.


OnShow не вызывается при сворачивании/разворачивании окна.
Только один раз - после создания, перед показом. Я туда всегда сую
всяческую инициализацию : подключение к БД, загрузку сохранённых настроек,
перевод интерфейса и т.п.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 17:14:34

svk12, даже если так, то оно может быть вызвано несколько раз за сеанс работы. Например, при сворачивании в трей. Что не очень хорошо.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение svk12 » 09.12.2016 17:22:46

Лекс Айрин писал(а):Например, при сворачивании в трей.


Да, при при показе после сворачивания в трей тоже вызывается.
Это следует учитывать.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 17:26:43

svk12, а , по хорошему, должен.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение Ichthyander » 09.12.2016 18:31:00

В моем приложении реализовано так:
  • Все нужные формы создаются между Application.Initilize и Application.Run, в том числе форма для ввода пароля и главное окно. Главное окно первым, конечно.
  • В событии метода OnShow прописываются действия для запуска, связанные с визуальными компонентами и в том числе появляется окошко для ввода пароля. Единственно, вначале перед процедурой запуска формы с паролем проверяю флаг FOnCreate, который после сбрасывается. В противном случае, эти процедуры будут постоянно вызывается при возникновении события OnShow, к примеру, при разворачивании главного окна из трея.
  • Перед выполнением процедуры ShowModal, блокирую главное окно :) Enable := false
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 698
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Форма ввода пароля после загрузки главной формы

Сообщение Лекс Айрин » 09.12.2016 18:35:19

svk12, сорри, я неправильно понял твой крайний пост.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Форма ввода пароля после загрузки главной формы

Сообщение olegy123 » 09.12.2016 20:02:58

почему не использовать TFormLogin.open() ? он универсален и его можно применять везде на любых местах..
общая программа зависает на вызове функции где вызывается TFormLogin.open() и ждет когда ShowModal завершится с результатом и вернет результат уже главной программе..

Такой подход лучше, с моей стороны, что позволяет запускать много модальных окон, допустим: открытия контрагента(1-е модальное окно) -> открытия населенного пункта (2-е модальное окно) -> город, улица дом (3-е модальное окно) ..
при этом я точно контролирую ввод, пользователь ограничен, он не может выбрать уйти..
и унифицировать данные - одна и та же форма ввода данных используется во многих местах..

Unvictis писал(а):Также пробовал прописать LoginForm.ShowModal в коде проекта между всех Application.CreateForm(..) и Application.Run - иногда этот метод работает, иногда нет. Что-то подсказывает мне что так всё-таки правильней, но не пойму почему он работает через раз?

поясните, что не так?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 243

Рейтинг@Mail.ru