Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить имя вызываемого метода?


Alex' ©   (2007-11-12 16:36:00) 

Пишу:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(MethodName(Sender));
end;


код неработает.
Мессага должна по задумке выдавать "TForm1.Button1Click(Sender: TObject)"


Alex'   (2007-11-13 11:55:00) [1]


> С чего бы это было имя формы, модуля в глобальном перехватчике.

Его там и нет. Сделать необходимо.


Anatoly Podgoretsky   (2007-11-12 18:36:00) [2]


> Имеем глобальный перехват исключений Application.OnException
>
> Для регистрации исключения необходима дополнительная информация:
>
> МЕТОД вызвавший исключение, имя формы, модуля

С чего бы это было имя формы, модуля в глобальном перехватчике.


Alex'   (2007-11-12 17:33:00) [3]

Аминь!


Сергей М.   (2007-11-12 17:28:00) [4]


> глючило все страшно


И будет глючить ныне и присно и во веки веков.
Нет и не может быть универсального механизма доступа к такой инф-ции.


Alex'   (2007-11-12 17:23:00) [5]


> Многое все из вышеперечисленного делается готовыми средствами:
>
>
> http://www.delphi.int.ru/articles/40/
>
> Изобретать велосипед нет никакого резона.

Спасибо!

Давно пробывал, непомню Jedi Code Library конкретно или нет, глючило все страшно и делфи и само приложение после включения Jedi. - посмотрю


Сергей М.   (2007-11-12 17:22:00) [6]


> Alex_Ne   (12.11.07 17:10) [10]


А завтра Owner'а не будет.
А послезавтра Sender'ом будет вовсе не TButton/
Что тогда ?


Alex'   (2007-11-12 17:13:00) [7]


> Че-то не то ты тезка в обработчик запихнул. ИМХО имелось
> в виду что-то вродеShowMessage('T' + (Sender as TButton).
> Owner.Name + '.' +   MethodName(@(Sender as TButton).OnClick));
>

То что нужно! Спасибо!


Alex_Ne   (2007-11-12 17:10:00) [8]

Че-то не то ты тезка в обработчик запихнул.
ИМХО имелось в виду что-то вроде
ShowMessage('T' + (Sender as TButton).Owner.Name + '.' +
  MethodName(@(Sender as TButton).OnClick));


Сергей М.   (2007-11-12 17:10:00) [9]


> Для регистрации исключения необходима дополнительная информация:
>
> МЕТОД вызвавший исключение, имя формы, модуля


Многое все из вышеперечисленного делается готовыми средствами:

http://www.delphi.int.ru/articles/40/

Изобретать велосипед нет никакого резона.


Alex'   (2007-11-12 17:04:00) [10]

Извиняюсь за плохо поставленный вопрос.

Задача: Обработать ВСЕ исключительные ситуации приложения.

Имеем глобальный перехват исключений Application.OnException

в не обрабатываем исключения: Делим по классам, номерам сообщений - предпринимаем соответсвующие действия(пишем в логи, делаем скриншоты, шлем по почте, руссифицируем ошибки БД и т.д. и т.п.)

Для регистрации исключения необходима дополнительнаяинформация:
МЕТОДвызвавший исключение, имя формы, модуля

Для того что бы знать имя последнего вызванного метода (в котором может произойти исключение) не придумал, ни чего лучше, как писать его в глобальную переменную. В начале каждого метода писать типа:
procedure TForm1.Button1Click(Sender: TObject);
begin
LastMethodForAppOnException('TForm1.Button1Click(Sender: TObject);');
LastUnitForAppOnException('Unit1');
end;


Сергей М.   (2007-11-12 16:54:00) [11]


> Мессага должна по задумке выдавать "TForm1.Button1Click(Sender:
>  TObject)"


Задача не имеет универсального решения на все случаи жизни.


Сергей М.   (2007-11-12 16:47:00) [12]


> Мне не адрес нужен как таковой, а имя вызывающего метода
> получить


Sender - это адрес объекта.
Просто некоего объекта, вовсе не обязательно вызывающего.

Спрашивается, имя какого метода реальновызывающего объекта ты вознамерился получить таким макаром ? И - опять же - зачемэто имя тебе понадобилось ?


Alex'   (2007-11-12 16:45:00) [13]


> И не будет работать, ибо полная ерунда в коде написана -
>  интересуешься адресом метода, а сам тычешь параметром адрес
> объекта.

Мне не адрес нужен как таковой, а имя вызывающего метода получить.


Сергей М.   (2007-11-12 16:44:00) [14]


> Я и писал "код неработает.". А хотелось бы


А чтобы он работал, нужно соблюсти требования, изложенные в справке.

If Address does not point to a published method of the object, MethodName returns an empty string.


Anatoly Podgoretsky   (2007-11-12 16:43:00) [15]

> Alex'  (12.11.2007 16:36:00)  [0]

Что значит не работае?
Напиши ShowMessage('=', + MethodName(Sender));


Alex'   (2007-11-12 16:42:00) [16]

Не должна, согласен. Я и писал "код неработает.". А хотелось бы... Есть ли работающий способ?


Сергей М.   (2007-11-12 16:42:00) [17]

Зачем посты плодить одни и те же ?

Чем тебе ветка

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1194870400&n=0

не угодила ?


> код неработает.


И не будет работать, ибо полная ерунда в коде написана - интересуешься адресом метода, а сам тычешь параметром адрес объекта.


homm   (2007-11-12 16:39:00) [18]

> Мессага должна по задумке выдавать "TForm1.Button1Click(Sender:
> TObject)"

Не должна.


Наверх

Титульная страница Поиск, карта сайта Написать письмо