Почему объекты Delphi не могут содержать объекты? Что еще более важно, в чем причина этого ограничения?Почему варианты Delphi не могут содержать объекты?
ответ
Это просто мнение, исходя из моего опыта того, какие варианты могут и не могут сделать.
Если вы поместите в него COM-объект, он будет сохранен в качестве ссылки IDispatch, и, таким образом, любые вызовы методов или свойства, которые вы получите на этом объекте, будут преобразованы в некоторый код, который ищет внутренний DISPID метода/свойство, массив с аргументами метода будет сконструирован, и метод будет вызван через интерфейс IDispatch.
Другими словами, IDispatch обрабатывается для вас, как обычно вам это нужно, но это делается автоматически с помощью компилятора.
Однако для обычных объектов Delphi все становится сложнее. Вы можете использовать RTTI для поиска и вызова опубликованных методов и свойств, но это все. Если у вас есть имя не опубликованного, не виртуального метода, Delphi не может найти для него правильный адрес в вашем методе.
Другими словами, все, что вы могли бы сделать, было бы только провести объект, вы не сможете его использовать. Возможно, они могли бы добавить поддержку только для ее освобождения, но опять же, вероятно, это будет.
Я знаю, что если вы правильно реализуете IDispatch, вы можете безопасно хранить и использовать объект через вариант. У меня есть класс, который можно использовать в качестве базового класса для объектов Delphi, для которого вы хотите это сделать. Он автоматически выведет опубликованные методы/свойства, и вы можете добавить больше, если хотите, через некоторые защищенные вызовы методов. Если есть интерес к такому классу, я могу разместить его где-нибудь.
Но опять же, это через IDispatch, и он использует опубликованные методы, остальное - это ручной код, поэтому поддержка вариантов должна быть встроена в ваши объекты, вами.
Вот почему я думаю, что они только что сказали: это просто вызовет жалобы, что мы можем держать объект, но это просто бесполезно.
Но это только мои мысли. Возможно, у кого-то чиновника есть намного лучший ответ.
Вы можете указать магазин объект внутри переменной Variant - просто введите его в NativeUInt. Во всяком случае, объект является всего лишь указателем.
obj := TObject.Create;
v := NativeUInt(obj);
obj := TSomeObject(NativeUInt(v));
я использовал Варианты для хранения объектов в прошлом, используя внутренние Variant, код что-то вроде этого:
var
MyObject: TMyObject;
Value: Variant;
begin
MyObject:= TMyObject.Create;
TVarData(Value).VType:= VarByRef;
TVarData(Value).VPointer:= MyObject;
- 1. Почему интерфейсы C# не могут содержать поля?
- 2. Почему объекты не могут преобразовываться в строку
- 3. Почему объекты Task не могут использоваться повторно?
- 4. Delphi: Pass TObject в массиве Варианты
- 5. Могут ли спящие постоянные объекты содержать коллекцию других постоянных объектов?
- 6. Почему вложенные гибкие коробки не могут содержать их содержимое?
- 7. Почему интерфейсы java не могут содержать реализации статических методов?
- 8. Почему строки в $ _POST не могут содержать точку "."?
- 9. Почему имена методов api не могут содержать символы подчеркивания?
- 10. Почему вектор stl не может содержать объекты coroutine?
- 11. Delphi 2010 не будет содержать большие значки
- 12. Параметры WCF REST не могут содержать периоды?
- 13. Ошибка веб-журнала Комментарии могут не содержать '-'
- 14. Структурные типы не могут содержать неявные члены?
- 15. Расширения Не могут содержать сохраненные свойства
- 16. Как записи могут содержать курсор
- 17. Почему интерфейсы могут содержать классы в VB .NET?
- 18. Почему логины обычно могут содержать только латинские символы и цифры?
- 19. Почему объекты не могут быть созданы без конструктора?
- 20. Почему объекты конструкторов не могут быть сериализованы в Java?
- 21. Почему объекты Silverlight не могут быть Nullable <> типа?
- 22. Могут ли элементы содержать блоки в bem
- 23. Динамические объекты в delphi
- 24. Объекты Delphi COM многопоточность
- 25. Зачем __all__ содержать только строковые объекты?
- 26. Как использовать варианты массивов в Delphi
- 27. Почему вычисления TDateTime включают варианты?
- 28. Javascript - Попытка содержать объекты внутри динамических свойств
- 29. Сгладить массив объектов, которые могут содержать массивы
- 30. Могут ли ключи доступа AWS содержать запятые?
Вы довольно много прав. Вы также должны указать классы TCustomVariantType и TInvokeableVariantType. Эти классы показывают все, что должен был бы сделать класс, чтобы быть * использованным * (а не только сохраненным) в варианте, без необходимости реализации IDispatch. – 2008-12-14 17:34:00
+1 для Rob: TCustomVariantType и TInvokeableVariantType довольно мощные. Некоторые штрафы за производительность, но которые [могут обойтись с хакерами низкого уровня] (http://blog.synopse.info/post/2011/07/01/Faster-variant-late-binding). – 2013-10-10 06:47:04