Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Дитё ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо