Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Можно ли по объекту узнать в каком модуле он объявлен ?   Найти похожие ветки 

 
Дитё   (2004-12-24 13:45) [0]

есть объект (TObject) как узнать в каком модуле он объявлен ?
пример  Main.pas


 
Slider007 ©   (2004-12-24 13:47) [1]

навести на объект мышкой и посмотреть, можно уйти в нужный тебе модуль - CTRL+MOUSELEFT


 
Skier ©   (2004-12-24 13:51) [2]

програмно - нет


 
Danilka ©   (2004-12-24 13:58) [3]

[2] Skier ©   (24.12.04 13:51)
При наличии очень горячего желания и большого количества времени - можно. :))
Пройтись по модулям объявленным в uses, если там нет, то по тем модулям, которые обьявленны у вышеописаных, и т.д. Где именно файлы модулей искать - в реестре пути все прописаны.


 
Дитё   (2004-12-24 14:01) [4]

т.е. программно никак ?

Задача следующая : в процедуре Application.OnException(Sender: TObject; E: Exception); как узнать в каком модуле была вызвана процедура ?


 
Дитё   (2004-12-24 14:03) [5]

вернее, в каком модуле произошла ошибка !!


 
Дитё   (2004-12-24 14:07) [6]

А ещё вопрос
как узнать какая форма текущая в моем приложении ?


 
Skier ©   (2004-12-24 14:10) [7]

TScreen.ActiveForm


 
Юрий Зотов ©   (2004-12-24 14:17) [8]

> Дитё   (24.12.04 13:45)
 
> Можно ли по объекту узнать в каком модуле он объявлен?

Если имеется в виду программный модуль (EXE, DLL, BPL), то можно. См. FindClassHInstance.

Если же имеется в виду юнит Delphi, то можно в Design-time (см. интерфейсы BorlandIDEServices).

> Дитё   (24.12.04 14:01) [4]

> Задача следующая : в процедуре Application.OnException(Sender:
> TObject; E: Exception); как узнать в каком модуле была вызвана
> процедура ?

> вернее, в каком модуле произошла ошибка !!

А какое же отношение имеет эта задача к вопросу? Это уже совсем другая задача. Класс Sender"а может быть объявлен в одном модуле, а ошибка может возникать совершенно в другом.

Помотрите Assert. Это исключение содержит сообщение с именем юнита и номером строки в нем. Если в нужных точках возбуждать именно его, то в OnException все будет можно достать.


 
vuk ©   (2004-12-24 14:20) [9]

to Skier ©   (24.12.04 13:51) [2]:
>програмно - нет
Неправда. :o)


uses
 TypIndo;
...
function GetInstanceUnitName(Instance: TObject): string;
var
 TypeData: PTypeData;
begin
 TypeData := GetTypeData(instance.ClassInfo);
 if TypeData <> nil then
   Result := TypeData.UnitName
 else
   Result := "";
end;


 
vuk ©   (2004-12-24 14:23) [10]

Работать, понятное дело, будет только для RTTI-enabled классов. :o)


 
Skier ©   (2004-12-24 14:43) [11]

>vuk ©   (24.12.04 14:20) [9]
мда, про RTTI-то я и забыл...нехорошо :)


 
Дитё   (2004-12-24 14:49) [12]


> vuk ©   (24.12.04 14:20) [9]

Спасибо

> uses
>  TypIndo;
наверно имелось ввиду TypInfo

> Юрий Зотов ©   (24.12.04 14:17) [8]

извените а  assert применяется только в design time да ?


 
vuk ©   (2004-12-24 14:55) [13]

to Дитё   (24.12.04 14:49) [12]:
>наверно имелось ввиду TypInfo
Ну да, очепятки... :o)
На самом деле я бы еще добавил проверку instance.ClassInfo на nil перед вызовом GetTypeData, иначе AV будет вылетать для классов без RTTI.


 
KSergey ©   (2004-12-24 15:01) [14]

По-моему, JclDebug.pas из JEDI - как раз то, что автору нужно. И строки тебе, и юниты...
http://homepages.borland.com/jedi/jcl/


 
vuk ©   (2004-12-24 15:05) [15]

to KSergey:
В принципе да. Трассировку стека JclDebug делать умеет. Но для приведения трассировки в удобоваримый вид нужно либо отладочную информацию включать либо map файл иметь.


 
Дитё   (2004-12-24 15:30) [16]

я слышал про какую то Eureka ExceptionLog но она платная и её найти тяжело , там как раз и создается какой-то map файл в папке программы


 
Юрий_Л   (2004-12-24 15:37) [17]

"Работать, понятное дело, будет только для RTTI-enabled классов."

И какие классы этому соответствуют?
Если написал новый класс, наследника класса из VCL, то для него будет работать?


 
vuk ©   (2004-12-24 15:44) [18]

to Юрий_Л   (24.12.04 15:37) [17]:
>И какие классы этому соответствуют?
Откомпилированные с опцией {$M+} и их наследники. Из стандартных это TPersistent.


 
Юрий_Л   (2004-12-24 16:30) [19]

А каким образом достигается такая фишка?
После названия метода набираем скобку, а нам список параметров даётся в хинте.


 
Юрий_Л   (2004-12-24 16:58) [20]

При наведении мышки на метод, функцию также показывается, в каком юните это определено. Наводим на Copy и видим "func System.Copy: - System.pas(18)". Какой же объект эту инфу выдаёт?


 
vuk ©   (2004-12-24 17:08) [21]

Это все берется из информации в dcu.


 
Юрий_Л   (2004-12-24 17:46) [22]

"Это все берется из информации в dcu."

Вряд ли это так. Набери только функwию какую в коде нового проекта, тот же copy. Ещё нет DCU, а в хинтах инфа показывается.
Скорее всего это от объекта IDE TollServices идёт. Только вот какие методы его для этого используются?


 
vuk ©   (2004-12-24 17:49) [23]

>Набери только функwию какую в коде нового проекта, тот же copy.
system.dcu


 
Юрий_Л   (2005-01-03 18:52) [24]

Не совсем правильный пример привёл.
Набери новую функцию какую попроще, к примеру

"function isnumgt0(num: integer): boolean;
begin
 result := num > 0;
end;"

Далее в какой функции/процедуре если набираешь

if isnumgt0(

и среда Delphi тут же подсказывает вам после открытия скобки

"num: integer"

Компилить при этом не нажималось, т.е. нового dcu ещё нет.
Так что dcu тут не при чём.



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
1-1104240403
Илья
2004-12-28 16:26
2005.01.16
D5 запускается без главного окна.


1-1104241154
ПЛОВ
2004-12-28 16:39
2005.01.16
Как установить режим консоли?


3-1102683731
pavel_guzhanov
2004-12-10 16:02
2005.01.16
Именованные каналы в MS SQL Server


14-1104062585
Андрей Червенко
2004-12-26 15:03
2005.01.16
Зацените новую программу Notepad Plus


3-1102739027
cruse
2004-12-11 07:23
2005.01.16
ГДЕ ошибка при компиляции скрипта