Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102

Открытие формы

21.07.2013, 10:34. Показов 5913. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая. Я пытаюсь открыть форму User сразу после запуска программы. Пишу код в FormCreat главной формы. Выходит ошибка, нельзя обратиться к объекту, который еще не создан.

Пишу так:


C++
1
2
TForm * User= new TForm(this);
User->Show();
Тут создается маленькая пустая форма.

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

Вот как открыть форму User сразу после запуска главной формы MainForm?

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2013, 10:34
Ответы с готовыми решениями:

Открытие (окна) второй формы всегда по центру относительно первой (формы)
Форма №1 - основное окно программы (можно свободно перемещать по экрану). Форма №2 - окно настроек (в нем можно что-то изменить и закрыть;...

Открытие формы
Как сделать так, штоб 9 форма открывалась как первая, тоисть запускалась вначале.

закрытие-открытие формы
можно ли после Form1->Close(); ее как нибудь открыть (нужен именно Сlose(), а не Hide();)

28
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 10:40
Я бы так делал...
C++
1
2
 if (!User) Application->CreateForm(__classid(TUser), &User);
 User->Show();
User.h должна быть включена в MainForm.
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 11:11  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
if (!User) Application->CreateForm(__classid(TUser), &User);
*User->Show();
в таком случае открывается только User. А по ее закрытию закрывается вся программа.

Добавлено через 24 минуты
Цитата Сообщение от Morgan-S23 Посмотреть сообщение
в таком случае открывается только User. А по ее закрытию закрывается вся программа.
Добавил кнопку и написал там
C++
1
2
User->Hide();
MainForm->Show();
главная форма показывается, только вот User не скрывается
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
21.07.2013, 11:14
Если надо открыть существующую, зачем тогда её создавать? Делай просто User->Show(). Причём, скорее всего, надо использовать ShowModal. И вызывать надо после того, как создастся эта форма и основная.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 11:14
вообще с формами лучше не мудрить (это по опыту...), а если мудрить - то осторожно.
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 11:25  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Если надо открыть существующую, зачем тогда её создавать? Делай просто User->Show(). Причём, скорее всего, надо использовать ShowModal. И вызывать надо после того, как создастся эта форма и основная.
прочитайте внимательно тему. Я уже говорил, что при подобном случае возникает ошибка. Нельзя просто так взять и написать
C++
1
User->Show();
в FormCreat.
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
21.07.2013, 11:28
Цитата Сообщение от nick42 Посмотреть сообщение
вообще с формами лучше не мудрить (это по опыту...)
Никаких премудростей. Надо просто чётко понимать, что и где происходит. Открываем файл проекта и видим что-то типа
C++
1
2
3
4
5
6
7
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TUser), &User);
// на данный момент TUser уже создана, можно её показывать,
// но в основной форме ещё только отработал конструктор и FormCreate, не больше
User->ShowModal(); 
Application->Run();
Более того, если TUser - это многострадальная форма авторизации пользователя, то по результатам авторизации можно решить, запускать ли основное приложение
C++
1
2
3
4
5
if( User->ShowModal() == mrOk )
{
  // Приложение не запустится, если что не так 
  Application->Run();
}
Можно убрать TUser из автосоздаваемых форм. Тогда её надо будет создавать самостоятельно. Тогда уже покатит
C++
1
2
3
4
5
6
7
Application->CreateForm(__classid(TMainForm), &MainForm);
TUser * User= new TUser( NULL );
if( User->ShowModal() == mrOk )
{
  // Приложение не запустится, если что не так 
  Application->Run();
}
Короче, фантазии - не меренный край...

Добавлено через 50 секунд
Morgan-S23, ты лучше внимательно почитай, что я пишу. Поверь мне, польза будет
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 11:38
все верно. Просто недавно поднимали вопрос, что вот, мол, когда делаю Close вспомогательной формы, на которой менялись настройки (чекбоксы и проч.), а потом снова ее открываю, то сохраняются предыдущие "манипуляции", а это не надо. Я по инерции и пишу, что вспоиогательную форму лучше пересоздать перед открытием (все, что вы на ней намутили при конструировании, ессно, сохранится). Как-то так...
C++
1
2
3
   if (User3)  { delete User3; User3=NULL; }
   Application->CreateForm(__classid(TUser3), &User3);
   User3->Show();
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
21.07.2013, 11:44
Morgan-S23, если внимательно рассмотреть твой случай, то получим следующее. Ты вообще создаёшь не ту форму в событии FormCreate. Для того, чтобы ты увидел свою User, то надо создавать именно её
C++
1
TUser* User = new TUser( this ); // Если я угадал название типа твоей формы
Можно и не создавать ничего, если эта форма у тебя автосоздаётся. Надо лишь проверить, что она создаётся ДО создания основной формы программы
C++
1
2
3
4
Application->Initialize();
Application->CreateForm(__classid(TUser), &User); // должно быть так
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
Тогда, в событии FormCreate можно смело вызывать
C++
1
User->Show(); // без всякого самостоятельного создания
Причём, так как ты вызываешь просто Show, то только что созданная форма тут же перекроется основной формой приложения, ибо работа FormCreate продолжится...

