Комментарии в программе на языке delphi бывают. пример объявления глобальных переменных. Сгенерированный оболочкой Delphi шаблон

Страница 5 из 9

Комментарии

Язык Object Pascal поддерживает два типа комментариев: блочные и однострочные. Общие соображение по использованию комментариев могут быть следующими:

  • Помещайте комментарий недалеко от начала модуля для пояснения его назначения;
  • Помещайте комментарий перед объявлением класса;
  • Помещайте комментарий перед объявлением метода;
  • Избегайте очевидных комментариев: (i:= i + 1 // добавить к i единицу) ;
  • Помните, что вводящий в заблуждение комментарий хуже чем его отсутствие;
  • Избегайте помещать в комментарий информацию, которая со временем может быть не верна;
  • Избегайте разукрашивать комментарии звездочками или другими символами;
  • Для временных (отсутствующие в релизе) комментариев используйте "TODO".

Блочные комментарии

Object Pascal поддерживает два типа блочных комментариев. Наиболее часто используемый блочный комментарий - это пара фигурных скобок: { } . Команда разработчиков Delphi предпочитает использовать этот комментарий как можно проще и как запасной. Используйте в таких комментариях пробелы для форматирования текста и не используйте символы зведочка "*". При переносе строк необходимо сохранять отступы и выравнивание

Пример из DsgnIntf.pas:

{ TPropertyEditor

Edits a property of a component, or list of components,
selected into the Object Inspector. The property
editor is created based on the type of the
property being edited as determined by the types
registered by...

GetXxxValue
Gets the value of the first property in the
Properties property. Calls the appropriate
TProperty GetXxxValue method to retrieve the
value.

SetXxxValue Sets the value of all the properties
in the Properties property. Calls the appropriate
TProperty SetXxxxValue methods to set the value. }

В блочный комментарий всегда заключается информация о модуле: копирайт, дата модификации и так далее. Блочный комментарий, описывающий метод должен идти перед объявлением метода.

Правильно

Второй тип блочного комментария содержит два символа: скобку и звездочку: (* *) . Этот тип комментария используется при разработке исходного кода. Его преимуществом является то, что он поддерживает вложенные комментарии, правда комментарии должны быть разного типа. Вы можете использовать это свойство для комментирования больших кусков кода, в котором встречаются другие комментарии:

(* procedure TForm1.Button1Click(Sender: TObject);
begin
DoThis; // Start the process
DoThat; // Continue iteration
{ We need a way to report errors here, perhaps using
a try finally block ??? }
CallMoreCode; // Finalize the process
end; *)

Однострочные комментарии

Однострочный комментарий состоит из символов // со следующим за ними текстом комментария. После символов // должен идти пробел и затем текст. Однострочные комментарии должны иметь отступы такие же, как и код, в котором они встречаются. Однострочные комментарии можно сгруппировать, чтобы сформировать большой комментарий.

Однострочный комментарий может начинаться с новой строки и может продолжать код, который он комментирует. В этом случае между кодом и комментарием должен быть хотя бы один пробел. Если больше одного комментария следует за кодом, то они должны быть выровнены по одному столбцу.

Пример однострочного строкового комментария:

// Open the table
Table1.Open;
Пример комментария в коде:
if (not IsVisible) then
Exit; // nothing to do
Inc(StrLength); // reserve space for null terminator

Необходимо избегать использовать комментарии в коде для каждой строки модуля.

Разработчик любого большого проекта на Delphi рано или поздно сталкивается с потребностью в документировании кода, начиная от банальных комментариев к классам/методам и заканчивая полноценным help-файлом (html, chm, hlp или даже майкрософтовским Help 2.0). Для тех кто пишет на Java или C# это уже давно не проблема — у них есть JavaDoc и Sandcastle . На Delphi ситуация была сложной вплоть до выхода 2005 -ой версии, в которой, наконец, добавили встроенную поддержку XML-документации.

Хотя и сейчас, глянув исходники разных проектов, чего только не увидишь. Наиболее часто используется javadoc-овский стиль (видимо, для бесплатного DelphiDoc ). Вот как выглядят комментарии в его формате:

{** Open all tables that is marked for opening @param FastOpen Use the fast opening routine @return Returns True if Ok @see TMainForm } function TMainForm.OpenTables(FastOpen: Boolean): Boolean; begin ... ... end;

Сгенерированные на основе таких комментариев хэлпы выглядят более-менее прилично. Но в отличие от тех же Eclipse или Netbeans , для которых такой формат как родной, для среды Delphi это дикость. Составлять такие конструкции без какой-либо помощи IDE довольно утомительное дело. Как ни старайся, текст “Open all tables that is marked for opening” не появится во всплывающей подсказке и программисту каждый раз придётся смотреть в исходник или лезть в хэлп.

Help Insight

Начиная с версии 2005 , в Delphi введен новый тип подсказок в редакторе кода — Help Insight. Теперь это уже не те жалкие tooltip-ы, которые были в старых версиях.


Help Insight в действии

Жаль конечно, что CodeGear (а за ним и Embarcadero ) не удосужились сделать подробные комментарии для Help Insight ко всем стандартным модулям. Наверное, им просто лень лезть во все исходники, многие из которых почти без иземений остались от самых древних версий Delphi. Но дело не в этом. Главное, что эта фича дейтвительно работает, а раз работает, то будем её использовать.

XML комментарии

С этим форматом, наверное, знакомы все кто так или иначе сталкивался с разработкой на.NET. Именно такой формат поддерживает вышеупомянутый Help Insight, и вот как он выглядит:

///

/// Open all tables/b that is marked for opening. See also /// class. /// /// Use the fast opening routine. /// True if ok; otherwise, False. function TMainForm.OpenTables(FastOpen: Boolean): Boolean; begin ... ... end;

Несложно догадаться, что тэг summary — это описание метода, param — описание параметров, returns — описание возвращаемого значения, а see — ссылка на другое описание. Список всех тэгов можно посмотреть в MSDN (в хэлпах Delphi 2007 и 2009 никакой информации по этому поводу мне найти не удалось). Более того, кроме стандартных тэгов можно использовать некоторые из HTML, к примеру или для выделения важных замечаний. Для написания таких комментариев удобно пользоваться шаблоном — наберите в тексте программы “summary” и нажмите клавишу Tab. В Delphi 2009 вам даже не придётся самостоятельно набирать три слэша в начале — по нажатию Enter они добавяся автоматически как в Visual Studio (это также срабатывает и в Delphi 2007 SP3 ). Стоит упомянуть, что XML комментарии можно писать в объявлениях классов, процедур, функций, типов и даже переменных.

Чтобы увидеть написанные комментарии в действии, нужно зайти в окно настроек проекта (Project — Options) и на вкладке Compiling отметить галочкой (или выставить в True в Delphi 2009) пункт Generate XML documentation . После каждой компиляции проекта Delphi сгенерирует несколько XML файлов (один на проект и по одному на каждый модуль) которые будут содержать все XML комментарии. Эти файлы можно будет использовать для создания справочной системы. Но главное, что теперь вот такой удобный мини-хэлп будет отображаться во всплывающих подсказках:

К сожалению, HTML тэги в Help Insight не срабатывают, зато все ссылки работают на ура.

Генерация документации средствами Delphi

В Delphi 2005—2009 есть 2 способа создания документации. Мы испробуем на деле оба. Первый, и самый простой, реализован средствами встроенного в IDE Together . Сохраните проект, и кликните по пункту меню View — Model View. Delphi может спросить, добавлять ли к проекту modeling support, выбирайте «да». Откроется окошко Movel View в котором нужно выделить проект и в контекстном меню нажать Generate Documentation . Появится небольшое окошко с настройками (их на удивление мало), в котором сразу советую убрать галочки с Include Diagrams и Include Navigation Tree . Delphi немного потужится, и через пару секунд выдаст несколько HTML страничек.

Неожиданно, но получился классический хэлп полностью копирующий javadoc. Сначала восторг, но потом разочарование. При подробном рассмотрении обнаруживается, что он содержит много лишних невразумительных ссылок вроде default или globals , и в работе крайне не удобен. Все тэги тупо вырезаются, так же как или . В описаниях классов и методов используются странные для Delphi понятия вроде Reintroduce , куда-то пропадают названия параметров. И в общем, полученный хэлп оказывается практически нечитабельным:(Такое впечатление, что разработчики просто не доделали эту функцию, а начали и оставили как есть.

Второй способ, как и многое в Delphi, не совсем очевиден — мы используем поставляемую вместе с IDE утилиту XMLDoc . Её можно найти в папке Мои документы\RAD Studio\ <версия Delphi>\Demos\XMLDoc . Кроме того, вам потребуется установить Java SDK (1.4.2 или выше), Python (минимум 2.3) и (версия 6.5.5 for Java). После установки нужно будет добавить в системную переменную “Path ” пути куда установлены Python и Saxon, например “C:\Python23\;C\Saxon655\” (это делается через «Мой компьютер», а в нём — «Переменные среды», пути нужно добавить через точку с запятой). В папке, куда вы распаковали Saxon, создайте BAT файл с именем saxon.bat с таким содержанием:

@java -jar "<путь к папке с Saxon>\saxon.jar" %1 %2 %3

Запускать его не нужно. В папке с XMLDoc-ом создайте BAT файл start.bat , чтобы не морочиться с командной строкой, и напишите в нём следующее:

Cls xmldoc.py "<путь к папке с проектом>" pause

Пример пути — “C:\Projects\TestProject”. Важно: все используемые пути не должны содержать кириллицу, иначе у XMLDoc-а с ней будут проблемы. Итак, теперь всё готово, и можно запускать файл start.bat. Если всё пройдет успешно, то в папке с проектом появится папка doc , а в ней — final, в которой будут храниться HTML файлы сгенерированной документации. Вот что у меня получилось (на примере метода OpenTables):

По субъективной оценке данный вариант выглядит посимпатичнее первого. Вроде бы все замечательно, но усугубляет тот факт, что XMLDoc так же небрежно вырезал ссылку . Нужно заметить что эти HTML файлы не окончательный вариант — их можно (и, по идее, нужно) преобразовать в формат Help 2.0 (их затем можно будет просматривать через Document Explorer , так же, как и хэлп в Delphi или Visual Studio). Для этого понадобится Visual Studio Help Integration Kit , а затем — CodeGear HelpKit . Так как у меня нервов больше не хватило, а результат уже в принципе понятен, я не стал идти дальше. Возвожно, вы окажетесь сильнее:)

Генерация документации с использованием Doc-O-Matic Express

Doc-O-Matic — довольно мощная утилита для создания документации на основе XML и JavaDoc комментариев в форматах HTML, CHM и Help 2.0. Но, к сожалению, полная её версия платная. Но не всё так плохо — есть версия Express (наверное подсмотрели название у Microsoft), а в ней есть почти всё что нужно. Её и опробуем.

С Doc-O-Matic не придется так много плясать с бубном, как с XMLDoc, но парой кликов тоже не обойдешься. Запустите утилиту, в разделе Project Files нажмите кнопку Add , в фильтре диалога выберите Delphi 2007 Project и откройте нужный файл проекта. Во вкладке HTML обратите внимание на раздел Files & Folders — в нём можно указать папку, куда будет помещён файл с документацией. Сохраните настройки в какое-нибудь удобоваримое место, намример в файл C:\mydoc.dox-express. Теперь закройте утилиту и зайдите в папку, куда установлен Doc-O-Matic. Создайте в ней BAT файл с такой строчкой:

Domexpress.exe -config "HTML" "<путь к файлу *.dox-express>"

После выполнения этой команды файлы документации помещаются в заданную выше папку и автоматически запускается браузер. Вот как, например, будет выглядить описание к методу:

Опять же, субъективно, такой хэлп производит наиболее благоприятное впечатление. Нет лишних пунктов, удобная навигация. Немного портит впечатление отсутствие ссылки на слове “TMainForm”, но Doc-O-Matic хотя бы её не вырезал, в отличие от двух предыдущих утилит.

Вместо послесловия. Поддержка XML комментариев на уровне редактора кода в Delphi — отличная и удобная штука, и ей надо пользоваться. Но с генерацией документации дело обстоит сложнее: стандартные средства слишком сырые (и, чего душой кривить, кривые =), чтобы ими можно было без труда пользоваться. Но есть альтернатива в лице Doc-O-Matic Express, который справляется с этим делом весьма неплохо. Будем надеятся, что в скором времени (может быть и с выходом новых версий Delphi) появятся и новые, более гибкие утилиты.

Язык программирования Delphi достаточно прост для освоения, но очень эффективный и мощный. Самое первое, с чем надо познакомиться - это комментарии.

Комментарии - это любой текст, который абсолютно не влияет на код программы. Он никогда не компилируется и не вставляется в исполняемый файл, а используется только для пояснений кода.

Комментарии могут оформляться двумя способами:

  1. все, что идет после двойного слеша // , воспринимается как комментарий
    (так можно оформить только одну строку комментария);
  2. все, что заключено в фигурные скобки { и }, тоже является комментарием
    (в этом случае можно включить в комментарий сколько угодно строк).

Пример комментария

// Это комментарий.

Это уже не комментарий

{ Это снова комментарий
И это тоже }

В данной статье постоянно будут использоваться комментарии для пояснения кода описываемых программ. Именно поэтому до начала разбора кода мы должны были познакомиться с ними.

Теперь вы готовы к изучению языка программирования Delphi. Создайте новый проект. После этого перейдите в редактор кода. Здесь для вас уже написана заготовка будущей программы.

Давайте досконально рассмотрим, что тут написано. Ниже приведены подробные комментарии для каждой строчки созданного шаблона. Однако здесь кое-что упущено в целях удобства изучения программного кода.

Сгенерированный оболочкой Delphi шаблон

unit Unitl; //Имя модуля

interface

uses //После этого слова идет перечисление подключенных модулей.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type //После этого идет объявление типов
TForml = class (TForm) //Начало описания нового объекта TForm. Здесь описываются компоненты и события Формы
private //После этого слова можно описывать закрытые данные объекта
{ Private declarations }
доступные только для объекта TForml

public //После этого слова можно описывать открытые данные объекта
{ Public declarations } //Подсказка, которую сгенерировал Delphi. Здесь можно описывать переменные и методы,
доступные из любого другого модуля

end ; //Конец объявления типов

var //Объявление глобальных переменных
Forml: TForml; //Это описана переменная Forml типа объекта TForml

implementation

{$R *.dfm} //Подключение.dfm файла (файл с данными о визуальных объектах)

end . // end с точкой - конец модуля

Если что-то осталось еще непонятным, то в процессе создания реальных программ все встанет на свои места. Не старайтесь запомнить все сразу, потому что это нереально. Слишком много новой информации, не подкрепленной практикой. Старайтесь понять только смысл написанной программы.

Практически все строчки заканчиваются знаком "; " (точка с запятой). Этот знак показывает конец оператора. Он ставится только после операторов и никогда не используется после ключевых слов типа

uses, type, begin, implementation, private, public

И т.д. Впоследствии вы познакомитесь со всеми ключевыми словами, большинство которых выделяется жирным шрифтом. Сразу видно исключение - последнее в модуле end , после которого ставится точка, а не точка с запятой.

Итак, разберем структуру кода. В самом начале стоит имя модуля. Оно может быть любым, но таким же, как и имя файла (без учета его расширения). Изменять имя модуля вручную нежелательно. Если все же надо изменить, то сохраните сначала модуль со старым именем. Для этого нужно выбрать команду меню: File | Save As (Файл | Сохранить как).

Желательно давать модулям понятные имена. В этом случае по имени можно определить, что находится внутри одноименного модуля. Трудно догадаться, что находится в файле под именем Unitl.pas. Файлам также желательно давать такие имена, которые связаны с их содержимым. Например, главную форму программы лучше сохранять в файле с именем MainUnit.pas или MainModule.pas. В этом случае модуль и файл будут иметь имя MainUnit или MainModule, и вы можете сразу определить, что это главная форма.

Далее идет подключение глобальных модулей. Все процедуры, функции, константы описаны в каком-нибудь модуле, и прежде чем эти процедуры использовать, нужно его подключить. Вы можете знать о существовании какой-нибудь функции. Но чтобы об этом узнал компилятор, вы должны указать модуль, где описана эта функция, понятным для компилятора языком. Например, вам надо превратить число в строку. Для этого в Delphi уже есть функция IntTostr. Она описана в модуле Sysutils. Если вы хотите воспользоваться этой функцией, вам надо подключить этот модуль к своему модулю Формы (напечатать название Sysutils в разделе uses).

Существуют четыре типа разделов:

  1. Private - свойства и методы из этого раздела доступны только этому объекту. Другие объекты не могут вызывать эти методы и читать/записывать свойства;
  2. Protected - эти свойства и методы доступны только этому объекту и потомкам (объектам, которые происходят от нашего и наследуют его свойства). Сторонние объекты не могут получить доступ к хранящимся здесь свойствам и методам;
  3. Public - все, что описано здесь, доступно всем;
  4. Published - когда будут писываться собственные компоненты приложения, в этом разделе мы будем описывать свойства и события, которые должны быть отображены в объектном инспекторе. Эти свойства доступны всем.
Надо заметить, что если два объекта объявлены в одном и том же модуле, они считаются дружественными и видят абсолютно все методы и свойства, даже если объявление произведено в разделе private .

После объявления объекта и его составляющих идет описание глобальных переменных. Оно начинается после ключевого слова var и идет всегда после объявления типов. Это надо запомнить уже сейчас, потому что сначала идет раздел type , где описываются типы, а затем var , где описываются переменные.

Глобальные переменные - это переменные, которые хранятся в стеке, создаются при запуске программы и уничтожаются при выходе из программы. Это значит, что они доступны всегда и везде, пока запущена программа.

пример объявления глобальных переменных

var //Объявление глобальных переменных
Forml: TForml; //Это описана переменная Forml типа объекта TForml

В этом примере объявлена переменная Forml типа объекта TForml. Когда будет создан объект TForml, то его указатель будет записан в переменную Form1. Данная переменная глобальная и существует, пока программа выполняется, а значит, к ней всегда можно получить доступ.

Ключевое слово implementation тоже пока трогать не будем, а оставим на будущее, когда наши знания о Delphi немного расширятся. Последнее, что осталось рассмотреть в этой главе, - ключ {$R * dfm}.

В фигурных скобках могут быть не только комментарии, но и ключи для компилятора. Они отличаются тем, что выглядят как {$Буква Параметр]. Буква - указывает на тип ключа. В нашем случае используется буква R . Этот ключ указывает на то, что надо подключить файл ресурсов, в данном случае .dfm файл (файл с данными о визуальных объектах) с тем же именем, что и имя модуля. Если имя модуля Mainunit , то нужно изменить этот ключ на {$R MainUnit .dfm}. Ключ R - это единственный ключ, который пока понадобится.

Любой программный код в Delphi заключается между begin и end. Ключевое слово begin означает начало кода, a end - конец. Например, когда вы пишете процедуру, то сначала нужно написать ее имя (как это делать, мы поговорим позже), а потом заключить ее код между операторными скобками begin и end.

По материалам сайта

Страница 7 из 12

Классы

Структура тела класса

Тело класса при его декларации подчинено следующей структуре:

  • Объявление полей;
  • Объявление методов;
  • Объявление свойств.
Поля, свойства и методы в вашем классе должэны быть упорядочены в алфавитном порядке.

Уровни доступа

Исключая код, вставленный IDE, директивы видимости должны быть объявлены в следующем порядке:
  • Приватные (скрытые) члены класса (private );
  • Защищенные члены класса (protected );
  • Общедоступные члены класса (public );
  • Публикуемые члены класса (published )

Таким образом, в Object Pascal существует четыре уровня доступа для членов класса: published, public, protected и private - в порядке уменьшения видимости. По умолчанию, уровень доступа - published. В общем, члены класса должны давать наименьший уровень доступа, который подходит для этого члена. Например, член, к которому имеют доступ классы из одного модуля должен иметь уровень доступа private. Кроме того, объявляя члены класса с наименьшим уровнем доступа, Вы позволяете компилятору воспользоваться дополнительными возможностями для оптимизации. С другой стороны, если Вы планируете в дальнейшем порождать дочерние классы от Вашего класса, то нужно использовать уровень доступа protected.

Никогда не указывайте уровень доступа public для данных. Данные всегда должны быть объявлены в приватной секции и доступ к ним должен осуществляться с помощью методов или свойств.

Объявление конструктора

Все методы класса должны быть упорядочены по алфавиту. Однако Вы можете поместить объявления конструктора и деструктора перед всеми остальными методами. Если у класса существует более чем один конструктор и если они имеют одинаковые имена, то они должны располагаться в порядке увеличения числа параметров

Объявление методов

По возможности, объявление метода должно располагаться на одной строке:
Например:
procedure ImageUpdate(Image img, infoflags: Integer,
x: Integer, y: Integer, w: Integer, h: Integer)


Top