Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

Приложение г. Kol с классами вместо объектов

Внимание: все, что написано в этом приложении, начиная с версии 3.00 более вообще не актуально – классы в KOL более не нужны и не поддерживаются. Главное, что этот механизм существовал, имеется в архивах исходных кодов прежних версий, и всегда можно его возобновить в случае жесткой необходимости.

Для того, чтобы проекты KOL могли успешно компилироваться компилятором Free Pascal версии 1.хх.хх, то есть еще тогда, когда этот замечательный компилятор не поддерживал простые объекты языка Object Pascal, был специально «создан» вариант кода библиотеки KOL для этой цели.

Я взял «создан» в кавычки потому, что на самом деле, второй вариант того же модуля KOL.pas не создавался, это было бы просто невообразимо сложно постоянно синхронизировать все изменения в двух таких больших модулях (мне и в одном-то не всегда удается все согласовать). В то же время, применение конструкций {$IFDEF …} … {$ELSE} … {$ENDIF} для реализации такой вариантности кода, когда в случае добавления какого-либо символа условной компиляции, так же было отвергнуто. Во-первых, это загромоздило бы исходный код, в котором и без того сложно разбираться. А во-вторых, это могло бы поставить в тупик среду Delphi IDE и вполне могло ввести в ступор его подсистемы Code Completion и Code Navigation.

В результате был выбран комбинированный подход с использованием специально разработанного внешнего препроцессора GLUECUT (к глюканью это название не имеет никакого отношения, и является комбинацией двух английских слов «клеить» и «резать»). Данное приложение может использоваться не только для цели конверсии модуля KOL (и сопутствующих) в классы, но и для каких-либо других схожих по характеру задач, требующих мощного текстового обработчика.

Почему подход комбинированный? Ответ таков, что в процессе обработки текста модуля для управления преобразованием входного текста в выходной используется набор правил, который может изменяться в на различных участках. Участки задаются «метками» в исходном файле, представляющими из себя комментарии вида //[ … ], расположенные с начала строки и занимающими целиком одну строку. Правила позволяют задать замену указанных подстрок, а так же манипулировать с целыми строками. То есть, частично используется содержимое входного текста, а часть информации о том, что и как заменять, находится во внешнем командном файле.

Например, если в KOL приходится писать @ Self, потому что Self – это сам объект, а нужен указатель на этот объект, то в случае использования классов значок @ должен быть устранен, так как переменная экземпляра класса сама уже является указателем. Правило вида

REPLACE [@Self][Self]

- выполнит все такие замены.

Кроме того, правила позволяют выполнять обход или замену специально помеченных участков кода, причем в качестве меток в этом случае используются короткие комментарии в фигурных скобках, например все участки {-} … {+} при копировании исходного текста в выходной могут быть пропущены правилом

SKIP [{-}] [{+}]

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

{++}(* TObj = class;*){--}

Реализуется такая замена в командном языке препроцессора парой правил

REPLACE [{++}(*][]

REPLACE [*){--}][]

Как видите, все просто. Разработчик, использующий старую версию компилятора Free Pascal, или просто предпочитающий классы, получив (скачав, обновив) новую версию файла KOL.pas, просто запускает bat-файл, вызывающий утилиту GLUECUT с требуемыми параметрами, и в результате в отдельной директории получается версия KOL с классами.

Напоследок, добавлю, что, начиная с версии 2.10, компилятор Free Pascal полностью поддерживает простые объекты Object Pascal, и особой необходимости в конверсии KOL в классы более не существует. Тем не менее, использование классов для каких-то целей все еще может кому-либо пригодиться, поэтому я счел необходимым предоставить информацию об этой возможности.

* Теперь я использую пакет Fast Type своей собственной разработки, который позволяет мне, в том числе, просто нажать клавишу ‘=’, и четыре символа ‘ := ’ вставляются в код сами собой.

* Позже файл KOL.pas настолько разросся, что пришлось все-таки его делить, вынося не самый нужный код в дополнительный KOLadd, но об этом будет еще сказано.

* Примечание: в отличие от обычной для VCL функции StrToInt из модуля SysUtils, функция KOL.Str2Int не генерирует исключения, если строка не является числом, и в этом случае просто возвращает 0. Аналогично работают и другие функции преобразования строки в число: Hex2Int, Str2Double, Str2Extended. Сделано так для того, чтобы не подключать системный код для обработки исключений, и без особой на той необходимости не увеличивать размер приложения.

* Начиная с версии 2.39 библиотеки KOL.

* Кстати, в версии Delphi 2 такой функции нет, если что.

* В том числе, выравнивание текста применимо к полям ввода (EditBox, ComboBox, Memo, RichEdit).

* Передает сообщение в функцию WndFunc система, в процессе работы API функции DispatchMessage. Система «знает» об этой функции потому, что эта функция указывается как обработчик сообщений при регистрации окна в системе.

* Замечательность данного явления заключается в том, что поле Form объявлено внутри только одной ветки {$IFDEF KOL_MCK}, в то время как форму времени разработки Delphi видит совсем в другой ветке. Будь авторы компилятора чуть аккуратнее, и этот фокус уже не «прокатил» бы.

* PE – Portable Executable. Более ранние форматы NE (New Executable) и LE (Linear Executable) использовались для 16-разрядных приложений DOS и Windows 3.x.

* Однако, установив свойство AcceptChildren в значение TRUE, можно любой оконный контрол, в том числе и метку, позволить делать родителем других контролов.

* В проектах MCK при наличии символа UNICODE_CTRLS вызывать SetUnicode для контролов, созданных на этапе проектирования, не нужно: такой вызов делается в сгенерированном зеркалами MCK коде.

* Это сделано и для экономии кода, и для повышения быстродействия для всех прочих случаев – когда MDI-интерфейс не требуется.

* Утяжеление возникает по той очевидной причине, что стандартный модуль math.pas использует модуль SysUtils.

* Существует, по крайней мере, возможность обеспечить перетаскивание на окно приложения файловых объектов, например, из проводника. Для этого достаточно назначить обработчик события OnDropFiles.

** Когда мне понадобилось организовать соединение между несколькими приложениями, я выбрал XSocket, и немного прошелся по нему напильником, исправив те ошибки, которые мне удалось обнаружить. Мой вариант с исправлениями выложен в архиве XXSocket.

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

* tooltip - инструментальная подсказка.

* Туториал – не русское слово, которое должно было бы быть заменено словом (тоже не русским) «лекция», но почему-то так никто не делает, все так и пишут – туториал.