Страница 1 из 3

ООП и формы

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

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 17:26:39
CynicRus
Если он создан и существует, то он уже готовый объект который забрал свойства родителя. Чтобы он каждый раз обновлял свои свойства, надо его создавать динамически. А не через Application.CreateForm.

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 17:35:10
vada
Проще данные (те что на обеих формах) в отдельный класс вытащить. Там и менять. Хоть из одной формы хоть из другой. Тогда на обеих формах их отображать в актуальном состоянии не составит проблем.
Наследовать форму от формы для таких целей.... Ну как-то покомсомольски. Сам создаешь трудности, сам их преодолеваешь.

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 18:43:22
S_Gur
CynicRus, речь идет о дизайн-тайме. У меня через Application.CreateForm создается только главная форма, все остальные создаются динамически

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

Re: ООП и формы

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

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 21:26:16
S_Gur
DedFrend, так в том-то и дело, что я меняю предка. К сожалению, моя система довольно сложная, не получается полностью прописать предка до создания потомка. Приходится делать всю цепочку наследования, а потом думать, в каком из предков вносить изменения. Все, что я хочу - чтобы потомок видел эти изменения

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 21:41:45
CynicRus
А потомки пересоздаются, когда происходят изменение в предке?

Re: ООП и формы

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

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 22:56:18
CynicRus
В рантайме да по идее. А в дизайн тайме, помнится мне что все потомки применят свойства предка, если форма предка открыта. По крайней мере в 15 году было так при визуальном наследовании. А позже как-то не касался больше.

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 23:00:24
S_Gur
CynicRus, к сожалению, нет. Во всяком случае, далеко не всегда. Бьюсь уже два дня

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 23:03:53
DedFrend
Тут какую-то фигню несут по поводу создания/пересоздания предка. Объект всегда создается такого типа с которым вызывается конструктор (обычно Create). Никаких предков создавать не надо (да и как?).
А значения свойств не наследуются , они просто могут быть равны значению у предка, если потомок их не менял.

Re: ООП и формы

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

Re: ООП и формы

СообщениеДобавлено: 10.09.2019 23:30:51
DedFrend
Если такой умный, зачем вопросы задаешь?

Re: ООП и формы

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

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

Если ты кроме Лазаруса иногда еще юзаешь Дельфи, запусти ее и выполни там тот же алгоритм. И, как говорится, почувствуй разницу

Re: ООП и формы

СообщениеДобавлено: 11.09.2019 01:23:17
CynicRus
Во. Как писал один из разработчиков Лазаря в рассылке, аж в 14 году: перед редактированием предка, необходимо закрыть потомков.

http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-Visual-Form-Inheritance-support-td4038136.html