IDE. Увидеть код родителя

Добрый день!Вопрос по IDE (D6-2007). Существует некая форма (либо компонент - не важно), которая является наследником другой. У нее есть метод, описанный в форме-родителе. Я открываю форму-наследника, вижу, что некий метод унаследован. Есть ли способ сразу, на месте увидеть/перейти к коду родителя (меню, горячая клавиша), не открывая форму родителя собственноручно и не ища этот метод там руками?
24 ответа

Rainer,Ctrl + мышь


Ctrl+LeftMouseButtonClick


Всмысле вот это?
Ctrl+Click Go to declaration.
Хм... В каком месте Ctrl+Click произвести, чтобы получить описанное в первом посте?


Всмысле вот это?Хм... В каком месте Ctrl+Click произвести, чтобы получить описанное в первом посте?
На названии метода (она при этом как гиперссылка выделится)


На названии метода
Все таки на названии класса наверное
TMyClass = <b>class</b>(TКудаТыкатьМышью)


Все таки на названии класса наверное
TMyClass = <b>class</b>(TКудаТыкатьМышью)
или по полям/свойствам классаА по методам удобно передвигаться от спецификации к телу и обратно по Ctrl + UpArrow/DownArrow


Ctrl + UpArrow/DownArrow
Ctrl + Shift + UpArrow/DownArrow


Теперь понятно, коллеги, спасибо!Да, это облегчает задачу немного, но все же я имел в виду несколько другое. Хочется имея под руками метод наследника, сразу перейти на код соотвествующего метода у родителя. Для решения этой задачи предложенный выше способ все равно подразумевает массу работы руками, т.к. позволяет всего лишь навсего открыть описание класса родителя, а непосредственно унаследованный код все равно приходится искать. И потом, непосредственный родитель может и вовсе не иметь кода в методе, и реальное наследование идет от более ранних предков. Получается, что по этой схеме, придется перебирать их всех... Я честно говоря, предполагал, что в IDE Дельфей существуют более изящный механизм просмотра иерархии наследования. Я сейчас объясню, что я имею в виду... Придется немного расширить вопросЯ продемонстрирую то, о чем я говорю на примере реализации этого в IDE FoxPro, а вы, если есть аналоги подобного в IDE Delphi, плиз подкажите как это найти Есть форма, в иерархии наследования у которой 6 предков *Попутя вопрос, как в IDE Delphi получить иерархию для класса в подобном виде?Вот так выглядит список ее методов в фоксовском аналоге Object Inspector:Стрелками указаны 2 метода, которые унаследованы от предков разного поколения. Фоксовское IDE, автоматом проверяя реализацию метода у всех предков, тут же само определяет от каких именно из них реально унаследован код (ведь непосредственные родители тоже могли его не пеереопределять, а получить в неизменном виде от ранних предков), и в какой библиотеке они находятся. Таким образом, я даже не открывая кода формы на редактирование, могу определить происхождение кода, который по наследованию получил метод. Так например, можно понять, что код метода Deactivate взят из первого класса в иерархии (i_form), и далее ни в одном из потомков не переопределялся, и в неизменном виде дошел до рассматриваемой формы. А вот код метода KeyPress наоборот, переопределен в последнем классе иерархии, у непосредственного родителя (appdataviewfrm) Далее, здесь же, по контекстному меню я имею возможность открыть на просмотр код метода у родителя. Не собственный код объекта, а именно реально доставшийся по наследству код. Не важно, переопределяли код в просматриваемой форме или нет, всегда есть возможность увидеть, что досталось методу от предковБолее того, в IDE есть возможность увидеть код унаследованного метода не только непосредственного родителя, а вообще у любого предка в родословной. Она появляется если открыть код метода на редактирование.С помощью выпадающего меню можно просмотреть всю историю реализации метода, выбирая каждый раз интересующего предка. Выбор класса из списка покажет код метода именно в нем. Выделенные жирным имена классов имеют код в методе, затененные - не имеютТ.е. Фокс - весьма и весьма пластичен в вопросе просмотра иерархии. Когда же я открыл унаследованную форму в Дельфи, я увидел всего лишь вот это:Из просмотра Object Inspector можно понять только лишь что некий метод унаследован - и всё (три метода на скриншоте). Любая допинформация "под руками" отсутсвует (от кого унаследован, какой именно был код у родителя, у деда, у прадеда и т.д по иерархии). Контекстное меню не содержит желаемых функций. Совсем не очевиден способ, с помощью которого можно было бы добраться до этой информации одним-двумя кликами мыши. Может, не в том месте ищу?


Это окно обработчиков событий, там методов нет, перейди на другое окно, или не приводи это.И второе ты наверно догадываешься, что все IDE различаются и Дельфи не исключение.--http://www.podgoretsky.com


И второе ты наверно догадываешься, что все IDE различаются и Дельфи не исключение.
Догадываюсь, и... ?
Это окно обработчиков событий, там методов нет
Это не меняет сути вопроса. В Object Inspector я вижу, что FormCreate достался от предка. Но оттуда я не могу увидеть его код без необходимости раскапывания всей иерархии наследования руками. А откуда могу?
перейди на другое окно
Вот я и спрашиваю на какое окно мне перейти, чтобы оно имело требуемую функциональность? Меня интересуют аналоги описанных выше возможностей в IDE Delphi. Мне исключительно все равно в каком окне это будет реализовано
MMCE вам в руки.
Это, я так понимаю, альтернативное 3d-party IDE практически... Попробую его посмотреть, спасибо!


...Это, я так понимаю, альтернативное 3d-party IDE практически... Попробую его посмотреть, спасибо!
Не, это примочка просто.


Не, это примочка просто.
Ok


пишем, и надимаем заветный клик
<b>inherited</b> KeyPress;


Не знаю, но видимо в Object Brower, не пользуюсь.Можно также в справку.И главное не могу понять зачем это нужно в терминах ООП, в чем дзен?--http://www.podgoretsky.com


пишем, и надимаем заветный клик
<b>inherited</b> KeyPress;
+1 Автор! Вот это похоже тебе нужно?


Rainer,выше тебе написали. Просто в фоксе перемудрили, если 6 наследников то делать на UML надо.


И главное не могу понять зачем это нужно в терминах ООП, в чем дзен?
Ну, я даже не знаю как ответить на этот вопрос... Может, Вам не нужно, мне - нужно. Передо мной исходники фреймворка с тучей классов наследованных-перенаследованных друг от друга, и мне, разбираясь в его работе, постоянно приходится тратить массу времени на бесконечные пустые однообразные действия, потому как в стандартном IDE Delphi мне пока не удается отыскать эффективные аналоги того, о чем говорилось выше. Чтобы получить то, для чего в FoxPro мне требуется нажать одну/две кнопки, здесь мне приходится приложить массу усилий
пишем, и надимаем заветный клик
<b>inherited</b> KeyPress;
+1 Автор! Вот это похоже тебе нужно?
Вот, уже кое что! Спасибо. Но... это уже вмешательство в код, а если это не входит в мои планы? Если у меня задача всего лишь посмотреть реализацию унаследованного метода, а в трогать его в наследнике я вовсе не хочу... Написать, перейти по линку, а потом стереть? Ну, в общем, по-любому спасибо, я основную идею уловил. Кстати, странно, почему создатели IDE не сделали хотлинк сразу на слове inherited, что было бы более логично, потому как оно может стоять в одиночестве, да и не приходилось бы писать еще и имя, ведь оно не всегда бывает нужно по логике кода
Rainer,Просто в фоксе перемудрили, если 6 наследников то делать на UML надо.
Что же особо мудреного представлено на скриншотах? Разработчику всего лишь дана банальная возможность без лишних усилий "достать" код предков метода, с которым он работает. В стандартном же IDE Delphi, судя по всему, без вмешательства в код такая возможность просто отсутствует. А количество уровней наследования тут и вовсе не при чем - был бы рабочий механизм, работал бы одинаково и для двух уровней, и для двухсот двадцати двух


Ctrl+LeftMouseButtonClick
не всегда открывает модуль с описанием класса - почему???сразу оговорюсь - все пути прописаны...


не всегда открывает модуль с описанием класса - почему???сразу оговорюсь - все пути прописаны...
Когда исходников (*.pas) нет, такое бывает)


Написать, перейти по линку, а потом стереть? Ну, в общем, по-любому спасибо, я основную идею уловил. Кстати, странно, почему создатели IDE не сделали хотлинк сразу на слове inherited, что было бы более логично, потому как оно может стоять в одиночестве, да и не приходилось бы писать еще и имя, ведь оно не всегда бывает нужно по логике кода
Почему создатели IDE чего-то там не сделали, это вопрос к создателям, а вот стирать ничего не обязательно, поскольку "логика кода" при этом не меняется.С точки зрения синтаксиса Object Pascal разрешается опускать название процедуры при вызове процедуры предка с тем же названием, компилятор добавит его по умолчанию сам.При этом, что интересно, опускать назание для функций нельзя.Кстати, если кто не в курсе, указав после inherited имя можно вызвать любую функцию или процедуру предка, а не только ту, которую в данный момент перекрываем. Когда-то, ещё во времена Turbo Pascal можно было вообще вызывать процедуры или функции с любого уровня в цепочке пердков, но из Object Pascal эту возможность убрали.


> логика кода при этом не меняетсяЕщё как меняется


Когда исходников (*.pas) нет, такое бывает)
Мда... - ну это вы уж совсем меня "ниже пояса" решили огреть))) - есть там *.pas


Когда-то, ещё во времена Turbo Pascal можно было вообще вызывать процедуры или функции с любого уровня в цепочке пердков, но из Object Pascal эту возможность убрали.
Не буду давать зуб, но мне что-то казалось, что ключевое слово inherited появилось уже в Delphi ;-)


> логика кода при этом не меняетсяЕщё как меняется
Интересно, каким это образом она меняется? Может быть я что-то упустил?
Не буду давать зуб, но мне что-то казалось, что ключевое слово inherited появилось уже в Delphi ;-)
Ключевое слово inherited появилось уже в Delphi, тут вы правы. В Turbo Pacal'е вызов методов предков производился через явное указание названия класса перед методом через точку, что и позволяло вызывать методы с любого уровня, а не только от ближайшего предка, где данный метод определён, как сейчас в Delphi.