|
|
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Такой вопрос. Хочу реализовать метод в своем классе, который одним из параметров принимал бы или TDBGrid или TCRDBGrid (по крайней мере, пока эти 2 типа). Знаю, что оба класса порождены от TCustomDBGrid. И собственно на этом можно было бы и остановиться, объявив тип этого параметра как TCustomDBGrid, но тогда возникает вопрос, как красиво с этим объектом внутри метода работать? То есть, вызываю я это метод в программе, передавая в него или один или другой грид. А вот дальше как быть? У TCustomDBGrid я ко многим методам не имею доступа, в частности к тем, какие у него объявлены в секции protected. ОбЪявлять внутри метода внутренние переменные нужных типов и делать приведение типов входного параметра - тоже как-то не хочется, ибо код для этих разных типов гридов по сути тот же самый (вызываю те же самые методы и свойства), потому не хотелось бы делать повторение кода. Осознаю, что можно было бы сделать перегрузку этого метода (создать 2 метода с разными типами параметров) - но это опять таки повторение кода. Существует ли способ, сделать это красиво? И если да, то как? Заранее благодарю за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 10:57 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
Это не описание задачи, а, возможно, не лучшее её решение. Без примера кода это будет лишь философствование на тему... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:07 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
wadmanЭто не описание задачи, а, возможно, не лучшее её решение. Без примера кода это будет лишь философствование на тему... Ок. Вот пример кода: Код: 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. А я хотел бы иметь вместо этих 2 фактически одинаковых методов, один, но который бы работал с обеими из этих типов гридов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:15 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
harisma, Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:26 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
harisma, можно передавать не grid, а связанный с ним dataset. Получится более универсально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:28 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
harisma, хочу дать небольшой комментарий к коду выше от Hammer'a этот момент: Код: pascal 1. 2. это такой легальный хак в Delphi, позволяющий получить доступ к protected-методам класса. Трюк: подобный хак-класс (TCustomDBGridAccess) должен быть объявлен в том же модуле, в котором будет использоваться . По-этому он в примере в секции IMPLEMENTATION, т.к. в INTERFACE не имеет смысла. И, кстати, я бы назвал не TCustomDBGridAccess, а по аналогии со многими библиотеками, TCustomDBGridCracker (мое предпочтение) или TCustomDBGridHack ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:37 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
harisma Код: pascal 1. 2. Так не стоит делать, т.к. не все записи могут быть на клиенте в данный момент. Как должно быть: Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:39 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
P.S. и вот так этот хак используется: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:40 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
Кроик Семён, Hammer, wadman: Всем спасибо. Помогли вспомнить, ибо когда-то именно так и делал. (в смысле, создавал Кракед класс от предка, чтоб получить доступ к протектед методам). Один ньюанс - место объявления этого класса. Я его пытался объявлять ы секции interface - и не работало. Щас попробую ваш способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 11:48 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
harismaКроик Семён, Hammer, wadman: Всем спасибо. Помогли вспомнить, ибо когда-то именно так и делал. (в смысле, создавал Кракед класс от предка, чтоб получить доступ к протектед методам). Один ньюанс - место объявления этого класса. Я его пытался объявлять ы секции interface - и не работало. Щас попробую ваш способ. Не могет токого быть, правда если объявление было в том же модуле что и класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 12:01 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
Более красиво использовать класс-хелпер для доступа к протектед потрохам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2019, 18:54 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
white_niggerБолее красиво использовать класс-хелпер для доступа к протектед потрохам Осталось только понять - зачем? Если смотреть на приведенный выше код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2019, 07:40 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
wadmanwhite_niggerБолее красиво использовать класс-хелпер для доступа к протектед потрохам Осталось только понять - зачем? Если смотреть на приведенный выше код.grid настройки для показа содержит(сильно не вникал что он там творит) хелпер реально правильнее, приведения типов делают код потенциально опасным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2019, 10:59 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
1. Экспорт из грида не очень правильно, разумнее в самом деле обращаться сразу к датасету. Если какие-то вещи нужно брать от грида, можно их заранее извлечь (список выделенных записей, например) и передать параметром. 2. Два класса-потомка приводить насильно к общему знаменателю можно, но только если используемые методы виртуальные либо не перекрывались потомками (очевидно, но тем не менее). 3. Решение вполне имеет право на жизнь, но в дальнейшем может потребовать переделки (например, экспорт из другого источника, который не получится натянуть на общий глобус, или какие-то специфические фичи). 4. По приведенному коду - экспорт одной записи можно выделить в подпрограмму, чтобы не повторялся код, либо сделать один цикл и условие if OnlyCurrentRow then Break else Dataset.Next ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 15: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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 15:52 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
Василий 22. Два класса-потомка приводить насильно к общему знаменателю можно, но только если используемые методы виртуальные либо не перекрывались потомкамиС какого перепугу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2019, 15:54 |
|
||
|
Тип параметра метода, и работа с этим параметртром внутри метода без повторения кода
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Василий 22. Два класса-потомка приводить насильно к общему знаменателю можно, но только если используемые методы виртуальные либо не перекрывались потомкамиС какого перепугу? С большого. Перекрыл ты в TChild невиртуальный метод Foo, а потом вызываешь TParent(Child).Foo, что получится? Правильно, ерунда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2019, 10:20 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=73&tid=2039488]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 322ms |

| 0 / 0 |
