| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Создание объекта от TClass |
| Автор: Budy 20.11.2009, 08:27 | ||
| :Привествую Есть код
При выполнении блока A создается объект класса TObject, при том TBaseCls.Create не выполняется, хотя указан этот класс. Помогите плиз выбрать нужный подход. Для блока A необходимо указать класс, от которого будет создан объект. Я написал обрезанный пример. Строю иерархическое дерево классов, а потому в блоке A не будет известен класс TBaseCls. |
| Автор: cemick 20.11.2009, 10:07 |
| Чт я не понял, а зачем столь хитрый код, использование указателя на класс.. опишите более подробно задачу, что то мне подсказывает, что можно намного проще. |
| Автор: Budy 20.11.2009, 11:13 | ||||||
Хочу написать класс листинга с автоматическим созданием и удалением элементов.
Проблема в следующем. Есть класс
Когда создаю MyList, я должен указать класс, от которого должны создаваться элементы списка. MyList := TBaseList.Create(TMyClass); Потом я создаю список, например вот так: var o : Pointer; o := MyList.Add; TMyObject(o^).SampleProc; Дак вот это самое "чего-нибудь" не происходит. |
| Автор: cemick 20.11.2009, 11:35 |
| Передавать надо ссылку на класс type TMyClassRef = class of TMyClass; |
| Автор: Budy 20.11.2009, 11:43 | ||
хм... |
| Автор: Budy 20.11.2009, 12:13 | ||
Путем усиленных колебаний мозга во всех 8ми направлениях, пришел к такому виду (см.первый код):
Блок try..except..end; будет выдавать ошибку в случае если метод Init в объекте не описан. Как можно проверить существование метода в классе? |
| Автор: Budy 20.11.2009, 12:34 | ||
Разобрался самостоятельно. Всем спасибо за внимание. Если кому интересно, пришел к следующему:
|
| Автор: cemick 20.11.2009, 12:51 | ||
| oh my god... Я бы ваш код переделал так
|
| Автор: Budy 20.11.2009, 13:36 |
| cemick, это тоже хороший способ, подобный мне уже предлагали. Но я выяснил, что при дебаге он не удобен. У меня около ста объектов создается таким образом при старте программы В любом случае спасибо. |
| Автор: Budy 23.11.2009, 06:14 | ||||
Хм... было бы полезно узнать как это сделать.
Привычка работать с памятью привязалась ко мне еще с Pascal'я. Более надеждного и удобного способа управления объектами для себя лично не вижу. |
| Автор: cemick 23.11.2009, 09:45 | ||
Tools->Debuging Options -> Language Exceptions (Это в семерке)
Это не есть плюс, теряется наглядность и прозрачность кода, повышается вероятность ошибки |
| Автор: CodeMonkey 23.11.2009, 16:12 |
| Вообще-то для этих целей есть такая вещь, как виртуальный конструктор и class of. |
| Автор: Budy 24.11.2009, 05:56 | ||
Может у вас есть интересные примеры. Прошу выкладывайте |
| Автор: CodeMonkey 24.11.2009, 12:04 | ||
Да пример-то будет почти так же, как у вас. Только уберите Init, засуньте его код в конструктор и объявите Create виртуальным.
|
| Автор: Budy 24.11.2009, 14:25 |
| CodeMonkey, Init был переписан в связи с условием проверки на post Create. Вобщем, я отделил метод конструктора и метод инициализации объекта. |
| Автор: CodeMonkey 24.11.2009, 15:30 |
Ну и зачем вы это сделали? Мой пример - это один-к-одному ваш код из оригинального вопроса, только с исправленным багом (нет virtual у конструктора) и убранными ненужными указателями (http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html). |