Секреты Delphi IDE  
В данном разделе приводятся секреты среды разработки Delphi, открытые мной лично или "выданные" мне другими разработчиками. Если у вас есть что-либо по этой теме (касаемо именно IDE, а не программистских трюков), шлите их мне.  
1. Чтобы избавиться от сообщения Unit xxxxx was compiled with another version of yyyyy, возникающего при компиляции с заменой системных модулей, попробуйте вот такой прием: скомпилируйте все (Build All) сначала без замены, затем выполните замену (измените настройки путей к модулям), и выполните компиляцию (Compile).

Автор совета: Thaddy de Koning.
 
2. Иногда во время разработки формы хочется поскроллировать list view в режиме report (в KOL - lvsDetail или lvsDetailNoHeader). Это возможно сделать... колесиком мыши.  
3. Если при прокрутке текста в редакторе Delphi колесом мыши удерживать клавишу Ctrl, то текст будет прокручиваться не строками, а целыми страницами. Если же удерживать клавишу Shift, то происходит вертикальное перемещение каретки (точный эквивалент клавиш-стрелок вверх/вниз).  
4. Не все знают, что для того, чтобы сдвинуть вправо или влево несколько строк исходного текста в Delphi, достаточно выделить эти строки и нажать комбинацию клавиш Ctrl+Shift+I (вправо) или Ctrl+Shift+U (влево)
(Автор совета: Кирюхин Е.Т.).
     Сдвиг при этом происходит на 2 позиции (число может быть другим, если вы исправили Tab size в редакторе IDE). Если нужно только на нечетное число позиций, можно выполнить сдвиг влево путем удаления блока шириной в 1 символ. Блок можно выделить, удерживая клавишу Alt (т.е. Alt+Shift+стрелки). Кстати, чтобы выйти из режима выделения блоков и снова иметь возможность выделять текст как обычно, нужно просто щелкнуть левой клавишей мыши где угодно в тексте. Как и обо многих других полезных сочетаниях клавиш, об этих секретах можно узнать из справочной системы самого Delphi, если знать, где искать (мне с налета найти не удалось ни эти два сочетания, ни Ctrl+Shift+R (начало/конец записи макрокоманды) и Ctrl+Shift+P (проигрыш записанной макрокоманды в редакторе IDE Delphi).
 
5. Иногда в Delphi6 при наборе исходного текста в Code Completion происходит очень неприятный затык, который выражается в том, что не работает пробел, возврат каретки и разделители - скобки, запятые и т.п. Обычно происходит это сразу после ввода имени процедуры или функции с помощью Code Completion, когда курсор оказывается внутри автоматически добавленных им скобок. Избавиться очень просто: надо нажать Ctrl+пробел, и после того, как выпадет список всевозможных подсказок, в данном случае обычно бесполезный, нажать Escape (ну, или выбрать что-то из списка, если и впрямь что-то оказалось.  
6. Не все знают, что в Delphi есть очень полезное средство поиска неприятных ошибок вроде Access Violation. Когда появляется сообщение с указанием адреса команды, в которой находится машинная инструкция, приведшая к неприятным последствиям, с помощью команды Search | Find error в IDE Delphi можно ввести этот адрес (с символом '$' в начале), и во многих случаях Delphi успешно показывает строку в исходном тексте, которая соответствуют ошибочному участку кода. Команда должна быть выполнена при выполнении программы. Если она сейчас не в состоянии отладки, нужно запустить ее (F8).  
7. Еще пара советов для тех, кто еще не привык писать программы сразу без ошибок.

7A. Если от начала работы всей программы или от вызова некоторого известного участка кода ошибка, которую следует обнаружить, возникает детерминированно, но для ее поиска следует многократно выполнить по шагам один и тот же участок кода (например, в цикле, или в рекурсии), то работу по определению места возникновения ошибки можно существенно облегчить (в Delphi5 и выше) следующим образом. Установим на строке, которую предполагается выполнить многократно, но неизвестно сколько раз, точку останова со счетчиком в качестве условия, а значением счетчика пусть будет очень большое число, например 9999. (Нажать на красном кружке, отмечающем точку останова, правой клавишей мыши, из выпавшего меню выбрать пункт Breakpoint properties, перейти в поле Pass count и ввести число в нем).

Запустим (продолжим) выполнение программы. Когда произойдет ошибка, не останавливая программу, найдем эту строку, и наведем мышь на красную точку. Во всплывающем окошке Delphi покажет, сколько раз выполнялся код в этой строке. Теперь снова меняем свойства этой точки останова, ставим показанное отладчиком количество проходов в качестве условия остановки, запускаем все заново, и останавливаемся в точности в тот момент, когда ошибка должна произойти (но еще не произошла). Теперь можно двигаться далее по шагам, и искать причину недоразумения. Разумеется, способ этот не годится для случаев "плавающих" ошибок.

7B. Если некоторая переменная после установки нужного вам значения, спустя некоторое время оказывается изменена в "неправильное" значение, и не удаётся обнаружить код, который выполняет такое изменение, то:
- установите точку остановки на место, где проблемная переменная имеет правильное значение;
- добавьте эту переменную в Watch list (желательно обеспечить контекстно-независимое полное им переменной, например, Form1.MyArray[4,6], или вообще выяснить адрес переменной в памяти, и написать что-то вроде PInteger($123456)^);
- нажмите на строке с этим значением в Watch list правой кнопкой мыши и выберите пункт меню Break when changed.
- запустите программу далее (F9). В том месте, где будет выполнено изменение указанной памяти, отладчик остановит программу, и можно будет проанализировать стек и понять, какой код и при каких обстоятельствах испортил ваше правильное значение.

 
8. Начиная с версии 5, в Delphi появились новые очень мощные средства для выполнения остановки по всевозможным условиям, что кое-кому облегчило жизнь. Но на самом деле, средство это весьма замедляет работу программы, и как оказывается, начиная с самой первой версии Delphi есть гораздо более эффективное и удобное средство для перехода выполнения программы в режим пошаговой отладки тогда, когда это нам нужно. Достаточно написать:
  if <some_condition> then 
  asm 
    int 3 
  end;
Как только заданное условие (которое может быть сколько угодно сложным) выполнится, выполнение программы приостановится на следующей строке программы.
 
9. Иногда при работе в Delphi5 происходит очень неприятный сбой, когда редактор исходного текста IDE виден на экране, и формы по F12 так же можно заставить показаться, и Object Inspector так же вызывается по F11, а вот самого окна IDE Delphi с его меню, тулбарами и линейкой компонентов нет. И не помогает даже переустановка Delphi поверх имеющегося.
     Решение: надо найти в директории \bin файл Delphi32.dsk и стереть его, после чего перезапустить Delphi.
 
10. Немного об установке Delphi. Не все знают, что нет абсолютно никаких проблем с установкой на машину одновременно нескольких (или всех) версий Delphi от Delphi 1 до Delphi 7 (кроме проблем с покупкой лицензии на все эти версии, разумеется). При установке Delphi (по крайней мере, в 5-й версии) могли быть проблемы при установке, если папка временных файлов оказывалась в пути, содержащем не только символы ASCII. Это практически всегда происходило при установке в русской версии Windows2000 из-под аккаунта администратора, имевшего по умолчанию имя Администратор. Для исправления ситуации предлагалось настроить в качестве папки временных файлов по умолчанию что-нибудь вроде C:\Temp. Кроме того, дистрибутив отказывался устанавливаться с жесткого диска или не из корневой директории жесткого диска. Чтобы не копировать все файлы и директории с дистрибутива в корень жесткого диска, достаточно создать псевдо-диск, например, в командной строке набрать:

>subst z: d:\путь к дистрибутиву

, после чего можно устанавливать Delphi с "диска" z:.
 
11. В Delphi есть некоторые секретные настройки, изменить которые возможно только прямой правкой реестра:
В Delphi2 окно CPU не было доступно. Чтобы исправить это, требовалось добавить в реестре по ключу
[HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Debugging]
"ENABLECPU" = "1".

Если занести следующие строки в реестр:
[HKEY_CURRENT_USER\Software\Borland\Delphi\5.0\Extras]
"AutoPaletteSelect"="1"
"AutoPaletteScroll"="1"
, то палитра компонетов будет автоматически прокручиваться при наведении курсора мыши.

Совет предоставлен: Dimaxx.
 
12. Если вы предпочитаете не отключать темы, то у вас есть возможность существенно улучшить внешний вид интерфейса Delphi7, Delphi6, Delphi4, Delphi3 и даже Delphi2, просто добавив в папку DelphiX\Bin файл интерфейса с именем Delphi32.exe.manifest (подойдет любой внешний файл манифеста от любого приложения, подключающего манифест через внешний файл). К сожалению, для Delphi 5 этот фокус не проходит: он не может запуститься и завершается с ошибкой. Впрочем, в Delphi4 подключение манифеста приводит к тому, что меню становится черным, и хорошо видно только текущий пункт меню.

В чем преимущество манифеста? Лучше становится видно закладки в редакторе Delphi, текущая закладка высвечена ярче прочих, и не приходится вглядываться, отыскивая нужную закладку среди многих.

 
13. Если во время выполнения программы, запущенной из Delphi в режиме отладки, нажать F12, то программа остановится и будет показано окошко CPU. Можно нажать F9, чтобы продолжить выполнение.
Jon сообщил следующее: В системах Windows NT, F12 является клавишей по умолчанию для прерывания программ в отладчике.
Это может быть изменено в реестре:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Для установки клавиши PAUSE измените:
"UserDebuggerHotKey"=dword:00000013
 
14. Вы можете существенно ускорить время начального запуска и работу среды Delphi, и при этом уменьшите расход памяти, если отключите те design-time пакеты (времени разработки), которые вы не используете в своей работе. Для этого выполните Components | Install packages, и снимите крыжики с тех пакетов, которые вам не нужны (они уйдут так же с линейки компонентов). Не следует снимать галочку с пакета Delphi Standard Components, в любом случае (возникнут проблемы с изменением списковых свойств в Инспекторе объектов).

Данное изменение следует сделать в отсутствие загруженных в IDE проектов, чтобы оно в дальнейшем применялось по умолчанию для всех вновь создаваемых приложений, и повторить после загрузки ранее созданных проектов, т.к. в настройках каждого проекта Delphi запоминает свой список пакетов.

 
15. Когда вы разрабатываете свой компонент, то для пересборки пакета используйте клик правой кнопкой мыши на узле верхнего уровня в дереве пакета (т.е. либо на слове Contains, либо на слове Requires). Если выделен любой другой элемент дерева, то пункт Build не появляется в контекстном меню.  
 

Copyright (C) 1999-2006 by Vladimir Kladov