![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| shmelina |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
У меня есть базовый класс. От него есть наследники.
В записимости от параметра конструктора мне нужно создавать или базовый класс или кого-то из его наследников. Я сделал отдельную процедуру для этого:
Сейчас пока всего два унаследованных класса, но их будет много. Мне не очень нравится многоэтажная конструкция IF. Есть ли способ попроще? Мне бы хотелось какой-нить константный массив сделать. А в этой процедуре пробегать по маассиву и создавать нужный класс. Нечто подобное я делал, но с рекордами:
Есть идеи? |
||||
|
|||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
вот как то так
Это сообщение отредактировал(а) Frees - 19.6.2009, 14:53 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Зачем вообще эти извращения? передавай в коструктор класс твоего объекта. Класс обявляется так:
Для всех твоих классов объяви, и передавай нужный. Будет что-то вроде:
-------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| shmelina |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Не получается с классами, у которых в конструкторе есть параметры. |
||||
|
|||||
| shmelina |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
В том то и проблема, что мне нужно определить какой класс создавать. Определение получается многоэтажным IF-ом. Этого и хочется избежать и сделать все как-то через массив. Еще раз опишу задачу. 1. Есть некий класс, обладающий стандартной функциональностью. 2. Есть наследники, обладающие измененной функциональностью. 3. Какой именно класс создавать отпределяется неким параметром. Этот параметр передается в конструктор класса (но это не важно). 4. Смущает многоэтажный IF, который я использую для определения того, какой класс создавать.
5. Хочется сделать все как-то через массив. Т.е. пусть в массиве содержится список классов (или конструкторов?) и условий для них. Так это смотрится гораздо изящнее. Ну например так:
А процедура для создания класса - примерно так:
Это сообщение отредактировал(а) shmelina - 25.6.2009, 09:31 |
||||||||||||
|
|||||||||||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
Это сообщение отредактировал(а) cemick - 25.6.2009, 19:18 |
|||
|
||||
| shmelina |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Не совсем понял, что ты хотел сказать, но: 1. Мне не нужно объекты сразу создавать. Одна из причин - может быть создано несколько объектов одного класса. 2. Ты не решил проблему выбора какой именно объект создавать. Опять многоэтажный IF? |
||||
|
|||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
Тебе нужно было хранить классы в массиве, а потом динамически, на основе индекса например, создать объекты, я тебе показал как хранить класс в массиве можно и как создать объект, я не писал код за тебя. Ты же сам хотел что то наподобии:
Это сообщение отредактировал(а) cemick - 26.6.2009, 12:03 |
|||
|
||||
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: 1 Всего: 20 |
shmelina, смотри в сторону RegisterClass, FindClass и будет тебе счастье
разом и от массивов избавишься и от if'ов Добавлено через 9 минут и 56 секунд только учти, что базовый класс должен наследоваться от как минимум от TPersistent -------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| shmelina |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
У меня скомпилировать не получалось это:
Сейчас сообразил сделать так:
Но при попытке создать объект получаю AV. Ошибка в этом месте:
Такое ощущение, что я не правильно создаю класс. Спотыкается на простейшей операции присваивания! Не смотрите, что количество параметров в конструкторе вдруг другое. Я просто перед этим упрощал для вас. Это сообщение отредактировал(а) shmelina - 29.6.2009, 12:27 |
||||||||
|
|||||||||
| cemick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
свойство Owner read only. Передавай его inherited create (AOwner); Это сообщение отредактировал(а) cemick - 29.6.2009, 12:38 |
|||
|
||||
| shmelina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Это мое свойство. Оно не ReadOnly. Думаю если бы оно было ReadOnly, то ошибка была бы не AV, а что-то другое. С многоэтажным IF-ом все работает. А как только я переделываю на массив с циклом - ошибка. |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
может у тебя конструктор потомка не вызывается, а только конструктор родителя?
объяви как то так конструкторы попробуй
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
| shmelina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
У потомков нет констуруктора. Только некоторые функции переопределены.
|
|||
|
||||
| Frees |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
ерунда полная!!! ClassName - это строка а не ссылка на класс!!! Добавлено @ 12:56 пардон не то посмотрел для начала
и еще
паардон если чет не понял запутался я в этом топике Это сообщение отредактировал(а) Frees - 29.6.2009, 12:59 -------------------- Кольцов Виктор Владимирович |
||||
|
|||||
| shmelina |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Это не строка, это TClass.
И ты сам же так предложил:
|
||||
|
|||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
| shmelina |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Не выходит. Компилятор ожидает конструктор без параметров. Оно и понятно. Добавлено @ 13:17 Привожу на всякий случай полную часть кода обсуждаемой проблемы. Есть процедура, которая возвращает нужный класс. Возвращает базовый класс или одного из его потомков. Выбирает какой класс создать через многоэтажный IF. Хочется как-то переделать это через массив. В функции CreateWinTbl часть кода закоментирована. Эта как раз та часть, которая работает. Пытаюсь переделать на работу с массивом.
Это сообщение отредактировал(а) shmelina - 29.6.2009, 13:18 |
||||||
|
|||||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
не дочитал мое сообщение
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
| shmelina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Спасибо! Получилось!
Вопрос, в принципе, был не критичный, но уж очень хотелось его красиво реализовать. Пойду почитаю что такое TClass2 = class of TClass1. Никогда не пользовался. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |