Как я могу закрыть форму входа и показать основную форму, не закрывая приложение?
Я пытаюсь понять, что если вход прошел успешно, я должен показать основную форму и закрыть форму входа.
У меня есть этот метод в форме входа в систему, который закрывает форму входа в систему при успешном входе в систему. Но основная форма не отображается.
Я попытался скрыть форму входа, если процесс входа прошел успешно. Но меня это беспокоит, потому что я знаю, что пока моя программа работает, форма входа в систему тоже есть, ее нужно закрыть, верно?
Какой для этого должен быть правильный подход? Спасибо.
попробуйте вызвать this.Close () в конце, а не в качестве первой операции — Roberto Conte Rosito
так же закрывается все приложение. — yonan2236
вы можете попробовать main.ShowDialog (); вместо main.Show () ;. он должен работать нормально. поскольку ShowDialog является немодальной формой. — Abu Muhammad
14 ответы
Причина, по которой ваша основная форма не отображается, заключается в том, что после закрытия формы входа в систему насос сообщений вашего приложения отключается, что приводит к выходу всего приложения. В Цикл сообщений Windows привязан к форме входа в систему, потому что это та, которую вы установили в качестве формы запуска в свойствах проекта. Загляните в свой файл «Program.cs», и вы увидите ответственный фрагмент кода: Application.Run(new LoginForm()) . Ознакомьтесь с документацией по этому методу здесь, на MSDN, что объясняет это более подробно.
Лучшее решение — переместить код из формы входа в файл «Program.cs». При первом запуске вашей программы вы создадите и покажете форму входа в систему как модальное диалоговое окно (которое запускается в отдельном цикле сообщений и блокирует выполнение остальной части вашего кода до его закрытия). Когда диалог входа в систему закроется, вы проверите его DialogResult , чтобы узнать, был ли вход в систему успешным. Если это так, вы можете запустить основную форму, используя Application.Run (таким образом создавая основной цикл сообщений); в противном случае вы можете выйти из приложения, вообще не показывая никакой формы. Что-то вроде этого:
не могли бы вы также добавить то, что должно быть написано в форме входа в систему? — р.хамд
@ r.hamd просто установил DialogResult = DialogResult.OK после того, как вы вызовете this.Close () в LoginForm — Фарук
Я бы сделал наоборот.
В событии OnLoad для вашей основной формы отобразите форму входа в качестве диалогового окна. Если результат диалогового окна ОК, разрешите Main продолжить загрузку, если результатом является ошибка аутентификации, прервите загрузку и покажите окно сообщения.
РЕДАКТИРОВАТЬ Образцы кода
Другое решение — показать LogonForm из метода Main в program.cs, примерно так:
В этом примере ваш LogonForm должен будет предоставить свойство LogonSuccessful bool, для которого установлено значение true, когда пользователь ввел действительные учетные данные.
Можно ли также изначально скрыть основную форму. Затем показать это при успешном входе в систему? — йонан2236
но таким образом, если у вас есть какая-то логика в загрузке основной формы, она все равно будет выполнена . и вы меняете формы, показывающие рабочий процесс из других форм . звучит немного грязно и спагетти-программирование. — Давид Пирас
Зачем вообще загружать основную форму до успешного входа в систему? — Коди Грей ♦
1. Когда я делаю форму входа в систему, чтобы она отображалась при загрузке формы. Он по-прежнему показывает основную форму на заднем плане. И когда я добавляю код «this.hide ();». Теперь это работает и выглядит более профессионально. 2. Но когда я смотрю на другой комментарий, другие комментарии не должны выполнять основной процесс формы до тех пор, пока пользователь не войдет в систему, поэтому я использую ваш второй пример кода, и он тоже работает. Спасибо — Анукул Лимпанасил
Это мое решение. Создайте ApplicationContext, чтобы установить основную форму приложения и изменить основную форму, когда вы хотите открыть новую форму и закрыть текущую форму.
Как закрыть главную форму при открытии дочерней?
Обработчик кнопки главной формы которая открывает дочернее окно.
Конструктор дочерней формы
В итоге закрываются обе формы при открытии дочерней.
Ответы (2 шт):
Это зависит от того, как запущено ваше приложение. Если ваше приложение просто ожидает закрытия главной формы — то когда вы её закрываете, происходит выход из приложения, при этом закрываются все остальные формы.
Да и смысл закрывать основную форму? Вы больше к ней не планируете возвращаться?
Если таки вам надо основную форму убрать с экрана, вы можете её скрыть, например, так
Ну, и, например, если после закрытия дочерней формы нужно снова показать главную
Если в Visual Studio создать новый WinForms проект и посмотреть код в файле Program.cs, можно увидеть что приложение запускается вот такой строчкой:
Этот код неявно создает новый экземпляр ApplicationContext, который подписывается у переданной формы на событие FormClosed. Когда возникает событие FormClosed , ApplicationContext вызывает метод Application.ExitThread, который закрывает все окна и завершает приложение.
Можно сделать свой собственный ApplicationContext, что позволяет управлять жизненным циклом приложения по своему усмотрению. Вот такое приложение, например, никогда самостоятельно не завершается, его нужно будет завершать из диспетчера задач.
Для того, чтобы завершить приложение тогда и только тогда, когда закроется самая распоследняя форма, можно использовать свойство Application.OpenForms для проверки наличия хотя бы одной открытой формы.
Теперь главное только следить за тем, чтобы у пользователя была возможность закрыть все формы. Нельзя допускать чтобы последняя форма не имела кнопки в правом верхнем углу и не обрабатывала Alt+F4.
Однако, если применить описанный выше подход в вашем примере, он все равно не сработает.
Вы закрываете вызывающую форму в конструкторе дочерней. В этот момент дочерняя форма все еще не открыта, и Application.OpenForms окажется пустым, что приведет к завершению приложения.
Можно перенести код, закрывающий вызывающую форму в метод OnShown .
А проще сделать так, чтобы вызывающая форма закрывала сама себя.
Метод ShowDialog открывает модальное окно. Оно зависит от родительского окна, и закрывается вместе с ним. Если вызывающая форма это единственное открытое окно на данный момент, она автоматически становится родительской для Form2 . Для того, чтобы разорвать связь с вызывающей формой, показывайте Form2 с помощью метода Show.
Бонус
В описанном сценарии, вам наверняка нет нужды, чтобы форма, которую вы показали первоначально, оставалась висеть в памяти после ее закрытия. Однако, Form1 это локальная переменная метода Main . Ссылка на Form1 будет хранится на стеке до тех пор, пока приложение не завершатся.
Чтобы не создавать локальную переменную, можно изменить MyApplicationContext таким образом, что он будет самостоятельно создавать самую первую форму в своем конструкторе. Например, передать в конструктор не экземпляр формы, а ссылку на метод, который этот экземпляр может создать.
Постскриптум
Идея в том, что приложение начинается с формы ввода логина и пароля, эта форма появляется первой, а значит главная. После нажатия баттона Log In форма ввода логина и пароля исчезает и появляется основное окно.
Как закрыть одну форму и открыть другую в c
При нажатии на кнопку Button, открываем из одной формы Form1, другую форму Form2.
Для Form1:
Unit1.cpp
Unit1.h
Для Form2:
Unit2.cpp
Unit2.h
- C++ Builder
- Button
- Form
- VCL Forms Application
- Windows Application
- Show
- Назад
- Вперёд
- Вы здесь:
- Главная

- Уроки и примеры по программированию С++

- Уроки и примеры программирование на C++ в Builder 6

- Из первой формы Form 1 открыть вторую форму Form2 | Программирование С++