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

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

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

Аватара пользователя
Unvictis
новенький
Сообщения: 48
Зарегистрирован: 17.07.2015 17:59:12
Откуда: Kokshetau, Kazakshtan
Контактная информация:

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

Сообщение Unvictis »

Здравствуйте коллеги! Хочу сделать что-бы сразу же после загрузки главной формы моего приложения (СУБД) вылазила форма ввода пользователя и пароля (тоесть сразу же после того как основная форма прорисовалась). Никак не могу разобраться как же это надёжнее и правильнее всего реализовать. Например когда кидаешь метод ShowModal в OnActivate иногда форма просто не успевает полностью прорисоваться. Пробовал ставить на главную форму таймер организующий задержку, - но это на мой взгляд попахивает быдлокодерством. Что скажете, кто как решает эти вопросы?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

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

Код: Выделить всё

  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
Контактная информация:

Сообщение Unvictis »

Также пробовал прописать LoginForm.ShowModal в коде проекта между всех Application.CreateForm(..) и Application.Run - иногда этот метод работает, иногда нет. Что-то подсказывает мне что так всё-таки правильней, но не пойму почему он работает через раз?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Unvictis
Проблема в том, что форма создается в два этапа. 1) собственно создание 2) ее показ (активация) и неизвестно на каком этапе заблокирует главную форму, если создать модальную форму в CreateForm.
Лучше вообще запустить таймер при создании главной формы и в форме авторизации его остановить. Тогда точно все прорисуется. Особенно если поиграть со временем срабатывания.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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

Сообщение Лекс Айрин »

svk12, плохая идея. Если так сделать, то при сворачивании/разворачивании окна придется снова вводить пароль. Если только для секьюрности подойдет.
Аватара пользователя
Unvictis
новенький
Сообщения: 48
Зарегистрирован: 17.07.2015 17:59:12
Откуда: Kokshetau, Kazakshtan
Контактная информация:

Сообщение Unvictis »

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

Добавлено спустя 1 минуту 43 секунды:
Я это к тому что если на форме относительно немного компонентов, то для этой задачи OnActivate подходит идеально, только проверку на то, залогинен ли уже пользователь или нет надо вставлять.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

После. Но тут та же проблема, что и в случае onShow, только пароль будете вводить как только уйдете с главной формы... (откроется диалоговое окно, окно настроек, поработаете с другой прогой...)
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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


OnShow не вызывается при сворачивании/разворачивании окна.
Только один раз - после создания, перед показом. Я туда всегда сую
всяческую инициализацию : подключение к БД, загрузку сохранённых настроек,
перевод интерфейса и т.п.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

svk12, даже если так, то оно может быть вызвано несколько раз за сеанс работы. Например, при сворачивании в трей. Что не очень хорошо.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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


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

Сообщение Лекс Айрин »

svk12, а , по хорошему, должен.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

В моем приложении реализовано так:
  • Все нужные формы создаются между Application.Initilize и Application.Run, в том числе форма для ввода пароля и главное окно. Главное окно первым, конечно.
  • В событии метода OnShow прописываются действия для запуска, связанные с визуальными компонентами и в том числе появляется окошко для ввода пароля. Единственно, вначале перед процедурой запуска формы с паролем проверяю флаг FOnCreate, который после сбрасывается. В противном случае, эти процедуры будут постоянно вызывается при возникновении события OnShow, к примеру, при разворачивании главного окна из трея.
  • Перед выполнением процедуры ShowModal, блокирую главное окно :) Enable := false
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

Сообщение olegy123 »

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

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

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

поясните, что не так?
Ответить