Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / определить имя выполняемой процедуры / 25 сообщений из 34, страница 1 из 2
10.12.2010, 18:54
    #37008025
Now II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Как определить на Delphi имя выполняемой процедуры внутри неё же?

На фокспро делается просто:

текст файла test.prg:
Код: plaintext
1.
2.
3.
do p_proc

procedure p_proc
?  'program: ',program( 1 ), ', procedure=', program( 2 )


программка выводит на экранprogram: TEST , procedure= P_PROC

А надо в Delphi.
...
Рейтинг: 0 / 0
10.12.2010, 18:57
    #37008028
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Now IIА надо в Delphi.

Код: plaintext
1.
2.
3.
4.
5.
Program test;

Procedure d_proc;
begin
  WriteLn('program: test, procedure=d_proc');
end;

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.12.2010, 18:57
    #37008030
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
никак
...
Рейтинг: 0 / 0
10.12.2010, 19:23
    #37008059
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
может через JCL или EurekaLog взять стек и вычленить из него название....
...
Рейтинг: 0 / 0
10.12.2010, 19:29
    #37008066
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
А для какой задачи надо знать имя процедуры?
...
Рейтинг: 0 / 0
10.12.2010, 21:58
    #37008234
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Now II,

Не надо забывать, что фокспро есть интерпретатор.
...
Рейтинг: 0 / 0
10.12.2010, 23:36
    #37008349
A V
A V
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Вообще можно определить, при условии, что это не процедура, а метод класса, и она содержится в rtti (т.е для версий ниже d2010, в секции published). например, пробежать по vmtMethodTable, в поисках наибольшего адреса, меньшего адреса вызова.
по-быстрому получился такой вариант: (без учета данных из extended rtti для d2010+)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 function  CalledMethName(Obj: TObject):  string ;
 var 
  CallAddr, MethAddr, MaxAddr: Cardinal;
  pb, methEnd: PAnsiChar;
  i, Count: Integer;
 begin 
    asm 
     mov CallAddr, ebp;
     add CallAddr,  4 ;
    end ;
   MaxAddr :=  0 ;
   CallAddr := PCardinal(CallAddr)^;
   pb := PAnsiChar(Obj.ClassType) + vmtMethodTable;
   pb := PPointer(pb)^;
    if  Assigned(pb)  then 
    begin 
     Count := PWord(pb)^;
     inc(pb, SizeOf(Word));
      for  i :=  1   to  Count  do 
      begin 
       methEnd := pb + PWord(pb)^;  //Len 
       Inc(pb, SizeOf(Word));
       MethAddr := PCardinal(pb)^;  //CodeAddress 
        if  (MethAddr < CallAddr)  and  (MethAddr > MaxAddr)  then 
        begin 
         MaxAddr := MethAddr;
          if  MaxAddr <= MethAddr  then 
           Result := Obj.MethodName(Pointer(MethAddr));
        end ;
       pb := methEnd;
      end ;
    end ;
 end ;
В любом методе вызвать CalledMethName(Sender) для получения имени
...
Рейтинг: 0 / 0
10.12.2010, 23:46
    #37008363
A V
A V
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
всмысле CalledMethName(Self) конечно-же )
...
Рейтинг: 0 / 0
11.12.2010, 01:25
    #37008476
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Вообще можно летать, при условии, что это не велик, а дельтаплан, и погода лётная
...
Рейтинг: 0 / 0
11.12.2010, 09:27
    #37008597
Anatoly Podgoretsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
JohnmenNow II,

Не надо забывать, что фокспро есть интерпретатор.
Помним, но он уже давно умеет делать исполнимые файлы. И даже с embeded БД.
...
Рейтинг: 0 / 0
11.12.2010, 13:10
    #37008753
Now II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Dimitry Sibiryakov , твой ответ победил в номинации "самая смешная шутка" в этой теме :)

Зайцев Фёдор , спасибо за ответ!

Zelius , а можно поподробнее? я чайник, но довольно умный (или любопытный), разберусь :)
Это же внешние программы? Моя прога работает у пользователя, не на моем компе. Хотелось бы обойтись внутренними средствами самой программы.

Кроик Семён А для какой задачи надо знать имя процедуры?
Возник вопрос так. Есть один пользователь у моей проги (Delphi+Oracle), у которого часто теряется связь с БД. Хочу записывать в лог на вывозе какой функции произошла потеря связи. В основном это нужно для TAction OnEхecute. Но потом стало интересно заодно, как узнать и имя просто процедуры.

Johnmen , я помню, что у фокса интерпретатор! но для меня не само собой разумеется, что если у Delphi компилятор, то нельзя узнать имя процедуры при её выполнении. Тем более, что вот метод класса тоже процедура, а для неё, оказывается, можно.
На велике, кста, тоже можно летать даже при нелетной погоде, если на рампе, но не все умеют ;-)

A V !!! спасибо, друг! Победитель в номинации самый полезный ответ!! спасибо преогромное! Все работает 8) Хотела из любой процедуры узнать её имя, не только из метода класса, но всё равно здорово, это как раз то, что мне надо было в реальной задаче!
У меня Delphi7.
...
Рейтинг: 0 / 0
11.12.2010, 13:14
    #37008759
Now II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
"на вызове" )) ну вы поняли
...
Рейтинг: 0 / 0
11.12.2010, 13:25
    #37008774
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Now IIDimitry Sibiryakov, твой ответ победил в номинации "самая смешная шутка" в этой теме :)

Какая шутка? У меня на самом деле каждый вызов в DB-слое имеет свой собственный код,
который попадает в выброшенное исключение и таким образом позволяет определить место
ошибки с точностью до строки.

А для OnExecute всё ещё проще - там есть параметр Sender, а у него куча интересных
свойств, по которым можно легко определить на что именно ткнул пользователь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.12.2010, 14:18
    #37008846
Now II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Дмитрий , я не спорю, что так можно сделать, но я искала общее решение.
...
Рейтинг: 0 / 0
11.12.2010, 20:10
    #37009158
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Now IIЕсть один пользователь у моей проги (Delphi+Oracle), у которого часто теряется связь с БД. Хочу записывать в лог на вывозе какой функции произошла потеря связи. В основном это нужно для TAction OnEхecute. Но потом стало интересно заодно, как узнать и имя просто процедуры.

Eсть такой Delphi-эксперт: SmartInspect .
Он вставляет во всем проекте на входе и выходе из каждой процедуры вызовы логирующих процедур. Очень подходит для твоего случая.
...
Рейтинг: 0 / 0
11.12.2010, 21:06
    #37009229
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Now II,
Если есть деньги - советую купить EurekaLog - он позволяет видеть стек ошибки, эксепшена, плюс много доп инфы о компутере клиента. Но если нет, JCL тоже показывает стек ошибки с названиями процедур, это как раз то что тебе надо...
...
Рейтинг: 0 / 0
11.12.2010, 21:11
    #37009236
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
авторНо если нет, JCL тоже показывает стек ошибки с названиями процедур, это как раз то что тебе надо...
Это откуда такой вывод?
...
Рейтинг: 0 / 0
13.12.2010, 11:05
    #37010842
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
JohnmenавторНо если нет, JCL тоже показывает стек ошибки с названиями процедур, это как раз то что тебе надо...
Это откуда такой вывод?
Это личный опыт.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
01.08.2019, 15:24
    #39844157
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
ZeliusEurekaLog - он позволяет видеть стек ошибки, эксепшена, плюс много доп инфы о компутере клиента
Кто знает, а у CodeSiteLogging есть такая возможность?

А вообще, в Delphi за почти 10 лет что-то изменилось в этом плане?
У современных версий можно узнать имя процедуры/функции внутри самой исполняемой процедуры/функции?
Само собой, что это должно касаться и private секции.
...
Рейтинг: 0 / 0
01.08.2019, 17:02
    #39844236
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
X11,

ну зачем тебе.
...
Рейтинг: 0 / 0
02.08.2019, 04:15
    #39844369
x77
x77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
если внутри нее же, то это ваша процедура, правильно? ну, пропишите им всем

procedure MyProc;
const
sProcName = "MyProc";
begin
<Banzai>
end.

непонятна задача, извините. зачем внутри процедуры _определять_ ее имя? для логов, или там у вас куча процедур в виде коллбэков и надо понимать что именно сработало? или еще какая магия? чтобы корректно ответить на ваш вопрос, надо хотя бы примерно понимать конечную задачу. чтобы любая _ваша_ процедура знала, как ее зовут - достаточно просто ей это сказать. если это чужая процедура - то там уже начинается нетривиальный цирк с конями.
...
Рейтинг: 0 / 0
02.08.2019, 07:40
    #39844395
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
из своего опыта могу сказать, что (для меня) сабж был актуален в одном редком случае - когда надо логгировать вход-выход в критсекцию, чтобы найти виновника лока.
Когда одна критсекция (кешер, например) может использоваться во многих десятках процедур - прописывать а потом убирать их всех руками становится малоинтересно.
...
Рейтинг: 0 / 0
02.08.2019, 09:52
    #39844446
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
X11у CodeSiteLogging есть такая возможность?если только снаружи ему передавать
...
Рейтинг: 0 / 0
02.08.2019, 10:50
    #39844482
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
JCL позволяет получить call stack.
...
Рейтинг: 0 / 0
02.08.2019, 10:59
    #39844491
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить имя выполняемой процедуры
Есть Delphi language Preprocessor - https://sourceforge.net/projects/dpp32/
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / определить имя выполняемой процедуры / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]