powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / определить имя выполняемой процедуры
25 сообщений из 34, страница 1 из 2
определить имя выполняемой процедуры
    #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
определить имя выполняемой процедуры
    #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
определить имя выполняемой процедуры
    #37008030
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никак
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #37008059
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может через JCL или EurekaLog взять стек и вычленить из него название....
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #37008066
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для какой задачи надо знать имя процедуры?
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #37008234
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Now II,

Не надо забывать, что фокспро есть интерпретатор.
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #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
определить имя выполняемой процедуры
    #37008363
A V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A V
Гость
всмысле CalledMethName(Self) конечно-же )
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #37008476
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще можно летать, при условии, что это не велик, а дельтаплан, и погода лётная
...
Рейтинг: 0 / 0
определить имя выполняемой процедуры
    #37008597
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnmenNow II,

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

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

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

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

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

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

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

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

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

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

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

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

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


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