Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.01.2015, 03:04
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию Незакрывется модальная форма

Добрый день
Возникла проблема с закрытием модальной формы авторизации

Файл проекта

Код:
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  
Старый 16.01.2015, 04:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Угу, потому что у тебя на самом деле у тебя 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  
Старый 16.01.2015, 12:16
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Используя такой код
Код:
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  
Старый 16.01.2015, 20:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Конечно, ты сообщение нетуда вставил.
Оставь Halt(0) в покое. Это ветка, когда юзер сказал "Отмена".
Твое сообщение надо вставить в Else последнего If'а.
Ответить с цитированием
  #5  
Старый 16.01.2015, 20:50
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Я так пробовал при неправильном пароле форма закрывается без выдачи сообщение и нет возможности повторно ввести пароль

Код:
 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  
Старый 17.01.2015, 02:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ха! Знаю почему!!!
Потому что DataModule надо создавать не так, а по старинке:
Код:
DMForm := TDMForm.Create(Application);
Дело в том, что главной формой приложения считается та, которая была создана первой. Не совсем понятно как там с Initialize это совмещается. Но я бы попробовал.
Ответить с цитированием
  #7  
Старый 17.01.2015, 12:44
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Доберусь до компа попробую
Но по моему все таки не совсем правильно составлен алгоритм

Execute возвращает true или false
При правильном пароле True в любом другом случае False
if Not TLoginForm.Execute then Halt(0)
Halt будет выполнятся когда mrAborrt or mrCancel
по этому он и не переходит на esle после проверки пароля
Ответить с цитированием
  #8  
Старый 17.01.2015, 14:58
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Подумав с книжкой по делфи в руках
получил вот такой код
Код:
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  
Старый 17.01.2015, 15:17
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
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  
Старый 17.01.2015, 15:54
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Если запускать по F8
видно что Программа доходит до Case Нажимается кнопка к примеру ОК
окно скрывается потом открывается. при повторном нажатии CASE проходит нормально. Почему так происходит?
Ответить с цитированием
  #11  
Старый 17.01.2015, 17:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Мой пример себя оправдал, работает без нареканий.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #12  
Старый 17.01.2015, 18:48
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
[code]Begin


Код:
  Application.Initialize;

  if TfrmUserLogin.UserLogin(Application, TfrmMain.UserLoginInfo) then
  begin
    Application.MainFormOnTaskbar := True;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
  end;
Объясните плиз это выражение if TfrmUserLogin.UserLogin(Application, TfrmMain.UserLoginInfo) then

У себя пишу
Код:
 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  
Старый 17.01.2015, 23:48
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Решил проблему
убрав из кода в сообщении #8 строку
LoginForm.ShowModal;
Ответить с цитированием
  #14  
Старый 18.01.2015, 12:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от geniusbsd
Решил проблему
убрав из кода в сообщении #8 строку
LoginForm.ShowModal;
Понятно, значит не читал первую часть сообщения http://www.delphisources.ru/forum/sh...50&postcount=9
В которой как раз была убрана строчка №8.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 18.01.2015, 12:35
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

А как на счет вашего варианта if TfrmUserLogin.UserLogin(Application, TfrmMain.UserLoginInfo) then
Обясните?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:44.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025