Andrey Bratuhin дата публикации 11-06-2004 18:00 Полезности IDE Delphi & C++Builder
Каждый программист, использующий C++Builder или Delphi, постоянно работает в IDE.
После некоторого опыта использования этого инструмента у каждого программиста появляются
свои приемы работы и настройки данной среды. Данная статья содержит информацию об
инструментах и настройках IDE в C++Builder & Delphi, которые не так явно выражены,
но которые могут принести большую пользу для программистов.
Статья в основном рассчитана на новичков, но и опытные программисты
смогут найти полезную информацию. По крайней мере, я надеюсь на это.
Автор не претендует на полноту изложения данной темы, а лишь пытается
поделиться собственным опытом.
ClassExplorer - один из самых полезных инструментов среды разработки.
ClassExplorer это:
навигация по классам;
навигация по методам класса и отдельным функциям;
автоматизированное добавление полей, свойств и методов;
контекстный просмотр иерархии класса (Class Hierarchy).
Из всех выше перечисленных возможностей очень часто забывают про
две последние. Большинство программистов не пользуются этими
функциями, аргументируя это тем, что для того чтобы их вызвать,
необходимо переключаться с клавиатуры на мышь. На самом деле у
всех на столе стоит Microsoft-совместимая клавиатура, на которой
есть специальная кнопочка, которая вызывает контекстное меню.
В контекстном меню ClassExplorer'a есть такие пункты: "New Field"
- добавление нового поля, "New Property" - добавление нового свойства,
"New Method" - добавление нового метода. Особого внимания заслуживают
"New Property" и "New Method".
При вызове "New Property" открывается диалоговое окно (см. рис. 2).
Задав ниже перечисленные параметры в этом окне, IDE автоматически
сгенерирует объявление и тело необходимых методов для
реализации Property в указанном классе.
Для создания Property необходимо задать следующие параметры:
Property Name - название Property;
Add to Class - имя класса, которому будет принадлежать Property;
Type - тип Property. Можно выбрать из списка или задать пользовательский
тип данных;
Visiblity - разрешение на доступ к Property;
Reads - имя метода для чтения Property;
create Get method - генерировать тело метода для чтения;
Writes - имя метода для установки значения Property;
create Set method - генерировать метод для установки значений;
Implement Get using member - использовать уже ранее объявленное поле,
в котором хранится значение Property, для реализации метода для чтения;
Implement Get using member - тоже самое что и "Implement Get using member",
только для метода установки значения;
create field - создание нового поля данных в классе. В поле
укажите имя переменной, в которой будет храниться значение Property;
using this field for implementing the Get method - использовать
выше указанное поле для реализации метода чтения Property;
using this field for implementing the Set method - использовать
выше указанное поле для реализации метода установки значения Property;
Array - если ваше Property будет массивом, то в этом параметре
необходимо указать какой будет использоваться индекс для доступа
к элементам массива. Обязательно указывайте квадратные скобочки.
Пример значения Array для создания Property-массива с целочисленным индексом:
[ int aIndex ] (С++),
[ aIndex : Integer ] ( Object Pascal );
Index - это целочисленная константа в пределах от -2147483647 до 2147483647,
указывающая на элемент массива, в котором хранится значение данного Property.
Пример использование параметра Index (из справки):
type
TRectangle = class
private
FCoordinates: array[0..3] of Longint;
function GetCoordinate(Index: Integer): Longint;
procedure SetCoordinate(Index: Integer; Value: Longint);
public
property Left: Longint index 0 read GetCoordinate write SetCoordinate;
property Top: Longint index 1 read GetCoordinate write SetCoordinate;
property Right: Longint index 2 read GetCoordinate write SetCoordinate;
property Bottom: Longint index 3 read GetCoordinate write SetCoordinate;
property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate;
...
end;
Stored - булевская переменная или константа (true, false),
указывающая будет ли сохраняться значение Property в файле формы.
Для Property-массива нельзя указывать этот параметр;
Default - значение по умолчанию для Property. Для Property-массива
этот параметр будет иметь другое предназначение. Если этот параметр
указан для Property-массива, то можно использовать следующую конструкцию:
ClassObject1.Property1[ Index ] := 10;
=>
ClassObject1[ Index ] := 10;
При вызове "New Method" из контекстного меню ClassExplorer будет вызвано
диалоговое окно для создания нового метода класса(см. рис. 3).
Для создания метода необходимо задать следующие параметры:
Method Name - имя метода;
Add to Class - имя класса, в который добавляется новый метод;
Arguments - список аргументов. Например:
int aIndex, const AnsiString &aName (C++);
aIndex : Integer; aName : const String (Object Pascal).
Method Type - вид создаваемого метода: Function - функция, процедура;
Constructor - конструктор; Destructor - деструктор.
Function Result - тип возвращаемого значения;
Visibility - разрешение на доступ к методу;
Directives - дополнительные директивы: abstract - абстрактный метод,
virtual - виртуальный метод, const - константный метод (в теле данной функции
не изменяется состояние объекта), __fastcall - влияет на передачу параметров
метода через регистры процессора. Этот параметр обязателен для методов формы,
которые участвуют в обработке событий (см. справку).
Message Handler - обработка системных событий. Если вам необходимо
обработать системное событие, не используя обработчики событий VCL,
то этот параметр позволит создать объявление и тело метода с необходимыми
параметрами.
Call inherited - в теле метода генерируется вызов метода предка;
Inline - подставляемый метод (используется директива inline).
Используйте подставляемые методы для оптимизации вызова маленьких, но
часто используемых функций.
Implicit inline - неявный подставляемый метод. Тело метода
создается в объявлении класса (только С++).
Среди программистов, которые никогда не работали в C++Builder или Delphi,
бытует мнение, что единственным, чем занимается программист на Delphi -
это "рисование" форм и перетаскивание визуальных компонент. На самом
деле RAD Delphi и C++Builder позволяет быстро перейти от создания
интерфейса программы к реализации необходимой функциональности.
Не загромождая код иногда ненужными деталями внутренней реализации
интерфейса программы.
Code Editor - редактор исходных текстов.Если сравнивать редактор
текста Delphi&C++Builder с MS Visual C++ (вместе с Visual Assist) или
(X)Emacs, то борландовский редактор намного уступает по возможностям и
удобству использования. Но его функций более чем достаточно для
нормального управления исходным текстом программы.
Ниже перечислены горячие клавиши, которые будут полезны для любого
программиста, но о которых мало кто знает:
Alt - { или Alt - } - быстрый переход по скобочкам. Очень удобно
использовать в С++ для перехода на начало/конец блока кода
или в длинном выражении для поиска начальной или конечной скобочки.
Ctrl-Shift-R - включает/отключает запись клавиатурного макроса.
Ctrl-Shift-P - выполняет сохраненный клавиатурный макрос.
Сtrl-F6 - переключение между заголовочным файлом и файлом реализации (С++).
В Code Editor есть один очень удобный инструмент Code templates -
шаблоны кода. Code templates вызывается по клавише Ctrl-J и в том месте,
где находится курсор, выпадает список, в котором перечислены почти все
конструкции языка и которые можно вставить в код несколькими нажатиями
кнопок. Это очень удобно и экономит массу времени. Особенно, если у
вас очень часто пальцы застряют между кнопками клавиатуры и вы
пишите с ошибками inherited, constructor, destructor :-) Code templates
не был таким полезным, если бы не было возможности самостоятельно расширять
или модифицировать существующие шаблоны. Для редактирования Code templates
нужно вызвать из меню "Tools" - "Editor Properties" и перейти на закладку
"Code Insight".
Цветовая гамма, которая по умолчанию используется в Code Editor,
довольно приятна для глаз и функциональна. За одним исключением -
комментарии. Я всегда изменяю цвет фона комментариев на серый.
Таким образом, я выделяю комментарии визуально. Это очень видно
на примере.
По собственному опыту могу заметить следующее, что очень часто
стол программиста превращается в мусорную корзину. На этом клочке
бумажки записана очень важная информация. Ее нельзя выбрасывать. На
этом клочке, что поменьше, написаны ключи компилятора для оптимизированной
компиляции проекта и т.д. и т.п. И на столе собирает ворох очень нужных
бумажек. А при потере одной из таких записок возникает не меньше проблем,
чем при утрате исходного файла.
To-Do List решит эту проблему, но он также поможет увеличить
эффективность ведения подобных записей. To-Do List - это довольно
удобный инструмент, который позволяет хранить контекстные заметки.
Окно To-Do List вызывается через меню "View" или в Code Editor
горячей клавишей Shift-Ctrl-T (см. рис. 5). Если вы вызываете
To-Do List из редактора, то в текущую позицию вставляется специально
оформленный комментарий, который содержит необходимую информацию о заметке.
Для создания заметки необходимо задать текст, приоритет, владельца и
категорию. Поле "Владелец" я использую в том случае, если моим исходном
кодом пользуется еще кто-то. И такая заметка может пригодиться для другого
программиста. Для поля "Категория" я обычно использую следующие значения:
Implementation, Redesign, Bug, Warning. Подобные заметки отличаются от
обычных комментариев тем, что данные заметки указывают, что нужно сделать
в будущем и являются инструментом планирования изменений исходного кода.
Обычно я такие заметки вставляю в тех местах, где я не знаю, как
реализовать функциональность. Это в основном блоки else или switch :- )
Например:
if( isFlag() )
{
doSomething();
}
else
{
assert( false, "Need implementation." );
/* TODO 1 -cImplementation : Здесь нужно что-то написать!!! */
}
Наверно любой программист когда-нибудь, но занимался отладкой своего
собственного кода. Или я один такой, у которого всегда найдется причина
покопаться отладчиком во внутренностях своей программы? Тема отладки
программ, конечно, может послужить источником написания отдельной
статьи или книги, но я приведу несколько инструментов в IDE C++Builder
& Delphi, которые, на мой взгляд, могут быть полезны любому программисту.
Local Variables - просмотр значений локальных переменных. Во время
отладки очень часто приходиться просматривать значения переменных.
В объектно-ориентированном программировании очень мало глобальных
переменных (большинство интересных значений инкапсулировано в объектах),
то очень удобно использовать для просмотра переменных Local Variables.
Окно Local Variables открывается из меню "View" - "Debug Windows",
через контекстное меню в редакторе кода или горячей клавишей Ctrl - Alt - L.
Debug Inspector - инспектор отладки. Если вам надоело добавлять
отдельные поля одного и того же класса в Watch List, то откройте этот
класс в Debug Inspector и наслаждайтесь увиденным. Через Debug Inspector
вы сможете не только просмотреть значения отдельных переменных, но и
раскрывать в отдельном окне классы и структуры.
Call Stack - просмотр стека вызовов. Если с вами полиморфизм
сыграл дурную шутку или вы не знаете, какой метод передает испорченные
параметры, то Call Stack сможет помочь найти источник ваших проблем.
Call Stack покажет в каком порядке происходили вызовы ваших и не только
ваших методов и с какими параметрами они начинали работать. Окно Call
Stack открывается из меню "View" - "Debug Windows", через контекстное меню
в редакторе кода или горячей клавишей Ctrl - Alt - W.
Я всегда стараюсь увеличить размеры редактора исходного кода, сбоку
от редактора у меня "прилеплен" Class Explorer, Object Inspector и
Project Manager. Во время отладки мне нужны еще дополнительно окна
Watch List, Local Variables, Call Stack, но эти окна мешают во время
проектирования, т.к. уменьшают размеры редактора исходного кода.
Можно, конечно, каждый раз при запуске отладки настраивать внешний
вид IDE, но меня очень быстро утомляет это занятие. Благодаря
возможности сохранения внешнего вида IDE, можно решить и эту
проблему (меню "View" - "Desktops"). Вы можете настроить Desktop
для разработки и сохранить его в файле. Затем вы настраиваете Desktop
для отладки и тоже сохраняете его в файле, но дополнительно указываете,
что этот Desktop вы будете использовать для отладки. Теперь при
запуске отладки у вас автоматически загружается уже настроенный Desktop,
а при возврате из отладки возвращается последний установленный Desktop.
Прошу читателя рассматривать данную статью как личный опыт.
Автор не хотел задеть чьи-либо чувства :- ).
Андрей Братухин,
http://ablabs.narod.ru
[Code Explorer] [Настройка среды (IDE)]
Обсуждение материала [ 30-07-2006 13:41 ] 8 сообщений |