Добавлено через 5 минут
nick42, вообще, тут может быть несколько подходов. Иногда надо сохранять "манипуляции", иногда нет. Да и постоянное пересоздание часто используемой формы - не самый оптимальный вариант. Совершенно нетрудно предусмотреть метод инициализации, который всё устанавливает как надо. В таком случае, его можно вызвать, если надо всё сбросить в исходное
C++
1
2
Form3->ClearAllFields();
Form3->ShowModal();
или не вызывать, если надо оставить последние манипуляции...
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 11:47
Цитата Сообщение от c0rvax Посмотреть сообщение
тут же перекроется основной формой
почему это? У приложения MainForm только одна; назначить на эту должность можно любую из автосоздаваемых, но только одну, которая и откроется.
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 11:48  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Можно и не создавать ничего, если эта форма у тебя автосоздаётся. Надо лишь проверить, что она создаётся ДО создания основной формы программы
я уже с таймерами решил, но конечно же никакие таймеры не нужны.
У меня было так:
C++
1
2
3
4
5
6
7
8
Application->Initialize();
              
                 Application->CreateForm(__classid(TMainForm), &MainForm);
                 Application->CreateForm(__classid(TSS), &SS);
                 Application->CreateForm(__classid(TForm2), &Form2);
                 Application->CreateForm(__classid(TForm4), &Form4);
                 Application->CreateForm(__classid(TForm5), &Form5);
                 Application->CreateForm(__classid(TUser), &User);
передвинул строчку и все заработало легко и просто.

Всем спасибо, задача решена
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 11:49
короче..
Цитата Сообщение от c0rvax Посмотреть сообщение
фантазии - не меренный край...
С этим полностью согласен.
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 11:59  [ТС]
А как все-таки быть с закрытием? Хочется просто сразу закрыть, а не передвигать, изменять размеры, чтоб не было видно.

Напомню: не закрывается и не скрывается User. После нажатия на кнопку ОК открывается главная форма и должна закрываться форма User.

Добавлено через 3 минуты
Цитата Сообщение от Morgan-S23 Посмотреть сообщение
не закрывается и не скрывается User
добавлю, что после закрытия программы (с главной формы), User остается. Кто тут уже главный?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 12:00
Так "решена задача", али нет? И если нет, то код бы, желательно...
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
21.07.2013, 12:09
Универсальный вариант.
1) Убираем TUser из автосоздаваемых.
2) В событии FormCreate у MainForm пишем:
C++
1
2
3
User = new TUser( this );
User->ShowModal();
delete User;
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 12:11  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Так "решена задача", али нет? И если нет, то код бы, желательно...
Решена, если можно сказать, кривенько.

Главной формой теперь стал User. Полагаю, это из-за манипуляций со сдвигом строчки создания User над MainForm.

Программа работает так:
Открывается User. У него кнопка
C++
1
2
User->Hide();
MainForm->Show();
после нажатия программа полностью закрывается.
Если убрать строчку с Hide, то MainForm открывается. Если нажать на "Выход", то снова возвращаемся к User
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.07.2013, 12:16
пробуйте универсальный вариант камрада cOrvax.
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 12:18  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Универсальный вариант.
1) Убираем TUser из автосоздаваемых.
2) В событии FormCreate у MainForm пишем:
Код C++
1
2
3
4
5
User = new TUser( this );
User->ShowModal();
delete User;
все тщетно.

Может вернуться к способу с таймером?

Принцип такой:
Создается условие, где проверяется, зарегистрировался ли пользователь, если нет, то активируем таймер.
В таймере просто вызываем User и деактивируем таймер. Не проще ли такой вариант?
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
21.07.2013, 12:20
Morgan-S23, вариант абсолютно рабочий. Ищи ошибку
0
 Аватар для Morgan-S23
-26 / 3 / 0
Регистрация: 20.03.2011
Сообщений: 102
21.07.2013, 12:27  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Morgan-S23, вариант абсолютно рабочий. Ищи ошибку
Отнюдь. Я проверил. User захватывает трон и становится родителем. Из-за этого получаются новые сложности.

Сделал с таймером, все работает как часы

теперь точно задача решена окончательно и бесповоротно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.07.2013, 12:27
Помогаю со студенческими работами здесь

Скрытие и открытие формы
Имеется небольшая форма без бордюра и заголовка окна пристыкованная к правой части десктопа. Необходимо сделать чтобы когда убираешь...

Открытие формы по кнопке
Доброго времени суток! Как реализовать открытие формы по кнопке например? Я создаю в проекте ещё одну форму (Project.exe -> Add New...

Открытие формы при запуске
Код, который при открытии формы, проверяет значение из ини. Если оно равно одному, то открывает другую форму, закрывая эту. Вызывает фатал....

Открытие формы из другого проекта
Всем привет. Мне нужно открыть в первом проекте форму, которую я создавал во втором проекте.

Открытие формы на весь экран
Как сделать, чтобы форма выводилась на весь экран, но панель задач была бы видна?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru