Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как правильно сделать форму аутентификации?

991
19 сентября 2005 года
Zenhipster
157 / / 14.01.2005
Как правильно сделать форму аутентификации в приложении работающем с базой данных? (Как логиниться в базу я знаю.) Т.е. при запуске программы должна появляться форма аутентификации. Если аутентификация прошла успешно, появляется главная форма приложения. Если мы отказались от аутентификации - происходит завершение программы.
Просто мне интересно, как это сделать грамотно, чтоб при отказе от аутентификации не проскакивало окно главной формы в момент завершения.

Кто нибудь писал базы данных на билдере?
315
19 сентября 2005 года
Nick_M
399 / / 29.05.2003
Цитата:
Originally posted by Zenhipster
Как правильно сделать форму аутентификации в приложении работающем с базой данных? (Как логиниться в базу я знаю.) Т.е. при запуске программы должна появляться форма аутентификации. Если аутентификация прошла успешно, появляется главная форма приложения. Если мы отказались от аутентификации - происходит завершение программы.
Просто мне интересно, как это сделать грамотно, чтоб при отказе от аутентификации не проскакивало окно главной формы в момент завершения.

Кто нибудь писал базы данных на билдере?


При открытии главной формы, если юзер незалогинился открываем форму аутентификации в модальном режиме. Если он закрывает форму не введя пароль: нажимает отмена, давит по кресту, не важно, обрабатываем событие OnClose и делаем Application->Terminate();

315
19 сентября 2005 года
Nick_M
399 / / 29.05.2003
Цитата:
Originally posted by Zenhipster

Кто нибудь писал базы данных на билдере?


писАл,пишу и буду писАть.

299
19 сентября 2005 года
3D Bob
885 / / 18.04.2005
Именно этим я сейчас занимаюсь))))))
Да именно так и я сделал.
246
20 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Zenhipster
Как правильно сделать форму аутентификации в приложении работающем с базой данных? (Как логиниться в базу я знаю.) Т.е. при запуске программы должна появляться форма аутентификации. Если аутентификация прошла успешно, появляется главная форма приложения. Если мы отказались от аутентификации - происходит завершение программы.
Просто мне интересно, как это сделать грамотно, чтоб при отказе от аутентификации не проскакивало окно главной формы в момент завершения.

Кто нибудь писал базы данных на билдере?


Такой вариант. Вроде работает. Ваше мнение?

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)
{
    ModalResult = mrCancel;    
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{
    Form1->IBDatabase1->Params->Add(String("user_name=") + Edit1->Text);
    Form1->IBDatabase1->Params->Add(String("password=") + Edit2->Text);
    try {
        Form1->IBDatabase1->Connected   = true;
        Form1->IBTable1->Active         = true;
    }
    catch(EIBInterBaseError &e) {
        Application->MessageBox(e.Message.c_str(), "Error", MB_OK|MB_ICONERROR);
        return;
    }

    ModalResult=mrOk;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->CreateForm(__classid(TForm1), &Form1);
         Form2 = new TForm2(Application);
         if(Form2->ShowModal() == mrCancel)
         {
            PostQuitMessage(0);
         }
         delete Form2;
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    return 0;
}
//---------------------------------------------------------------------------
991
20 сентября 2005 года
Zenhipster
157 / / 14.01.2005
Цитата:
Originally posted by GIZMO
Такой вариант. Вроде работает. Ваше мнение?



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

Код:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->CreateForm(__classid(TForm1), &Form1);
         Form2 = new TForm2(Application);
         if(Form2->ShowModal() == mrCancel)
         {
            PostQuitMessage(0);
         }
         delete Form2;
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    return 0;
}


Что бы избежать проскакивания главной формы в момент нажатия "отмена" я сделал следующее (в упрощенном виде):

Код:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->CreateForm(__classid(TForm1), &Form1);
         Form2 = new TForm2(Application);
         int iRes = Form2->ShowModal();
         delete Form2;
         if(iRes == mrCancel)
            Application->Terminate();
         else
         Application->Run();
         
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    return 0;
}


Всем спасибо за помощь.
246
20 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Zenhipster
Действительно работает, только я позволил себе сделать незначительные изменения. У вас было:

Что бы избежать проскакивания главной формы в момент нажатия "отмена" я сделал следующее (в упрощенном виде):

 
Код:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
        ...
        Application->Terminate();
        ...

Всем спасибо за помощь.


1. Пожайлуста, самому скоро понадобится.
2. О вкусах,

Цитата:
Originally quote by BCB Help System
Ends application execution.

void __fastcall Terminate(void);

Description

Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate.

Terminate is called automatically on a WM_QUIT message and when the main form closes.


не спорят.

991
20 сентября 2005 года
Zenhipster
157 / / 14.01.2005
Цитата:
Originally posted by GIZMO
1. Пожайлуста, самому скоро понадобится.
2. О вкусах,

не спорят.



Да не, там не во вкусах было дело =) Application->Terminate() использовать, или PostQuitMessage(0) - пофиг.

Просто мне показалось, что в этом куске

 
Код:
if(Form2->ShowModal() == mrCancel)
         {
            PostQuitMessage(0);
         }
         delete Form2;
         Application->Run();

Application->Run(); - выполнится в независимости от того вернул Form2->ShowModal() значение mrCancel, или нет. Поэтому явно прописал "else".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог