Век живи, век учись! И самое главное, когда чувствуешь, что что-то не так, не нужно себя обманывать, чем быстрее осознаешь проблему, тем быстрее её решишь. В одном из предыдущих постов, я написал простой алгоритм входа в личный кабинет, но всегда есть, что усовершенствовать. Оно вроде бы всё работало, но вот с точки зрения логики и памяти были нюансы.
В данном посте, на принципиальном уровне хочу закрепить как в Delphi организовать вход в личный кабинет. По логике вещей, должна создаваться сначала логин форма, там будет что-то происходить, например пользователь вводит логин с паролем, и если они совпадают, то создается основная форма.
В прошлый раз я не совсем правильно сделал, с точки зрения памяти. Нужно создавать и уничтожать формы в том порядке, в котором они нужны, чтобы правильно расходовать память.
Я для простоты на логин-форме создал кнопку Enter. По нажатию, открывается основная форма.
Вот что у меня получилось.
Нюанс
Я не силен в WinAPI на данный момент, но пронаблюдал следующую картину, если загруженную модальную форму свернуть, нажав на нижней панели на значок программы, то обратно она не разворачивалась. Я думаю, это как-то легко решается при помощи WinAPI, но я вышел из ситуации стандартными средствами Delphi.
Положил на форму компонент TApplicationEvents и обработал событие Deactivate
1 2 3 4 |
procedure TLoginForm.ApplicationEventsDeactivate(Sender: TObject); begin showmessage('Программа запущена. Авторизуйтесь или закройте окно'); end; |
Код реализации
Project > ViewSource
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 |
program Aphina; uses MainUnit in 'MainUnit.pas' {MainForm}, LoginUnit in 'LoginUnit.pas' {LoginForm}, Vcl.Controls, Vcl.Forms, Vcl.Themes, Vcl.Styles; {$R *.res} var MyLoginForm:TLoginForm; begin TStyleManager.TrySetStyle('Onyx Blue'); MyLoginForm:=TLoginForm.Create(nil); MyLoginForm.ShowModal; if MyLoginForm.ModalResult=mrOK then begin MyLoginForm.Free; Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.MainFormOnTaskbar := True; Application.Run; end; end. |
LoginUnit
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 |
unit LoginUnit; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TLoginForm = class(TForm) bEnter: TButton; procedure bEnterClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var LoginForm: TLoginForm; implementation {$R *.dfm} procedure TLoginForm.bEnterClick(Sender: TObject); begin Self.ModalResult:=mrOK; end; end. |
Код главной формы приводить не буду. В принципе, всё элементарно, но хотелось с этим разобраться раз и навсегда.