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

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

29.03.2012, 13:28. Показов 4755. Ответов 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru