Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13

Как узнать какая форма открыта?

17.11.2019, 15:33. Показов 5733. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим у меня в программе 10 форм Form1, Form2 и т.д. и например открыты 1, 3, 6, 8 формы, как узнать какие формы открыты и какая из них находится поверх остальных и имеет фокус (или оно активно)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2019, 15:33
Ответы с готовыми решениями:

Как узнать открыта ли определенная форма
Есть две формы. На ВТОРОЙ форме определенные действия должны происходить ТОЛЬКО в том случае, если первая форма ТОЖЕ открыта. Вот...

Как узнать, с какой формы открыта форма, активная сейчас
есть 3 формы Form1, Form2, Form3 На этих формах есть кнопка Adotable1.Append; frmDob.Caption:='Добавление'; ...

Как узнать, с какой формы была открыта (Form*.ShowModal:) текущая форма
Доброго всем времени суток! Помогите, пожалуйста решить одну задачку: Проект для расчёта времени изготовления деталей (это так... для...

20
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
17.11.2019, 15:56
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
как узнать какие формы открыты
Screen.Forms
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
и какая из них находится поверх остальных и имеет фокус (или оно активно)?
Screen.ActiveForm
1
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
17.11.2019, 16:16  [ТС]
Verevkin, Спасибо, но у меня почему-то отображает все формы которые есть в программе, хотя открыта только одна. Делал вот так:
Delphi
1
2
for i := 0 to Screen.FormCount - 1 do
Memo1.Lines.Add(Screen.Forms[i].Caption);
Или я сделал неправильно?
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
17.11.2019, 16:23
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
Спасибо, но у меня почему-то отображает все формы которые есть в программе, хотя открыта только одна.
Этот список содержит все формы, которые созданы на данный момент. Видно их или нет - не имеет значения.
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
17.11.2019, 16:50  [ТС]
Verevkin, А как тогда показать только те которые открыты?
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
17.11.2019, 16:56
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
А как тогда показать только те которые открыты?
У них жэж есть свойства Visible и WindowState.
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
19.11.2019, 10:47
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
у меня почему-то отображает все формы которые есть в программе, хотя открыта только одна
Цитата Сообщение от Verevkin Посмотреть сообщение
Этот список содержит все формы, которые созданы на данный момент
Замечу, что не очень комильфо создавать сразу все формы при старте приложения. Лучше по мере необходимости (в БОЛЬШИНСТВЕ случаев). а у тебя, видимо, опция Автосоздания форм включена
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
19.11.2019, 13:25
Цитата Сообщение от DenNik Посмотреть сообщение
Замечу, что не очень комильфо создавать сразу все формы при старте приложения. Лучше по мере необходимости (в БОЛЬШИНСТВЕ случаев). а у тебя, видимо, опция Автосоздания форм включена
Не могу не согласиться, коллега.
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
20.11.2019, 17:26  [ТС]
DenNik, Verevkin, Да все формы автоматом создавались. Нашел где-то тут на форуме код как создавать формы динамически и создаю их вот так:
Delphi
1
2
3
Forma := TForm.Create(Form1);
...
Forma.ShowModal;
Еще перед созданием и показе динамической формы у меня такой код:
Delphi
1
2
if IsIconic(Application.Handle) then
    Application.Restore;
Сделано это потому что перед показом формы производятся еще некие действия и иногда они могут по пару минут выполнятся и программу могут свернуть в это время, без этого кода открывается только динамическая форма а сама программа остается свернутой и когда щелкаю на иконку в панели чтобы развернуть (восстановить) главную форму то она показывается по верх динамической и при этом в главной форме все элементы становятся активными хотя динамическая форма открывается как ShowModal, а с этим кодом при показе динамической формы программа восстанавливается полностью и ни каких проблем нет. Так вот к чему я это, у меня из динамической формы создается еще одна динамическая форма и тоже ShowModal и в тех же целях что описал я вставляю этот же код:
Delphi
1
2
if IsIconic(Application.Handle) then
    Application.Restore;
Но программа на этот код вообще не как не реагирует! Почему? На простой форме все работает прекрасно, а вот на динамической нет. Как решить тогда эту проблему?
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
20.11.2019, 18:40
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
Но программа на этот код вообще не как не реагирует! Почему? На простой форме все работает прекрасно, а вот на динамической нет. Как решить тогда эту проблему?
покаж кот
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
20.11.2019, 19:16  [ТС]
Verevkin, Так я уже его написал, если подробнее то так:
Код главной формы не динамической:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm2;
begin
... // Тут код который выполняется перед созданием формы он не как не влияет на это, так как пробовал без него
if IsIconic(Application.Handle) then
    Application.Restore;
Forma := TForm2.Create(Form1);
... // Тут код который выполняется перед показом формы он не как не влияет на это, так как пробовал без него
Forma.ShowModal; 
end;
Код динамической формы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm2.Button1Click(Sender: TObject);
var
  Form: TForm3;
begin
... // Тут код который выполняется перед созданием формы он не как не влияет на это, так как пробовал без него
if IsIconic(Application.Handle) then
    Application.Restore;
Forma := TForm3.Create(Form2);
... // Тут код который выполняется перед показом формы он не как не влияет на это, так как пробовал без него
Forma.ShowModal; 
end;
В первой кнопке все работает отлично а во второй кнопке это:
Delphi
1
2
if IsIconic(Application.Handle) then
    Application.Restore;
вообще игнориться.
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
20.11.2019, 19:30
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
вообще игнориться.
Да не игнорится, а просто функция возвращает false, ёмаё.
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
20.11.2019, 19:52  [ТС]
Verevkin, Ну понятно что возвращает false, просто написал что игнориться. А почему не работает то код? Как победить его?
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
20.11.2019, 20:34
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
А почему не работает то код? Как победить его?
Код работает правильно. Не надо его побеждать. Но если очень хочется, не вызывай IsIconic().
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
20.11.2019, 20:58  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Код работает правильно.
Я не спорю что он работает не правильно, я же писал что на простой форме он отрабатывает нормально а на динамической почему-то нет, вот мне и интересно почему?
Цитата Сообщение от Verevkin Посмотреть сообщение
не вызывай IsIconic()
Verevkin, Как тогда определить что программа свернута?
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
20.11.2019, 21:10
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
я же писал что на простой форме он отрабатывает нормально а на динамической почему-то нет
Не на динамической, а на модальной. Когда открыто модальное окно, имхо, программа считается несвёрнутой. Логично, не?
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
Как тогда определить что программа свернута?
ХЗ. Тебе виднее: тыжпрограммист.
Кликните здесь для просмотра всего текста
0
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
20.11.2019, 21:21
Наверняка можно избавиться от модальных окон, и так будет правильнее в целом. Тем более, если там выполняются длительные операции.
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 13
21.11.2019, 13:49  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Когда открыто модальное окно, имхо, программа считается несвёрнутой. Логично, не?
Verevkin, Ну я же описал ситуацию, что например ее могут свернуть до появления модального окна. Ну и программа когда свернута но модальное окно еще не открыто она считается свернутой? По-моему тоже логично. А когда окно модальное открывается то программа то не разворачивается, вот если бы программа разворачивалась при открытии модального окна тогда да можно считать что программа не свернута.
Цитата Сообщение от Verevkin Посмотреть сообщение
ХЗ. Тебе виднее: тыжпрограммист.
Не смешно. Если вы не заметили вопрос был задан в разделе "Delphi для начинающих", если бы я знал как это реализовать не задавал бы вообще тут никаких вопросов.
Цитата Сообщение от AzAtom Посмотреть сообщение
Наверняка можно избавиться от модальных окон, и так будет правильнее в целом.
Модальные окна нужны для того чтобы на предыдущей форме нельзя было что-то делать пока не закончат работу с тем что находится на модальном окне. Да даже если сделать окна не модальными то при его показе все равно код не срабатывает и программа не разворачивается, точно так-же как и с модальным окном.
0
Злостный нарушитель
 Аватар для Verevkin
10297 / 5720 / 1268
Регистрация: 12.03.2015
Сообщений: 26,494
21.11.2019, 14:12
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
Ну я же описал ситуацию, что например ее могут свернуть до появления модального окна. Ну и программа когда свернута но модальное окно еще не открыто она считается свернутой? По-моему тоже логично. А когда окно модальное открывается то программа то не разворачивается, вот если бы программа разворачивалась при открытии модального окна тогда да можно считать что программа не свернута.
Я за это ответственность не несу, не я это придумал.
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
Если вы не заметили вопрос был задан в разделе "Delphi для начинающих", если бы я знал как это реализовать не задавал бы вообще тут никаких вопросов.
Вопрос был "Как узнать какая форма открыта?". Какого МПХ мы тут WinAPI обсуждаем?
0
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
21.11.2019, 14:26
Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
чтобы на предыдущей форме нельзя было что-то делать пока не закончат работу с тем что находится на модальном окне.
Легко и просто. Посадить на панель все элементы, которые нельзя трогать при открытом другом окне и когда надо сделать
Delphi
1
Panel1.Enabled := false;
И тогда не получится нажать ни на какие элементы на панели.

Цитата Сообщение от PlotnyyArbuz Посмотреть сообщение
даже если сделать окна не модальными то при его показе все равно код не срабатывает и программа не разворачивается,
Логично - если на экране есть окно от программы, значит, программа не свёрнута и потому не может развернуться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2019, 14:26
Помогаю со студенческими работами здесь

Узнать с какой формы открыта текущая форма
Нужно узнать с какой формы, был осуществлен переход на текущую форму. т.е. что то типа Sender, но Sender возвращает текущую форму (((

Можно ли узнать, какая папка была открыта в проводнике в момент нажатия горячих клавиш?
например у меня есть на рабочем столе ярлык для запуска моей проги или батника. у ярлыка есть горячие клавиши. Вот я нахожусь в проводнике...

Как проверить открыта или закрыта форма, открытая НЕ модально?
Здравствуйте. Есть две формы: Form1 (главная форма) и Form2 (открывается из первой НЕ модально). На Form1 нужно произвести...

Как определить, что открыта панель Персонализации и завершить её, если она открыта?
Я понимаю, что необходимо узнать Hendle окна. Но как узнать хэндл Панель управления\Все элементы панели управления\Персонализация???...

Как узнать - открыта ли форма?
То есть например мне нужно при изменениях в одной форме обновлять список в другой, но только если она в данный момент открыта.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru