2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
||||||
1 | ||||||
Как обращаться к программно создаваемой форме04.03.2015, 16:12. Показов 6785. Ответов 20
Метки нет (Все метки)
Подскажите пожалуйста.
Есть код - создание формы:
Вопрос в следующем: как обращаться к этим формам ? Пробовал по свойству Name: ... FormN.Name ..... но при изменении имени какой-нибудь одной формы, я всё равно могу обратиться к ней по старому имени. В общем это не правильно. Т.е. какое свойство есть у формы, которое позволяет её идентифицировать ? Какие значения получает это свойство при программном создании форм ? Добавлено через 3 минуты Насколько я понял, после просмотра форумов, нужно делать список LIST и хранить имена форм. Еще один вариант - это с классами. Но в объектно-ориентированное программирование пока лезть не хочу (попозже). Как можно решить данный вопрос без ООП.
0
|
04.03.2015, 16:12 | |
Ответы с готовыми решениями:
20
Как обратиться к программно созданной кнопке, на программно созданной форме? Как программно создать объект на другой форме? Как программно послать сообщение форме, о нажатой клавише? Как закрыть окно MessageBox программно в скрытой форме без закрытия программы |
Native x86
5605 / 3348 / 952
Регистрация: 13.02.2013
Сообщений: 10,619
|
||||||
04.03.2015, 16:21 | 2 | |||||
Не имена, а ссылки на них:
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
04.03.2015, 17:15 [ТС] | 3 |
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
04.03.2015, 19:24 | 5 | |||||
Здесь для формы Form2 владельцем (Owner) назначается объект Application. Соответственно, Application содержит сведения о всех компонентах, в том числе и формах, для которых он назначен владельцем.
Пример:
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
04.03.2015, 22:05 [ТС] | 6 |
Mawrat, вы хотели сказать, что обращаться с созданной формой нужно аккуратно, чтобы не задеть других потомков Application ?
0
|
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,471
|
|
04.03.2015, 22:16 | 7 |
Не по теме: Конечно аккуратно, а то вдруг заденешь боком одной формы другую. Поломаешь обе. :) Mawrat имел ввиду, что такой список уже есть. Зачем делать еще один?
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
05.03.2015, 00:10 [ТС] | 8 |
Вот еще такой вопрос.
Если пишем вот так: Создается форма повторяющая Form2. Её Name будет Form2_1. Если создавать далее - Form2_2, Form2_3 и т.д. А если написать вот так: Тогда поле Caption пустое. Что создается в этом случае ? Какое имя у формы ? Или этот код не корректен ?
0
|
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,471
|
|
05.03.2015, 00:34 | 9 |
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
||||||||||||||||
05.03.2015, 09:08 [ТС] | 10 | |||||||||||||||
Согласен, не задал. Но тогда я немного не понимаю. Все таки объясните, что является идентификатором формы при её создании ? Ведь если форма создана и есть на экране, значит у неё должно быть имя или другое свойство, которое даёт на неё ссылку.
Еще раз на примере. Если форма добавлена в проект но автоматически не создается, мы её создаем так:
Теперь поменяем тип переменной FormNew:
Также я пробовал засунуть переменную FormNew в поле Edit (по подобию Memo) чтобы увидеть её значение, но тип FormNew не string. Как посмотреть "идентификатор" (имя) формы ?
0
|
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,471
|
|
05.03.2015, 10:20 | 11 |
Сcылку на вновь созданную форму возвращает конструктор Create.
Имя пользовательской формы задает сама Дельфи в дизайнере. Не надо путать имя сомпонента (TComponent.Name) и имя переменной.
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
05.03.2015, 14:08 [ТС] | 12 |
А тип данных какой тут получается ?
Как бы вывести в Edit или Label эту информацию ?
0
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
05.03.2015, 14:13 | 13 |
Тот самый тип и получается, метод Create которого ты вызвал
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
05.03.2015, 14:40 [ТС] | 14 |
Т.е. в моем случае это тип TForm и просто посмотреть переменную, которая указывает мне на форму, т.е. посмотреть что она из себя представляет - число, строка или что-то другое, не получиться ?
Добавлено через 1 минуту Может есть поле в TForm какое, с таким "идентификатором" формы ? Если сохранять это в TList, как потом посмотреть что хранит TList ?
0
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
05.03.2015, 14:49 | 15 |
Эта переменная FormNew у тебя вполне конкретного типа - TForm.
И содержит она ссылку на объект (класса TForm), который тебе вернул конструирующий метод TForm.Create
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
06.03.2015, 10:28 [ТС] | 16 |
Нашел инфу. Делфи предоставляет нам удобный инструмент. Она ведёт самостоятельно список всех открытых форм. Доступ к этому массиву получить легко. Количество открытых форм – Screen.FormCount. Обратиться к конкретной форме – Screen.Forms[индекс].
http://www.delphi.int.ru/articles/45/ Добавлено через 18 часов 13 минут Вобщето Screen.FormCount не очень подходит. Индекс не всегда будет соответствовать конкретной форме. Пи закрытии формы индексы меняются. Например, закрываем форму 3, её нет, а индекс три есть и принадлежит уже другой форме. Придется делать TList.
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
06.03.2015, 10:50 | 17 |
Так это хорошо, как раз. Потому, что содержимое списка соответствует действительности - содержит ссылки только на существующие формы.
Лучше пользоваться Screen.Forms. Если надо отличать формы по номерам, для этого можно использовать свойство TForm.Tag - в него записывать соответствующие номера.
0
|
2 / 2 / 1
Регистрация: 15.08.2014
Сообщений: 170
|
|
06.03.2015, 10:59 [ТС] | 18 |
тогда нужно следить за соответствием списка и форм, чтобы они не поехали относительно друг друга. Хотя я вывел счетчик в поле Edit и увидел что при закрытии форм (на крестик в шапке формы) он не уменьшается. Может нужно их правильно уничтожать просто ? Какой-нибудь деструктор использовать. Разберусь с этим.
Спасибо за подсказку. Погуглю что за свойство такое и как его использовать.
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
06.03.2015, 11:19 | 19 |
TForm.Tag - это просто целочисленное поле, которое можно использовать для своих нужд. Например, можно записывать порядковый номер, в данном случае.
0
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
06.03.2015, 13:09 | 20 |
Жмаканье крестика на любой форме, кроме главной, по умолчанию не приводит к уничтожению этой формы - она просто становится невидимой и по-прежнему продолжает фигурировать в списке Screen.Forms
Для уничтожения формы следует обработать событие OnCloseQuery, установив в нем параметр Action равным acFree Добавлено через 2 минуты А еще лучше (в XE-линейке) - TObjectList<TMyForm>.
0
|
06.03.2015, 13:09 | |
06.03.2015, 13:09 | |
Помогаю со студенческими работами здесь
20
Как генерировать класс создаваемой формы? Как задать кодировку программно создаваемой html-страницы Как обращаться к PictureBox созданным программно? Как обращаться к элементам созданным программно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |