![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| LamerTM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Есть процедура (допустим называется WL), которую вызывают другие процедуры. Хочется из процедуры WL узнавать имя процедуры ее вызвавшей (без передачи ей каких-то дополнительных параметров). Это возможно ?
|
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Оно?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| LamerTM |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Нет. У меня другой случай. У меня так:
Для чего мне это вообще понадобилось. Я хочу сделать чтобы моя программа писала лог. Разные процедуры передают сообщения в процедуру wl в виде строк (wl пишет эти сообщения в окно либо в log-файл). Хотелось бы чтобы wl сама вычисляла имя процедуры, которая эту сроку передала, чтобы знать какая именно процедура это сообщение генерировала. Имя класса у меня уже вычисляется (по ClassName). А имя процедуры нет. Можно передавать имя процедуры прямо в строке. Но мне хочется чтобы само вычислялось. |
||||
|
|||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
По-умолчанию, в общем случае, этого сделать нельзя. Вы можете узнать только адрес вызывающего. Его имя же нигде в программе не хранится. Исключение составляет RTTI классов, но это решение очень узко-специализированное.
Решение в общем виде выглядит так: вы подключаете в программу отладочную информацию и извлекаете имя из неё. Один из вариантов - используя JCL и JclDebug. Вот ссылка для чтения: http://forum.vingrad.ru/index.php?showtopi...t&p=1696161 В JclDebug вас будут интересовать функции Caller и GetLocationInfo(Str) Если вы в своей программе используете какой-либо трейсер исключений (EurekaLog, madExcept или аналоги) - то, конечно, лучше бы воспользоваться его функциями. Например, в EurekaLog есть GetSourceInfoByAddr. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| LamerTM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
ОК, там много чего читать, поэтому я пока еще один вопрос задам. Имея адрес процедуры можно узнать ее имя функцией MethodName. В данном случае мне этого достаточно, т.к. у меня везде классы. Я так когда-то делал обработчик исключительных ситуаций. Но он получал информацию из объекта Exception, который содержал адрес исключения ExceptionAddress. По этому адресу определялась процедура в которой произошло исключение. А сейчас адреса нет. Но по идее адрес вызывающей процедуры должен оставаться где-то в стеке (вернее адрес места вызова процедуры wl). Как-нибудь можно из стека этот адрес получить? Если получится, то имя процедуры вычислить будет несложно. Это будет самое лучшее решение для меня, т.к. самое простое. |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Вот один из возможных вариантов:
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| LamerTM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
О! Спасибо огромное. Как раз то что нужно.
Правда оказалось что теперь везде надо понаставить published, ну да ладно. Все равно я в силу своего ламерства не знаю какие это имеет издержки Спасибо еще раз. |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Как я уже говорил - обычно это решается подключением отладочной информации к программе, а не использованием RTTI. Но тут уж ваш выбор.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |