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

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

Можно ли в методе объекта узнать название метода? [D7]


Дмитрий Белькевич ©   (2007-03-24 22:44:00) 

Сабж, в общем?


Alexey (AZ)   (2007-04-01 10:51:00) [1]


> > Caption := MethodName(@TForm1.FormCreate) ?
>
> А почему бы сразу не Caption := 'TForm1.FormCreate'?

Потому что вместо @TForm1.FormCreate можно сунуть любой указатель как в примере от
> Alexey (AZ)   (25.03.07 16:47) [4]

. И все published методы будут просканены.


Суслик   (2007-04-01 00:05:00) [2]

можно


Дмитрий Белькевич   (2007-03-31 23:36:00) [3]

В принципе, как вариант, можно методы нумеровать, вместо именования...
Принципиальных плюсов это не имеет, но ресурсов меньше будет юзаться, это да...


Джо   (2007-03-31 12:33:00) [4]

Какой смыслвообще писать MethodName (SomeMethod), если с тем же успехом можно захардкорить 'SomeMethod'?


Дмитрий Белькевич   (2007-03-31 12:25:00) [5]

К сожалению:

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

(с) Delphi help


Джо   (2007-03-31 10:02:00) [6]

> Caption := MethodName(@TForm1.FormCreate) ?

А почему бы сразу не Caption := 'TForm1.FormCreate'?


GrayFace   (2007-03-31 09:57:00) [7]

Alexey (AZ)   (25.03.07 16:33) [2]
procedure TForm1.FormCreate(Sender: TObject);
var
p : pointer;
begin
asm
  mov eax, offset FormCreate
  mov p, eax
end;
Caption := MethodName(p);
end;


Caption := MethodName(@TForm1.FormCreate) ?


Дмитрий Белькевич   (2007-03-31 06:01:00) [8]

...исходников.


Дмитрий Белькевич   (2007-03-31 06:00:00) [9]

Спасибо за ответ, проблема в том, что много версий программ работает одновременно. И такой подход немного неудобен. Опять же - придется парсер делать (хотя, откровенно говоря, работы на пару часов), что бы парсил в нормальный журнал, т.к. куча адресов почти нечитаема.
Сейчас у меня есть нокторое решение - пришлось повбивать названия всех процедуры и включать логи по мере необходимости. В общем, достаточно хорошо и быстро работает, но на поддержание времени много уходит - вот думаю, как компьютер заставить рутину делать. Склоняюсь к парсеру текстов.


Loginov Dmitry   (2007-03-30 13:10:00) [10]

В принципе можешь сгенерировать MAP-файл с именами процедур, а в нем по адресу процедуры можно и имя процедуры определить. Правда далеко не для всех процедур имя заносится в MAP-файл, но в качестве определенного шага к решению данного вопроса должно сойти.


Дмитрий Белькевич   (2007-03-30 11:49:00) [11]

Стек процедур журналировать иногда нужно. А относиться ко всему. Во всём и нужно.


Германн   (2007-03-30 00:58:00) [12]


> Дмитрий Белькевич ©   (30.03.07 00:07) [7]
>
> Ага, именно это и пишу - на мой сайт глянь.
>

А к чему опубликованному на твоём сайте относится вопрос? И каким образом относится?
P.S. Никакой подколки или иронии. Просто любопытно для чего это может быть нужно?


Дмитрий Белькевич   (2007-03-30 00:07:00) [13]

Ага, именно это и пишу - на мой сайт глянь.
Спасибо всем ответившим. Нет - так нет...


0leg   (2007-03-29 00:08:00) [14]


> Можно ли в методе объекта узнать название метода?


Ты пишешь самомодифицирующийся вирус-компилятор? А почему именно на Дельфи??


RASkov   (2007-03-25 17:42:00) [15]

> [3] Alexey (AZ)   (25.03.07 16:36)


> Можно ли в методе объекта узнать название метода?


> Только для этого надо знать название метода... :)

Приколист  :)


Alexey (AZ)   (2007-03-25 16:47:00) [16]

А если вы извращенец, то можно тупо посканить на наличие методов...
procedure TForm1.FormCreate(Sender: TObject);
var
 p : pointer;
 i : integer;
 s : ShortString;
begin
 ListBox1.Items.BeginUpdate;
 for i := 0 to $F00000 do begin
 asm
   mov eax, $400000
   add eax, i
   mov p, eax
 end;
 s := MethodName(p);
 if s <> '' then
   ListBox1.Items.Append( s );
 end;
 ListBox1.Items.EndUpdate;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 //
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//
end;


Alexey (AZ)   (2007-03-25 16:36:00) [17]

Только для этого надо знать название метода... :)


Alexey (AZ)   (2007-03-25 16:33:00) [18]

Учитывая ограничения предыдущего автора...
procedure TForm1.FormCreate(Sender: TObject);
var
 p : pointer;
begin
 asm
   mov eax, offset FormCreate
   mov p, eax
 end;
 Caption := MethodName(p);
end;


Loginov Dmitry   (2007-03-24 23:02:00) [19]

В общем случае нет. Однако если метод объявлен в секции published, и для класса сгенерирована RTTI, то наверно как-то можно.


Наверх

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