Форум программистов, компьютерный форум, киберфорум
Наши страницы
krapotkin
Войти
Регистрация
Восстановить пароль
Блог. Двадцать пять лет Делфи-практики

В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.

Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.

Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
____________________________________________________________________________________
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Рейтинг: 1.00. Голосов: 1.

Как правильно сделать форму логина

Запись от krapotkin размещена 13.08.2017 в 08:46
Обновил(-а) krapotkin 16.05.2018 в 09:29

Как ни странно, но часто создание сценария входа в программу становится довольно сложным препятствием при построении архитектуры приложения у молодых программистов. Давайте попробуем сделать хороший пример.

Итак, сначала должен быть сценарий. Вот он.
Стартует приложение.
Перед показом главной формы мы должны вывести диалог авторизации к кнопками ОК и Отмена
Если в диалоге нажать Отмена, то мы сразу выходим из программы
Если ОК - то нужно проверить логин пароль. Если все правильно - показать главную форму, если нет - опять показать диалог.

Делать это можно двумя способами - в обработчике OnCreate главной формы, и переопределяя конструктор главной формы
Более правильный вариант - второй. Поэтому рассмотрим его.
Дело в том, что если мы выберем выход из программы, в случае OnCreate главная форма все равно сначала загрузится и только потом мигнет и программа закончится. Нам это не хочется видеть, поэтому - конструктор.

