Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Паролирование формы


Автор: mr.Anderson 10.10.2005, 18:58
Я перед открытием главной программы вызываю в событии OnCreate главной формы вспомогательную форму для ввода пароля. Там есть две кнопки - проверка пароля (вход) и выход. При нажатии кнопки "Выход" надо прекратить загрузку главной формы. Form1->Close() не работает, форма все равно загружается. Как этого избежать (т.е. как прекратить загрузку проекта, если нажата кнопка выхода)?

Автор: Slayers 10.10.2005, 21:10
Попробуй Application->Terminate();
smile smile smile

Автор: szz 11.10.2005, 00:21
Цитата(Slayers @ 10.10.2005, 21:10)
Попробуй Application->Terminate();
smile smile smile

Ага, и это убьет всю программу. Человеку надо только форму закрыть, не так ли?
Добавлено @ 00:22
А, простите, "прекратить загрузку проекта" не заметил... smile
Заработался я сегодня...

Автор: azesmcar 11.10.2005, 08:04
Цитата
Попробуй Application->Terminate();


Извращенство какое то smile)

Давайте все же что нибудь более гуманное...убивать процесс, причем собственный не есть хорошо...зачем убивать что либо если есть способ просто красиво прекратить его существование...эфтаназия ! smile

На диалоге с для ввода пароля ставишь на кнопку OK ModalResult mrOk на Cancel соответсвенно mrCancel. При показе диалог делаешь что то наподобие

Код

void __fastcall TForm1::OnFormShow(TObject *Sender) //Событие можешь изменить по своем усмотрению
{
   TPasswordDialog *pDialog = new TPasswordDialog(this);
   if ( pDialog->ShowModal() == mrCancel )
   {
      this->Close();
   }
   //Здесь проверка пароля
   if ( pDialog->passwordEdit->Text != "mypass" )
   {
      this->Close();
   }
   delete pDialog;
}


Не помню сейчас, билдера нет у меня, но Close в этом случае должен нормально закрывать. Если не закроет напиши, сегодня вечером посмотрю как у меня дома это сделано

Я так думаю ты из формы ввода пароля пытался Close вызвать? ну конечно не заработает..как же твоя форма закроеться если у нее есть модальные формы открытые..закрой сперва, а потом закрывай основное окошко..

Автор: Vyacheslav 11.10.2005, 12:32
Использрвание события OnCreate является не рекомедуемым для Builder. Для аналогичных целей лучше использоввать конструктор
Application->Terminate() вполне нормальное решение и эквиавлентно Closeт.
Проблема в другом. Будет некоторое мелькание, если использовать OnFormClose. Форма все равно попытается откроется и тут же закроется. Это конечно не страшно но раздражает.
Есть выход следующено плана: исключение в конструторе.

Код

class NoLoginException : public Exception {
public:
      NoLoginException():Exception("User cancel registration process"){}
};

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

    std::auto_ptr<TLoginDialog> LoginDialog(new TLoginDialog(this));
    if (mrCancel == LoginDialog->ShowModal())
    {
         throw NoLoginException();
    }

}


LoginDialog не должен закрываться, пока пользователь не зарегиструется. Это легко сзделать повесив проверку
LoginDialog::FormCloseQuery(TObject *Sender, bool &CanClose)
Тогда у пользователя остается два варианта: либо правильно зарегистрироваться используя сколько угодно поаыток, либо прервать процесс регистрации и при этом программа выкинет сообщение "User cancel registration process"



Автор: mr.Anderson 11.10.2005, 18:25
Vyacheslav, как когда-то предлагали мне тут, смените мне звание на "Новичок". И пусть оно всегда таким остается. Я не понимаю ваших объяснений, это уже слишком сложно для меня.

Slayers, большое вам спасибо. С этой строчкой заработало. А это мелькание очень уж быстро происходит, чтобы оно начало кого-то раздражать.

Автор: Slayers 12.10.2005, 06:10
Всегда рад помочь smile smile smile

Автор: Vyacheslav 12.10.2005, 09:05
Цитата(sim7 @ 11.10.2005, 18:25)
Vyacheslav, как когда-то предлагали мне тут, смените мне звание на "Новичок". И пусть оно всегда таким остается. Я не понимаю ваших объяснений, это уже слишком сложно для меня.


Во-первых, я не могу поменять Ваш профиль.
Во-вторых, Вы не обижайтесь, но что я понять не могу так это Вашу методику обучения.
Когда обучаются, обычно начинаю с прочтения литературы, например со Страструпа и знакомства со стандартом. Если Вы это прочли то мой код должен быть понятен. Вам было достаточно повторить его у себя предварительно адаптировав к своим условиям и проверить, что получится. Разобрать в дебагере как это работает и решить подходит ли это Вам или нет.А при разборе данного кода Вы бы узнали, что такое исключения, зачем применяется auto_ptr и про особенности генерации исключения в конструкторе
А Вы
Цитата

Я не понимаю ваших объяснений, это уже слишком сложно для меня.

Естественно. Но программирование - это не такое уж простое дело( естественно, если имеется в виду качественное программирование). А признать, что это "слишком сложно" - последнее дело. К сожалению, у Вас - это входит в систему.
Напомнить Вам, чем закончилось обсуждение поиска при Вашем подходе:
Цитата

Дайте плиз проверенный и рабочий код, а то надоело мучаться. Мучаться бессмысленно надоело, то есть.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)