|
|
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Я тут рано порадовался, что в Delphi хорошо написано делегирование. Но не тут-то было... Код: 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. Нужно чтобы AMiddleMan поддерживал IOtherInterface. Можно ли как-нибуть этого добиться элегантным образом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 16:56:29 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админ, так подойдёт? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:32:59 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Uridian, нет, увы. Идея в AMiddleMan в том, что он передается в черный ящик как IBaseInterface , но в некоторых коллбеках мне нужно из него распаковать назад IOtherInterface. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:40:43 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Я или не тот паттерн юзаю, или еще не понял как правильно работать с TAggregatedObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:41:49 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админМожно ли как-нибуть этого добиться элегантным образом? Наследовать TBasicObject от TAggregatedObject? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:48:43 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, вот видимо. Только я не понимаю, что тогда должно быть контроллером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:51:59 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админТолько я не понимаю, что тогда должно быть контроллером То, что реализует IOtherInterface. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:54:07 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админМожно ли как-нибуть этого добиться элегантным образом?Есть. Обновить Делфи http://www.sql.ru/forum/1165959/izmenilsya-sposob-vyzova-ekzemplyar-klassa-dlya-queryinterface ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 17:57:50 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, урра, вышло! Код: 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. 74. 75. 76. 77. 78. 79. 80. всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:04:45 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Есть. Обновить Делфи В данном случае это бесполезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:06:08 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Спасибо! познавательно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 18:09:56 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey_Vasilisk_Есть. Обновить Делфи В данном случае это бесполезно. Самое интересное, что обновление оказалось пагубным. Мой исправленный код стал работать в D2007 (именна эта версия сейчас в продакшане), но в XE 10.2 она не работает. Дейсвительно, если в D2007 при выполнении Код: pascal 1. использовалась TAggregatedObject.QueryInterface -> TExtension.QueryInterface, то теперь почему-то вызывается TDelegate.QueryInterface. Я так понимаю, это то, про что писал _Vasilisk_ по ссылке выше, но не совсем понял, почему это расценивается как исправление старых ошибок. Конечно, я понимаю, какую цель преследовали те, кто сделал изменения (=неизменение поинтера при вызове QueryInterface), но как-то уж совсем криво выходит. Теперь совсем непонятно, какая роль у TAggregatedObject. Пока что я оформил это как багу https://quality.embarcadero.com/browse/RSP-18137. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 22:00:47 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админто теперь почему-то вызывается TDelegate.QueryInterface Измени декларацию: Код: pascal 1. на Код: pascal 1. И всё будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 22:18:33 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Код для обоих версий работает только для аггрегирования через интерфейс. Аггрегирования через класс не работает толком и хз как его сделать нормальным. Код: 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. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 23:03:46 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админ, объясни по русски, что хочешь сделать ИМХО implements было сделано, что бы облегчить выдачу интерфейсов к объектам не реализующим IUnknown. Бага до XE2, включительно, в том, что нарушалось правило приоритетов видимости - нельзя было переопределить в агрегирующем объекте методы для указанного в Implements интерфеса. Даже вручную, что как бы нелогично ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 07:35:54 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyИ всё будет нормально. Спасибо, сам дошел. Про что и написал. Заметил ваш коммент только сейчас. kealon(Ruslan)зеленый админ, объясни по русски, что хочешь сделать Мы уже все перетерли. Не заморачивайтесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 09:53:18 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Народ, как избавиться от утечек памяти? текст программы Код: 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. --------------------------- Unexpected Memory Leak --------------------------- An unexpected memory leak has occurred. The unexpected small block leaks are: 13 - 20 bytes: TDelegate x 1, TBasicType x 1, TExtension x 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 10:48:53 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
UridianНарод, как избавиться от утечек памяти? Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:39:07 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
зеленый админно не совсем понял, почему это расценивается как исправление старых ошибок.QueryInterface должен обладать свойством симметричности. Т.е. если из интерфейса A можно получить интерфейс B, то и из B можно получить A. Когда все интерфейсы реализовываются через один класс - это выполняется, а когда через implements - операция была односторонней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 11:44:36 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, ошибка компиляции E2015 Operator not applicable to this operand type (версия XE7) Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 12:16:54 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, TBasicType ни в каком соку не освобождается... У него же AddRef и Release идет на контроллер - вот только контроллер от силы и освободится. TBasicType нужно освобождать явно. _Vasilisk_QueryInterface должен обладать свойством симметричности. Согласен. При изменении поинтера этого не достичь. Раньше если уже пришел в контроллер аггрегата, то оттуда уже не вернешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 12:18:41 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
Uridianошибка компиляцииПриведите описание конструкторов классов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:16:39 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
" Код: plaintext 1. после чтения документации и практических опытов вывел для себя следующее. Наследники TAggregatedObject должны храниться внутри Controller-а (или Container-а, кому что нравится) именно как классы, а не как интерфейсы. Их жизненный цикл совпадает с жизненным циклом контейнера, и уничтожаться они должны явно Free. При этом, несмотря на то, что, неявное (!) приведение наследников TAggregatedObject к интерфейсам, которые они реализуют, почему-то разрешено компилятором, не следует этим пользоваться для хранения их как интерфейсных ссылок внутри контейнера, поскольку это, (в отсутствие явного Free), приводит к утечкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:40:05 |
|
||
|
Делегирование с расширением
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А зачем такие сложности, как и где это используется? и зачем? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:56:56 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=144&tid=2042306]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 340ms |

| 0 / 0 |
