![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|
|
#6
|
||||
|
||||
|
вместо log('here'); используй Assert(False);
|