Главная страница
    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.057 c
4-1101711707
BVV
2004-11-29 10:01
2005.01.16
Время создания файла


14-1104383875
КаПиБаРа
2004-12-30 08:17
2005.01.16
Вера в разум тоже религия?


9-1096483582
Jus
2004-09-29 22:46
2005.01.16
Как избежать ошибки <B>Canvas does not allow drawing </B>при свор


14-1103814228
Cosinus
2004-12-23 18:03
2005.01.16
Перевод проекта Delphi6 <=> Delphi5


3-1103051174
SergP
2004-12-14 22:06
2005.01.16
Есть ли в SQL возможность не указывать имена полей?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский