|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Хитро узнать имя класса и его метода
Здравствуйте, уважаемые!
Имею код: Код:
{$APPTYPE CONSOLE} program Project1; uses classes, sysutils; type myclass = class( TPersistent ) procedure test; end; procedure log( msg : string ); var magic : string; begin magic := '???'; Writeln( format( '%s:%s', [ magic, msg ] ) ); end; { myclass } procedure myclass.test; begin log('here'); end; begin with myclass.Create do begin test; Free; end; Readln; end. На выходе, естественно "???:here". Внимание вопрос! Реально ли получить внутри функции log вместо ??? имя класса и метода из которгого эта функция вызвана. Да, функция лог действительно не метод класса, это не очепятка. Если это нереально, можно ли сделать подобное если сделать log методом предка этого класса? Ну вы поняли, хочется простенький юнит-логгер. Сторонних монстров пожалуйста не предлагайте. Спасибо за внимание. |
#2
|
||||
|
||||
А собственные методы класса ClassName и MethodName вас не устроят?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
К сожалению не устроят.
Вы предлагаете так: log( format( 'вызвано из класса %s', [ self.classname ] ) ); А хочется получить нечто такое вот: Добавить в uses к своему проекту некий юнит logger с единственной функцией log, и дёргать эту функцию в разных местах проекта чтобы она регистрировала имя объекта и класса откуда её дёрнули и писала их в лог. Извращение, я понимаю, но было бы очень удобно. Можно конечно этой функции передвать имя класса и метод явно, в параметрах как показано выше, но это очень лишние движения для такой мелочи как вывести строчку в лог. Видимо нужно копать в сторону Call Stack но предвижу большие пляски с бубном которые совсем не радуют ради такой небольшой цели. Спасибо за ответ, не ожидал такой быстрой реакции ) Последний раз редактировалось front242, 15.11.2011 в 19:18. |
#4
|
||||
|
||||
Если у вас D2009 и выше, то помнится мне можно просто сгенерить исключение и тогда заполнится структура в которой будут все вызовы. Это по сути просто StringList который можно использовать по своему усмотрению.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
||||
|
||||
вместо log('here'); используй Assert(False);
Пишу программы за еду. __________________ |
#7
|
|||
|
|||
Проект на Delphi7. Спасибо за внимание, поняв что изобретение велосипедов
ни к чему хорошему не приводит остановился на JCLDebug. :-) |
#8
|
|||
|
|||
Цитата:
А это ещё лучше, не надо сражаться со стеком! Большое сапсибо! |