Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.11.2011, 17:06
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию Хитро узнать имя класса и его метода

Здравствуйте, уважаемые!

Имею код:

Код:
{$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  
Старый 15.11.2011, 17:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А собственные методы класса ClassName и MethodName вас не устроят?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 15.11.2011, 19:12
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию

К сожалению не устроят.

Вы предлагаете так: log( format( 'вызвано из класса %s', [ self.classname ] ) );

А хочется получить нечто такое вот: Добавить в uses к своему проекту
некий юнит logger с единственной функцией log, и дёргать эту функцию
в разных местах проекта чтобы она регистрировала имя объекта и класса
откуда её дёрнули и писала их в лог. Извращение, я понимаю, но было бы
очень удобно. Можно конечно этой функции передвать имя класса и метод
явно, в параметрах как показано выше, но это очень лишние движения для
такой мелочи как вывести строчку в лог.

Видимо нужно копать в сторону Call Stack но предвижу большие пляски с
бубном которые совсем не радуют ради такой небольшой цели.

Спасибо за ответ, не ожидал такой быстрой реакции )

Последний раз редактировалось front242, 15.11.2011 в 19:18.
Ответить с цитированием
  #4  
Старый 15.11.2011, 19:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Если у вас D2009 и выше, то помнится мне можно просто сгенерить исключение и тогда заполнится структура в которой будут все вызовы. Это по сути просто StringList который можно использовать по своему усмотрению.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 15.11.2011, 19:56
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Страдалецъ
Если у вас D2009 и выше, то помнится мне можно просто сгенерить исключение и тогда заполнится структура в которой будут все вызовы. Это по сути просто StringList который можно использовать по своему усмотрению.
Странно, у меня на ХЕ там пусто было.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 15.11.2011, 20:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вместо log('here'); используй Assert(False);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 15.11.2011, 20:30
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию

Проект на Delphi7. Спасибо за внимание, поняв что изобретение велосипедов
ни к чему хорошему не приводит остановился на JCLDebug. :-)
Ответить с цитированием
  #8  
Старый 15.11.2011, 20:45
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
вместо log('here'); используй Assert(False);

А это ещё лучше, не надо сражаться со стеком! Большое сапсибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter