Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
60 / 57 / 8
Регистрация: 22.07.2011
Сообщений: 436

Проверить, существует ли форма.

29.03.2012, 13:28. Показов 4702. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При нажатии на кнопку, создаётся форма. Нужно проверить, существует ли она (чтобы при повторном нажатии на кнопку не создалась вторая форма). Естественно можно всё это сделать с FindWindowEx, но просто хочется знать, есть ли альтернатива на билдере?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2012, 13:28
Ответы с готовыми решениями:

Как проверить, существует ли папка?
Как проверить есть ли Каталог E2E2~1 По средствам С++ Builder?

Как проверить, существует ли папка на диске?
Какая команда позволяет проверить (сравнить), существует ли папка по указанному пути на диске, и если да, получить список её файлов.

Как проверить, существует ли дата в календаре? Например, 32 февраля?
Как сделать "защиту от дурака", если в календарь вставляется дата из поля Edit? date1=StrToDate(Edit1->Text + "." +...

21
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.03.2012, 14:49
Проверяйте хендл формы.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
29.03.2012, 18:30
C++
1
2
3
4
5
void __fastcall TForm1::Button1Click(TObject * Sender)
{
  // ваше единичное отображение формы.
  Button1->Enabled = false;
}
Цитата Сообщение от SDmaN Посмотреть сообщение
Естественно можно всё это сделать с FindWindowEx, но просто хочется знать, есть ли альтернатива на билдере?
Есть - вызов функции FindComponent у родителя формы, если не NULL, значит существует. Но вот что рациональней, если использовать именно FindWindowEx сейчас сказать вам не смогу.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2012, 23:31
Проверять указатель на форму, до создания формы он должен быть = NULL.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 18:23
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Проверять указатель на форму, до создания формы он должен быть = NULL.
А Вы не могли бы подсказать как это сделать? Где это нужно впихнуть в моем случае?

C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2 = new TForm2(this);
Form2->Show();
...
}
Спасибо!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 18:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//---------- Создать форму ------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(Form2==NULL) // или просто if(!Form2)
 {
 Form2 = new TForm2(this);
 Form2->Show();
 }
}
//------------- Удалить форму -----------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(Form2!=NULL) 
  {
  delete Form2;
  Form2 = NULL; // Это может быть важным
 }
}
//-----------------------------------------------------------
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 18:37
Avazart,

C++
1
2
3
4
5
if(Form2==NULL)
 {
 Form2 = new TForm2(this);
 Form2->Show();
 }
При таком условии Form2 не создается/не открывается

А ранее Form2 я нигде не инициализирую...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 18:43
Ну указатель у тебя то где то объявлен? вот и обнули его в например конструкторе главной формы
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Form2 = NULL;
}
//---------------------------------------------------------------------------
Но все конечно зависит от кода.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 18:50
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Ну указатель у тебя то где то объявлен?
Ага, разумеется объявлен, но в другом cpp (Form2.cpp):
C++
1
TForm2 *Form2;
Цитата Сообщение от Avazart Посмотреть сообщение
обнули его в например конструкторе главной формы
C++
1
2
3
4
5
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Form2 = NULL;
}
На всякий случай сделал так, но увы - не работает
В чем может быть косяк?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 18:58
По тому наверное что Form2 уже создана, причем после Form1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TForm2 *NewForm;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
NewForm=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(NewForm==NULL)
 {
 NewForm = new TForm2(this);
 NewForm->Show();
 }
}
//---------------------------------------------------------------------------
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 19:10
Avazart, во, а вот так получилось! Огромнейшее Вам спасибо!
А если не трудно, Вы не могли бы разъяснить почему именно так, а не иначе?


Цитата Сообщение от Avazart Посмотреть сообщение
По тому наверное что Form2 уже создана, причем после Form1
Я не очень понял Вы имели в виду, что Form2 создавалась после
C++
1
2
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
?
А почему? И вообще как узнать, когда она создается?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 19:15
Project1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->CreateForm(__classid(TForm2), &Form2); // !!!!!! Тут она создается, но еще не видима
        Application->Run();
    }
