ООП и формы

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

ООП и формы

Сообщение S_Gur » 10.09.2019 10:14:05

Всем доброго времени суток. Вылез очередной вопрос по Лазарусу. Есть у меня две формы, одна унаследована от другой. Вопрос: что я могу менять в родителе, когда потомок уже создан и существует, чтобы потом эти изменения отразились в потомках - хотя бы после перезапуска среды. Объясняю на только одном конкретном примере. На родительской форме у меня сидит ActionList, в котором были прописаны несколько акций. Потом была создана дочерняя форма, а потом на родительской я часть акций уничтожил. Не буду описывать все манипуляции и эксперименты, скажу только, что в итоге мне пришлось выполнять те же самые действия на дочерней форме - убивать те же самые акции, которые там прекрасно остались. Вполне возможно, что в рантайме все работает правильно, но вносить в дизайн-тайме изменения в родителя получается довольно напряжно - приходится выполнять все те же действия на всех потомках, которых к этому времени может быть уже далеко не один...
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение CynicRus » 10.09.2019 17:26:39

Если он создан и существует, то он уже готовый объект который забрал свойства родителя. Чтобы он каждый раз обновлял свои свойства, надо его создавать динамически. А не через Application.CreateForm.
CynicRus
постоялец
 
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Re: ООП и формы

Сообщение vada » 10.09.2019 17:35:10

Проще данные (те что на обеих формах) в отдельный класс вытащить. Там и менять. Хоть из одной формы хоть из другой. Тогда на обеих формах их отображать в актуальном состоянии не составит проблем.
Наследовать форму от формы для таких целей.... Ну как-то покомсомольски. Сам создаешь трудности, сам их преодолеваешь.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 18:43:22

CynicRus, речь идет о дизайн-тайме. У меня через Application.CreateForm создается только главная форма, все остальные создаются динамически

Добавлено спустя 12 минут 6 секунд:
vada писал(а):Наследовать форму от формы для таких целей...
Для каких именно целей? Цели я вроде бы не описывал. Интересно, каким образом и что можно вытащить в отдельный класс, если (например), есть форма-предок для работы с набором данных, которая содержит кучу методов для перемещения по датасету и редактирования данных, включая меню, тулбары, ActionList, ImageList-ы, методы для поддержки мультиязычности и кучу прочего инструментария, а потом от нее нужно поиметь отдельную форму-потомка для представления этих данных в гриде и отдельную для представления в дереве? А потом от них обоих нужны потомки для работы с конкретными разными наборами данных? С удовольствием выслушаю варианты. Наверное, разработчики и Дельфей и Лазаруса специально для создания трудностей разработчикам сделали при создании новой формы возможность создать наследника от уже существующей в проекте?
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение DedFrend » 10.09.2019 21:15:47

Тут принцип такой: пока ты у наследника свойства не менял - они имеют те же значения, что у предка. Но если ты их поменял, то теперь они будут иметь другие значения, чем у предка (а иначе ты положение наследованной кнопки изменить не сможешь).
Если заглянуть в файл lfm наследника, то можно увидеть что-то вроде
Код: Выделить всё
  inherited MyBtn: TButton // наследована от предка
    Top=100  // новые значения свойств
    Left=50
  end
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 21:26:16

DedFrend, так в том-то и дело, что я меняю предка. К сожалению, моя система довольно сложная, не получается полностью прописать предка до создания потомка. Приходится делать всю цепочку наследования, а потом думать, в каком из предков вносить изменения. Все, что я хочу - чтобы потомок видел эти изменения
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение CynicRus » 10.09.2019 21:41:45

А потомки пересоздаются, когда происходят изменение в предке?
CynicRus
постоялец
 
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 21:48:42

CynicRus, в дизайне - нет. У меня цепочка из 5-ти порожденных друг от друга форм, и в каждой уже прописаны свои изменения. Нужно обязательно убивать потомка из проекта и создавать заново при каждом изменении предка?
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение CynicRus » 10.09.2019 22:56:18

В рантайме да по идее. А в дизайн тайме, помнится мне что все потомки применят свойства предка, если форма предка открыта. По крайней мере в 15 году было так при визуальном наследовании. А позже как-то не касался больше.
CynicRus
постоялец
 
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 23:00:24

CynicRus, к сожалению, нет. Во всяком случае, далеко не всегда. Бьюсь уже два дня
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение DedFrend » 10.09.2019 23:03:53

Тут какую-то фигню несут по поводу создания/пересоздания предка. Объект всегда создается такого типа с которым вызывается конструктор (обычно Create). Никаких предков создавать не надо (да и как?).
А значения свойств не наследуются , они просто могут быть равны значению у предка, если потомок их не менял.
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 23:19:19

DedFrend, уважаемый критик, прежде, чем рассуждать о "фигне", попытайтесь понять, о чем тут идет речь. Для начала. Потом разберитесь в разнице между DesignTime и RunTime - это так, для разнообразия. А потом я с вами с удовольствием побеседую :D
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение DedFrend » 10.09.2019 23:30:51

Если такой умный, зачем вопросы задаешь?
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: ООП и формы

Сообщение S_Gur » 10.09.2019 23:41:45

DedFrend, я, видимо, не тебе их задаю. Предыдущие участники - тот же CynicRus, например, понимают, о чем идет речь. А ты даже не понял намека. Намекну тоньше:

1. Открой Лазарус
2. Создай новую форму - например, TForm1
3. Посади на нее TActionList и создай в нем 2-3 акции
4. Создай форму TForm2 - Меню -> Создать -> Унаследованный от компонента проекта -> Выбрать TForm1
5. Зайди в TForm2 в редактор TActionList и посмотри, что там есть внутри
6. Возвратись на форму TForm1, зайди в редактор TActionList и убей там одну из созданных акций
7. Выполни пункт 5. Если там будут отсутствовать те акции, которые ты убил из TForm1 - возвращайся. Поговорим о фигне

Если ты кроме Лазаруса иногда еще юзаешь Дельфи, запусти ее и выполни там тот же алгоритм. И, как говорится, почувствуй разницу
S_Gur
постоялец
 
Сообщения: 120
Зарегистрирован: 30.12.2018 22:17:42

Re: ООП и формы

Сообщение CynicRus » 11.09.2019 01:23:17

Во. Как писал один из разработчиков Лазаря в рассылке, аж в 14 году: перед редактированием предка, необходимо закрыть потомков.

http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-Visual-Form-Inheritance-support-td4038136.html
CynicRus
постоялец
 
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru