|
|
|
Интерфейсы и самоуничтожение
|
|||
|---|---|---|---|
|
#18+
Это касается приложения типа UniGUI. Сам автор советует использовать интерфейсы. Задача. Создать глобальные списки, использовать их в разных местах программы и не заботиться об их уничтожении. Сразу напишу, что уничтожение объектов в UniMainModule.Destroy делать нельзя, т.к. при перезагрузке страницы может произойти так, что сразу за событием OnCreate выполнится из предыдущей веб-сессии событие OnDestroy. Основное назначение зачем я это делаю - это, чтобы по 100500 раз их (списки) не наполнять, т.к. это списки, которые часто используются в событиях прорисовки таблиц. В общем, получается так, что при закрытии приложения вываливается сообщение об утечках памяти, а их быть не должно. Так вот. В классе есть два объекта (два списка TObjectDictionary). Проблема в том, что интерфейсы не могут иметь поля (переменные VAR), т.е. в интерфейс нельзя вставить TObjectDictionary в виде объекта а-ля VAR или свойства, поэтому пришлось объявить TObjectDictionary как результат функции. Не знаю, правильно ли это, т.е. две функции возвращают эти самые два объекта-списка типа TObjectDictionary. Списки один раз наполняются и используются глобально в разных формах приложения. В конце концов списки должны самоуничтожиться. В конструкторе класса вызываю методы создания и наполнения списков. В деструкторе соответственно уничтожение списков. Ставил бряку внутри Destroy - бряка не срабатывает :( т.е. списки (TObjectDictionary) вместе со своими внутренними объектами не уничтожаются. Так получилось, что интерфейсы до этого момента не приходилось использовать. Вот весь модуль интерфейса и класса: Код: 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. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. вот так использую, это просто для тестирования при старте главного модуля приложения создаю KvxListsStyles Код: pascal 1. 2. 3. 4. 5. 6. Модет быть неправильно то, что сделал TObjectDictionary в виде результата функции? Может надо объявить их как отдельные глобальные переменные? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 01:18 |
|
||
|
Интерфейсы и самоуничтожение
|
|||
|---|---|---|---|
|
#18+
X11, Destroy таки должен быть override. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 01:30 |
|
||
|
Интерфейсы и самоуничтожение
|
|||
|---|---|---|---|
|
#18+
О! Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 10:02 |
|
||
|
Интерфейсы и самоуничтожение
|
|||
|---|---|---|---|
|
#18+
X11 в интерфейс нельзя вставить TObjectDictionary в виде объекта а-ля VAR или свойства X11 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Вместо этой простыни X11 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: pascal 1. 2. 3. 4. 5. 6. код будет абсолютно равнозначный. Ну и еще, чтобы избежать неявной модификации списков, я бы делал так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2020, 15:25 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=52&tid=2038616]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
36ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 307ms |

| 0 / 0 |
