Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1102937302
}|{yk
2004-12-13 14:28
2005.01.16
При удалении дочерних записей получаю ошибку


1-1104227614
AC
2004-12-28 12:53
2005.01.16
CheckListBox Как убрать переключатели у отдельных пунктов?


1-1104141631
Aleksandr.
2004-12-27 13:00
2005.01.16
Как у главного меню поменять цвет?


1-1103792518
SbtON
2004-12-23 12:01
2005.01.16
PopUpMenu в StringGrid


14-1104434825
Profi
2004-12-30 22:27
2005.01.16
Ошибка или злая шутка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский