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

Блог. Двадцать пять лет Делфи-практики

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

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

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

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

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

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

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

Итак. Мы создадим главную форму TMainForm и форму логина TLoginForm.
(примечание про AutoCreate https://www.cyberforum.ru/blog... g4873.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
Более жизненный сценарий старта программы я привел здесь

Всего комментариев 30

Комментарии

Запись от DenNik размещена 18.08.2017 в 16:41

Запись от DenNik размещена 22.08.2017 в 10:13

Запись от DenNik размещена 21.11.2017 в 09:58

Запись от Mr_Cipa размещена 20.03.2019 в 00:25

Запись от krapotkin размещена 20.03.2019 в 07:35

Запись от Usaga размещена 20.03.2019 в 09:01

Запись от Rius размещена 20.03.2019 в 09:57

Запись от krapotkin размещена 20.03.2019 в 10:27

Запись от Rius размещена 20.03.2019 в 10:49

Запись от Usaga размещена 21.03.2019 в 11:03

Запись от krapotkin размещена 21.03.2019 в 12:46

Запись от Rius размещена 21.03.2019 в 20:01

Запись от krapotkin размещена 21.03.2019 в 20:28

Запись от Rius размещена 21.03.2019 в 20:58

Запись от Usaga размещена 22.03.2019 в 08:13

Запись от Mr_Cipa размещена 22.03.2019 в 08:26

Запись от Usaga размещена 22.03.2019 в 12:01
Обновил(-а) Usaga 22.03.2019 в 12:02