![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли в методе объекта узнать название метода? [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, то наверно как-то можно.