Этот документ в основном предназначен для того, чтобы предоставить разработчикам Delphi стандарт написания исходного кода, а также стандарт именования программ и файлов, чтобы они могли иметь согласованный формат, которому они могут следовать при программировании. Таким образом, каждый программист пишет код, понятный другим.
Отступ означает два пробела между каждым уровнем. Не размещайте символы табуляции в исходном коде. Это связано с тем, что ширина символа табуляции варьируется в зависимости от различных настроек и утилит управления кодом (печать, документация, контроль версий и т. д.).
С помощью меню «Инструменты | Среда» на странице «Общие» диалогового окна «Параметры среды» снимите флажки «Использовать символ табуляции» и «Необязательную заливку», чтобы символы табуляции не сохранялись.
Поля установлены на 80 символов. Исходный код обычно не выходит за пределы написанного слова, но это правило более гибкое. По возможности операторы длиной более одной строки следует заключать в запятые или операторы. После разрыва строки отступ должен составлять два символа.
Оператор начала должен находиться на отдельной строке. Например, первая строка ниже неверна, но вторая строка правильна:
for i:=0 to 10 do Begin // Неверно, начало и for находятся в одной строке
for i:=0 to 10 do // Да, начать с другой строки
начинать
Особым случаем этого правила является случай, когда начало является частью оператора else, например:
если какое-то утверждение = тогда
начинать
.
конец
еще начать
Некоторое другое заявление;
конец;
Примечание. Конечный оператор всегда находится на отдельной строке. Если начало не является частью оператора else, соответствующий оператор конца сдвигается на ту же величину, что и оператор начала.
Обычно мы используем комментарии к блоку типа "{...}". Предыдущий комментарий к блоку типа "(*...*)" используется для временного закомментирования неиспользуемого кода. Начиная с Delphi 2, поддерживается строка "//". комментарии, если вы решите не поддерживать версии Delphi ниже 2.0, вы можете использовать комментарий «//».
Между открывающей скобкой и следующим символом нет пробела. Аналогично, между закрывающей скобкой и предыдущим символом нет пробела. В следующем примере показаны правильные и неправильные пробелы.
CallPROc(Апараметр); // Ошибка!
CallProc(Апараметр); // Правильно!
Не включайте в утверждения лишние скобки. В исходном коде круглые скобки используются только тогда, когда это действительно необходимо. Следующие примеры демонстрируют правильное и неправильное использование:
if (I=42) then // Ошибка, скобки лишние
if (I=42) или (J=42) то // Правильно, необходимо использовать скобки
Зарезервированные слова и ключевые слова в языке Object Pascal всегда пишутся строчными буквами. Ниже приведен список зарезервированных слов Delphi 5:
и | множество | как | Асм |
начинать | случай | сорт | константа |
конструктор | деструктор | диспинтерфейс | делитель |
делать | вплоть до | еще | конец |
кроме | экспорт | файл | завершение |
окончательно | для | функция | перейти к |
если | выполнение | в | унаследованный |
инициализация | в соответствии | интерфейс | является |
этикетка | библиотека | мод | ноль |
нет | объект | из | или |
вне | упакованный | процедура | программа |
свойство | поднимать | записывать | повторить |
строка ресурсов | набор | шл | шр |
нить | затем | тредвар | к |
пытаться | тип | единица | до |
использует | вар | пока | с |
исключающее ИЛИ | частный | защищенный | общественный |
опубликовано | автоматизированный |
Имена процедур должны начинаться с заглавной буквы и располагаться в шахматном порядке для удобства чтения. Вот неправильный способ написания:
процедура: это неправильно отформатированное имя подпрограммы;
Просто измените это на это:
процедура ThisIsMuchMoreReadableRoutineName;
По возможности параметры одного типа следует группировать вместе:
процедура Foo(Param1,Param2,Param3:Imteger;Param4:string);
Порядок формальных параметров во многом зависит от правил вызова регистров. Наиболее часто используемым параметром должен быть первый параметр, расположенный слева направо в порядке частоты использования. Входные параметры предшествуют выходным параметрам. Параметры с большим диапазоном следует размещать перед параметрами с небольшим диапазоном. Например:
SomeProc(Планета, Континент, Страна, Штат, Город).
Некоторые являются исключениями. Например, во время обработки событий параметр Sender типа TObject часто является первым передаваемым параметром.
Чтобы предотвратить изменение параметров записи, массива, короткой строки или типа интерфейса процедурой, формальный параметр должен быть помечен как Const. Таким образом, компилятор будет генерировать код наиболее эффективным способом, гарантируя неизменяемость передаваемых параметров.
Если процедура не предполагает изменения других типов параметров, их также можно пометить как Const. Хотя это не влияет на эффективность, но дает вызывающему процедуру больше информации.
Внутри процедуры используются локальные переменные. При необходимости переменные следует инициализировать сразу при входе в процедуру. Локальные переменные типа AnsiString автоматически инициализируются пустой строкой, переменные типа локального интерфейса и интерфейса dispinterface автоматически инициализируются нулевым значением, а локальные переменные типа Variant и OleVariant автоматически инициализируются значением Unassigned.
Использование глобальных переменных обычно не рекомендуется. Однако иногда это необходимо. Несмотря на это, глобальные переменные должны быть ограничены средами, где они необходимы. Например, глобальная переменная может быть глобальной только для части реализации модуля.
Глобальные данные, которые будут использоваться многими объектами, должны быть перемещены в общий блок и использоваться всеми объектами. Глобальные данные могут быть напрямую инициализированы значением при объявлении. Обратите внимание, что все глобальные переменные автоматически инициализируются нулями, поэтому не инициализируйте глобальные переменные нулевыми значениями, такими как 0, nil или Unassigned. Глобальные переменные, инициализированные нулем, не занимают места в EXE-файле. Данные с нулевой инициализацией хранятся в сегменте виртуальных данных, а сегмент виртуальных данных выделяет память только при запуске приложения. Ненулевые инициализированные глобальные данные занимают место в EXE-файле.
Идентификаторы типов являются зарезервированными словами и должны быть записаны строчными буквами. Типы Win32 API часто пишутся с заглавной буквы и соответствуют правилам для конкретных имен типов в Windows.pas или других модулях API. Для других имен переменных первая буква должна быть заглавной, а остальные буквы — в чередующемся регистре. Вот несколько примеров:
вар
MyString: строка // зарезервированные слова
WindowsHandle: HWND // Тип API Win32;
I: Integer; //Идентификатор типа, введенный в системный модуль
Использование типа Real не рекомендуется, поскольку он зарезервирован только для совместимости со старым кодом Pascal. Обычно Double следует использовать для чисел с плавающей запятой. Double может быть оптимизирован процессором и является стандартным форматом данных, определенным IEEE. Расширение можно использовать, когда требуется больший диапазон, чем обеспечивает Double. Extend — это тип, специфичный для Intel, и не поддерживается Java. Когда физическое количество байтов переменной с плавающей запятой важно (возможно, используется другой язык для записи DLL), следует использовать Single.
Обычно не рекомендуется использовать Variant и OleVariant. Однако эти два типа необходимы для программирования, когда тип данных известен только во время выполнения (часто в приложениях COM и баз данных). При программировании COM, например при автоматизации элементов управления ActiveX, вам следует использовать OleVariant, а для программирования, отличного от COM, следует использовать Variant; Это связано с тем, что Variant может эффективно сохранять собственные строки Delphi, в то время как OleVariant преобразует все строки в строки OLE (т. е. строки WideChar) и не имеет функции подсчета ссылок.
В операторе if/then/else наиболее вероятный вариант выполнения должен быть помещен в предложение then, а менее вероятный случай должен быть помещен в предложение else. Чтобы избежать большого количества операторов if, используйте вместо них операторы case. Если уровней более 5, не используйте операторы if. Вместо этого используйте более понятный метод. Не используйте дополнительные круглые скобки в операторах if.
Если в операторе if необходимо проверить несколько условий, их следует расположить справа налево в порядке вычислительной сложности. Это позволяет коду в полной мере использовать преимущества упрощенной логики оценки компилятора. Например, если Condition1 быстрее, чем Condition2, а Condition2 быстрее, чем Condition3, оператор if обычно должен быть построен следующим образом:
если Условие1, Условие2 и Условие3, то
Если существует высокая вероятность того, что Condition3 является ложным, используя логику оценки короткого замыкания, мы также можем поместить Condition3 впереди:
если Условие3 и Условие1 и Условие2, то
Константы для каждого случая в операторе case должны быть расположены в числовом или алфавитном порядке. Описание действия для каждой ситуации должно быть коротким и обычно не превышать 4–5 строк кода. Если действие слишком сложное, код следует вынести в отдельную процедуру или функцию. Предложение else оператора Case используется только для случаев по умолчанию или для обнаружения ошибок.
Операторы Case следуют обычным правилам отступов и именования.
Рекомендуется не использовать процедуру Exit для выхода из цикла while. При необходимости для выхода из цикла следует использовать условие цикла. Весь код, инициализирующий цикл while, должен располагаться перед записью while и не должен быть разделен ненужными операторами. Любую вспомогательную работу для бизнеса следует проводить сразу после цикла.
Если количество циклов определено, вместо оператора while следует использовать оператор for.
Оператор повторения аналогичен циклу while и следует тем же правилам.
Оператор with следует использовать с осторожностью. Избегайте чрезмерного использования операторов with, особенно при использовании нескольких объектов или записей в операторе with. Например:
с Record1, Record2 сделать
Такие ситуации могут легко запутать программистов и затруднить отладку.
Оператор with также следует правилам этой главы по именованию и отступам.
Обработка исключений в основном используется для исправления ошибок и защиты ресурсов. Это означает, что при выделении ресурсов необходимо использовать команду try...finally, чтобы гарантировать освобождение ресурсов. Однако делаются исключения, если ресурсы выделяются/освобождаются в начальной/конечной части модуля или в конструкторе/деструкторе объекта.
По возможности каждое выделение ресурсов должно соответствовать структуре try...finally. Например, следующий код может вызвать ошибку:
SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
пытаться
{напишите немного кода}
окончательно
SomeClass1.Бесплатно;
SomeClass2.Бесплатно;
конец;
Безопасное решение для вышеуказанного распределения ресурсов:
SomeClass1 := TSomeClass.Create;
пытаться
SomeClass2 := TSomeClass.Create;
пытаться
{напишите немного кода}
окончательно
SomeClass2.Бесплатно;
конец;
окончательно
SomeClass1.Бесплатно;
конец;
Если вы хотите выполнить какую-то задачу при возникновении исключения, вы можете использовать try...кроме. Обычно нет необходимости использовать try... кроме как для простого отображения сообщения об ошибке, поскольку объект приложения может сделать это автоматически в зависимости от контекста. Если вы хотите активировать обработку исключений по умолчанию в предложении, вы можете вызвать исключение еще раз.
Использование try...кроме с предложением else не рекомендуется, поскольку это заблокирует все исключения, включая исключения, которые вы не готовы обработать.
Имена процедур и функций должны быть осмысленными. Лучше всего к названию процесса выполнения действия приставить глагол, выражающий действие. Например:
процедура ФорматHardDrive;
Имя процедуры установки значений входных параметров должно иметь префикс Set, например:
процедура SetUserName;
Имя процедуры получения значения должно иметь префикс Get, например:
функция GetUserName: строка;
Название всех формальных параметров должно отражать их назначение. При необходимости имя формального параметра желательно начинать с буквы а, например:
процедура SomeProc(aUserName:string; aUserAge:integer);
Префикс a необходим, если имя параметра совпадает с именем атрибута или поля класса.
Когда два модуля содержат процедуры с одинаковым именем, при вызове процедуры фактически вызывается процедура в модуле, который появляется позже в предложении Uses. Чтобы этого избежать, добавьте перед именем метода нужное имя модуля, например:
SysUtils.FindClose(SR);
или Windows.FindClose(Handle);
Имя переменной должно отражать ее назначение. Переменные управления циклом часто представляют собой отдельные буквы, например I, J или K. Вы также можете использовать более значимое имя, например UserIndex. Имена логических переменных должны четко указывать значение значений True и False.
Локальные переменные следуют правилам именования других переменных.
Глобальные переменные начинаются с заглавной буквы «G» и соответствуют правилам именования других переменных.
Имя типа перечисления должно отражать цель перечисления. Перед именем должен стоять символ T, чтобы указать, что это тип данных. Префикс списка идентификаторов перечислимого типа должен содержать 2–3 символа нижнего регистра для связи друг с другом. Например:
TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
Имя экземпляра переменной перечислимого типа такое же, как и тип, но без префикса T. Вы также можете дать переменной более специальное имя, например: FavoriteSongTypel, FavoriteSongType2 и т. д.
Имя типа массива должно отражать назначение массива. Имена типов должны начинаться с буквы «Т». Если вы хотите объявить указатель на тип массива, вы должны поставить перед ним букву P и объявить его перед объявлением типа. Например:
тип
PCycleArray = ^TCycleArray;
TCycleArray=массив[1..100] целых чисел;
Фактически, экземпляр переменной типа массива имеет то же имя, что и тип, но без префикса «T».
Имя типа записи должно отражать цель записи. Имена типов должны начинаться с буквы Т. Если вы хотите объявить указатель на тип записи, вы должны поставить перед ним букву P и объявить его перед объявлением типа. Например:
тип
PEmployee = ^TEmployee;
TEmployee=запись
ИмяСотрудника: строка;
Ставка сотрудника: двойная;
конец;
Имя класса должно отражать цель класса. Обычно перед именем класса следует добавлять букву «T». Если это класс интерфейса, то перед именем класса следует добавлять букву «I». К имени класса исключения ошибки следует добавлять букву «E». и тип ссылки на класс (тип ссылки на класс) должен быть добавлен перед именем класса. Добавьте «Класс» после имени. Например:
тип
TCustomer = класс (TObject);
ICustomer = интерфейс;
TCustomerClass = класс TCustomer
ECustomerException = класс (Исключение);
Имя экземпляра класса обычно совпадает с именем класса, без префикса «T».
вар
Клиент: TCustomer;
Примечание. Именование компонентов см. в разделе «Типы компонентов».
Имена полей следуют тем же правилам, что и переменные, за исключением того, что добавляется префикс F, указывающий, что это поле.
Все поля должны быть закрытыми. Если вы хотите получить доступ к полю вне области действия класса, вы можете сделать это с помощью атрибутов класса.
Именование методов подчиняется тем же правилам, что и процедуры и функции.
Статические методы следует использовать, если вы не хотите, чтобы метод был переопределен производными классами.
Если вы хотите, чтобы метод переопределялся производными классами, вам следует использовать виртуальные методы. Если метод класса должен использоваться прямо или косвенно несколькими производными классами, следует использовать динамические методы (динамические). Например, если класс содержит часто переопределяемый метод и имеет 100 производных классов, метод следует определить как динамический, что может уменьшить нагрузку на память.
Если класс собирается создавать экземпляры, не используйте абстрактные методы. Абстрактные методы можно использовать только в базовых классах, которые никогда не создают экземпляры.
Все методы доступа к свойствам должны быть определены в приватной или защищенной части класса. Методы доступа к свойствам подчиняются тем же правилам, что и процедуры и функции. Методы, используемые для чтения, должны иметь префикс «Get», методы, используемые для записи, должны иметь префикс «Set» и иметь параметр Value, тип которого совпадает с типом свойства. Например:
TSomeClass = класс (TObject)
частный
fsomeField: целое число;
защищенный
функция GetSomeField: Integer;
процедура SetSomeField (Значение: целое число);
общественный
свойство SomeField: Целочисленное чтение GetSomeField запись SetSomeField;
конец;
Хотя это и не обязательно, рекомендуется использовать методы доступа для записи для доступа к свойствам, представляющим частные поля.
Свойства служат средствами доступа к частным полям и следуют тем же правилам именования, что и поля, за исключением отсутствия префикса F. Имена свойств должны быть существительными, а не глаголами. Свойства — это данные, а методы — это действия. Имена свойств массива должны быть во множественном числе, а общие свойства — в единственном числе.
Именование компонентов аналогично именованию классов, за исключением того, что в случае конфликта с именами других компонентов вы можете добавить трехсимвольный префикс для идентификации компании, отдельного лица или другого объекта. Например, компонент часов можно объявить следующим образом:
TddgClock = класс (TComponent)
Обратите внимание, что три символа префикса должны быть строчными.
Имя экземпляра компонента должно отражать его фактическое значение. Здесь используется модифицированное соглашение об именовании венгерских префиксов. Причина использования префикса вместо суффикса заключается в том, что искать имя компонента в Инспекторе объектов и Обозревателе кода проще, чем искать тип компонента. В этом стандарте имя экземпляра компонента состоит из двух частей: префикса и идентификатора атрибута.
Префикс компонента обычно представляет собой аббревиатуру типа компонента. См. префиксы компонентов в таблице ниже:
Имя класса компонента | Префикс компонента |
TActionList, TAction представляет элемент списка действия. | действовать |
TButton, TSpeedButton, TBitBtn и другие классы кнопок. | кнопка |
TCheckBox, TDBCheckBox и другие флажки. | проверить |
Класс переключателя TRadioButton | РДО |
Панель инструментов TToolBar | ТБ |
Все классы главного меню TMainMenu | мм |
Все классы пунктов меню TMainMenuItem | ми |
Все классы всплывающих меню TPopupMenu | вечер |
Все классы элементов всплывающего меню TPopupMenuItem | ПМИ |
TLabel, TStaticText и другие классы меток, используемые для отображения. | фунт |
TPanel и другие классы панелей | ннл |
TPageControl и другие классы управления страницами | пгк |
TEdit, TMaskEdit и другие классы однострочных полей редактирования. | EDT |
TMemo, TRichEdit и другие классы многострочных полей редактирования. | ммо |
TDrawGrid, TStringGrid и другие классы сетки. | грд |
TAnimate и другие классы анимации | ани |
TImageList и другие классы списков изображений | иль |
TImage и другие классы изображений | изображение |
Класс диаграммы TChart | чт |
TComboBox, TDBComboBox и другие классы раскрывающихся списков. | CBO |
TListBox, TDBList и другие классы списков. | первый |
Ттривиев | телевизор |
Тлиствиев | лв |
THotKey | хк |
TSplitter и другие классы разделителей | СПТ |
Все классы компонентов диалога, такие как TOpenDialog. | длг |
Все классы таблиц данных, такие как TTable | стол |
Все компоненты SQL-запросов, такие как TQuery. | qry |
Элементы набора клиентских данных TClientDataSetAll | компакт-диски |
TDataSource | дс |
TDatabase | БД |
TSockConnection, TDCOMConnection и другие классы компонентов подключения. | мошенничество |
TQuickRep, TFastReport и другие классы компонентов отчета. | рпт |
TDDEClientConv, TDDEClientItem и другие классы компонентов DDE. | дде |
Все классы календаря, такие как TMonthCalendar. | кал |
TGroupBox и другие классы управления | группа |
Как показано выше, префикс типа компонента получается в результате анализа свойств типа, описывающих компонент. Обычно следующие правила описывают, как определить префикс типа компонента:
Примечание. Префикс компонента указывает тип компонента, будь то кнопка, метка и т. д., поэтому нет необходимости создавать префикс компонента для каждого специального класса компонента. Например, префикс компонента. TMyButton все еще отключен.
Идентификационное имя свойства компонента представляет собой описание назначения компонента. Например, экземпляр компонента TButton, используемый для закрытия формы, может называться btnClose. Экземпляр компонента имени редактирования может называться edName.
Имя формы или типа диалога должно отражать назначение формы, с префиксом «Tfrm» для формы или «Tdlg» для диалогового окна, за которым следует описательное имя. Например, имя типа формы «О программе»:
TfrmAbout = класс (TForm)
Имя типа основной формы:
TfrmMain = класс (TForm)
Имя типа формы входа клиента:
TfrmCustomerEntry = класс (TForm)
Имя типа диалогового окна входа в систему:
TdlgLogin = класс (TForm)
Имя экземпляра формы совпадает с именем соответствующего типа, но без префикса T. Например, имя типа и экземпляра формы, упомянутое ранее:
Введите имя | Имя экземпляра |
TfrmО программе | frmО программе |
TfrmMain | frmMain |
TfrmCustomerEntry | frmCustomerEntry |
TdlgВойти | dlgЛогин |
Если нет особых причин, автоматически генерируется только основная форма. Все остальные формы необходимо удалить из автоматически создаваемого списка в диалоговом окне «Параметры проекта». Дополнительную информацию см. в следующих разделах.
Все модули формы должны содержать функции создания экземпляров для создания, настройки, модального отображения и выпуска формы. Эта функция вернет результат режима, возвращенный формой. Параметры, передаваемые в эту функцию, соответствуют правилам передачи параметров. Причиной такой инкапсуляции является облегчение повторного использования и обслуживания кода.
Переменные формы следует удалить из модуля и определить как локальные переменные в функции создания экземпляра формы (обратите внимание, что для этого необходимо удалить форму из автоматически созданного списка в диалоговом окне «Параметры проекта». См. предыдущее содержимое.
Например, следующий модульный файл демонстрирует функцию создания экземпляра GetUserData.
Модуль UserDataFrm;
Интерфейс
Использование
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы,
Диалоги, StdCtrls;
Тип
TfrmUserData = класс (TForm)
edtUserName: TEdit;
edtUserID: TEdit;
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
функция GetUserData (var aUserName: String;var aUserID: Integer): Word;
выполнение
{$R *.DFM}
функция GetUserData (var aUserName: String;var aUserID: Integer): Word;
вар
frmUserData: TfrmUserData;
начинать
frmUserData: = TfrmUserData.Create(Приложение);
frmUserData.Caption:='Получение данных пользователя';
Результат: = frmUserData.ShowModal;
если Результат=mrOK, то
начинать
aUserName := frmUserData.edtUserName.Text;
aUserID := StrToInt(frmUserData.edtUserID.Text);
конец;
окончательно
frmUserData.Free;
конец;
конец;
Конец.
Если структура формы слишком сложна, ее необходимо разделить на основной фрейм формы и несколько фреймов подформы, встроенных в основной фрейм формы. нравиться:
ТфрмМаинФрейме: ТфрмИнфоФрейм, ТфрмредиторФрейм
Основная цель использования фреймов формы — решить проблему повторного использования интерфейса и кода, а также улучшить связность модульного кода (после разделения каждый фрейм формы является независимой единицей), тем самым улучшая качество разработки программного обеспечения. Вы должны извлечь код, связанный с интерфейсом (многоразовый), и код, связанный с приложением (неповторно используемый).
Имя типа модуля данных должно отражать его назначение и иметь префикс «Tdm», за которым следует описательное имя. Например, имя типа модуля данных клиента:
TdmCustomer = класс (TDataModule)
Имя типа модуля данных «Заказы»:
TdmOrder = класс (TDataModule)
Имя экземпляра модуля данных должно совпадать с именем соответствующего типа, но без префикса T. Например, предыдущий тип модуля данных и имя экземпляра следующие:
Введите имя | Имя экземпляра |
ТдмКлиент | дмКлиент |
Тдмордер | dmOrder |
Рекомендуется использовать структурированную информацию заголовка файла во всех исходных файлах, файлах проекта и файлах модулей. Заголовок файла должен содержать как минимум следующую информацию:
{
Авторские права @ Год по авторам
}
Имена файлов проекта должны быть описательными. Например, имя проекта «Руководство разработчика Delphi 5: Менеджер ошибок» — DDGBugs.dpr, а имя программы системной информации — SysInfo.dpr.
Имя файла формы должно отражать назначение формы и иметь суффикс Frm. Например, имя файла формы «О программе» — AboutFrm.dfm, а имя файла основной формы — MainFrm.dfm.
Имя файла модуля данных должно отражать роль модуля данных и иметь суффикс DM. Например, имя файла модуля данных «Клиенты» — CustomersDM.dfm.
Имя файла удаленного модуля данных должно отражать назначение удаленного модуля данных. Добавьте суффикс RDM после имени. Например, файл модуля удаленных данных «Клиенты» называется CustomersRDM.dfm.
Названия единиц должны быть описательными. Например, основная единица формы приложения называется MaimFrm.pas.
Пункт «Использование» раздела «Интерфейс» должен содержать только те модули, которые требуются в этом разделе. Не включайте имена модулей, которые могут быть добавлены автоматически Delphi. Раздел «Использование» части «Реализация» должен содержать только те модули, которые необходимы для этой части, и не содержать дополнительных модулей.
Раздел «Интерфейс» должен содержать только объявления типов, переменных, процедур и функций, к которым должны быть доступны внешние модули. Более того, эти декларации должны предшествовать разделу «Реализация».
Часть «Реализация» включает в себя реализацию частных типов, переменных, процедур и функций этого модуля.
Не размещайте трудоемкий код в разделе «Инициализация». В противном случае приложение будет запускаться очень медленно.
Обязательно освободите все ресурсы, выделенные в разделе «Инициализация».
Имя файла модуля формы такое же, как и соответствующее имя формы, просто замените префикс на суффикс. Например, имя модуля формы «О программе» — AboutFrm.pas. Имя модульного файла основной формы — MainFrm.pas.
Имя файла модуля данных совпадает с именем соответствующего модуля данных. Например, имя модуля модуля данных — CustomersDM.pas.
Название общей единицы должно отражать ее назначение и должно начинаться с префикса «u». Например, имя практического модуля инструмента отладки — uDebugUtilities.pas, а имя модуля, содержащего глобальные переменные, — uCustomerGlobals.pas.
Обратите внимание, что имена модулей должны быть уникальными в пределах проекта. Общие имена модулей не могут иметь одно и то же имя.
Ячейки компонентов следует размещать по отдельным путям, чтобы указать, что они являются ячейками, определяющими компонент. Обычно они не размещаются по тому же пути, что и проект. Имена файлов модулей должны отражать их содержимое.
Обратите внимание: дополнительную информацию о стандартах именования компонентов см. в разделе «Стандарты именования типов компонентов».
Ячейка компонента может содержать только один основной компонент — компонент, отображаемый на палитре компонентов. Другие вспомогательные компоненты или объекты также могут быть включены в один и тот же блок.
Процесс регистрации компонентов следует вынести из блока компонентов и поместить в отдельный блок. Этот блок регистрации используется для регистрации всех компонентов, редакторов свойств, редакторов компонентов, мастеров и т. д.
Регистрация компонентов должна производиться в пакете проектирования. Поэтому единицы регистрации следует включать в пакет времени разработки, а не в пакет времени выполнения. Рекомендуется называть единицу регистрации следующим образом:
xxxReg.pas
Среди них префикс символов xxx используется для идентификации имени пакета компонента или компании, физического лица или другого объекта. Например, единица регистрации называется xxxReg.pas.
Пакет времени выполнения должен содержать только необходимые модули. Эти элементы редактора свойств и редактора компонентов должны быть помещены в пакет времени разработки. Регистрационные единицы также должны быть включены в пакет этапа проектирования.
Именование пакетов соответствует следующему шаблону:
dcliiiDescvvCn.pkg — Пакет проектирования
iiiDescvvCn.pkg — пакет времени выполнения
Среди них iii представляет собой префикс из 2–3 символов, который используется для идентификации компаний, отдельных лиц или других объектов, которые необходимо идентифицировать. Это необязательно; Desc представляет собой краткое описание пакета управления; vv представляет собой номер версии; package. Вы можете выбрать в соответствии с вашими потребностями. Префикс «dcl» указывает на пакет времени разработки, без этого префикса указывает на пакет времени выполнения; буква «Cn» указывает тип компилятора и номер версии компилятора, например: Delphi5=D5, Delphi4=D4, CBuilder3=C3....
Обратите внимание, что lib или std в имени пакета указывают, является ли это пакетом времени разработки или пакетом времени выполнения соответственно. Например:
dclrbStdComPSD5.pkg — пакет времени разработки Delphi 5.
rbStdCompsD5.pkg — пакет среды выполнения Delphi 5.
Хотя большинство инструментов автоматического форматирования кода могут помочь вам изменить формат исходной программы и обновить заглавные буквы зарезервированных слов и идентификаторов, лучше всего сделать это перед использованием контроля версий. Если вы уже использовали контроль версий, рекомендуется не использовать его. Легко использовать инструменты автоматического форматирования кода. Даже если есть еще одно место, инструмент контроля версий подумает, что строка была изменена, что приведет к изменениям в управлении программой.