![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли по объекту узнать в каком модуле он объявлен ?
Дитё © (2004-12-24 13:45:00)есть объект (TObject) как узнать в каком модуле он объявлен ?
пример Main.pas
Юрий_Л (2005-01-03 18:52:00) [1]Не совсем правильный пример привёл.
Набери новую функцию какую попроще, к примеру
"function isnumgt0(num: integer): boolean;
begin
result := num > 0;
end;"
Далее в какой функции/процедуре если набираешь
if isnumgt0(
и среда Delphi тут же подсказывает вам после открытия скобки
"num: integer"
Компилить при этом не нажималось, т.е. нового dcu ещё нет.
Так что dcu тут не при чём.
vuk (2004-12-24 17:49:00) [2]>Набери только функwию какую в коде нового проекта, тот же copy.
system.dcu
Юрий_Л (2004-12-24 17:46:00) [3]"Это все берется из информации в dcu."
Вряд ли это так. Набери только функwию какую в коде нового проекта, тот же copy. Ещё нет DCU, а в хинтах инфа показывается.
Скорее всего это от объекта IDE TollServices идёт. Только вот какие методы его для этого используются?
vuk (2004-12-24 17:08:00) [4]Это все берется из информации в dcu.
Юрий_Л (2004-12-24 16:58:00) [5]При наведении мышки на метод, функцию также показывается, в каком юните это определено. Наводим на Copy и видим "func System.Copy: - System.pas(18)". Какой же объект эту инфу выдаёт?
Юрий_Л (2004-12-24 16:30:00) [6]А каким образом достигается такая фишка?
После названия метода набираем скобку, а нам список параметров даётся в хинте.
vuk (2004-12-24 15:44:00) [7]to Юрий_Л (24.12.04 15:37) [17]:
>И какие классы этому соответствуют?
Откомпилированные с опцией {$M+} и их наследники. Из стандартных это TPersistent.
Юрий_Л (2004-12-24 15:37:00) [8]"Работать, понятное дело, будет только для RTTI-enabled классов."
И какие классы этому соответствуют?
Если написал новый класс, наследника класса из VCL, то для него будет работать?
Дитё (2004-12-24 15:30:00) [9]я слышал про какую то Eureka ExceptionLog но она платная и её найти тяжело , там как раз и создается какой-то map файл в папке программы
vuk (2004-12-24 15:05:00) [10]to KSergey:
В принципе да. Трассировку стека JclDebug делать умеет. Но для приведения трассировки в удобоваримый вид нужно либо отладочную информацию включать либо map файл иметь.
KSergey (2004-12-24 15:01:00) [11]По-моему, JclDebug.pas из JEDI - как раз то, что автору нужно. И строки тебе, и юниты...
http://homepages.borland.com/jedi/jcl/
vuk (2004-12-24 14:55:00) [12]to Дитё (24.12.04 14:49) [12]:
>наверно имелось ввиду TypInfo
Ну да, очепятки... :o)
На самом деле я бы еще добавил проверку instance.ClassInfo на nil перед вызовом GetTypeData, иначе AV будет вылетать для классов без RTTI.
Дитё (2004-12-24 14:49:00) [13]
> vuk © (24.12.04 14:20) [9]
Спасибо
> uses
> TypIndo;
наверно имелось ввиду TypInfo
> Юрий Зотов © (24.12.04 14:17) [8]
извените а assert применяется только в design time да ?
Skier (2004-12-24 14:43:00) [14]>vuk © (24.12.04 14:20) [9]
мда, про RTTI-то я и забыл...нехорошо :)
vuk (2004-12-24 14:23:00) [15]Работать, понятное дело, будет только для RTTI-enabled классов. :o)
vuk (2004-12-24 14:20:00) [16]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;
Юрий Зотов (2004-12-24 14:17:00) [17]> Дитё (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 все будет можно достать.
Skier (2004-12-24 14:10:00) [18]TScreen.ActiveForm
Дитё (2004-12-24 14:07:00) [19]А ещё вопрос
как узнать какая форма текущая в моем приложении ?
Дитё (2004-12-24 14:03:00) [20]вернее, в каком модуле произошла ошибка !!