Форум по 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,088
Версия 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,088
Версия 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,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ха! Знаю почему!!!
Потому что DataModule надо создавать не так, а по старинке:
Код:
DMForm := TDMForm.Create(Application);
Дело в том, что главной формой приложения считается та, которая была создана первой. Не совсем понятно как там с Initialize это совмещается. Но я бы попробовал.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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