Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Разбираясь давеча с указателями на процедуры, мне показалось чрезвычайно заманчивым использовать их при написании собственных классов (наверняка это не ново), когда метод класса узнает что же он должен делать только во время выполнения (условно). Решив опробовать это на элементарном маленьком проекте с одним юнитом - формочка с кнопочкой и мемо, а также класс, при создании экземпляра этого класса, конструктору передаётся указатель на процедуру, которая реально и должна выполняться при вызове метода MyProc. Компилится проект прекрасно, но вот на этапе выполнения выдается ошибка: нарушение доступа по адресу... Почему это происходит? Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 10:26 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Насколько я помню, отдельная процедура и метод в классе - несколько разные вещи, друг с другом не совместные... И меня смущает вызов конструктора TMyClass - все ли там в порядке с адресами... Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 10:41 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
>>MyObject := TMyClass.Create(@TForm1.SomeWork); 1. @Form1.SomeWork ? 2. MakeObjectInstance ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 10:46 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
адрес процедуры класса удобно получать при помощи функции GetProcAddress правда тогда надо объявлять класс как наследник TObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 11:00 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
сорри, GetMethodAddress ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 11:01 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
2 ZrenBy: я не понял, это вопросы или рекомендации? Если рекомендации, то 1) так не работает(не компилируется), 2) хм, не понял? Если вопросы: 1) берем адрес процедуры ;) 2) хм, не понял? ;) 2 StarWind Ну, во-первых, если явно предок не указан, то по умолчанию он TObject, во-вторых, ты уверен, что такая функция есть (GetmethodAddress)? А потом, а чем плоха такая запись @...? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 11:18 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Значит так 1. SomeWork делаешь глобальной Код: plaintext 1. 2. 3. 4. 5. 6. 7. 2. >>procedure TForm1.FormCreate(Sender: TObject); >>begin >> MyObject := TMyClass.Create(@TForm1.SomeWork); >>end; Это перенеси из FormCreate в FormShow Код: plaintext 1. 2. 3. 4. Усё будет работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 11:50 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Ссылки на метод объекта не эквивалентны ссылкам на процедуру. Ссылка на процедуру представляет собой 32 битный указатель на место расположения машинного кода процедуры в сегменте кода программы, т.е. число. Ссылка на метод объекта - пара чисел, первое из которых - адрес кода самого метода в классе объекта; а второе - адрес объекта, для которого вызывается метод. Для хранения ссылок на метод в DelphiPascal существует тип TMethod: Код: plaintext 1. 2. 3. 4. Метод TObject.MethodAddress возвращает как раз значение соответствующее TMethod.Code. Т.о., чтобы сохранить где-то ссылку на метод объекта, необходимо объявить переменную типа TMethod, и заполнить ее поля: Код: plaintext 1. 2. 3. 4. 5. 6. (кстати значение Event`ов представляют собой тоже TMethod, только типизированные ) Чтобы использовать сохраненное ранее в MyMethod значение для вызова метода, необходимо объявить в секции деклараций событийный тип соответствующий структуре сохраненного метода и привести к нему MyMethod. Например: Код: plaintext 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. Обрати внимание, что UsefulMethod1 и UsefulMethod2 объявлены как published, иначе MethodAddress возвратит nil; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 12:37 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Вообще то для методов объектов (процедур и функций) нужно добавлять of object Код: plaintext 1. 2. Но в этом случае этим переменны можно присваивать только методы, то есть, процедуры и функции объявленные внутри дургих классов, у которых совпадает количество и типы параметров. Далее, не изгаляйтесь со всеми этими указателями и т.п. Зачем же вы тогда процедурный тип объявляете? Используйте его на прямую и большей части проблем не будет. В итоге должно быть что-то типа: Код: plaintext 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. Конструкция if assigned обычно всегда используется в текстах самой Borland. Правда, у них обычно изначально в конструкторе Method:=NIL; а присвоение конкретной процедуры происходит позже. Это позволяет исключить ошибку доступа, если метод не поределён. Кстати, именно через этот механизм работают события. А удобно это тем, что можно по ходу программы изменять реакцию объектов, а можно и вообще её "выключить", если опять присвоить NIL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 13:25 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
Теперь все прояснилось, спасибо всем, особенно ZrenBy и anubis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 13:28 |
|
||
|
опять об указателях на процедуру - не работает код
|
|||
|---|---|---|---|
|
#18+
.. и Дмитрию Мыльникову тоже :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 13:31 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=58&tid=2117243]: |
0ms |
get settings: |
20ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 398ms |

| 0 / 0 |
