![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день
Возникла проблема с закрытием модальной формы авторизации Файл проекта Код:
program WorkShop; uses Vcl.Forms, MainUnit in 'MainUnit.pas' {MainForm}, LoginUnit in 'LoginUnit.pas' {LoginForm}, DModuleUnit in 'DModuleUnit.pas' {DMForm: TDataModule}; {$R *.res} label rer; begin CheckUserPaswd: Application.CreateForm(TDMForm, DMForm); if TLoginForm.Execute then begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; end else Application.MessageBox('Проверьте имя пользователя и пароль!', 'Ошибка авторизации',(MB_ICONWARNING)); goto CheckUserPaswd; end. Функция вызова формы авторизации Код:
class function TLoginForm.Execute: boolean; begin with TLoginForm.Create(nil) do try Result := ShowModal = mrOk; finally Free; end; end; На форме авторизации две кнопки ОК и Отмена Кнопка ОК Код:
//Проверка логина и пароля если true ModalResult := mrOk end else ModalResult := mrAbort; На кнопку отмена и OnClose формы Код:
Application.Terminate; Так вот при нажатии кнопка отмена или закрытие формы Форма авторизации закрывается, а на экран вылазит сообщение Проверьте имя пользователя и пароль! в бесконечном цикле. Подскажите что я делаю не так? Последний раз редактировалось geniusbsd, 16.01.2015 в 03:06. |
#2
|
|||
|
|||
![]() Угу, потому что у тебя на самом деле у тебя 3 значения, а не 2.
Пусть форма возвращает - True- в случае, если пользователь ввел логин/пароль и нажал OK - False -в случае, когда пользователь нажал Cancel Тогда код должен выглядеть примерно так: Код:
While True Do Begin if Not TLoginForm.Execute then Halt(0) Else If Login({пытаемся логиниться]) Then Begin // Успешный логин, создаем формы и работаем // Exit - для выхода из бесконечного цикла Exit; End; End; |
#3
|
|||
|
|||
![]() Используя такой код
Код:
program WorkShop; uses Vcl.Forms, Winapi.Windows, MainUnit in 'MainUnit.pas' {MainForm}, LoginUnit in 'LoginUnit.pas' {LoginForm}, DModuleUnit in 'DModuleUnit.pas' {DMForm: TDataModule}, SettingsUnit in 'SettingsUnit.pas' {SettingsForm}; {$R *.res} begin Application.CreateForm(TDMForm, DMForm); While True Do Begin if Not TLoginForm.Execute then begin Application.MessageBox('Проверьте имя пользователя и пароль!', 'Ошибка авторизации',(MB_ICONWARNING)); //Halt(0) end Else if (DMForm.ADOQueryFase.RecordCount>0)Then Begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; Exit; End; End; end. Результат точно такой же как и в моем коде А мне требуется что бы при не правильном пароле выдавалось сообщение об ошибке и происходила следующая попытка пока пароль не будет правильный. А если нажимаю на кнопку отмена или закрыть происходило закрытие программы без вывода сообщений |
#4
|
|||
|
|||
![]() Конечно, ты сообщение нетуда вставил.
Оставь Halt(0) в покое. Это ветка, когда юзер сказал "Отмена". Твое сообщение надо вставить в Else последнего If'а. |
#5
|
|||
|
|||
![]() Я так пробовал при неправильном пароле форма закрывается без выдачи сообщение и нет возможности повторно ввести пароль
Код:
if (DMForm.ADOQueryFase.RecordCount>0)Then Begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; End else Application.MessageBox('Проверьте имя пользователя и пароль!', 'Ошибка авторизации',(MB_ICONWARNING)); end; |
#6
|
|||
|
|||
![]() Ха! Знаю почему!!!
Потому что DataModule надо создавать не так, а по старинке: Код:
DMForm := TDMForm.Create(Application); |
#7
|
|||
|
|||
![]() Доберусь до компа попробую
Но по моему все таки не совсем правильно составлен алгоритм Execute возвращает true или false При правильном пароле True в любом другом случае False if Not TLoginForm.Execute then Halt(0) Halt будет выполнятся когда mrAborrt or mrCancel по этому он и не переходит на esle после проверки пароля |
#8
|
|||
|
|||
![]() Подумав с книжкой по делфи в руках
получил вот такой код Код:
Begin While True Do begin //Application.CreateForm(TDMForm, DMForm); DMForm := TDMForm.Create(Application); LoginForm := TLoginForm.Create(Application); LoginForm.ShowModal; Case LoginForm.ShowModal of mrCancel : Halt(0); mrAbort : Application.MessageBox('Проверьте имя пользователя и пароль!', 'Ошибка авторизации',(MB_ICONWARNING)); mrOk: begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; Exit; end; end; End; Все в принципе отрабатывает как я задумал, но есть одно НО все операции срабатывют только при втором нажатии ![]() Опять что то нашаманил не то ![]() Последний раз редактировалось M.A.D.M.A.N., 17.01.2015 в 15:18. Причина: случайно промахнулся сообщением |
#9
|
||||
|
||||
![]() Код:
Begin While True Do begin //Application.CreateForm(TDMForm, DMForm); DMForm := TDMForm.Create(Application); LoginForm := TLoginForm.Create(Application); Case LoginForm.ShowModal of mrAbort : Application.MessageBox('Проверьте имя пользователя и пароль!', 'Ошибка авторизации',(MB_ICONWARNING)); mrOk: begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; Break; end; end; End; Правда один фиг это через упож. ----------- Я делал так: Код:
Application.Initialize; if TfrmUserLogin.UserLogin(Application, TfrmMain.UserLoginInfo) then begin Application.MainFormOnTaskbar := True; Application.CreateForm(TfrmMain, frmMain); Application.Run; end; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 17.01.2015 в 15:24. |
#10
|
|||
|
|||
![]() Если запускать по F8
видно что Программа доходит до Case Нажимается кнопка к примеру ОК окно скрывается потом открывается. при повторном нажатии CASE проходит нормально. Почему так происходит? |
#11
|
||||
|
||||
![]() Мой пример себя оправдал, работает без нареканий.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#12
|
|||
|
|||
![]() Цитата:
У себя пишу Код:
Begin Application.CreateForm(TDMForm, DMForm); DMForm := TDMForm.Create(Application); if TLoginForm.LoginForm(Application, TDMForm.ADOQueryFase.RecordCount>0) then begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; end; End; [dcc32 Error] WorkShop.dpr(19): E2096 Method identifier expected [dcc32 Error] WorkShop.dpr(19): E2029 'THEN' expected but identifier 'RecordCount' found |
#13
|
|||
|
|||
![]() Решил проблему
убрав из кода в сообщении #8 строку LoginForm.ShowModal; |
#14
|
||||
|
||||
![]() Цитата:
В которой как раз была убрана строчка №8. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#15
|
|||
|
|||
![]() А как на счет вашего варианта if TfrmUserLogin.UserLogin(Application, TfrmMain.UserLoginInfo) then
Обясните? |