Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форма не закрывается, FormClose срабатывает 
V
    Опции темы
Akella
  Дата 13.1.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Есть главная форма, в момент показа её, вызывает форму ввода логина и пароля
Код

procedure TfmAdmSrv.FormShow(Sender: TObject);
begin

  if UserData.UserID <= 0 then begin
    if Assigned(fmSplash) then Freel(fmSplash);


    fmLogon := TfmLogon.Create(Application);
    fmLogon.ShowModal;
    Freel(fmLogon);

  end;
end;


На форме пользователь вводит логин и пароль, нажимает кнопку, форма логина исчезает и появляется главная форма. Всё Ок.
Теперь внимание. Нужно сделать так, чтобы на форме логина и пароля вводились автоматом логи и пароль, а дальше нажималась кнопка ОК и форма логина закрывалась.

Так вот. Вводить программно логин и пароль нет сложностей. Проблема в том, что форма логина и пароля НЕ закрывается, хотя Formclose срабатывает.

Вот при показе форма логин вводим программно логин и пароль:
Код

procedure TfmLogon.FormShow(Sender: TObject);
begin
  if dblcbUser.Text <> '' then
    dbePassword.SetFocus
  else
    dblcbUser.SetFocus;

  if FileExists(sAppPath + 'lp.dat') then
    with TIniFile.Create(sAppPath + 'lp.dat') do
      begin
        dbePassword.Text   := Decrypt(ReadString('DATA', 'p', ''), 32148);
        dblcbUser.ListSource.DataSet.Locate('NAME', Decrypt(ReadString('DATA', 'u', ''), 15972), [loCaseInsensitive]);
//        btnOk.Click;
        btnOkClick(sender);
      end;
end;



Вот код по нажатию на кнопку
Код

procedure TfmLogon.btnOkClick(Sender: TObject);
Var
 ca: TCloseAction;
begin
  if CheckPass(dblcbUser.Text, dbePassword.Text) then begin
    UserData.UserName := dblcbUser.Text;
    UserData.Password := dbePassword.Text;
    bGood := True;
    ModalResult := mrOk;
    fmLogon.Close;


//    fmLogon.CloseModal;
//    fmLogon.Close;
//    ca := caFree;
//    FormClose(sender, ca);
//    ModalResult := mrOk;


всё выполняется до этого момента и даже fmLogon.Close; НО форма логина НЕ закрывается
  end else begin
    Inc(iTryCount);
    MessageBox(Application.ActiveFormHandle,
               'Неверные имя или пароль пользователя! :(',
               'ОШИБКА!',
                MB_ICONWARNING or MB_OK);
    dbePassword.SetFocus;
    dbePassword.SelectAll;
  end;//else
  if iTryCount >= 3 then Application.Terminate;
end;


Добавлено через 3 минуты и 34 секунды
Забыл добавить, что когда жмакаешь мышкой по кнопкам, то форма нормально закрывается
PM MAIL   Вверх
Демо
Дата 13.1.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Не надо нажимать на кнопку.
Достаточно ModalResult для формы установить.


--------------------
    
PM MAIL ICQ Skype   Вверх
Akella
Дата 13.1.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



в исходниках, в модуле Forms


Код

procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then

здесь if возвращает false

Добавлено через 1 минуту и 8 секунд
А мне нужно нажать на кнопку, т.к. по нажатию на кнопку выполняется проверка логина и пароля!!

Добавлено через 1 минуту и 36 секунд
А в нажатии на кнопку я уже вызываю     fmLogon.ModalResult := mrOk;
PM MAIL   Вверх
Демо
Дата 13.1.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Причём сделать это из обработчика таймера на форме, например...


--------------------
    
PM MAIL ICQ Skype   Вверх
bems
Дата 13.1.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Напверное это потому что форма еще в процессе открытия. Посылай (post) форме (или кнопке) сообщение, или используй ApplicationEvents.OnIdle чтобы отложит вызов fmLogon.Close на момент после выхода из FormShow


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Демо
Дата 13.1.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Akella

После обработки ввода логина и пароля пошли сообщение (PostMessage), в нём и присвой ModalResult := mrOk;

Это сообщение отредактировал(а) Демо - 13.1.2010, 17:59


--------------------
    
PM MAIL ICQ Skype   Вверх
bems
Дата 13.1.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Ну да, или таймер smile

Добавлено через 1 минуту и 36 секунд
Цитата(Демо @  13.1.2010,  17:59 Найти цитируемый пост)
После обработки ввода логина и пароля пошли сообщение

Я бы все-таки посылыл сообщение о щелчке кнопки. Так не меняется порядок выполнения.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 13.1.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Сделал так, кинул на форму таймер
Код

procedure TfmLogon.Timer1Timer(Sender: TObject);
begin
  btnOk.Click;
  Timer1.Enabled := false;
end;


Теперь форма нормально закрывается.
Хм... получается, что  из OnShow нельзя вызывать OnClose?

Добавлено через 47 секунд
О, пока делал, уже ответили  smile 
PM MAIL   Вверх
Демо
Дата 13.1.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Akella @  13.1.2010,  18:03 Найти цитируемый пост)
Хм... получается, что  из OnShow нельзя вызывать OnClose?


Ну да, из метода OnShow формы её саму не получается закрыть.


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.