//.....
Что бы работало с Form2 надо ее перекинуть
Миниатюры
Проверить, существует ли форма.  
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 19:39
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Что бы работало с Form2 надо ее перекинуть
Да, действительно, после этой операции все заработало тем способом, который Вы предложили изначально. Но хотелось бы понять что эта опция делает - не подскажите?

Я еще пробовал сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TForm2), &Form2); 
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    }
//.....
дабы создавать Form2 до Form1, но вышел (наверное вполне логичный) косячок: первым делом на экране появляется Form2.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 19:43
Если вы посмотрите что произошло в в Project.cpp то строчку
C++
1
 Application->CreateForm(__classid(TForm2), &Form2);
вы не найдете там.
первым делом на экране появляется Form2.
Первым делом создается главная форма
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 20:48
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Если вы посмотрите что произошло в в Project.cpp то строчку
Код C++
1
Application->CreateForm(__classid(TForm2), &Form2);
вы не найдете там.
Ну да, я первым делом туда и посмотрел Вот и хотел у Вас уточнить куда она подевалась и что вообще произошло

Добавлено через 21 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Что бы работало с Form2 надо ее перекинуть
Хм... Все же не могу понять, что происходит после этого перекидывания? Грубо говоря Form2 попадает под юрисдикцию Form1 и... И когда она создается в таком случае?
Просто хочу понять смысл, чтобы в будущем этим оперировать.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 20:54
Хм... Все же не могу понять, что происходит после этого перекидывания? Грубо говоря Form2 попадает под юрисдикцию Form1 и... И когда она создается в таком случае?
Сразу после неё как написано в коде
C++
1
2
Application->CreateForm(__classid(TForm1), &Form1);// Form1->Visible=true;
Application->CreateForm(__classid(TForm2), &Form2); // Form2->Visible=false;
Если второй строчки нет, то не создается...

В первом случае достаточно сделать просто Form2->Show() из Form1 что бы показать её, во втором же случае надо сначала её создавать с помощью new ну и не забыть потом удалить delete
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 22:19
Avazart, спасибо, я понял!

Цитата Сообщение от Avazart Посмотреть сообщение
ну и не забыть потом удалить delete
Кстати говоря, а не подскажите где удалять надо? В каком месте? Ну для того, чтобы потом эту же форму (Form2) опять можно было бы открыть по нажатию кнопки.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 22:30
Что значит эту?
Если её удаляешь, то навеки.Можно создать новую такого же класса(типа)
Либо не удалять, а просто спрятать одним из способов:
Методом
C++
1
Form2->Hide();
или свойством
C++
1
Form2->Visible= false;
А когда надо показать её.

А удаляют формы тогда когда они больше не нужны в программе можно например в OnClose формы 1
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
21.04.2012, 22:35
Avazart, да про прятки-то понятно...

Цитата Сообщение от Avazart Посмотреть сообщение
Можно создать новую такого же класса(типа)
Н каждый раз создавать форму - это, наверное, не совсем правильно, да?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 22:37
Все зависит от того насколько часто она используется. Если часто, то да легче хранить её в памяти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2012, 22:37
Помогаю со студенческими работами здесь

ini - файлы. Как проверить, существует ли группа с определенным именем?
Как можно с помощью расширения <inifails.hpp> проверить, существует ли группа, зная ее название. Допустим у меня есть переменная str, в...

Проверить открыта ли форма
Мне нужно после нажатия одной кнопки проверить открыта ли форма и если да то закрыть если нет открыть, форма дочерняя. Как это реализовать?

Как проверить, существует ли форма?
сабж собственно конкретно надо проверить была ли уже создана подформа в форме

Проверить, существует ли каталог, и если не существует - создать
Как средствами VB6 проверить существует ли каталог, и если не существует - создать? DName$ = "C:\111" If Dir(DName$) <>...

Проверить, существует ли папка
Господа, как проверить, существует ли папка? Про PathFileExists я знаю, но A path specified by Universal Naming Convention (UNC) is...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru