Форум программистов, компьютерный форум, киберфорум
Наши страницы
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
Более жизненный сценарий старта программы я привел здесь
Размещено в Без категории
Просмотров 738 Комментарии 5
Всего комментариев 5
Комментарии
  1. Старый комментарий
    Аватар для DenNik
    а я считаю, что форму авторизации лучше показывать ДО создания главной формы, да и мигание этой формочки при неправильном вводе тоже некомильфо. я делаю обычно так

    форма авторизации
    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
    
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TfrmLogin = class(TForm)
        Button1: TButton;
        Button2: TButton;
        edtLogin: TEdit;
        edtPass: TEdit;
        procedure Button1Click(Sender: TObject);
      end;
     
      // функция авторизации. ее можно вызывать потом и при работе программы (ну мало ли :))
      // проверять результат и принимать решение
      function Authorized: boolean;
     
    implementation
     
    {$R *.dfm}
     
    // отображение окна авторизации
    function Authorized: boolean;
    begin
      with TfrmLogin.Create(Application) do
      begin
        Result:= ShowModal = mrOk;
        Free;
      end;
    end;
     
    // DUMP-функция. проверка карректности данных
    function CheckLogin(const Login,Password: string): boolean;
    begin
      Result:= true;
    end;
     
    procedure TfrmLogin.Button1Click(Sender: TObject);
    begin
      // click on OK button
      if CheckLogin(edtLogin.Text,edtPass.Text) then ModalResult:= mrOk else
      begin
        ShowMessage('Incorrect!');
        edtLogin.Clear;
        edtPass.Clear;
        edtLogin.SetFocus;
      end;
    end;
     
    end.


    главный модуль проекта
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    program Project1;
     
    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {frmMain},
      Unit2 in 'Unit2.pas' {frmLogin};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      if not Authorized then Exit;                // добавим всего одну строчку
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TfrmMain, frmMain);
      Application.Run;
    end.


    да и код по итогу короче получается
    Запись от DenNik размещена 18.08.2017 в 16:41 DenNik на форуме
  2. Старый комментарий
    Аватар для krapotkin
    Не факт. Или не обязательно факт.
    Попробую аргументировать.
    Во-первых, для проверки логина часто нужно подключиться к БД или взять данные из интернета. А настройки подключения считать из файла. Тогда придется и это пихать сюда же. Перебор.
    Более жизненный сценарий старта программы я привел здесь
    Во-вторых, мигания (по крайней мере у меня) не заметно.
    В-третьих, ужасно не люблю вносить правки в DPR.
    Запись от krapotkin размещена 21.08.2017 в 17:22 krapotkin вне форума
    Обновил(-а) krapotkin 21.08.2017 в 17:24
  3. Старый комментарий
    Аватар для DenNik
    Цитата:
    ужасно не люблю вносить правки в DPR.
    почему так?
    это сугубо личный субъективный принцип кодинга?
    Запись от DenNik размещена 22.08.2017 в 10:13 DenNik на форуме
  4. Старый комментарий
    Аватар для krapotkin
    это старая история. IDE бывало знатно глючила. До сих пор иногда беспричинно портит DPR и PAS
    все дело в том, что она пользуется автоматическим парсингом dpr файла
    и когда там много ей непонятного, фиг знает, что у нее слетит )
    так что да, сугубо личное и субъективное. предрассудки типа не дразнить красной тряпкой черную кошку )
    Запись от krapotkin размещена 22.08.2017 в 10:32 krapotkin вне форума
    Обновил(-а) krapotkin 22.11.2017 в 01:33
  5. Старый комментарий
    Аватар для DenNik
    Цитата:
    До сих пор иногда беспричинно портит DPK
    вероятно, DPR )
    да, если строки
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;

    заключить в begin..end
    а если вариант с Exit, то все good )
    Запись от DenNik размещена 21.11.2017 в 09:58 DenNik на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru