|
|
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Я пытаюсь написать бота. Больше нужна идея, нежели код и пример, но и примеры тоже будут полезны. Важно, чтобы в итоге код получился легко масштабируемым, чтобы можно было легко добавлять обработчики (процедуры) новых команд. Я так понимаю, что нужно создать какой-то список, где будет ключ: команда боту /start, /find, /найти, /Ещё что-то) и значение: название, соответствующей этому ключевому слову процедуре. Не писать же в процедуре входящих команд 100500 IF`ов? Дженерики почти никогда не использовал. Использовал что-то простое для строк и объектов или чисел. Буду благодарен за примеры и идеи. Хоть как это правильно объявить, с чего начать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 12:33 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
что-то типа Код: pascal 1. 2. чтобы можно было потом подставить название процедуры в качестве параметра и как это потом использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 12:45 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11что-то типа Код: pascal 1. 2. чтобы можно было потом подставить название процедуры в качестве параметра и как это потом использовать? type TMyProc = function(const Command: string): string; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 12:47 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Внутри секции ptivate пишу Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. так? даже если разное количество параметров у процедур будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:07 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11 Код: pascal 1. в итоге ругается компилятор Incompatible types: 'regular procedure and method pointer' Так правильно? Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:18 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, TMethod и Invoke на вскидку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:24 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
ziv-2014, ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:48 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Лучше уж добавлять обработку команд через о дельный метод: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:54 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, а дальше? пока не понял идеи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 13:58 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
и вообще, в обработчик ведь надо параметры разные передавать. Поэтому сначала надо определиться с форматом этих параметров. Например, в виде json-строки. Type TBotWorker = procedure(const AParams: string); После чего получится Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 14:01 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, я пока не знаю, какие будут параметры и какого типа. Мало того, заранее неизвестно, что напишет пользователь боту. Это может быть не только команда, но и простой текст, которые придётся распарсить и понять - какую процедуру обработки вызвать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 14:03 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Внутри секции ptivate пишу Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. так? даже если разное количество параметров у процедур будет? Уже давно пора писать Код: pascal 1. И там неважно что будет тогда, метод, процедура или анонимная процедура ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 14:28 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-Cite Код: pascal 1. Тогда как объявить словарь? Вот сделал так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Получаю ошибку при компиляции: Incompatible types: 'TProcedure' and 'TfmXXX.TBotProcRef' Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 15:27 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
А если словарь объявлять так: Код: pascal 1. 2. 3. 4. 5. 6. То тогда придётся объявлять несколько разных словарей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 15:35 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Навскидку Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 15:47 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Я пока думаю, что всегда будет один параметр, т.е. в качестве этого одного параметра будет входящее написанное пользователем сообщение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 15:51 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11А если словарь объявлять так: Код: pascal 1. 2. 3. 4. 5. 6. То тогда придётся объявлять несколько разных словарей Ладно, продолжаю тормозить rcvMessage - метод ресивера, который срабатывает при входящем сообщении Код: pascal 1. 2. 3. 4. И как запустить на выполнение cmdStart? Сейчас объявлено так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 15:57 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11 Код: pascal 1. 2. здесь я ошибся, нужно подставлять имена реальных процедур Код: 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. и как теперь выполнить cmdStart, в котором живёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:04 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Да, работает, бот получил эти 2 команды и запустил нужные процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:06 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#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. Полностью реализация: Код: 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. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:20 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, это тя прямо сейчас написал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:23 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, ога... дфм форму не прикладываю, она там простая - кнопка и поле для ввода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:25 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Ага, спасибо. Значит, я шёл в нужном направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2018, 16:31 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Не смог найти. Поэтому вопрос. А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам? Код: pascal 1. Или нужно самому пилить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:40 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, Надо TCustomEqualityComparer.GetHashCode и Equals - переопределить и вуаля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:47 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Ну и TCustomEqualityComparer.Create -> указать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:49 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:49 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Ну т.е. написать СВОИ методы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:50 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, Ну да, пишешь GetHashCode - с Upper вначале - и получаешь регистронезависимость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:52 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Откуда то со Стэка... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 16:53 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Где-то я стормозил. Пишу: объявил Код: pascal 1. 2. 3. 4. 5. 6. реализация Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Создаю словарь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. /start выполняется /Start - не выполняется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:07 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, CustomEqualityComparer - а создать его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:12 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
точно но... вижу, что моя GetHashCode выполняется, а моя Equals - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:20 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, А нафига, он кстати при добавлении будет выполняться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:22 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
GetHashCode выполняется, когда в словарь добавляю Код: pascal 1. 2. а потом ещё, когда приходит боту команда "/ S tart" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:25 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
zinpubX11, А нафига, он кстати при добавлении будет выполняться ? а я откуда знаю? я ж его не заставляю, видать разработчики дельфи так захотели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:26 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Пришлось переделать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. т.е. сперва приводим к нижнему регистру. Теперь работает. Так правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:28 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Пошарился, по сети, вижу, что я не одинок http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=28868 тоже кто-то переделал GetHashCode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:29 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, Ну как-то так... Единственное хэш, как-то по другому надо теперь получать THash.BobJenkins.GetHash - как-то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:29 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Странно, что разработчики Delphi не сделали это сами, заранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:30 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
zinpubX11, Ну как-то так... Единственное хэш, как-то по другому надо теперь получать THash.BobJenkins.GetHash - как-то так... Да, за такие подсказки разработчикам спасибо. 'BobJenkinsHash' is deprecated: 'Use System.Hash.THashBobJenkins.GetHashValue' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:32 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, Всё проще -- AnsiLowerCase перед добавлением/проверкой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:34 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDiX11, Всё проще -- AnsiLowerCase перед добавлением/проверкой... Настоящие герои всегда идут в обход ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:36 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Странно, что разработчики Delphi не сделали это сами, заранее. А не стоит ли задуматься, что если ради какой-то своей фичи приходится ТАК извращаться и лезть в самые дебри -- то что-то пошло не так и надо пересмотреть подход к решению своей проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:37 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, Это если не надо хранить оригинал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:37 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Я делаю примерно так же, как и пример у Jadi +- Только пример с формами (TForm). Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:46 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Не смог найти. Поэтому вопрос. А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам? Или нужно самому пилить? Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 17:52 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Valery_BX11Не смог найти. Поэтому вопрос. А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам? Или нужно самому пилить? Код: pascal 1. я пробовал Ordinal - он регистразависим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 19:41 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 20:29 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, смотри создание TPersistentClassDictionary в System.Classes.pas или как тебе Valery_B посоветовал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 21:21 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-Cite, не это почти то же самое, только с использованием лямбла-функций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:31 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Valery_BX11Не смог найти. Поэтому вопрос. А есть ли у Delphi встроенный способ создать словарь с регистронезависимым (case-insensitive) поиском по ключам? Или нужно самому пилить? Код: pascal 1. Не понял... недавно использовал именно TIStringComparer.Ordinal и регистронезависимость не работала, а теперь работает ок. наверное я где-то ещё обшибся. спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:33 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Valery_Bпропущено... Код: pascal 1. я пробовал Ordinal - он регистразависим Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:46 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:54 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Не понял... недавно использовал именно TIStringComparer.Ordinal и регистронезависимость не работала, а теперь работает ок. наверное я где-то ещё обшибся. спасибо Ок. По теме - не создавай функции/процедуры, а создавай классы. Как было предложено ранее: Код: pascal 1. 2. 3. 4. 5. 6. С таким кодом, будет гораздо проще работать и понимать. Ты всегда можешь инициализировать класс так, как нужно тебе в конкретном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:57 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Valery_B, да верю, я верю, уже перепроверил и убедился, что ты прав. Я не знаю, что не так у меня было в пенрвый раз, почему не сработало. Я именно с TIStringComparer.Ordinal и начинал. вот и в справке написано:Возвращает объект TStringComparer, который выполняет сравнение строк с учетом регистра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:57 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Не понял... недавно использовал именно TIStringComparer.Ordinal и регистронезависимость не работала, а теперь работает Вру. Скорей всего я "TIStringComparer.Ordinal" хотел использовать, но не использовал, т.к. полез в справку, а там написано, что - зависит от регистра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:59 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Я не знаю, что не так у меня было в пенрвый раз, почему не сработало. Я именно с TIStringComparer.Ordinal и начинал. Такое у всех было) Потому что ты делал это в большом проекте, и тестировал не в тех местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 09:59 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Лол, чудаки из эмбы свою справку так и не исправили -- до сих пор стоит текст про регистрозависимость: http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Generics.Defaults.TIStringComparer.Ordinal Тогда как в коде там AnsiLowerCase используется (т.е. не зависит от регистра): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 10:05 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, Ха, прикольно... Ребята жгут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 10:14 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Кстати, если правильно помню, то использование такого словаря приводило к утечке памяти в одной из версий делфи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 12:08 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Неужели две конвертации строк и бинарное сравнение быстрее непосредственного сравнения без учета регистра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 10:26 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Василий 2, А что такое "непосредственное сравнения без учета регистра" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 10:40 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
zinpubВасилий 2, А что такое "непосредственное сравнения без учета регистра" ? AnsiCompare с параметром ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 14:21 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Василий 2, Да так быстрее, но CompareString - на мой взгляд, несколько не подходит в данном случае, тк результат сравнения не всегда однозачен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 14:38 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Немножко переделал. Теперь в словаре живут не ссылки процедуры, а строковые имена процедур. Кто работал с RTTI, пожалуйста, подскажите, как выполнить метод по имени. Читаю про TRttiContext, TRTTIType и TRTTIMethod примеры и справку, не могу врубиться. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 17:40 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 17:52 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
вроде бы, но не разобрался как правильно ему передать параметры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 19:29 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. В вашем случае скорее всего так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 20:36 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Ошибся выше, надо так: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 20:37 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Весело настанет когда, пользователь случайно, а может и не случайно используя уже какой - то метод, вызовет Invoke с типом объявленным посредством type тот же type myString = string и не сможет вызвать с этим аргументом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2018, 22:46 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдо, не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 09:23 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Проблема в том, что Код: pascal 1. не находит нужный метод, хотя он 100% есть у формы: хотя метод PcmdStart объявлен в секции private формы: Код: pascal 1. Снимок сделан после выполнения строки: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 09:32 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
тут есть похожий пример https://forum.antichat.ru/threads/362046/ но тут даже целый цикл запилили... Ну ОК, я тоже сделал: Код: pascal 1. 2. 3. но вот что странно: Видите, сработала бряка на строке 725, хотя: rmethod.Name = 'Destroy', а BotProcName = 'PcmdStart'. Как так? Может, дело не в бабине? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 10:02 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Если метод не public или published то по умолчанию их в RTTI нет, вроде бы... Из-за в System Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Укажите в том модуле где ваш класс с приватными методами Код: pascal 1. 2. или Код: pascal 1. 2. не помню что переопределяет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 11:49 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-CiteЕсли метод не public или published то по умолчанию их в RTTI нет, вроде бы.. Я про это читал, но думал, что это только старой self.GetProcAddress касается. Ок, ладно, но почему условие срабатывает, если имя метода не находит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 11:59 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Ок, ладно, но почему условие срабатывает, если имя метода не находит? Скорее всего. косяк отладчика. Сделай вывод в лог, наверняка там будет все правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 13:22 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 13:30 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Ок, я перенес нужные методы в public. Теперь нужный метод найден, но... exceptionProject raised exception class EInvalidCast with message 'Invalid class typecast' на вот этой строке Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 13:34 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Наглядное пособие переинженеринга -- как вот эта простая конструкция: Код: pascal 1. превратилась вот в этого монстра: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 13:38 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDi, сперва нужно сделать, чтобы "заработало" пусть даже и в виде монстра, а потом уже и причесать можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 13:46 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Ок, я перенес нужные методы в public. Теперь нужный метод найден, но... exceptionProject raised exception class EInvalidCast with message 'Invalid class typecast' на вот этой строке Код: pascal 1. У вас в вашем методе, оба параметра типа string ? Передавайте те значения параметров и того типа, что в методе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:03 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11, видимо, я что-то пропустил -- чем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:08 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDiчем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а? Поддерживаю. Первое слово всегда команда, остальное, если есть, параметры. В обработчик команды передаются только параметры. К чему эти огороды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:11 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-CiteУ вас в вашем методе, оба параметра типа string ? блиииииииииииииин Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:26 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
переделал на From: ItgUser Код: pascal 1. 2. 3. всё равно Invalid class typecast ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:31 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadmanJaDiчем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а? Поддерживаю. Первое слово всегда команда, остальное, если есть, параметры. В обработчик команды передаются только параметры. К чему эти огороды? 1. Первым словом может быть не /команда, а просто текст какой-нибудь. И тоже нужно обработать. 2. Если всё же /команда, то нужно понять, что именно за команда и вызвать соответствующую процедуру, передав ей ВЕСЬ текст, например, "/Показать 15973". Вроде бы я никуда не отклонялся. Пытаюсь сделать универсальную масштабируемую модель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:35 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11И тоже нужно обработать. Боты без команд не работают. По меньшей мере я не сталкивался. Ну или пример "какого-нибудь" текста? Из жизни, по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:37 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadman, работают ещё как Что такое "команда боту"? Это то, что ты САМ, как программист, запрограммируешь в бота, т.е. любое сочетание любых символов. Это же просто текст. Просто есть какие-то общепринятые нормы и понятия. Бот ведь работает не на их стороне, т.е. не на стороне Вайбера или Телеграма, а на твоей. Сервер тебе просто пересылает то, что напечатал/выбрал пользователь. Никто не запрещает сделать так, что команды будут начинаться не чертой /, а * звёздочкой, например. Или вообще без таковых. Например, боты с ИИ: ты ему пишешь текст, а он отвечает, разобрав текст предварительно. Например, пишешь "какая сейчас погода в Харькове", а бот лезет в сеть, получает данные и отвечает "такая-то погода". И нет никаких команд, разве не так? ну как-то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:47 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadmanНу или пример "какого-нибудь" текста? Из жизни, по возможности. Есть идея запилить приём текстовых объявлений на какой-нибудь портал: автомобильный или по недвижимости типа вашего Авито или нашего OLX, хотя это одно и то же (владелец из Южной Африки - Насперс). Распарсил текст, разбил на части: тип, цена, район, площади, коробка передач, размер трусов, фокусное расстояние объектива и т.д. И не надо никаких команд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:50 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11Например, пишешь "какая сейчас погода в Харькове", а бот лезет в сеть, получает данные и отвечает "такая-то погода". И нет никаких команд, разве не так? Тогда и не нужно никакого списка с командами и методами? Изначально-то тема касалась именно списка команд. А тут уже и ИИ вылез и скоро тело прикрутим. Женское. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:54 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X111. Первым словом может быть не /команда, а просто текст какой-нибудь. И тоже нужно обработать. 2. Если всё же /команда, то нужно понять, что именно за команда и вызвать соответствующую процедуру, передав ей ВЕСЬ текст, например, "/Показать 15973". Вроде бы я никуда не отклонялся. Пытаюсь сделать универсальную масштабируемую модель. Было еще в самом начале 21717308 Менеджер определяет, что за команда и отправляет ее нужному боту: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 14:55 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadmanТогда и не нужно никакого списка с командами и методами? это уже сам программист решает, мне - нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:01 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDiБыло еще в самом начале 21717308 Менеджер определяет, что за команда и отправляет ее нужному боту: да не проблема.... проблема в том, когда пользователь скажет, что "я хочу, чтобы бот выполняет вот это запрограммированное действие на три похожие команды" и что, мне каждый раз добавлять и перекомпилировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:03 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11переделал на From: ItgUser Код: pascal 1. 2. 3. всё равно Invalid class typecast Код: pascal 1. Вы читали хелп? Что идет первым параметром? Если у вас метод класса, то надо передать Указатель на экземпляр класса в контексте которого будет вызываться метод Если у вас классовый метод, то надо передать сам класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:06 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11и что, мне каждый раз добавлять и перекомпилировать? Есть иные способы? Разве что на сервер отправлять, вот и весь бот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:11 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-Cite, т.е. просто self вписать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:15 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X-Cite, спасибо, теперь дошло Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:16 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadman, да, я же уже запилил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:17 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
wadman, на предыдущих страницах я показывал скрины. Идея в том, что у дерева есть корневые узлы - это действия, к которым привязаны методы (процедуры), т.е. то, что умеет бот. Дочерние узлы - это команды. Команды пользователь может редактировать (добавлять, удалять, переименовывать, отключать, включать) т.е. можно сделать так, что если первое или единственное слово, полученное ботом, будет не "/старт", а "старт", то его тоже можно обработать, так же, как и "/start". Для этого пользователь просто добавляет узел см текстом "старт" в качестве дочернего к корневому "СТАРТ". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:24 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
X11JaDiБыло еще в самом начале 21717308 Менеджер определяет, что за команда и отправляет ее нужному боту: да не проблема.... проблема в том, когда пользователь скажет, что "я хочу, чтобы бот выполняет вот это запрограммированное действие на три похожие команды" и что, мне каждый раз добавлять и перекомпилировать? Нет, достаточно договориться о протоколе. Например, что каждая команда должна начинаться со спецсимвола типа \. Или что несколько команд можно задать в виде скобок. Или в видео start -end. Короче, вариантов масса. И всё это реализуется как раз в одном месте -- в менеджере, который должен распарсить сообщение пользователя и дальше передать в обработку (одному, нескольким ботам или сразу пачкой команд). Эти правила будут действовать для всех (боты будут видеть эти команды как отдельные -- без пользовательских сессий будет проблемно объединить их в одну пачку... короче, тут много вариантов в зависимости от требований). Или если речь про конкретного бота -- то пускай он для себя и парсит в той нотации, что ему удобнее (собственно, так боты в том же телеграмме и других чатах так и работают) -- у всех свои правила для обработки. Пример: "бот1 скачай лалала преобразуй в какака сожми отправь ссылку на лулулу" Команда: "бот1" Параметры: "скачай лалала.... на лулулу". На вход бот1 получает список и дальше сам парсит. Например, команда, команда и параметр. Команда: "скачай", параметр: "лалала" Команда: "преобразуй в", параметр: "какака" Команда: "сожми", дефолтный параметр: результат с последней команды Команда: "отправь ссылку на", параметр: "лулулу" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:27 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDiИ всё это реализуется как раз в одном месте -- в менеджере, который должен распарсить сообщение пользователя и дальше передать в обработку (одному, нескольким ботам или сразу пачкой команд). ну я вроде бы так и делаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:31 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
JaDiПример: "бот1 скачай лалала преобразуй в какака сожми отправь ссылку на лулулу" Команда: "бот1" Параметры: "скачай лалала.... на лулулу". да, я так примерно и делаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2018, 15:34 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
А точно, баг в Invoke происходит из за Pointer Код: pascal 1. Не сможет вызвать не один тип PInteger, Pointer и прочие. Код: 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. Хочу напомнить, что всё же можно напороться на этот баг, примеру с вызовом функции TStyleManager.SetStyle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 01:50 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Так типы то якобы разные... Вот так работает... Не надо совмещать похожие но не одинаковые типы... Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 11:53 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдо, да, я читал твою тему :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 12:59 |
|
||
|
Дженерики: передача процедуры в качестве параметра
|
|||
|---|---|---|---|
|
#18+
Итак, оно работает :) как-то так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но это всё работает в модуле главной формы и получается так, что интерфейс виснет, если много команд сразу... теперь следующий этап - это нужно перенести в отдельный поток... вопрос в том, будет ли rmethod.Invoke работать не в модуле формы, а в отдельном потоке? Или это не важно, был бы класс и public-методы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 14:41 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038887]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
204ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 506ms |

| 0 / 0 |
