Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизМожно ли по объекту узнать в каком модуле он объявлен ? Найти похожие ветки
← →
Дитё (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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.047 c