0 / 0 / 0
Регистрация: 30.08.2013
Сообщений: 8
|
|
1 | |
RAD XE3+ Фабрика классов и TObjectList17.08.2020, 13:33. Показов 751. Ответов 3
Метки нет (Все метки)
Добрый день. Посмотрите, пожалуйста, код.
Делал проект в Delphi XE 10.2 Lite (Проект в приложенном архиве). Описание: Я реализую в данном проекте фабрику классов, чтобы можно было в дальнейшем расширять проект. Структура проекта: 1) файл ClassFactory - в нем сама абстрактная фабрика и синглтон. Также в нем менеджер фабрик - его я сделал как нулевой элемент массива FactoryList: TObjectList (на будущее возможно будет несколько менеджеров, потому сразу так сделал) 2) файл ORM - здесь объектно-реляционная модель В этом файле 2 конкретные фабрики и 2 класса, которые они должны создавать. Т.е. фабрика пользователя создает форму пользователя и фабрика документов создает форму работы с документами. 3) Фабрики конкретные (2 штуки) создаются в файле ORM в разделе initialization 4) при отладке поставьте точки останова в файле ClassFactory в constructor TFactoryInterface.Create(id: byte); - конструктор создания фабрики и в function TFactory.registerFactoryInterface(factory_interface: TFactoryInterface): boolean; - здесь фабрики помещаются в массив reg_ifaces менеджера фабрик (нулевой элемента массива FactoryList) В этих двух методах вы увидите как фабрики обе нормально создаются и их ID присваиваются 1 и 2 соответственно - для этого можете в Watch при отладке поместить такие переменные: TFactory(FactoryList[0]).reg_ifaces[0].ID_WINDOW TFactory(FactoryList[0]).reg_ifaces[1].ID_WINDOW 5) как только вы в отладке дойдете до вызова TFactory(FactoryList[0]).OpenWindow(USER_FORM) из основного файла проекта (Project1.dpr - его можете открыть через вкладку Project - View Source), то при вызове этого метода будет вызван методв CreateInstance Фабрики с ID=1. Он вызывает UserForm := TUserForm.Create(Application); После чего ID фабрик почему-то меняются на 1 и 1. бывают и другие значения. Если отладить глубже, то я ушел в отладке в Vcl.Forms. Там на строке 3642 написано: if not InitInheritedComponent(Self, TForm) then - после этого значения ID фабрик почему-то меняются. не знаю почему. raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); 6) как примечание: если вторую фабрику пока вообще убрать, то все окей. и значение первой фабрики сохраняется на протяжении всего цикла работы программа = 1. программа работает.
0
|
17.08.2020, 13:33 | |
Ответы с готовыми решениями:
3
Можно ли в TObjectList добавлять TObjectList-ы? Фабрика классов Фабрика обьектов и названия классов Фабрика классов: ковариантные возвращаемые типы не поддерживаются в управляемых типах |
0 / 0 / 0
Регистрация: 30.08.2013
Сообщений: 8
|
|
17.08.2020, 14:47 [ТС] | 2 |
Все, разобрался. Надо было также создать указатель на вторую фабрику.
Когда остается какая-нибудь ссылочка на объект, то он не удаляется, не обнуляется. Я сделал еще один указатель глобальный, как на первую фабрику, только на вторую. И значения ID остаются
0
|
Модератор
3491 / 2614 / 741
Регистрация: 19.09.2012
Сообщений: 7,976
|
|
17.08.2020, 14:50 | 3 |
Не увидел, где FactoryList создается
0
|
0 / 0 / 0
Регистрация: 30.08.2013
Сообщений: 8
|
|
17.08.2020, 14:59 [ТС] | 4 |
Но если у кого будут предложения по более корректному исполнению кода, то буду рад обсудить
0
|
17.08.2020, 14:59 | |
17.08.2020, 14:59 | |
Помогаю со студенческими работами здесь
4
TObjectList TObjectList Работа с TObjectList Сортировка TObjectList Добавление элемента в TObjectList TObjectList и работа с классами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |