
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
03.10.2018, 18:43
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
Можно ли создать объект по типу, записанному в строке? Что-то вроде Код: pascal 1. только тип данных, к примеру, считан из файла. Понимаю, что можно перебирать через условие и создавать объекты по совпадению с определенным типом, но интересует, есть ли возможность сделать это без кучи условий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 18:58
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_newПонимаю, что можно перебирать через условие и создавать объекты по совпадению с определенным типом, но интересует, есть ли возможность сделать это без кучи условий. Нельзя. Но с RegisterClass ты можешь спрятать этот перебор под ковёр. Для большинства современных программистов этого хватает. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 19:04
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
03.10.2018 18:43, aXS_new пишет: > Можно ли создать объект по типу, записанному в строке? можно конечно. но все возможные классы которые ты попытаешься создать должны быть зарегистрированы в аппликации. почитай про Class of... и как его едят. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 19:10
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
Можно, так работает сериализация/десериализация Код: pascal 1. 2. 3. 4. 5. Естественно надо понимать что конструкторов может быть несколько, поэтому такие дела лучше указывать через атрибуты, например какой конструктор будет использоваться при автоматическом создании, чтобы автоматически подставить параметры. Из нюансов требуется полный путь к типу, т.е. с указанием имени модуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 19:59
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
X-Cite , вот именно десериализацию и пытаюсь сделать. Но проблема такая: есть поле типа "TList<TMyClass>", и параметр className (получаю через TRttiContext) содержит такую строку: "TList<main.TMyClass>", вот и думаю, как, во-первых, все это преобразовать в TList<TMyClass> и, во-вторых, записать в него полученные из сериализованной строки объекты класса "TMyClass". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 20:02
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
Опять люди свой компилятор пишут. И зачем все так усложнять? Неужели перебором из N вариантов классов сделать было нельзя? Работать будет проще, предсказуемей и надежней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 20:16
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_new X-Cite , вот именно десериализацию и пытаюсь сделать. Но проблема такая: есть поле типа "TList<TMyClass>", и параметр className (получаю через TRttiContext) содержит такую строку: "TList<main.TMyClass>", вот и думаю, как, во-первых, все это преобразовать в TList<TMyClass> и, во-вторых, записать в него полученные из сериализованной строки объекты класса "TMyClass". Зачем преобразовывать? Для сериализации корректно указывать полные имена классов - через имя модуля. Т.к. в разных модулях (читай неймспейсах) могут быть классы с одинаковым именованием. Откуда десериализатору узнать какой использовать без указания модуля (неймспейса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 21:30
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_new, Создай Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 22:26
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
Всем спасибо за помощь, понемногу разбираюсь. X-Cite , есть одна проблема. Пишу так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. И при запуске программы появляется ошибка памяти "Access violation". Может быть, что-то не так делаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 23:44
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_newВсем спасибо за помощь, понемногу разбираюсь. X-Cite , есть одна проблема. Пишу так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. И при запуске программы появляется ошибка памяти "Access violation". Может быть, что-то не так делаю? Если метод Create - это конструктор, то в Invoke надо передавать не экземпляр объекта, а класс. т.к. у вас десериализация, то передавать явно TList<TMyClass> нельзя, надо через метаданные Rtti как ниже... Код: pascal 1. 2. 3. 4. 5. Естественно надо везде делать 100500 проверок, есть ли метод, конструктор ли он, вернулось ли значение, найден ли тип и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2018, 23:52
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_newВсем спасибо за помощь, понемногу разбираюсь. X-Cite , есть одна проблема. Пишу так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. И при запуске программы появляется ошибка памяти "Access violation". Может быть, что-то не так делаю?радуйся, тебе повезло что свалилось сегодня у тебя, а не завтра у пользователя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 09:48
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
X-Cite , спасибо. Но проблема еще и в том, что "asObject" возвращает объект класса "TObject", и компилятор выдает ошибку: "Incompatible types". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 09:55
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_newМожно ли создать объект по типу, записанному в строке? Можно, собственно так всё и работает. По тексту их DFM создаётя форма и все компоненты на ней. Курить TReader.ReadComponent до просветления и забыть про бесовщину - TRttiContext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 09:58
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
DimaBr , буду благодарен за разъяснения по поводу греховности использования TRttiContext. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 10:39
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
Контекстов до Delphi 2010 этого не существовало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 10:45
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
DimaBraXS_newМожно ли создать объект по типу, записанному в строке? Можно, собственно так всё и работает. По тексту их DFM создаётя форма и все компоненты на ней. Курить TReader.ReadComponent до просветления и забыть про бесовщину - TRttiContext Не надо боятся RTTI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 11:48
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_new X-Cite , спасибо. Но проблема еще и в том, что "asObject" возвращает объект класса "TObject", и компилятор выдает ошибку: "Incompatible types". Если у вас переменная obj конкретного типа, то тогда вместо AsObject, AsType<TList<TMyClass>>() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 12:09
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
X-Cite , но тип-то записан в строке, таким образом сделать не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 12:34
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_new X-Cite , но тип-то записан в строке, таким образом сделать не получится. Так он же переменную объявил как-то... Если он ее объявил как var obj: TList<TMyClass> значит в этом контексте кода он знает про него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 13:14
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
X-Cite , в том и дело, что переменная в моем случае - свойство класса, к которому обращаюсь через rtti, и таких свойств может быть много, а имена типов считываются в строку. То есть, написать "TList<TMyClass>" не могу, так как на этом месте может быть стоять и любой другой тип: "TMyClass", "TMyClass2", "TList<TMyClass2>" и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 14:13
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_new X-Cite , в том и дело, что переменная в моем случае - свойство класса, к которому обращаюсь через rtti, и таких свойств может быть много, а имена типов считываются в строку. То есть, написать "TList<TMyClass>" не могу, так как на этом месте может быть стоять и любой другой тип: "TMyClass", "TMyClass2", "TList<TMyClass2>" и т.д. Так а в чем проблема через Rtti в свойство записать значение? Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 18:20
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
X-Cite , проблема в том, что типы данных могут быть разными, в том числе, и "составными". Вот, как пример: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. По этому классу прохожу при помощи rtti. Допустим, с простыми свойствами дела обстоят лучше, можно обратиться к их конструктору при помощи описанного вами метода. А со свойством "FC: TList<TClassC>" как раз, трудности. Сначала нужно создать сам объект: TList<TClassC>, затем - в цикле записать в него элементы: FC[i]: TClassC. Вы привели много хорошего кода, но как сделать это, я так и не понял. В итоге, в любом случае, наталкиваемся на то, что имя класса доступно только в строковом виде, а ситуация требует указателя на тип. Если подскажете, как это реализовать применительно к моему примеру, буду очень благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 18:51
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
ЖЕСТЬ !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 18:57
|
|||
|---|---|---|---|
|
|||
Cоздать объект по типу, записанному в строке |
|||
|
#18+
aXS_newа имена типов считываются в строкуА зачем вы так делаете? Работайте с TRttiType ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2018, 19:14
|
|||
|---|---|---|---|
Cоздать объект по типу, записанному в строке |
|||
|
#18+
вот за 10 минут на коленке набросал... конечно надо делать все красиво с кешированием типов, объектов, узлов xml и т.п. чтобы не вычислять их каждый раз... Но для понимания сути достаточно... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&tablet=1&tid=2040312]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 485ms |

| 0 / 0 |
