Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вылет из Application.Run(), неожиданное завершение приложения 
V
    Опции темы
ДобренькийПапаша
Дата 15.6.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



У меня первой прогружается форма для аутентификации.

Код

static class Program
    {
        
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AuthenticationForm curF = new AuthenticationForm();
            
                 using (AuthenticationForm curF = new AuthenticationForm())
            {
                if (curF.ShowDialog() == DialogResult.OK && curF.Visible == false)
                {
                    Application.Run(new MainForm());
                }
            }
            
            
        }
    }


В аутентификации следующее, здесь есть кнопка Вход, при нажатии которой, происходит вызов функции ValidateUser (если всё хорошо),
то я присваиваю свойству Visible этой формы false, таким образом получая полный комплект для проверки if в предыдущем коде, эта форма должна быть уничтожена ибо обёрнута в using и должна запустится Application.Run(new MainForm). Однако машина что-то немного думает, а потом завершает приложение... а почему, просто непонятно!!! 

Код

public partial class AuthenticationForm : Form
    {
        static SqlConnection GetDbConnection(string source, string initCat)
        {
            /*SqlConnectionStringBuilder cnStr =
                new SqlConnectionStringBuilder();
            cnStr.IntegratedSecurity = SSPI;
            cnStr.DataSource = source;
            cnStr.InitialCatalog = initCat;
             */
            string cnStr =
                string.Format
                ("Data Source={0}; Integrated Security=SSPI; Initial Catalog={1}", source, initCat);
            SqlConnection cn = new SqlConnection();
            //cn.ConnectionString = cnStr.ConnectionString;
            cn.ConnectionString = cnStr;
            return cn;
        }

        static bool ValidateUser(string username, string password)
        {
            AuthenticationForm ex = new AuthenticationForm();
            string tmppwd = "";
            string query = string.Format
                ("Select password From usrpwd where usr='{0}'", username);
            using (SqlConnection curConnect =
                GetDbConnection(ex.ServerPath.Text, ex.BasePath.Text))
            {
                curConnect.Open();
                SqlCommand cmd = new SqlCommand(query, curConnect);
                SqlDataReader myReader;
                myReader = cmd.ExecuteReader();
                while (myReader.Read())
                {
                    tmppwd = myReader["password"].ToString().Trim();
                }
                if (password.Equals(tmppwd) == true)
                {
                    return true;
                }
                else
                    return false;
                //myReader.Close();
            }
        }
        public AuthenticationForm()
        {
            InitializeComponent();
        }
        
        private void LogButton_Click(object sender, EventArgs e)
        {
            if (Login.Text != "" && pwd.Text != "")
            {
                try
                {
                    if (ValidateUser(Login.Text, pwd.Text))
                    {
                        //Пользователь определён, прогружаю основную форму...
                        MessageBox.Show("User validated! Congratulations!",
                            "Аутентификация", MessageBoxButtons.OK);
                        this.Visible = false;
                    }
                    else
                    {
                        MessageBox.Show("Имя пользователя или пароль не действителен",
                            "Аутентификация", MessageBoxButtons.OK,
                            MessageBoxIcon.Warning);

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Аутентификация",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Введите логин и пароль",
                    "Ошибка аутентификации",
                    MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
            }

        }
    }





--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KelTron
Дата 15.6.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Ну во первых, что за лишний объект создаётся:
Код

AuthenticationForm curF = new AuthenticationForm();
            
                 using (AuthenticationForm curF = new AuthenticationForm())
            {

Во вторых using тут нафиг не нужен 
Цитата(ДобренькийПапаша @  15.6.2009,  16:04 Найти цитируемый пост)
ибо

таким образом AuthenticationForm уничтожится уже после того как завершится приложение, а не до появления MainForm

И такой вопрос: у тебя установлена кнопка LogButton как AcceptButton у формы AuthenticationForm и установлено ли свойство 
LogButton.DialogResult = DialogResult.OK?

Ибо если нет, то 
1) curF.ShowDialog() никогда не вернёт тебе DialogResult.OK
2) AuthenticationForm не закроется, т.к. ты её не закрываешь при нажатии на эту кнопку.

Возможно что у тебя прога и не завершается, а тупо форма становится невидимой и ничего не происходит.

Вот этот код тоже меня смущает:
Код

static bool ValidateUser(string username, string password)
        {
            AuthenticationForm ex = new AuthenticationForm();

Зачем тут создавать объект формы?

П.С. Пройдись по коду отладчиком.


Это сообщение отредактировал(а) KelTron - 15.6.2009, 18:06


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 15.6.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



Свойство DialogResult не было установлено. Ну и ну, я вообще-то его выставлял... видимо откатилось каким-то макаром. Теперь всё нормально.

Цитата

Код

static bool ValidateUser(string username, string password)
        {
            AuthenticationForm ex = new AuthenticationForm();

Зачем тут создавать объект формы?


Если тут не создать объект то не могу обратиться к (путь к серверу и базе) GetDbConnection(ex.ServerPath.Text, ex.BasePath.Text))
(обращаюсь через объект, как по другому не знаю, в конце объект уничтожаю, вызывая Dispose() так что не думаю что это повлияет на производительность.

Добавлено через 11 минут и 49 секунд
Теперь непонятно почему, вообще в любом случае, чтобы я не набрал в форме аутентификации, после выдачи сообщения типа вы прошли аутентификацию и даже после сообщения "Такой логин или пароль недействителен" прогружается основная форма (которая при неверно логине или пароле прогружаться не должна). Такое ощущение будто конструкция if плевать не хотела на проверку curF.Visible==false 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KelTron
Дата 15.6.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Я так понял у тебя на форме AuthenticationForm 2 текстбокса

Так зачем создавать лишний объект почему нельзя сделать так?
Код

GetDbConnection(this.ServerPath.Text, this.BasePath.Text));


...
А заметил, у тебя методы статичные...но а зачем они статичные))
Сделай обыкновенными.

Ещё: я так думаю у тебя данные в эти текстбоксы забиты в редакторе форм и поэтому что то работает.
Ты же создаёшь форму и читаешь оттуда значения, но ты эту форму даже не открываешь, поэтому когда почистишь
текстбоксы в дизайнере, то код работать перестанет.

Это сообщение отредактировал(а) KelTron - 15.6.2009, 18:43


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 15.6.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



Поправил как ты сказал, щас дам комменты:

здесь пока так:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace TaxZeus
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            using (AuthenticationForm curF = new AuthenticationForm())
            {
                if (curF.ShowDialog()== DialogResult.OK && curF.Visible == false)
                {
                    Application.Run(new MainForm());                                     //ЭТО СРАБАТЫВАЕТ НЕЗАВИСИМО ОТ ТОГО КАК  ПРОШЛА АУТЕНТИФИКАЦИЯ
                }
            }
            
        }
    }
}


Код

public partial class AuthenticationForm : Form
    {
        SqlConnection GetDbConnection(string source, string initCat)
        {
                string cnStr =
                string.Format
                ("Data Source={0}; Integrated Security=SSPI; Initial Catalog={1}", source, initCat);
            SqlConnection cn = new SqlConnection();
            //cn.ConnectionString = cnStr.ConnectionString;
            cn.ConnectionString = cnStr;
            return cn;
        }

        bool ValidateUser(string username, string password)
        {
            string tmppwd = "";
            string query = string.Format
                ("Select password From usrpwd where usr='{0}'", username);
            using (SqlConnection curConnect =
                GetDbConnection(this.ServerPath.Text, this.BasePath.Text))
            {
                curConnect.Open();
                SqlCommand cmd = new SqlCommand(query, curConnect);
                SqlDataReader myReader;
                myReader = cmd.ExecuteReader();
                while (myReader.Read())
                {
                    tmppwd = myReader["password"].ToString().Trim();
                }
                if (password.Equals(tmppwd) == true)
                {
                   return true;
                }
                else
                {
                   return false;
                }
            }
        }
        public AuthenticationForm()
        {
            InitializeComponent();
        }
        
        private void LogButton_Click(object sender, EventArgs e)
        {
            if (Login.Text != "" && pwd.Text != "")
            {
                try
                {
                    if (ValidateUser(Login.Text, pwd.Text))                                          //ВЫЗЫВАЮ ФУНКЦИЮ СВЕРКИ ПАРОЛЯ И ЛОГИНА
                    {
                        //Пользователь определён, прогружаю основную форму...
                        MessageBox.Show("User validated! Congratulations!",
                            "Аутентификация", MessageBoxButtons.OK);
                          this.Visible=false;                                                                 //ИДИОТСКАЯ СТРОЧКА это я делаю специально чтобы 
                    }                                                                                                //в предыдущем коде сделать сравнение
                    else
                    {
                        MessageBox.Show("Имя пользователя или пароль не действителен",
                            "Аутентификация", MessageBoxButtons.OK,
                            MessageBoxIcon.Warning);

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Аутентификация",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
            }
            else                         //ДАЖЕ ЕСЛИ СРАБАТЫВАЕТ ЭТО, ТО ОСНОВНАЯ ФОРМА ВСЁ РАВНО ПРОГРУЖАЕТСЯ
            {
                MessageBox.Show("Введите логин и пароль",
                    "Ошибка аутентификации",
                    MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
            }                                                                                      

        }
    }


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

Это сообщение отредактировал(а) ДобренькийПапаша - 15.6.2009, 18:59


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KelTron
Дата 15.6.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Предлагаю так исправить код:
1)
Код

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        AuthenticationForm curF = new AuthenticationForm();
        if (curF.ShowDialog() == DialogResult.OK)
        {
            Application.Run(new MainForm());
        }
    }
}

2)
Код

public partial class AuthenticationForm : Form
{
    private SqlConnection GetDbConnection(string source, string initCat)
    {
        /*SqlConnectionStringBuilder cnStr =
            new SqlConnectionStringBuilder();
        cnStr.IntegratedSecurity = SSPI;
        cnStr.DataSource = source;
        cnStr.InitialCatalog = initCat;
         */
        string cnStr =
            string.Format
            ("Data Source={0}; Integrated Security=SSPI; Initial Catalog={1}", source, initCat);
        SqlConnection cn = new SqlConnection();
        //cn.ConnectionString = cnStr.ConnectionString;
        cn.ConnectionString = cnStr;
        return cn;
    }

    private bool ValidateUser(string username, string password)
    {
        string query = string.Format("Select password From usrpwd where usr='{0}'", username);
        using (SqlConnection curConnect = GetDbConnection(this.ServerPath.Text, this.BasePath.Text))
        {
            curConnect.Open();
            SqlCommand cmd = new SqlCommand(query, curConnect);
            
            string tmppwd = cmd.ExecuteScalar().ToString();
            if (password == tmppwd)
            {
                return true;
            }
            return false;
        }
    }
    public AuthenticationForm()
    {
        InitializeComponent();
    }

    private void LogButton_Click(object sender, EventArgs e)
    {
        if (Login.Text == "" || pwd.Text == "") 
        {
            MessageBox.Show("Введите логин и пароль", "Ошибка аутентификации", MessageBoxButtons.OK, 
                MessageBoxIcon.Error);
            return;
        }
        try
        {
            if (!ValidateUser(Login.Text, pwd.Text))
            {
                MessageBox.Show("Имя пользователя или пароль не действителен", "Аутентификация", 
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            //Пользователь определён, прогружаю основную форму...
            MessageBox.Show("User validated! Congratulations!", "Аутентификация", MessageBoxButtons.OK);
            //this.Visible = false;
            Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Аутентификация", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}


Я тут слегка упростил, хотя можно было бы и ещё, попробуй такой код.



Это сообщение отредактировал(а) KelTron - 15.6.2009, 19:18


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 15.6.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



Application.Run(new MainForm());
срабатывает в любом случае, даже если аутентификация не успешна!

Добавлено через 13 минут и 37 секунд
Мне непонятно вот что... 
Надо что-то вернуть типа переменной-флага (flag) ... дать true

А в основном коде делать сравнение

if(curF.ShowDialog()==DialogResult.OK && flag==true)
{
ApplecationRun(new MainForm())
}

и тогда будет всё нормально я думаю. А как организовать передачу этого флага я не понимаю...(((



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
ДобренькийПапаша
Дата 15.6.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



создал в классе аутентификации 

public bool grant=false;
В функции проверки при верном логине и пароле присваиваю true при неверном false.

теперь делаю цикл и сравниваю. Так всё работает. Но безопасно ли такое поле, фактически выписывающее билет в программу делать public?
И как можно сделать безопасно? Через свойство пойдёт?

Код

       static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (AuthenticationForm curF = new AuthenticationForm())
            {
                do
                {
                    if (curF.ShowDialog() == DialogResult.OK && curF.grant == true)
                    {
                        Application.Run(new MainForm());
                    }
                }
                while (curF.grant == false);
            }
        }



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KelTron
Дата 16.6.2009, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Цитата(ДобренькийПапаша @  15.6.2009,  19:32 Найти цитируемый пост)
Надо что-то вернуть типа переменной-флага (flag) ... дать true


Ну а для чего по твоему нужен DialogResult?

Логика в том, чтобы при успехе закрыть форму и т.к. у кнопки установлен DialogResult.OK, то результат ShowDialog() будет OK.
Если же аутентификация неудачна, то просто не позволить пользователю закрыть форму при нажатии на эту кнопку =>
ShowDialog() не вернёт OK.

А у тебя видимо форма закрывается в любом случае при нажатии на эту кнопку, поэтому и такое поведение...



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
KelTron
Дата 16.6.2009, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Я совсем забыл про особенность этих DialogResult - ов.

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

Код

if (!ValidateUser(Login.Text, pwd.Text))
{
        MessageBox.Show("Имя пользователя или пароль не действителен", "Аутентификация", 
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
}
//Пользователь определён, прогружаю основную форму...
MessageBox.Show("User validated! Congratulations!", "Аутентификация", MessageBoxButtons.OK);
          
// Устанавливаем это свойство при успешной аутентификации и форма закроется с результатом OK 
this.DialogResult = DialogResult.OK;



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 16.6.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 7



Да сделал уже всё))))
Код оптимизировал.
Спасибо за помощь!


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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