Итак. Мы создадим главную форму TMainForm и форму логина TLoginForm.
(примечание про AutoCreate http://www.cyberforum.ru/blogs/469693/blog4873.html)
LoginForm - два Label два Edit и две TButton с заполненным ModalResult mrOk и mrCancel соответственно.
BorderStyle=bsDialog. Position=poMainFormCenter

В MainForm переопределяем конструктор и пишем туда... оп! не плодить простыни в коде!
Пишем туда
Delphi
1
2
inherited; // нужно вызвать конструктор предка
CheckLogin(); // а тут будут действия по проверке логина
так же стараемся себя вести и в других местах, выделяя логические блоки в отдельные процедуры и функции
например, сама проверка пароля у нас будет выполняться в функции LoginCorrect(login,pass:string):boolean;
и она ничего вообще не будет знать о форме логина, ибо мало ли откуда к нам придут логин и пароль впоследствии...

итого:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
unit UMainForm;
 
interface
 
uses
  classes, types, forms, Controls, StdCtrls, Dialogs, SysUtils;
 
type
  TMainForm = class(TForm)
  private
    procedure CheckLogin;
    function LoginCorrect(login, pass: String): Boolean;
  public
    constructor Create(AOwner: TComponent); override;
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
uses
  ULoginForm;
 
 
{$R *.dfm}
 
function TMainForm.LoginCorrect(login,pass:String):Boolean;
begin
  result := true;
end;
 
procedure TMainForm.CheckLogin();
var
  f:TLoginForm;
  r:TModalResult;
begin
  f:=TLoginForm.Create(NIL);
  try
    repeat
      r:=f.ShowModal;
      if r=mrOk then
      begin
        // придумаем функцию LoginCorrect() которая возвращает нам True или False
        // откуда она берет эти данные, из базы или файла или придумывает сама, нам все равно
        if LoginCorrect(f.eLogin.text, f.ePassword.text) then
          Break
      end;
    until r=mrCancel;
    if r=mrCancel then
    begin
      ShowMessage('Отказ от авторизации. Программа завершает свою работу.');
      Application.Terminate();
      Abort;
    end;
  finally
    f.free;
  end;
end;
 
 
constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited;
  CheckLogin;
end;
 
end.


Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
unit ULoginForm;
 
interface
 
uses
  Windows, Messages, Forms, StdCtrls, Classes, Controls;
 
type
  TLoginForm = class(TForm)
    eLogin: TEdit;
    ePassword: TEdit;
    bOk: TButton;
    bCancel: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
 
implementation
 
{$R *.dfm}
 
end.

вот и все

UPD
Более жизненный сценарий старта программы я привел здесь
Размещено в Без категории
Просмотров 1456 Комментарии 25
Всего комментариев 25
Комментарии
  1. Старый комментарий
    Аватар для Mr_Cipa
    Ну хоть убейте. Я как новичок, заявляю! Никак не могу назвать данный пример хорошим , из за того, что используется для входа модальное окно. Представьте ситуацию, открыла бухгалтерша Лида программу, а пароль для входа забыла, побежала Лида узнавать пароль. Тем временем Зине,Ксюше,Сергею понадобился компьютер Лиды... Форма входа потерялась за окнами других программ, в панели задач её нет. Лида опять открывает программу, пароль не верен она опять убежала, ситуация повторяется... Сколько окон для входа наплодит Лида пока откроет нашу программу? Форма для входа должна сворачиваться и быть видна в панели задача. Вот. Я вижу только один выход (напомню я "новичок" ) Делать форму входа в которой при верном результате, создастся главная форма нашей программы, а она уничтожит форму входа. Ну как то так...
    Запись от Mr_Cipa размещена 22.03.2019 в 12:57 Mr_Cipa вне форума
  2. Старый комментарий
    Аватар для Rius
    Mr_Cipa, при запуске программы выводится окно логина. Оно является главным окном программы в данный момент. Показывается на панели задач и всё такое.
    После его закрытия, логика программы получает результат и создаёт новое окно и показывает его, теперь уже как главное. Или завершает программу с руганью, если данные не верны.
    Но, внимание, если данные не верны, то главное окно создавать не нужно. В отличие от описываемого в топике костыля обыкновенного для дельфи решения.

    К тому же, программа может вообще висеть значком в системном трее и не иметь окна. Только по клику на значке или в меню значка, создавать окно и показывать.
    Запись от Rius размещена 22.03.2019 в 13:04 Rius вне форума
    Обновил(-а) Rius 22.03.2019 в 13:10
  3. Старый комментарий
    Аватар для krapotkin
    вы в 1С заходили когда-либо? )) не помня пароль и убегая )))))
    вообще много у вас юзеров, которые сначала заходят в программу, а потом, возможно вводят пароль ?
    Уверяю, что приведенный сценарий как раз более распространен.
    А для вашего варианта и я, и другие комментаторы вам уже предложили схему работы с дополнительным функционалом.

    Господа, вас имхо немного уносит. Уже помянуты утилиты, которые висят в трее, ввод пароля через консоль, и подобный столь же широко распространенный функционал. Как говорят друзья-казахи, Астана-Витесь )))

    и никаких главных "в этот момент(!!!)" форм в стандартной архитектуре не предусмотрено...
    есть понятие главная форма. она связана в том числе и с кнопкой приложения в панели задач. и есть типовые решения относительно проектирования появления форм. Вы можете переписать вообще все с нуля, и заменить все своими сценариями. Дело ваше, но при чем тут делфи-то ?
    Запись от krapotkin размещена 22.03.2019 в 13:33 krapotkin вне форума
  4. Старый комментарий
    Аватар для Rius
    Цитата:
    в стандартной архитектуре не предусмотрено...
    Шаг в сторону от кидания компонентов на Form1 и у начинающего дельфийца сразу будет паника. Поэтому пусть следуют проложенному пути и не думают. Да, я уже понял.

    Кликните здесь для просмотра всего текста

    Не по теме:

    Цитата:
    (!!!)
    C#
    1
    2
    3
    4
    5
    
    private static void Main()
    {
      Application.Run(new Form1());
      Application.Run(new Form2());
    }

    Запись от Rius размещена 22.03.2019 в 13:54 Rius вне форума
  5. Старый комментарий
    Аватар для Avazart
    Я не когда не был сторонник такого подхода.
    Эти передачи эстафеты между формами - никому не нужна мишура. Главная форма должна быть одна.

    Создавайте главное окно, а потом показывайте поверх модально диалог логина.
    Если логин не верный или пользователь его закрыл - главное окно, но пустое без данных. "Люся" вспомнит пароль сможет нажать в главном окне кнопочку или в меню ->диалог логина и повторить ввод в диалог и если правильно -> подключение и отображение данных в главном окне.
    Запись от Avazart размещена 22.03.2019 в 17:36 Avazart на форуме
    Обновил(-а) Avazart 22.03.2019 в 17:38
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.