Введение Архивы Приложения Новости ЧАВО
Форум Подписка Статьи Ссылки Прочее

 

 Key Objects Library     

 Key Objects Library     

Старая история KOL

См. здесь историю новую

KOL & MCK v0.84 (1-Jul-2001)

[*] Небольшое изменение: если свойство TControl.Icon установить в значение THandle(-1), то приложение не пытается прочитать иконку по умолчанию. Некоторые средства отладки и профилирования (MemProof) не бьют тревогу по поводу попытки загрузить несуществующий ресурс.
    Так же, в MCK добавлено свойство Icon (типа String) добавлено в TKOLApplet и значение -1 может быть установлено для всего приложения, вместо того, чтобы устанавливать его для каждой форсы отдельно.

[-] Потеря ресурса (bitmap) исправлена для TMenu (для случая, когда используется свойство ItemBitmap[ ] - ассемблерная версия).
    Asm-версия метода TIcon.Destroy исправлена на предмет потери ресурса (icon).
    Небольшое исправление для TBitmap.RotateRight - была возможна утечка памяти.
    Исправлена утечка памяти в asm-версии метода TBitmap.FormatChanged.
    Исправлена потенциальная ошибка с использованием GetObject в pascal-версии TBitmap.FormatChanged (структура tagBitmap должна быть выровнена на слово(видимо, хотя об этом нигде не упоминается, даже в MSDN).

[-] TControl.CreateWindow - исправлена pascal-версия. (Вызов Global_Align был не нужен, и мог привести к бесконечному выравниванию во время исполнения программы).

[-] Исправлено выравнивание контролов, динамически создаваемых на странице tab control'а. (Свойство ToBeVisible для закладки tab-контрола теперь возвращает Parent.ToBeVisible. Это позволяет при выравнивании учесть все закладки, а не только видимые в настоящий момент).

[-] Исправлен дополнительный модуль HeapMM.pas: теперь он может использоваться не только вместе с заменой system.dcu (в стандартном system.pas, переменная IsMemoryManagerSet не находится в интерфейсной части, и недоступна из других модулей). HeapMM рекомендуется для использования вместо стандартного менеджера памяти в случае применения профилирующих инструментов (MemProof), т.к. стандартный менеджер памяти Delphi позволяет себе попытки неверного обращения к API системы, что обнаруживается профилирующим отладчиком, и засоряет отчет ненужной информацией.

[+] Методы IconLoad, IconLoadCursor, CursorLoad добавлены в TControl. Рекомендуются для использования, когда значение свойств Icon или Cursor загружается из ресурса, т.к. в этом случае устанавливается флаг для предотвращения попытки освобождения общего ресурса. Соответствующие изменения внесены в MCK для загрузки Icon и Cursor из ресурса, если это задано во время разработки.

[-] Функция StrSatisfy изменена, и теперь не зависит от регистра. Это, в свою очередь, исправляет фильтр в TDirList. Спасибо Алексею Шувалову, сообщившему об этой ошибке.

[+] Добавлены методы TObj.Add2AutoFree и TObj.Add2AutoFreeEx для обеспечения возможности автоматического уничтожения объектов, не имеющих родителей. Эти методы использованы в MCK для добавления в список для автоматического уничтожения всех объектов, не имеющих оконных "родителей". Сюда же (в список формы) добавляется сам объект, содержащий форму. Таким образом, отпала надобность в генерации специальной процедуры для освобождения объектов "формы". Главное же то, что теперь в момент вызова события OnDestroy формы или ее контролов сам объект формы (переменная Form1 - в случае использования статического объекта) еще "жив".
   Соответствующие изменения для TKOLForm и TKOLDataModule уже реализованы.
[!] Примечание: данные изменения требуют, чтобы в существующих проектах были вновь открыты все формы, с тем чтобы перед компиляцией проекта сохранить все выполненные изменения.

[-] Исправлено возможное зависание Delphi при бросании контролов на TKOLForm.

[-] События OnEnter / OnLeave добавлены к тем зеркальным контролам (MCK), которые могут оказаться в фокусе. Событие OnLeave исправлено для radio box (никогда не вызывалось).

[!] О совместимости с Delphi6. Пока никаких усилий в этом направлении не было. Но люди сообщают, что pas-версия компилируется нормально (для версии 0.83).

[!] О совместимости с FreePascal. Больше не спрашивайте. Я потратил 3 своих вечера и вот что нашел:
- нет property для object, только для class - с огромным числом необходимых исправлений для перехода с объектов на классы.
- вообще нет и не предполагается какой-либо поддержки интерфейсных объектов (interface).
- слишком привиредливый ассемблер. Например, нельзя [EAX].fCount в методе TList. Требуется [EAX].TList.fCount. Огромное число исправлений, и трудно представить, как все это оттестировать.
- минимальный размер приложения 50K. Либо должен быть переписан (win32sys.pp) для преодоления этого ограничения. Для Delphi2, минимальный размер был ~7K, для Delphi5, даже без замены system.dcu - всего 16K. А с заменой 4,5К.

 

KOL & MCK v0.83 (26-Jun-2001)

Изменения, предложенные Сергеем Шишминцевым:
[+] Добавлено событие OnTVSelChanging для tree view. Позволяет предовратить смену выделенного элемента.
[*] Событие OnTVBeginEdit изменено с процедуры на функцию типа boolean. Обработчик может возвратить False для предотвращения редактирования некоторых узлов.

[-] Событие OnSelChange исправлено для tree view. Так же, редактирование текста узла исправлено в ассемблерной версии. Спасибо Сергею Шишминцеву за сообщение об этих ошибках.

[+] В MCK-зеркало TKOLTreeView добавлены события OnTVBeginDrag, OnTVBeginEdit, OnTVEndEdit, OnTVSelChanging, OnTVExpanding, OnTVExpanded, OnTVDelete. Теперь они доступны из Object Inspector'а в design-time.

 

KOL & MCK v0.82 (24-Июня-2001)

[+] Добавлен тип Int64, и некоторый набор функций для работы с ним:
     - MakeInt64( Lo, Hi ): Int64
     - Int2Int64( I ): Int64
     - IncInt64( X, I )
     - DecInt64( X, I )
     - Add64( X, Y ): Int64
     - Sub64( X, Y ): Int64
     - Neg64( X ): Int64
     - Mul64i( X, I ): Int64
     - Div64i( X, I ): Int64
     - Mod64i( X, I ): Int64
     - Sgn64( X ): Integer
     - Cmp64( X, Y ): Integer
     - Int64_2Str( X ): String
     - Str2Int64( S ): Int64
     - Int64_2Double( X ): Double
     - Double2Int64( D ): Int64

[+] Так же для Double добавлены:
     - TruncD( D ): Double
     - Double2Str( D ): String
     - Str2Double( S ): Double

[-] Исправлено чтение стилей шрифта для rich edit - спасибо Сергею Шишминцеву за исправление.

[*] Небольшие изменения в реализации TStream. Интересны только тем, кто реализует свои собственные типы потоковых объектов.

[-] Небольшое исправление в KOLGIF.PAS, доступна новая версия 0.2.82.

 

KOL & MCK v0.81 (17-Jun-2001)

[-] Исправлен OnEraseBkgnd (не работал для формы).

[-] Когда уничтожается Brush (свойство TCanvas, или TControl), его BrushBitmap освобождается автоматически. Так же, старый BrushBitmap разрушается при прсваивании ему другого значения (дескриптора растрового рисунка).

[-] После OnPaint, все графические инструменты высвобождаются из полотна Canvas контрола, если оно создано. Это исправляет рисование с нестандартными инструментами (font, brush, и т.д.)

[-] Исправлена Pascal-версия TCanvas.TextExent.

[+] MCK: Добавлен компонент: TKOLFrame. Предназначен для использования на форме вместо TKOLForm, и позволяет создавать и настраивать в design time панель с дочерними контролами на отдельной форме. В о время исполнения (run time), экземпляры этой панели вместе с дочерними контролами могут быть созданы и положены на другой контрол или форму динамически.

[*] Улучшена реализация объекта TTimer. Теперь окно, содержащее таймеры, разрушается только вместе с разрушением последнего таймера, не только по деактивации последнего активного таймера (и при изменении его значения Interval). Это делает таймер более быстрым.

 

KOL & MCK v0.80 (12-Jun-2001)

[-] Исправлено: нарушение порядка создания выровненных визуальных объектов (в проектах MCK) с недоступным свойством TabOrder (таких как метка).

[-] Добавлено (пропущенное) свойство TextAlign в зеркальный компонент TKOLMemo.

[-] Исправлена функция StrLen - спасибо Peter Tuente, сообщившему об ошибке. (В результате исправления, TStrList.GetText, SaveToFile работают правильно).

[-] Редактор компонента TKOLToolbar поправлен (для кнопоко-сепараторов картинки не должны были учитываться, и прочее) и улучшен немного. Так же, свойство noTextLabels исправлено для случая кнопок-сепараторов.

[*] Теперь при вызове методов TVInsert / TVDelete tree view - контрол перерисовывается автоматически (вызывается Invalidate). До сих пор, кнопка [+] не появлялась у родительских узлов немедленно после добавления подлчиненных узлов во время выполнения. (Спсаибо BaRoN! за сообщение).

[+] Добавлены методы BeginUpdate / EndUpdate к TControl (полезно для treeview, listview, listbox, memo, richedit - для предотвращения лишних перерисовок на время больших модификаций). Спасибо BaRoN! за вопрос об отсутствии такой важной возможности.

[-] Для зеркала TKOLOpenSaveDialog, теперь правильно генерируется присваивание свойству OpenDialog (это влияло только на надпись на кнопке в диалоге - всегда было 'Open' (открыть), тогда как в диалоге сохранения более естественно видеть 'Save' - сохранить).

[-] Для combobox, событие OnSelChange теперь происходит после того, как свойства Text и CurIndex изменились.

[-] Теперь событие OnClose вызывается один раз (что обеспечено присваиванием nil указателю на обработчик OnClose при первом успешном его вызове). Ранее, OnClose мог быть вызван дважды для формы без отдельного объекта Applet - в результате отправки сообщения WM_CLOSE по завершении цикла обработки сообщений в процедуре Run. Спасибо Peter Tuente за информацию об этой ошибке.

[+] Добавлен альтернативный менеджер памяти - HeapMM - маленький, но шустрый (в отдельном архиве). Может использоваться отдельно (в том числе без KOL), или вместе с предлагаемой заменой system.dcu.

[*] TTimer более не зависит от переменной Applet и наличие форм в приложении: для привязки используется отдельное невидимое окно для владения всеми таймерами. Т.е., теперь объект TTimer может использоваться в приложении без GUI-интерфейса (консольных), или работать вне цикла обработки сообщений. Данное изменение не увеличивает код исполнимой программы ни коим образом.

[+] Событие OnPaint теперь доступно для любого контрола, не только для paint box. Добавлены свойства UpdateRgn и EraseBackground, позволяющие ускорить прорисовку (первое дает возможность анализировать, какие части окна подлежат перерисовке, и избежать затрат времени на рисование нетронутой части окна, второе определяет, система или приложение отвечает за стирание заднего плана). Добавлено так же событие OnEraseBkgnd (и снова - доступное для всех контролов), которое позволяет обеспечить дополнительное декорирование контролов без переопределения всей процедуры перерисовки контрола. С новой функцией PaintLaterIsBetter возможно еще более усовершенствовать прорисовку и существенно снизить потребление процессорного времени, откладывая перерисовку до тех пор, пока в очереди не будут исчерпаны все сообщения WM_PAINT / WM_ERASEBKGND.

[!] Извинения, но исправления в TKOLDataModule могут привести к потере объектов при загрузке использующего модуля в IDE. Обязательно сохраните работу (скопируйте файлы модуля) до загрузки такого модуля в дизайнер, затем восстановите объекты вручную. [ :-( ]

Версия 0.80 (базовая, или "стабильная") KOL и MCK представлена двумя архивами, в которых все необходимые файлы имеются целиком. Последующие несколько обновлений будут сделаны (снова) в виде пач-файлов.

 

KOL & MCK v0.78 (5-Jun-2001)

[+] Добавлен модуль: KOLword.PAS, который обеспечивает автоматизацию MS Word. Требует только  ~1K кода сам (и ~2K кода подключается из системных модулей), и делает доступными все объекты Word"а вместе с их свойствами.

[*] Улучшен метод DragStart. Теперь он использует недокументированную команду SC_DRAGMOVE, которая позволяет легко обеспечить перетаскивание окна (формы или контрола) левой клавишей мыши. (Протестировано и работает даже в ранней Windows95 без какого-либо установленного дополнительно ПО).

[-] Исправлено вычисление свойства TKOLProject.projectName для случая, когда Delphi5 запускается с опцией -hm в командной строке. Спасибо Doиekal Radek, сообщившему об этой ошибке.

[-] Небольшие изменения для обеспечения совместимости с Delphi2 (снова). Весь код KOL проверен на предмет совместимости со старыми версиями Delphi.

[*] Изменена (улучшена) работа со свойством Cursor. В KOL, свойство Cursor "наследуется" (теперь) дочерними контролоами от своих родителей в момент создания. В MCK, введено свойство Cursor_ (TKOLControl) как строка (чтобы позволить ввод имени ресурса вручную), и обеспечен специальный редактор этого свойства, позволяющий выбрать один из стандартных курсоров из выпадающего списка.
   Так же, введена глобальная переменная ScreenCursorKOL), которая перекрывает свойство Cursor для большинства контролов и всех форм, если изменена (полезно для установки специальной формы курсора на время выполнения длительных операций).

[*] Выравнивание исправлено и усовершенствовано. Теперь родительское свойство Border (то же, что раньше Margin) используется для обеспечение общей границы между выровненными контролами, а также как дистанция между крайними выровненными контролами и границей клиентской области родителя. Так же, введены свойства MarginTop, MarginBottom, MarginLeft, MarginRight, которые позволяют скорректировать саму границу клиентской области контрола (ранее они были, просто сделаны открытыми для изменения). В MCK, ранее определенное свойство Margin (теперь замененное на Border) перемещено из секции published, так что просто ответьте "Ignore all", когда при загрузке старого проекта с измененным свойством Margin будет получено соответствующее предупреждение.

[-] Исправлена генерация кода для свойства Margin (теперь Border) для TKOLForm - спасибо BaRoN!.

[-] Groupbox исправлен: стиль WS_ES_TRANSPARENT более не используется, все, что требовалось - это очистить его фон по сообщению WM_ERASEBKGND. Теперь Groupbox никуда не пропадает, нормально перерисовывается, ... немного "фликает" при изменении размеров, но на то есть DoubleBuffered, PreventResizeFlicks - если очень надо.

[*] Небольшие изменения в коде для splitter"а для обеспечения его совместимости с новыми возможностями выравнивания. Добавлен еще один "конструктор" NewSplitterEx, который позволяет задать, как будет выглядеть сплиттер (вдавленный, выпуклый или плоский). Соответственно, добавлено свойство (design-time) edgeStyle в зеркале сплиттера (MCK). Теперь возможно установить свойство MinSizeNext в отрицательное значение, чтобы компенсировать слишком большое значение Border родителя и позволить изменять размеры первого контрола в большем диапазоне.

[-] Небольшое исправление для рисования в режиме DoubleBuffered: ClientRect теперь используется возвращаемый API-функцией GetClientRect, а не свойство ClientRect, которое может быть скорректировано с использованием свойств MarginXXX.

[-] Исправлено присваивание значения свойству Color объекта TControl во время исполнения.

[-] Исправлены TBitmap.LoadFromStream, LoadFromFile.

[+] Добавлена функция ExecuteWait, котора позволяет запустить приложение и дождаться его исполнения, либо прекратить ожидание, если приложение не завершилось в указанный промежуток времени.

[-] Сделана попытка исправить генерацию icon и bitmap ресурсов для проекта MCK. По задумке, это должно было обеспечить перегенерацию проекта в случае реального изменения ресурса или его имени, но как выяснилось к версии 0.80, исправление было не совсем удачным.

 

KOL & MCK v0.77 (29-May-2001)

[=] Извинения: специальное обновления для исправления (не-)установки MCK v0.76 в Windows95 (устранена зависимость от наличия в системе setupapi.dll). Так же, поправлен dcr-файл.

 

KOL & MCK v0.76 (28-Мая-2001)

[+] Добавлен модуль KOLSocket.PAS. Автор Alexander Shakhaylo.

[+] Добавлен объект TCABFile для извлечения файлов из пакета CABinet файлов.

[*] TIniFile: методы GetSectionNames, SectionData обновлены (Vyacheslav A. Gavrik).

[-] Присваивание значения свойству Text для зеркальных компонент TKOLEdit, TKOLMemo, TKOLRichEdit в design time теперь применяется немедленно, и необходимый код генерируется автоматически.

[-] MCK: Исправлено присваивание Visible = False в design time - для зеркал визуальных объектов из comctl32.dll (такие как TKOLRichEdit, TKOLListView, и т.п.)

[-] Исправлено форматирование в rich edit. Теперь все свойства RE_Fmt... работаеют правильно.
  Так же, добавлен код для предотвращения вставки символа табуляции в текст по нажатию Ctrl+I, когда используется RE_FmtStandard и это сочетание переключает курсив.

[*] rich edit: Изменено присваивание значения свойству RE_FmtFontColor. Теперь при этом (новое) свойство RE_FmtAutoColor сбрасывается в False, и цвет конвертируется в RGB. Добавлены свойства форматирования атрибутов RE_FmtHidden и RE_FmtHiddenValid.

[*] rich edit: свойства RE_AutoKeyboard, RE_AutoKeybdSet, RE_AutoURLDetect, RE_DisableOverwriteChange, RE_FmtStandard, RE_Transparent и события OnRE_InsOvrModeChange, OnRE_OverURL доступны в design time для зеркала rich edit (MCK).

[-] MCK: Исправлена вставка длинных строк в качестве начального значения для строковых свойств - спасибо LasTNighT за предоставленный код.

[*] MCK: теперь TKOLProject сам определяет правильное местонахождение директории, в которой располагается проект, так что необходимость править его свойство sourcePath вручную отпадает при перемещении проекта в другой каталог или на другую машину..

[-] Исправлено табулирование на контролы, в настоящее время невидимые вместе со своими родителями. Свойство ToBeVisible теперь возвращает False, если ToBeVisible для родительского объекта так же False.

[-] Исправлено выравнивание дочерних контролов на родительском group box. Спасибо BaRoN!, обнаружевшему это "счастье" (кажется, так будет "глюк" с немецкого :) ).

 

KOL & MCK v0.75 (20-Мая-2001)

[+] Новые методы в TControl: DragStart (для формы) и DragStartEx, DragStopEx (вместе с переиспользованным свойством Dragging) - для любых контролов. Эти методы позволяют перемещать окно (форму/контрол) мышкой не только за заголовок.

[-] События OnMouseDblClk, OnClose, ранее забытые, добавлены к зеркальным компонентам и доступны в Инспекторе Объектов.

[*] Некоторые изменения в оконной процедуре обработки сообщений. Динамические процедуры (присединенные вызовом AttachProc) более не вызываются для переменной Applet (кроме обработки ее собственных сообщений), но только для того целевого контрола, окну которого предназначены. В результате, присоединенные процедуры переменной Applet не фильтруют все сообщения, поступающие окнам приложения (т.е. для фильтрации всех сообщений остается только событие Applet.OnMessage).

[*] Вышеуказанное изменение позволило улучшить обработку сообщений мыши. Теперь все мышиные события (OnMouseDown, OnClick, OnMouseUp, OnMouseDblClick) принимаются нормально, не заглушая OnClick и OnMouseDblClk. Еще один флаг задействован в структуре TMouseEventData, передаваемой всем обработчикам событий OnMouse... . Этот флаг назван StopHandling, и установка позволяет его в значение TRUE предотвращает дальнейшую обработку данного сообщения, в том числе передачу его стандартному обработчику окна.

[*] Изменения в генерации кода проекта MCK: теперь для конструирования формы вместо функций
        New{Formname}(AParent:PControl ):P{Formname}
используются процедуры
        New{FromaName}( var AForm: P{Formname}; AParent: PControl ).
В результате глобальная переменная, соответствующая форме (например, Form1: PForm1 ) оказывается уже присвоена в обработчике OnFormCreate (и других обработчиках событий, если они вызваны еще до завершения конструирования формы).

[*] Двойной щелчок на зеркальных невизуальных компонентах в design time теперь обеспечивает создание и показ в редакторе IDE наиболее подходящего обработчика события (OnDestroy считается подходящим только при отсутствии других событий в списке).

[+] Добавлен новый тип зеркального компонента в MCK: TKOLDataModule. Он предназначен для использования вместо компонента TKOLForm для коллекционирования множества компонент (обычно невизуальных) на отдельной форме во время разработки - во избежание загромождения собственно формы. Хотя создание ссылок на объекты в других модулях из дизайнера и не поддерживается, польза от этого может быть.

 

KOL & MCK v0.74 (14-May-2001)

[=] TTimer: предыдущие изменения были сделаны слишком неаккуратно. И ассемблерная, и паскалевская версии исправлены.

[-] Решена проблема установки MCK в старой ОС Windows95. Как было обнаружено, API функция BroadcastSystemMessage, была неверно декларирована в модуле windows.pas, и ссылалась ошибочно на точку входа BroadcastSystemMessageA, которая отсутствует в USER32.DLL в старых версиях Windows95. Должна была бы использоваться точка входа BroadcastSystemMessage.

[*] Если иконка не может быть назначена в ненулевой колонке listview (по причине слишком старой версии comctl32.dll), исключение assert (run-time error 227) теперь не генерируется. Но могут не измениться прочие состояния (метод LVSetItem).

[*] Начиная с этого небольшого обновления, несколько последующих будут публиковаться в виде пач-данных. Для обновления версии используйте утилиту Updater.

 

KOL 0.73 (13-Мая-2001)

[-] Исправлено большое количество утечек памяти и ресурсов. Большое ( нет, БОЛЬШОЕ ! ) спасибо  Вячеславу Гаврик, сообщившему об этих неполадках, и предложившему полезные предложения по исправлению кода (а также предложившему другие полезные дополнения и изменения).

[+] Включены новые методы GetSectionNames и SectionData для объекта TIniFile (by Vyacheslav A. Gavrik).

[*] Для упрощения дальшейшей работы с профилирующими средствами, внешними отладчиками (memproof), а так же с code insight, code completion в Delphi5, все inc-файлы снова объединены в KOL.PAS(1,5 Мб). Для минимизации объемов обновлений, со следующей версии будут использоваться утилиты PatchMaker и Patcher, разработанные ранее для XCL (текущая версия поставляется целиком).

[-] Изменения в Tab control : добавлена опция tcoBorder, включение которой имитирует предыдущее поведение, когда вокруг таб-контрола появлялся (вдавленный) бордюр. Теперь по умолчанию никакой границы нет (как у TPageControl в VCL), причем стиль WS_EX_TRANSPARENT для этого не используется, что устраняет неправильную прорисовку дочерних edit-контролов. Соответственно, в MCK, изменена реализация TKOLTabControl.edgeType и тип границы по умолчанию (без бордюра) не требует генерации дополнительного кода.

[-] Исправлен двойной вызов события OnRE_URLClick (rich edit, щелчок по гипер-ссылке).

MCK 0.73 (13-May-2001)

[+] Добавлено свойство VerticalAlign для зеркала TKOLPanel. Также, VerticalAlign и TextAlign добавлены к TKOLBitBtn (ранее были забыты).

[+] Добавлено свойство Font к TKOLTabControl. См. также изменения в KOL 0.73 (исправлено отображение дочерних edit-контролов, в случае edgeStyle = esNone).

[-] Имена для ресурсов иконок, генерируемых автоматически (в TTrayIcon) начинаются теперь с буквы 'z', что обеспечивает их размещение после 'MAINICON' (т.е., иконки, представляющей само приложение). В результате, проводник Windows показывает заданную иконку приложения в списке файлов.

[-] Предприняты некоторые усилия для разрешения проблемы с неправильным размещением деклараций новодобавленных компонент в описании класса формы. Иногда дизайнер Delphi помещал их до директивы {$ENDIF}, в результате чего проект не мог быть скомпилирован нормально. Обычно такое могло происходить непосредственно после создания проекта MCK. Теперь, каждый раз при генерации кода, исходный текст проверяется, и при необходимости, директива {$ENDIF KOL_MCK} перемещается в правильную позицию. Изменение должно работать корректно как на старых, так и на вновь созданных проектах.

[+] Свойства SimpleStatusText и StatusText добавлены в компонент TKOLForm.

[+] Свойство MaxTextSize и событие OnRE_URLClick добавлены в компонент TKOLRichEdit.

 

KOL 0.72 (7-May-2001)

[+] Добавлен объект TImageShow (подобно TImage в VCL, но для показа картинки из TImageList). Соответствующий зеркальный компонент TKOLImageShow так же добавлен к MCK.

[+] Добавлены события OnShow и OnHide для TControl. И оба доступны на этапе времени разработки (в MCK).

[-] Исправлена Pascal-версия TControl.Run (неверная попытка присвоить nil переменной, пережанной в качестве параметра, на хвосте выполнения). Ассемблерная версия работала верно.

[-] Исправлена Pascal-версия TControl.GetCurIndex (с ассемблерной все было в порядке).

[-] Asm-верия вызова обработчика OnSelChange исправлена для tab control-а. Так же, добавлено форсирование события OnSelChange, когда CurIndex изменялся программно (сообщение TCN_SELCHANGE системой в этом случае не посылается автоматически).

[+] Добавлены методы BringToFront и SendToBack для объекта TControl для упрощения изменения порядка окна ( Z-order ) во время выполнения.

[-] Исправлены Asm-версии методов TBitmap.FillBmpWithBkColor и TBitmap.FormatChanged (неверно работали для случая изменения свойства HandleType на bmDDB, а так же при изменении ширины/высоты объекта TBitmap).

[+] Добавлен метод PopupEx для объекта TMenu. Для pop-up меню, вызываемых (обычно из "трея"), когда родительское окно невидимо - обеспечивает правильное исчезновение меню в случае щелчка в любом другом окне (баг, характерный для NT/2K).

[-] Исправлен вызов событий OnMouseXXXX для панели (не вызывались вообще - отсутствовал стиль SS_NOTIFY).

[-] Изменена и исправлена обработка событий OnMouseEnter / OnMouseLeave. Теперь используется функция _TrackMouseEvent, которая делает это намного аккуратнее, чем предыдущая методика захвата мыши до выхода из визуального объекта. Проверено так же, что работают функции bitbtn-а "неправильной" формы, для случае, когда эти события используются для изменения его состояний.

MCK 0.72 (7-May-2001)

[+] Добавлено design-time свойство wordWrap для TKOLLabel. Оно лишь определяет, какой конструктор будет вызываться для создания объекта метки - NewLabel или NewWordWrapLabel (т.е., данное свойство отсутствует во время исполнения).

[-] TKOLTabControl: обеспечена генерация кода для инициализации отдельных страниц-закладок ( Pages ) - т.е., изменения их базовых свойств (цвет, шрифт, и т.п.) и назначение событий (было пропущено). Так же, исправлено отображение в момент запуска страницы, заданной свойством CurIndex (использован новый метод BringToFront).

[-] Обеспечена возможность (устранена невозможность - как хотите) добавлять другие функции, процедуры непосредственно в dpr-файл проекта. В предыдущих версиях, первая строка, содержащая слово 'begin', ошибочно рассматривалась как место для подмены части кода в плане приведения проекта к нужному виду. Это исправлено добавлением маркирующего комментария к этому оператору begin в первый раз (или при дальнейшей работе, если такая строка еще не обнаружена).

[-] Еще одно исправление для свойств parentFont, parentColor. Теперь они сами становятся FALSE, когда Font, Color изменены в Object Inspector-е.

[-] Исправлена генерация (отсутствие) события OnMenu для зеркала TKOLTrayIcon.

[-] Исправлен TKOLImageList component editor. Теперь он не портит картинки, добавленные в него, после повторного редактирования (как раньше).

[-] Исправлено использование потомков TComponent на форме MCK в Delphi3.

 

Новости сайта (3-May-2001)

Несколько новых ответов добавлено на страничку FAQ.

KOL 0.71 (3-Мая-2001)

Примечание: когда был выпущен MCK v0.70, KOL не изменялся, поэтому непосредственно за версией 0.69 библиотеки KOL следует версия 0.71 для сохранения синхронности номеров версий между KOL и MCK.

[+] Добавлено событие OnDropFiles к объекту TControl. Оно позволяет приложению принимать из других приложений (например, из проводника) файлы, "брошенные" (drop) на его визуальные элементы простым назначением обработчика такого события. (Соответствующее изменение уже внесено в код MCK 0.71, так что настроить прием файлов в приложении теперь очень просто).

[-] Событие OnSelChange вызывалось дважды для tab control-а, когда закладка была изменена (например, мышью) - исправлено.

[*] Методы GetWindowHandle и CreateChildWindows перемещены в секцию public в декларации объекта TControl. GetWindowHandle позволяет форсировать выделение дескриптора окна контрола без того, чтобы его родительская форма была отображена на экране в незавершенном состоянии (обычно это требуется на этапе инициализации формы, когда еще окончательно не определено местоположение и размеры формы. Использование метода GetWindowHandle может уменьшить вероятность мелькания окна в момент его появления). CreateChildWindows так же может быть полезно при динамическом создании группы дочерних контролов во время выполнения.

[-] Асм-версия метода TTrayIcon.Destroy проверена и исправлена.

[-] Исправлен метод TIcon.Convert2Bmp для случая иконки нестандартного размера (не 32х32). Спасибо Матвееву Б., обнаружившему этот баг и сообщившему о нем.

MCK 0.71 (3-May-2001)

[-] Добавлено событие OnSelChange для зеркала TKOLTabControl.
[+] Добавлено свойство времени проектирования edgeType, позволяющее легко настроить стиль границы tab control'а (зеркальный компонент TKOLTabControl).

[-] Добавлена инициализация свойства Tooltip для зеркала TKOLTrayIcon.

[-] Генерация кода для инициализации свойств FontPitch, FontOrientation и FontCharset исправлена. Благодарности за обнаружение этого жучка: Jean-Marie Delbary.

[-] Свойства parentFont, parentColor теперь действительно позволяют наследовать родительский шрифт/цвет рекурсивно - для всех дочерних визуальных объектов, для которых соответствующее свойство True.

[*] Добавлено свойства Locked для компонентов TKOLForm и TKOLProject. Оно устанавливается в True, когда на форме обнаруживаются визуальные объекты VCL. Будучи блокированы (Locked=True), данные компоненты не функционируют, что предотвращает возможные неприятности в случае ошибочного бросания на форму VCL-проекта компонентов MCK.

[+] Добавлена генерация кода для наследников TComponent из VCL, помещенных на форму MCK. Хотя использование VCL-компонент в проектах KOL сводит на нет преимущества KOL по сокращению используемого кода, в некоторых случаях их применение может быть оправдано.
   Единственное неудобство - после изменения свойств таких компонентов, необходимо форсировать перегенерацию кода, например - двойным щелчком по TKOLProject.
   Поддерживается генерация кода, который автоматически создает такие компоненты во время исполнения, присваивает им те публикуемые свойства (и события), которые отличаются от присваиваемых компоненту в его конструкторе, а так же формируется код, который разрушает компонент вместе с родительской формой. Поскольку никакие объекты KOL не являются компонентами, в качестве владельца для всех автоматически генерируемых объектов используется nil.

[-] Изменен порядок вызова OnFormDestroy таким образом, чтобы он вызывался правильно независимо от причины вызова деструктора формы - в результате соответствующего сообщения (WM_DESTROY) или программно из самого приложения (Free).

[*] Добавлено особое публичное свойство "FormPointer_DoNotUseItPlease_ItIsUsedByMCK" для объекта TControl, чтобы использовать его в качестве ссылки из формы на содержащий ее объект (holder). Так что, поле Tag формы теперь освободилось снова и может использоваться любым разумным способом.

 

MCK 0.70 (30-Апр-2001)

[+] Наконец-то: добавлено зеркало TKOLTabControl для tab control'а (известного в VCL как page control). с этим дополнением, зеркала есть теперь практически для всех визуальных объектов KOL.

[+] Добавлены зеркала для невизуальных объектов TKOLColorDialog, TKOLTrayIcon.

[*] TKOLPaintBox может принимать дочерние визуальные объекты, т.е. использоваться как панель с полотном для рисования.

 

Новости сайта:

[*] Зеркало kol.nm.ru отключено - оно стало слишком медленным (там осталась ссылка сюда, запомните этот адрес: XCL.CJB.NET ).

KOL 0.69 (28-Апр-2001)

[+] Добавлена функция SysErrorMessage для форматирования системного сообщения об ошибке, полученной по GetLastError.

[+] Добавлен архив kol_service.zip , содержащий модуль Service.pas. В нем определены два объекта TServiceCtl и TService, позволяющие изготавливать сервисы для NT и управлять ими.

MCK 0.69 (28-Apr-2001)

[-] TKOLToolbar: исправлен вызов редактора компонента для Delphi5 (не работал).

[-] Несколько изменилось поведение свойств parentFont, parentColor. Теперь возможно присвоить False во время разработки, чтобы дальнейшие изменения в свойствах Font или Color родительского объекта не влияли на значение этих свойств дочернего визуального объекта.

[+] Теперь TKOLApplet действительно не нужен в MCK-приложениях, содержащих единственную форму - даже в случае, когда используется TKOLTimer (он требовал, чтобы переменная Applet не была nil). Для случая отсутствия TKOLApplet переменной Applet автоматически присваивается указатель на объект главной формы немедленно после его создания.

 

Новости сайта:

[+] На странице FAQ, добавлен ответ на вопрос о том, как создать DLL, содержащую форму KOL.

KOL 0.68 (26-Apr-2001)

[-] TOpenSaveDialog.InitialDir - исправлено присваивание значения во время вызова функции NewOpenSaveDialog.

[-] Stream2Stream - исправлен для случая, когда исходный поток является потоком в памяти (memory stream) - ранее не изменялась текущая позиция в нем.

[-] TStream.Seek - исправлена ассемблерная версия.

[-] TBitmap.Dormant - исправлена утечка ресурсов для случая, когда Canvas уже был использован. Процедура изменения формата так же улучшена для более корректной работы с форматом pf15bit.

[*] Теперь событие OnDestroy вызывается до разрушения визуального объекта ( TControl ).

[*] Некоторые исправления и изменения в документации: TColorDialog документирован и отображается в автоматически генерируемой справке, некоторые комментарии изменены с целью использовать новые возможности xHelpGen v3.0 (обновлен на этой неделе), прочие комментарии проверены и уточнены.

[+] добавлена поддержка формата GIF: KolGif.pas лежит в отдельном архиве. Правильно раскодируются и отображаются анимированные, прозрачные и даже испорченные (обрезанные) gif-файлы. Для целей упаковки неанимированных точечных изображений, возможно использовать "облегченный" объект TGifDecoder, который просто распаковывает кадры и конвертирует их в bitmap. Для обеспечения корректного отображения кадров в анимированных gif-клипах, следует использовать более мощный объект TGif.

MCK 0.68 (26-Апр-2001)

[-] Установка Checked := True и SetRadioChecked добавлена для TKOLCheckbox и TKOLRadiobox соответственно - если они были "checked" в design-time.

xHelpGen 3.0 (19-Apr-2001)

[+] Добавлена многоязыковая (и многоцелевая) поддержка. Хотя, комментарии не для всех пока объектов добавлены на русском языке (в будущем будут обеспечены русские комеентарии - по мере возможности).

[+] Добавлена поддержка местного глоссария (local glossary). Это упрощает поддержку перекрестных ссылок в больших исходных текстах (что важно для KOL).

[-] Исправлена и улучшена поддержка таких синтаксических конструкций, как interface, interfaced class, overload directive, case in record, packed object, вложенные объявления типов внутри класса.

 

KOL 0.67 (15-Apr-2001)

[+] Обеспечено две независимых схемы, позволяющие создать свой собственный визуальный control на базе имеющегося в KOL объекта TControl. Первый способ использует стандартные возможности ООП по наследованию объектов. Необходимо в самом KOL включить опцию USE_CONSTRUCTORS. Это приводит к некоторому увеличению конечного кода, так что эта возможность оставлена выборочной. Второй способ позволяет расширить TControl изнутри. Достаточно включить опцию USE_CUSTOM_EXTENSIONS и подготовить три файла CUSTOM_TCONTROL_EXTENSION.inc, CUSTOM_KOL_EXTENSION.inc и CUSTOM_CODE_EXTENSION.inc, где размещается код, вставляемый соответственно внутрь декларации самого TControl, в интерфейсную часть KOL.PAS, и в конец раздела implementation. Поскольку дистрибутив вышеуказанных файлов не содержит, при распаковке новой версии ваш код останется нетронутным.

[+] ЧРЕЗВЫЧАЙНО ВАЖНАЯ НОВОСТЬ: добавлен новый модуль KOLEDB.PAS (ссылка для загрузки здесь), который позволяет изготавливать на основе KOL приложения для работы с СУБД. Используется универсальный интерфейс OLE DB. Это еще только первая, функционально слабая версия, но она позволяет делать уже очень многое. Прилагается пример, собираемый в исполнимый файл размером всего 24К.

[-] Исправлен клоп в LVItemAdd, LVItemInsert.

MCK 0.67 (15-Apr-2001)

[-] Исправлен небольшой баг со свойством InitialPath компонента TKOLOpenDirDialog.

 

KOL 0.66 (8-Apr-2001)

[-] Исправлено свойство CanResize (ассемблерная версия SetCanResize). Восстановление размеров формы после минимизации, когда CanResize = False, так же исправлено.

[-] Ошибка с назначением индивидуальных обработчиков событий OnMenuItem для TMenu иправлена. (Была в asm-версии).

[-] Неверно работал toolbar в случае единственной кнопки (asm-версия).

[-] Исправлена еще одна "фича" toolbar-контрола. Теперь происходит только одно событие OnClick, когда клик выполнен в области, где нет кнопок. Работает теперь одинаково правильно для левого и правого щелчка мыши. В обоих случаях CurItem и CurIndex содержат идентификатор и индекс кнопки, либо -1, если щелчок был вне кнопки.

[-] После "шаманских танцев" исправлены методы TObj.Init и TObj.Destroy для Delphi3 и Delphi2. Теперь правильно работает разрушение визуальных объектов во время исполнения, и правильно вызывается событие OnDestroy. Большинство проблем обнаружилось в ассемблерной версии кода.

[+] Следующие свойства и методы добавлены в TControl для получения индекса выделенных элементов в list view:

  • LVCurItem - возвращает индекс первого выделенного элемента
  • LVNextSelected( Idx ) - возвращает индекс следующего выделенного элемента (для lvoMultiSelect)
  • LVNextItem( Idx, Attrs ) - возвращает индекс следующего элемента с заданными атрибутами

     С этими добавками устранен пробел в функциональном интерфейсе list view в KOL.

[+] Для удобства программистов, добавлен метод Close в TControl. Если применен к главной форме или объекту Applet, он прекращает работу всего приложения. Так же добавлены функции: ShowMsg( S, Flags ), ShowMessage( S ), ShowMsgModal( S ).

[+] Добавлен метод MinimizeNormalAnimated в TControl. Если применен к главной форме, обеспечивает правильную анимацию приложения - от заголовка главной формы к кнопке приложения на панели задач. Соответствующее свойство времени проектирования добавлено к зеркальному компоненту TKOLForm в MCK.

MCK 0.66 (8-Apr-2001)

[*] Свойство parentFont теперь работает несколько иначе. Оно определяет, действительно ли шрифт дочерних контролов изменяется вместе со шрифтом родительского во время разработки - не только показывает, что они равны. (Следует помнить, что изменять надо шрифт компонента TKOLForm, а не самой формы).

[+] В тех же целях добавлено свойство parentColor.

[*] Использована более "продвинутая" техника доступа к исходному коду прямо в редакторе IDE. Теперь нет ограничения на загрузку в редактор автоматически генерируемых inc-файлов. Свойство protectFiles объекта TKOLProject более не задействуется, защита автоматически генерируемых файлов от ручного изменения всегда отключена.
   К сожалению, этот метод доступа к исходному коду прямо в редакторе IDE недоступен в Delphi2 и Delphi3. Для этих версий по-прежнему не рекомендуется загружать автоматически сгенерированные файлы в редактор Delphi.

[+] Реализовано зеркало для toolbar-контрола: TKOLToolbar. Проверено во всех версиях Delphi. В Delphi2 по неизвестным причинам отказалась работать API-функция CreateMappedBitmap, так что добавлено свойство mapBitmapColors, позволяющее генерировать код без трансляции цвета (если mapBitmapColors = True, вызывается CreateMappedBitmap для трансляции прозрачного цвета в clBtnFace).

[*] Событие OnDestroy встроено в TKOLForm.

[-] Устранена генерация .SetSize( 0, 0 ) в автоматически генерируемом коде (эффекта от него не было, вреда тоже, но - неоптимально).

 

KOL 0.65 (1-Apr-2001)

[-] Обнаружена и исправлена "утечка" в связи с неосвобождением памяти, выделенной строковым полям объектов. К счастью, таких полей в KOL очень мало (например, в TControl - только одно FREUrl, и то использумое крайне редко - при работе с rich edit).

[+] Добавлен еще один архив kol_err.zip.Он содержит модули ERR.PAS и KOLMATH.PAS, предназначенные для замены стандартных SysUtils и Math в части обработки исключительных ситуаций. Использование ERR.PAS увеличивает размер исполнимого файла примерно на 6K (вместо 11K при использовании SysUtils), и позволяет использовать конструкции try-finally, try-except, try-except-on, raise в проектах, разработанных с KOL.

MCK 0.64 (25-Mar-2001)

[+] Добавлены зеркала TKOLOpenSaveDialog и TKOLOpenDirDialog (для TOpenSaveDialog и TOpenDirDialog).

[+] Событие OnDestroy добавлено ко всем зеркалам визуальных и невизуальных объектов.

[=] Обнаружен (пока не устранен) баг в реализации редактора меню, проявляющий себя только в Delphi2: событие OnMenu для отдельных элементов недоступно. Пока можно использовать общее событие OnMenuItem, оно работает нормально.

 

KOL 0.64 (25-Mar-2001)

[-] UpperCase и LowerCase (asm-версии) исправлены - для случая пустой строки. (Спасибо to Rick B. за bug report).

[+] List view контрол усовершенствован. Добавлены:

  • LVItemState[ Idx ]: set of [ lvisFocused, lvisSelect, lvisBlend, lvisHighlight ]
    (индекс -1 используется для ссылки на все элементы list view со стилем lvoMultiSelect или на последний элемент в противном случае)
  • LVSelectAll
  • LVItemAdd( aText )
  • LVItemInsert( Idx, aText )
  • LVItemStateImgIdx[ Idx ]
  • LVItemOverlayImgIdx[ Idx ]
  • OnDeleteLVItem( Sender, Idx )
  • OnDeleteAllLVItems( Sender )
  • OnLVData( ... ) и стиль lvoOwnerData, позволяют управлять огромным (виртуальным) списком без потери производительности приложения.
  • OnCompareLVItems( Sender, Idx1, Idx2 ): integer и процедуры LVSort/LVSortData
  • OnColumnClick( Sender, Idx )
  • LVSortColumn( Idx )
  • OnDrawItem( Sender, DC, Rect, Action, State ) и стиль lvoOwnerDraw для list view

[+] Так же обеспечены стили owner-drawn и виртуальный для list box'а:

  • событие OnDrawItem (см. выше) и стили loOwnerDrawFixed/loOwnerDrawVariable дают возможность создавать owner-drawn list box
  • стиль loNoStrings/loNoData и возможность изменения значения свойства Count дают возможность манипулирования с виртуальным list box'ом, содержащим тысячи строк без потери производительности приложения
  • добавлено новое событие: OnMeasureItem, которое позволяет добавить код, отвечающий за установку индивидуальной высоты строк list box'а (с включенной опцией loOwnerDrawVariable) или combo box'а (coOwnerDrawVariable)

[+] Так же обеспечен owner-drawn combobox:

  • стили coOwnerDrawFixed и coOwnerDrawnVariable вместе с описанными выше событиями OnDrawItem и OnMeasureItem дают желаемый эффект.

[+] Новое свойство ItemData[ Idx ]: DWORD доступно для list box'а и combo box'а и позволяет ассоциировать любые определенные пользователем данные с элементами этих контролов.

MCK 0.64 (25-Mar-2001)

[+] Все новые события и стили внедрены в TKOLListView, зеркало list view,.

[+] в TKOLListbox, зеркало list box'а,

[+] в TKOLCombobox, зеркало combobox'а.

 

KOL 0.63 (9-Mar-2001)

[-] В методе SetPosition исправлен случай присваивания 0 свойству Left или Top формы. Теперь константа CW_USEDEFAULT используется только в случае, если и Left, и Top не были изменены до создания окна.

[-] Ассемблерная версия процедуры SortData исправлена.

[*] Добавлено событие OnDestroy к самому базовому объекту TObj (так что, теперь любой объект KOL имеет такое событие).

MCK 0.63 (9-Mar-2001)

[+] Добавлено несколько зеркальных компонентов: TKOLGroupBox, TKOLCheckBox, TKOLRadioBox, TKOLEditBox, TKOLMemo, TKOLListBox, TKOLComboBox, TKOLSplitter, TKOLPaintBox, TKOLListView, TKOLRichEdit, TKOLProgessBar.
   Осталось реализовать только несколько: tabcontrol, toolbar, label effect. Надеюсь, это удастся очень скоро сделать. Но уже сейчас, возможно начать программировать с использованием KOL - визуально.

[-] Устранены проблемы со строковыми свойствами, содержащими символы апострофа и управляющие.

[-] Исправлено использование свойства TabOrder. Теперь визуальные объекты создаются в том порядке, который задан порядком их обхода по клавише Tab, так что генерация специального кода для присваивания значения свойству TabOrder, просто не требуется.

[-] Проблемы соответствия визуального размещения дочерних контролов во время разработки и во время исполнения частично разрешена. Приложены некоторые усилия для преодоления отсутствия пространства между границей родительского контрола и его клиентской областью во время разработки. По крайней мере, для не-выровненных дочерних элементов, они размещаются во время исполнения действительно в том же самом месте, где и были помещены во время разработки формы. (Для выровненных дочерних контролов проблема не столь существенна, и для реализованного набора зеркальных компонентов, важным является только TKOLPanel, для которого отличие может составлять 3 пиксела и менее, в зависимости от значения свойства TKOLPanel.edgeStyle). Для Delphi5 добавлены специальные редакторы свойств для правильной визуализации свойств Left и Top в Инспекторе Объектов (однако при прямом редактировании их значение отображается все-таки со смещением).

Все вышеуказанные изменения проверены для Delphi5, Delphi4, Delphi3, Delphi2 в Windows 2000.

 

  
KOL 0.62 (1-Мар-2001)

[-] SetCanResize - исправлена ассемблерная версия (спасибо говорить Dalibor Toman, Чехия).

[-] Присваивание значения свойству MaxProgress (для прогресс-контрола) исправлено.

[-] TOnEventAccept - исправлено объявление типа (TObject заменен на PObj, как и должно быть - ну нету в KOL TObject'ов!).

[+] Добавлено некоторое количество функций для работы с реестром: RegKeyOpenCreate, RegKeyExists, RegKeyValueExists.

[*] Для диалога TOpenSaveDialog, теперь ';' в фильтре не подразумевается как делитель между строками фильтра (только '|' должен использоваться для этого). Так что, точка с запятой может использоваться как разделитель внутри группы масок.

   Рекомендую посетить Страничку Thaddy и посмотреть на маленький (60К!) FTP-explorer, сделанный на KOL.

 

MCK 0.61 (30-Дек-2000)

Два небольших исправления для Delphi5:

[-] Исправлен код функции QueryFormDesigner.

[-] Небольшое дополнение в инструкции "Как выполнить первичное преобразование проекта в KOL": надо в новом проекте указать компилятору путь к его дизайнерским модулям $(Delphi)\Source\ToolsAPI.

С Новым Годом!

 

M C K   0 . 6 ( 2 6 - Д е к - 0 0 )

MCK 0.6:

[+] <!!!> Добавлено зеркало (вернее сказать, сразу несколько зеркал) для меню - TKOLMainMenu и TKOLPopupMenu - со своим design-time редактором (включая два редактора свойств, и множество кода, о котором программисту ничего не надо знать, кроме того, что он работает, и надеюсь - без серьезных глюков). В том числе, поддерживается упрощенный ввод клавиш-акселераторов, назначение точечных рисунков для пунктов меню и т.п. Даже сделана имитация главного меню на форме в режиме разработки - с возможностью создания события и перехода на него по выбору пункта главного меню (хотя обеспечен и доступ и из Инспектора Объектов - в закладке События).

[+] Добавлен небольшой (но полезный) редактор для компонента TKOLProject, который обеспечивает форсирование конвертации проекта в KOL в соответствии с последними изменениями (эта операция равносильна двойному щелчку по значению свойства BUILD, когда компонент TKOLProject выделен в Инспекторе Объектов).

[*] Небольшое изменение в соглашениях по наименованию: в зеркальных компонентах все свойства, существующие только во время разработки (design time), или существенн отличаются от своего аналога в коде KOL, именуются маленькими буквами.

KOL 0.6:

[-] Исправлено присваивание (и срабатывание) отдельного события пункту меню (AssignEvents, WndProcMenu) - для случая, когда события присваиваются не все сразу, а по одному.

[-] Исправлена асм-версия WndProcMouse. Теперь все мышиные события отлавливаются правильно (работал только OnMouseMove).

 

В связи с некоторыми форс-мажорными обстоятельствами (винт сгорел) данный выпуск был задержан. Тем не менее, определенный прогресс был достигнут. В особенности в плане обеспечения совместимости с другими версиями Delphi - как самой библиотеки KOL, так и ее визуального расширителя MCK.

MCK 0.5 (19-Dec-00)

[+] Решены некоторые проблемы. Добавлено зеркало для панели, TKOLPanel - и генерация кода для дерева дочерних контролов выверена. Добавлены два зеркальных класса для невизуальных объектов: TKOLTimer и TKOLImageList (последний - со своим редактором). Используя imagelist, добавлено зеркало для рисованной кнопки TKOLBitBtn, с возможностью использовать картинки из Bitmap или ImageList.

[+] Улучшена генерация кода для случая использования единственной формы без специального окна Applet (теперь главная форма создается вместо него и присваивается переменной Applet, так что различные объекты, которым требуется окно приложения (такие как timer) могут использовать окно главной (единственной) формы.

[+] Обеспечена совместимость  с Delphi4, Delphi3 и Delphi2. Поскольку в Delphi2 имеются существенные проблемы с использованием точечных рисунков (отсутствует поддержка DIB, нет свойств HandleType и PixelFormat в классе TBitmap), хорошая работа с графикой не может быть обещана. Тем не менее, зеркальные компоненты устанавливаются на палитру без проблем и позволяют делать практически все так же легко, как и в последующих версиях Delphi.

KOL 0.5 (19-DEC-00)

[+] Свойство VerticalAlign реализовано так же для метки и панели, не только для кнопки (допустимы стили vaTop и vaCenter, vaBottom для них не действует). Так же свойство TextAlign теперь применимо к панелям.

[-] Исправлена Asm-версия BitBtn (рисование было неверным для GlyphLayout, не равного glyphLeft).

[+] Совместимость с Delphi2, Delphi3 и Delphi4 для самой библиотеки KOL обеспечено (проблемы были связаны с отсутствием определения TGUIThreadInfo, а так же из-за неверной декларации GetPrivateProfileStruct / WritePrivateProfileStruct в windows.pas от D2-D4, и некоторых других различий).

 

MCK 0.4 (11-Дек-00)

[+] Методика получения / обновления исходных файлов проекта существенно улучшена: теперь модули pas и dpr, если они загружены в Delphi IDE Editor, извлекаются прямо оттуда и там же обновляются. Это почти полностью решает задачу синхронизации исходных файлов на диске и в памяти Delphi.
  Однако, не следует загружать в IDE автоматически генерируемые inc-файлы (кроме специально оговоренных случаев).

[+] Добавление формы стало чрезвычайно простой операцией благодаря изменению выше.

[+] Теперь нет необходимости постоянно держать открытой главную форму. (Но в этом случае изменения всегда вносятся немедленно, независимо от значения AutoBuild и BuildTime в компоненте TKOLProject, находящемся на главной форме).

[*] Минимальное значение для AutoBuildDelay теперь = 0. (Означает выполнять конвертацию немедленно).

[+] Проблема переименования форм полностью решена. Переименование следует выполнять изменяя свойство FormName компонента TKOLForm на самой форме. (Однако, если главная форма не открыта - операция не разрешается и выдается сообщение о необходимости открыть главную форму).

[+] Компонент TKOLProject научился полностью автоматически распознавать путь к директории проекта, а так же к директории, в которую записываются dcu-файлы. При создании нового проекта диалог выбора директории, в которой проект расположен, более не появляется.

<*> Примечание: MCK разрабатывается под Delphi5, но поставляется в исходниках, так что когда будет проверена совместимость самого KOL с прочими версиями Delphi, скорее всего, не будет проблем и с установской MCK в них.

 

MCK 0.3 (10-Дек-00)

[-] Устранено сообщение 'Invalid typecast' при бросании TKOL... компонентов на форму.

[-] TKOLProject.AutoBuild теперь работает правильно.

[-] Решена проблема с конвертацией в KOL добавленной в проект формы. Пока не завершено корректное переименование формы - но пока можно завершить переименование вручную.

[+] Добавлена отладочная консоль - может быть полезна при тестировании.

[*] Изменена структура dpr - с целью лучшей генерации кода для закрытых форм (т.е. не открытых в IDE). Соответственно, свойство AutoCreate удалено из TKOLForm, и управление автоматическим созданием форм идет обычным в VCL способом: Project|Options|Forms.

[*] Свойства TKOLForm (design-time) DefaultWidth и DefaultHeight заменены DefaultSize.

KOL 0.391 (извинения, этот баг был заявлен как исправленный, но по дороге исправление было утеряно...):
[-] Исправления в CanResize:
- дескриптор окна создается, если еще не был создан, так что неприятное съеживание формы устранено (но убедитесь в том, что False присваивается свойству CanResize непосредственно перед тем, как выполняется вызов Run);
- Теперь обрабатывается сообщение WM_NCHITTEST и изменение курсора на границе окна предотвращается.

 

KOL 0.39 (9-Дек-00)

[+] KOL MCK стал еще лучше. Найден ряд новых решений, которые позволили сделать разработку KOL-проекта такой же удобной как в VCL и ПОЛНОСТЬЮ визуальной. Вы можете создавать формы, бросать на них KOL-контролы и KOL-объекты, менять их местоположение и размеры, настраивать свойства с помощью Инспектора Объектов, даже создавать обработчики событий и писать свой код используя все возможности IDE (code insight, code completion, auto completion, и т.д.), и когда проект скомпилирован - Вы получаете маленькую, очень маленькую программу. И больше не нужно переключаться между зеркальным и истинным проектом - Вы разрабатываете приложение в точности так же, как Вы делаете это с обычным проектом Delphi! (Ваши точки останова не теряются, курсор не пропадает из того места, где он находился во время отладки, когда Вы решили сделать остановку, чтобы исправить кусок кода, все закладки сохраняются... красота, не правда ли...!)
  Еще далеко не для всех объектов KOL готовы зеркальные классы, и даже рисование объектов происходит в прежнем схематическом стиле (это будет исправлено в последний момент - когда будет завершена фунциональная часть), но уже сейчас мы можем сказать - KOL стал настоящей визуальной средой, а не просто библиотекой объектов. И плюс маленький код!

[-] Исправлена асм-версия функции TrimRight (символы #128..#255 обрезались).

[-] Паскалевские версиифункций DelimeterLast, ExtractFilePath/Name/Ext/NameWOExt исправлены.

[-] Асм-версия метода TDirList.ScanDirectory исправлена (теперь последний '\' в передаваемом пути к сканируемой директории необязателен).

[-] Исправлена Паскаль-версия функции Hex2Int (символы, не являющиеся цифрами 16-ричной системы счисления, просто пропускались - вместопрекращения сканирования).

[+] Добавлен объект диалога TColorDialog.

[*] Изменен метод TControl.Click так, что теперь и для кнопки формируется сообщение WM_COMMAND с кодом BN_CLICKED=0).

[-] Исправлен метод TIniFile.ValueBoolean: в режиме ifmWrite, всегда возвращалось False.

[-] Исправлена асм-версия функции SortData: сортировка была иногда некорректна (но без вываливаний в исключительную  ситуацию).

[-] Асм-версия метода TControl.WndProc исправлена на предмет обработки OnMessage для случая единственной формы (приложение без специального окна, представляющего кнопку приложения на панели задач). Большое спасибо Peter Feldbaumer и Alexey Shuvalov, сообщившим об этом баге. Так же, обе версии (включая Паскаль) поправлены так, чтобы в любом случае сообщение фильтровалось обработчиком Applet.OnMessage, затем его динамически обработчиками, а потом поступало форме, где так же сначало фильтровалось обработчиком OnMessage формы, после чего - динамически подключенными обработчиками (разумеется, обработка прекращается, когда один из фильтров возвращает True).

[+] Опубликована новая версия (2.0) приложения xHelpGen. Оно теперь полностью переведено в KOL и значительно усовершенствовано (в плане дополнительных настроек).

 

KOL 0.38 (2-Дек-00)

[+] Начат новый проект - KOL Mirror Classes Kit (Набор Зеркальных Классов для KOL). Публикуется сейчас в следующем состоянии: 5 зеркальных компонент готовы для регистрации их на Палитре Компонентов Delphi: TKOLProject, TKOLForm, TKOLApplet, TKOLButton, TKOLLabel. Это только схематическая модель, но она работает, и даже возможно назначить событие брошенному на форму зеркальному объекту (OnClick). Визуальная разработка формы, настройка свойств и написание кода могут быть выполнены в визуальной среде - в зеркальном проекте, и когда он запускается, генерируется "настоящий" KOL проект. Затем, он может быть открыт в IDE, оттранслирован и запущен (отлажен).
   KOL MCK будет публиковаться бесплатно, вместе с исходными текстами (в обмен, я надеюсь на Ваше участие в проекте - сообщайте, пожалуйста, о найденных багах, предлагайте идеи, помогайте с написанием кода...).

 

KOL 0.37 (26-Ноя-00)

[-] Asm-версия NewApplet исправлена (было: неверная подготовка команд minimize/restore системного меню). Так же, исправлен метод TControl.WndProc (asm-версия) в плане обработки команды SC_MINIMIZE.

[-] toolbar: метод TBAddButtons (asm-версия) поправлен для случая, когда при создании тулбара первый раз (NewToolbar) не создаются кнопки на нем.
[*] Добавлена опция tboTextBottom, и опция tboTextRight стала опцией по умолчанию (т.е., ее отсутствие игнорируется, и эта опция применяется всегда, кроме случаев, когда явно используется опция tboTextBottom при создании тулбара). Это изменение позволяет форсировать корректное задание размеров кнопок на тулбаре (Win9x), если для кнопок не используются текстовые метки.
[*] Еще одно небольшое изменение: теперь возможно передавать пустую строку в качестве метки для кноки при создании тулбара (раньше было необходимо передавать строку, содержащую один пробел. Прежний вариант работает так же).

[+] Добавлен метод Click в TControl. Для контролов, которые (подобно кнопке), распознают команду WM_COMMAND, генерируется такое сообщение с наиболее подходящим кодом команды. Для прочих, нажатие симулируется посылкой пары сообщений WM_LBUTTONDOWN / WM_LBUTTONUP.
[*] Метод SetRadioChecked переименован в SetRadioCheckedOld, и другой метод с именем SetRadioChecked заменил его. В действительности, он обращается к новому методу Click, и это работает даже если контрол (еще) невидим (возможно, вместе с формой).

[+] Оконные утилиты портированы из XCL с небольшими изменениями: FindWindowByThreadID, GetDesktopRect, WindowsShutdown. Добавлены новые функции: GetWindowChild( { wcActive, wcFocus, wcCapture, wcMenuOwner, wcMoveSize, wcCaret } ), GetFocusedChild, Stroke2Window, Stroke2WindowEx.

[+] Добавлено свойство AlphaBlend (0..255) к TControl, которое позволяет сделать контрол или форму полу-прозрачной (в Win2K).

[*] Свойство CanResize выполнено иначе. Теперь, если False, изменение размеров предотвращается путем мониторинга сообщения WM_GETMINMAXINFO в динамически присоединенной процедуре. Таким образом, успешно игнорируются любые попытки изменить размер окна (Присваивайте False свойству CanResize формы/контрола только после того, как ее размеры окончательно определены).

[+] Открыта секция Приложения на сайте KOL, содержащая приложения, разработанные с использованием библиотеки KOL. Если у Вас есть что-либо полезное, сообщите мне, и я добавлю ссылку на Ваш сайт (или на download, помещение архивов непосредственно на страницу KOL так же возможно).

 

KOL 0.36 (19-Ноя-00)

[+] Добавлено свойство FontWidth к объекту TGraphicTool, имплементирующему объект шрифта. Позволяет масштабировать шрифт непропорционально, вытягивая его в заданном направлении.

[-] Функции ExtractFilePath, ExtractFileName, ExtractFileExt, ExtractFileNameWOExt поправлены для случаев, когда в заданном пути имеется только имя файла, или путь содержит только имя диска с двоеточием (например, 'AAA.TXT', 'C:AAA.TXT' ).

[+] Добавлен невизуальный объект TTree (для организации данных в памяти в дерево-подобных структурах).

[-] Исправлена ассемблерная версия метода TDirList.ScanDirectory (всегда сканировалась текущая директория вместо заданной).

[-] Исправлена asm-версия функции IndexOfCharsMin (результатом была не первая, а последняя позиция с заданным символом).

[-] Исправлены asm-версии функций LowerCase и UpperCase ('Z' не конвертировалось в 'z').

 

KOL 0.35 (14-Ноя-00)

[-] Некоторые исправления для TBitmap (asm-версия методов GetCanvas и FormatChanged).

[-] Объект TIcon протестирован (до сих пор не тестировался, просто был портирован их XCL) и исправлены некоторые баги.

[-] Добавлены примечания к NewToolbar (как исправить некорректный размер кнопок под Windows9x в случае, когда все кноки тулбара не имеют текстовых меток).

[+] Свойство HasBorder теперь работает для контролов, не только для форм.

 

KOL 0.34 (29-Окт-00)

[-] Выполнены некоторые исправления с использованием свойств ImageList с tree view и list view. Теперь правильно распознаются imagelist-объекты с любым размером картинки. Так же решены проблемы с использованием overlay-изображений (добавлено свойство Overlay[1..15]: integer к объекту TImageList для указания того, какие изображения из списка использовать в качестве оверлейных).

[+] Добавлена пара функций для работы с текстом через буфер обмена: Text2Clipboard и Clipboard2Text.

[+] Добавлено свойство AutoRecreate в объект TTrayIcon. Если установлено в true, оно обеспечивает ре-активацию иконок в трее в случае рестарта эксплорера.

[-] Asm-версия splitter-контрола исправлена.
[-] Выравнивание (Align) исправлено для (первоначально) невидимых контролов.

[+] Еще один "прозрачный" метод добавлен - Size( w, h ) для упрощения процедуры первоначальной настройки визуальных элементов формы. Новый метод похож по смыслу на имевшийся SetSize, но специально предназначен для случая выровненных контролов: он обеспечивает достижение нужного размера и при необходимости корректирует размеры родительских контролов (рекурсивно, если требуется).

[+] Добавлено свойство ToBeVisible. Возвращает True, если контрол Visible или создан "невидимым", но станет видимым вместе с показом временно невидимой родительской формы.

[a] Остаток базовых оконных процедур перекомпилирован в basm, так что минимальный размер исполнимой программы, содержащей единственную пустую форму, теперь составляет 13K (см. TestKOL.dpr). И после удаления таблицы смещений и сжатия компрессором, такая программа занимает всего 8K.

 

KOL 0.33 (22-Окт-00)

[*] Сильно извиняюсь, но в процессе перевода WndProcKeybd на BASM, я решил изменить тип TOnChar и добавить параметр Shift, который передает обработчику состояние клавиш Shift/Control/Alt так же, как и в событии TOnKey. Данное изменение может потребовать изменений в коде существующих проектов, если они используют событие OnChar). Пусть нас утешит то обстоятельство, что благодаря этому изменению, код процедуры WndProcKeybd в asm-версии уменьшился на168 байт.

[-] Исправлены ассемблерные версии для NewForm, NewPaintBox, NewWordWrapLabel и ApplyImageLists2ListView (последняя приводила к неправильной работе некоторых  NewListView с overlay-image list-ом).

[+] Добавлен контрол: NewTabControl( aParent, aTabs[ ], aOptions, aImgList, aImgIdx1st ): PControl. Он позволяет разместить дочерние элементы на своих страницах - Pages[ ], только одна из которых видима во время работы, и переключаться между страницами с помощью закладок.

[+] Еще один контрол добавлен: NewTreeView( aParent, aOptions, aImgListNormal, aImgListState ): PControl.

 

KOL 0.32 (15-Окт-00)

[+] Добавлено событие OnTestMouseOver (позволяет более гибко управлять событием попадания мыши в контрол - ухода мыши с контрола - особенно полезно для имитации непрямоугольной кнопки BitBtn).

[-] ShowModal (метод TControl) исправлен (если модальная форма закрывается обычной кнопкой, теперь ModalResult устанавливается в -1 и форма не уничтожается сама). Спасибо to Michael A. Sewell for this bug report.

[-] RichEdit: RE_SearchText исправлен. Добавлен параметр ScanForward. Спасибо   to Michael A. Sewell for this bug report.

[-] Combobox: Табулирование из/в комбобокс исправлено снова (было неправильно, если опция coReadOnly не задавалась при создании).

[a] Больша'я часть кода переведена в BASM и оптимизирована.

К сожалению, я вынужден временно прекратить рассылку новостей из-за некоторых проблем с этим сервисом (почта не доставляется регулярно до более 10% получателей, вместо этого я получаю около 70 писем с сообщением о невозможности доставить почту). Тем не менее, вы все еще можете подписаться на будущее. Извиняюсь за неудобства. По крайней мере, обещаю в дальнейшем выполнять обновление в выходные. Так что Вы можете смотреть, что есть новенького на сайте, каждый понедельник-вторник.

 

KOL 0.31 (8-Oct-00)

[!] Открыт Форум, посвященный KOL. Спасибо Эрику Нордлунду, который сделал его для нас.

[-] ListView исправлен для StateImageIndex и OverlayImageIndex (методы LVInsert, LVAdd объекта TControl). Так же исправлен стиль lvsDetailNoHeader для ListView. Спасибо Mike Talcott за баг-репорт и советы по исправлению.

[-] RichEdit: присваивание булевых значений свойствам RE_FmtBold, RE_FmtItalic и т.п. поправлено. Asm-версия метода SetSelLength так же иправлена.

[*+] Метод Add несколько развит и теперь может использоваться для Edit-контролов. Для RichEdit-контрола, необходимо хотя бы раз обратиться к свойству RE_Text для того, чтобы в последующем обеспечивалось добавление rtf-текста с помощью метода Add.

[+] Добавлен еще один визуальный контрольный объект: NewBitBtn( aParent, aCaption, aOptions: [ bboImageList, bboNoBorder, bboNoCaption, bboFixed ], aLayout: { glyphLeft, glyphTop, glyphRight, glyphBottom, glyphOver }, GlyphBmp_or_ImageList, GlyphCount__or__ImgIdx_and_GlyphCount_shl16 ): PControl с дополнительными свойствами Flat, RepeatInterval. Эта разновидность кнопки понимает изменение свойств Font, Color и может быть полностью прозрачной (Transparent). Так же, она может отображать до 5 изображений в соответствии с состоянием кнопки (glyphs, хранятся в bitmap-рисунке или объекте imagelist).

[+] Добавлен "прозрачный" метод LikeSpeedButton, позволяющий кнопке (обычной или BitBtn) реагировать только на нажатие мышью и не становиться в фокус, подобно TSpeedButton в VCL.

[+] Добавлены события OnMouseEnter / OnMouseLeave и свойство MouseInControl (TControl).

[-*+] Последнее заявление об устранении всех неприятностей с прозрачным edit-контролом оказалось несколько неверным. Теперь добавлено специальное свойство  Ed_Transparent, которое решает указанную проблему (однако оно должно быть присвоено True в проекте для каждого edit-контрола, которому требуется прозрачность при редактировании, изменении выделения с использованием мыши или клавиатуры).

[*] Сделаны замечания по поводу того, какие действия необходимы для получения вертикально ориентированного toolbar-контрола.

 

KOL 0.30 (1-Окт-00)

[-] TTrayIcon поправлен: теперь иконка удаляется из трея автоматически, только если окно-владелец получает сообщение WM_CLOSE или WM_NCDESTROY (раньше хэндл окна не проверялся, и все иконки деактивировались по закрытию любой формы). Спасибо Вадиму Петрову за bug report.

[-*] Tabulate и TabulateEx исправлены. Теперь оба сообщенияWM_KEYDOWN и WM_KEYUP анализируются, их отя сама табуляция происходит толкько при обработке  WM_KEYUP, нежелательная обработка управляющих клавиш предотвращается в обоих случаях (тем не менее обработчик OnKey... вызывается, если назначен). В результате, например, нажатие стрелки вверх в однострочном edit-control-е, приводит только к табуляции на предыдущий контрол, и без изменения текущей позиции в самом edit-боксе.
   Так же: TabulateEx использует теперь реальные (экранные) координаты окон, так что smart (умная) табуляция стала более корректной.

[-] TOpenSaveDialog исправлен для непустого DefExtention (asm версия). Спасибо Ferenc Lutischan (из Венгрии) за bug report.

[-] Событие OnMessage исправлено для форм и контролов и теперь вызывается не только для главного окна и окна апплета. Спасибо Carlo Kok (Голландия) за report о несоответствии поведения с документацией.

[-] TControl.GetCaption (asm-версия) поправлена для случая, когда заголовок пуст. Спасибо Erik Nordlund за этот bug report.

[-] Изображение LabelEffect поверх GradientPanel исправлено (изменена оконная процедура для LabelEffect). Так же, DoubleBuffered для формы исправлен (и поправлены все аналогичные участки кода, которые потенциально могли вызвать ошибки). И, поправлен Transparent для Editbox (теперь возможно без проблем редактировать прозрачный editbox, лежащий поверх градиентной панели).

[-] MemoryStream: SetPosition иправлен (и возвращает теперь новую позицию, как и  FileStream).

[a] Код Statusbar-а переведен в BASM.
Остатки graphics.inc (TCanvas, TGraphicTool) так же переведены в BASM.
Все методы, помеченные __!, снова переведены в BASM (asm-версии для некоторых методов были временно закомментированы после добавления RichEdit).
Большая часть методов в streams.inc и функций в fileutils.inc так же переведены на ассемблер.

KOL_INC:

[-] В graphics.inc, asm-версия TGraphicTool.MakeFontHandle исправлена (обеспечено присваивание значения свойству FontWeight).

  Некоторые серьезные изменения произошли в inc-файлах, так что с версией 0.30 необходимо загрузить оба архива kol_inc.zip и kol.zip.

 

KOL 0.28 (24-Сен-00), KOL 0.29 (27-Сен-00)

[-] Несколько исправлений для Toolbar control-а:

  • Для выравнивания toolbar-а по верхнему краю родителя надо передавать в качестве параметра aAlign функции NewToolbar значение caNone, а затем устанавливать свойство Align в нужное значение, например, caTop. Так необходимо поступать в случае наличия на том же родительском окне других выровненных с помощью свойства Align визуальных объектов.
  • Щелчок мыши (правой или левой кнопкой, на кнопке, выпадающей кнопке или на свободной части тулбара) теперь распознается правильно (и даже с уменьшением задействованного кода).
  • Если тултипы не установлены для кнопок тулбара, ошибка (Access Violation) более не возникает.

[*] Исправления и изменения для Listview control-а:

  • {-} Исправлено использование иконок из image list-а для list view (lvsIcon, lvsSmallIcon стили просмотра).
  • {+} Добавлено свойство LVItemImageIndex[ ].

прочее:

  • {-} Исправлены стили выравнивания текста taCenter и taRight (кнопки, метки и пр.)

Если Вы уже загружали версию 0.27 или 0.28, достаточно получить новую версию  kol.zip (kol_inc.zip не изменялся).

 

KOL 0.27 (23-Сен-00)

[-] Исправлен показатель CPU Usage (загрузка процессора), отображаемая менеджером задач Windows (было всегда 100% - добавлен вызов WaitMessage в цикл обработки сообщений для исправления этого).

[*] Большая часть статических вызовов (по указателю) расширений оконных процедур заменена динамическими обработчиками. Это делает код меньше и несколько быстрее, существенно увеличивая гибкость (в плане программирования новых расширителей, хотя никаких изменений в программном интерфейсе объектов не произошло, соответственно не требуется никаких изменений в коде существующих проектов).
  Например, немедленно добавлено событие OnResize для всех контролов (TControl), и без какого-либо добавления кода в исполнимую программу (если обработчик не присвоен событию).

[*] RichEdit:

  • {-} Для версий Windows, имеющих различные установленные dll, NewRichEdit теперь в первую очередь пытается загрузить RICHED20.DLL (класс 'RichEdit20A'), затем RICHED32.DLL и RICHED.DLL (класс 'RichEdit'). Так же добален "конструктор" NewRichEdit1 для работы только с версией RichEdit 1.0. Данное изменение исправляет неправильное функционирование при отсутствии более новых dll.
  • {-} Исправлено появление scrollbar-ов при изменении размеров окна RichEdit.
  • {-} Исправлено событие OnSelChange для RichEdit.
  • {+} Теперь для изменения атрибутов форматирования используются структуры TCharFormat2 и TParaFormat2 (кроме случая, когда работа идет с RichEdit v1.0).
  • {+} Для метода RE_FmtStandard (который расширяет обработку клавиатуры, добавляя к пользовательскому интерфейсу клавиши CTRL+B - bold, CTRL+I - italic, и т.п.), CTRL+SHIFT+Z выполняет теперь операцию RE_Redo (CTRL+Z - undo - обеспечивается самим RichEdit-контролом).
  • {+} Добавлена поддержка других клавиш форматирования (метод RE_FmtStandard), таких как CTRL+L (выравнивание влево), CTRL+E (выравнивание по центру), CTRL+R (выравнивание вправо), CTRL+J (выравнивание по краям - новое), хотя эти клавиши и работают автоматически в новых версиях RichEdit.
  • {+} CTRL+SHIFT+U расширяет CTRL+U (подчеркивание - в RE_FmtStandard) возможностью переключения различных стилей подчеркивания для RichEdit2.0 и выше (dotted -> double -> words -> single ->...), хотя некоторые из видов подчеркивания отображаются неправильно (так же как и большинство новых возможностей RichEdit2.0/3.0).
  • {+} Введены новые свойстваRE_NumStyle, RE_NumBrackets, RE_NumStart, RE_NumTab, позволяющие использовать дополнительные стили нумерации (цифры, буквы, римские цифры, скобки). Так же к списку авто-клавиш добавлены CTRL+N и CTRL+SHIFT+N (метод RE_FmtStandard), позволяющие использовать нумерацию при вводе текста пользователем.
  • {+} Новые свойства RE_SpaceBefore, RE_SpaceAfter, RE_LineSpacing, RE_SpacingRule и соответствующие им RE_SpaceBeforeValid, RE_SpaceAfterValid, RE_LineSpacingValid - для форматирования параграфов.
  • {+} Добавлено событие OnProgress (для загрузки и сохранения содержимого RichEdit из / в поток, файл или строку ansi).
  • {+} Добавлены событие OnRE_InsOvrMode_Change, свойства RE_OverwriteMode, RE_DisableOverwriteChange - для мониторинга переключения режимов insert/overwrite.
  • {+} Добавлено свойство RE_Transparent - для реализации прозрачного RichEdit (обычное свойство Transparent не действует для него, так же как и свойство DoubleBuffered - так сделан RichEdit). Новая прозрачность смотрится замечательно, но наблюдаются большие флики (мелькания) при изменении размеров (хотя флики скроллирования удалось устранить полностью).
  • {+} Добавлены события OnRE_OverURL, OnRE_URLClick и строковое свойство RE_URL - для работы с URL-ссылками.
  • {+} Добавлено свойство RE_CharFmtArea ( raSelection, raWord, raAll ) для модификации области форматирования (свойства RE_Fmt..., RE_Font... и RE_CharFormat).
  • {+} Все виды курсоров, обеспечиваемые RichEdit-ом, теперь работают без проблем.
  • В настоящий момент, большая часть запланированных возможностей RichEdit реализована. И если Вы чувствуете, что чего-то не хватает, дайте мне знать.

[-] Исправлена функция StrIsStartingFrom (спасибо Marco Bobba - Marisa Bo).

[*] Начиная с данного выпуска, архив KOL поделен на два: kol.zip, содержащий kol.pas и исходники (dpr) примеров, и kol_inc.zip со всем остальным, включая .inc-files, требуемые для установки KOL. Второй архив содержит наименее изменяемые части, так что новые версии этой части будут появляться значительно реже (Я буду сообщать о необходимости загрузки новой версии kol_inc.zip особо).

 

KOL 0.26 (15-Sep-00)

[+] Добавлен rich edit control: NewRichEdit( Parent, Options ): PControl. По крайней мере, в первом приближении, он готов к использованию. Расширенные стили (такие как "justify" - выравнивание текста по ширине, дополнительные опции нумерации, таблицы и пр.) будут добавлены позже.

[+] Свойство Selection(: String) для Edit и RichEdit.

[+] Свойство TControl.TabOrder - подобно такому же в VCL (но код добавляется, только если TabOrder изменяется).

[+] Свойство TControl.Focused для TControl.

[+] Метод TControl.SelectAll (для edit, rich edit)

[+] Функция File2Str( F ): String

[-] Исправлен стиль выравнивания для list view(метод LVColAdd).

[-] Исправлена asm-версия TControl.GetClientHeight.

 

StrDB unit (13-Sep-00)

[+] Дополнительный модуль StrDB.pas (автор Mike Talcott). Содержит объект TStrTable, инкапсулирующий простую таблицу базы данных с фиксированными (поименованными) полями. Созданная таблица может быть доступна из MS Access (текстовый файл из записей с полями фиксированного размера - с некоторыми небольшими ограничениями).
   StrDB.zip доступен для загрузки как отдельный архив, с комментариями автора (имеется мой перевод на русский) и небольшим демо-приложением.

 

KOL 0.25 (13-Сен-00)

[+] Свойство Align добавлено в TControl. Теперь возможно выравнивать визуальные объекты привычным для Delphi свойством (стили coLeft, coTop, и т.п.) Для упрощения начального присваивания значения свойству Align, определена функция SetAlign( aAlign ): PControl, возвращающая указатель на сам объект (т.е. этот метод является "прозрачным" и может вызываться в том же операторе языка Паскаль, в котором объект создается - см. демо TestKOL4).

[+] Добавлен еще один визуальный объект - splitter (разделитель), очень похожий на TSplitter в VCL.

[-+] Исправлено свойство DoubleBuffered. Transparent и DoubleBuffered усовершенствованы значительно.

[+] Добавлен метод PreventResizeFlicks. Будучи вызван для формы (или визуального контрола, или объекта Applet), подавляет большую часть мельканий изображения при изменении размера формы/контрола. Особенно эффективно в сочетании с DoubleBuffered=True и в отношении к визуальным объектам, имеющих выровненные с помощью Align дочерние контролы.


[+] Несколько функций для проигрывания WAVE-звуков из ресурсов, памяти, стандартных звуковых событий или файлов:

  • PlaySoundMemory( Memory: Pointer; Options:set of [ poLoop, poWait, poNoStopAnotherSound, poNotImportant ] )
  • PlaySoundResourceID( Inst, ResID: Integer; Options )
  • PlaySoundResourceName( Inst: Integer; const ResName: String; Options )
  • PlaySoundEvent( const EventName: String; Options )
  • PlaySoundFile( const FileName: String )
  • PlaySoundStop

[+] Две дополнительные функции для регулировки уровня звука для wave output:

  • function WaveOutChannels( DevID: Integer ): set of [chLeft, chRight];
  • function WaveOutVolume( DevID; Channel: {chLeft, chRight}; NewValue ): Integer

[+] TMediaPlayer переведен вBASM. Добавлено еще несколько методов и свойств для управления скоростью, звуком и изображением проигрываемого файла.

[-] Исправлено: Combobox с опущенной опцией coReadOnly. В этом режиме, теперь нормально обрабатываются клавиши "Escape" и "Enter". Табуляция из комбобокса теперь работает правильно и безшумно.

[*] Курсор IDC_IBeam обеспечивается для "edit"-контрола автоматически.

[+] Метод AddDirList, изначально задуманный для "listbox"-а, работает теперь так же и для "Combobox"-а.

[-] Исправлен метод CenterOnParent (TControl, asm-версия). Спавсибо Y.X.B. за "report".

[-] Исправлено: нажатие клавиши Tab в "edit"-контролах теперь только перемещает фокус в следующий контрол. Но если при создании редактирующего объекта использована (новая) опция eoWantTab, эта клавиша теперь вставляет символ табуляции в текст.

[-] Исправлены: ExtractFileName, ExtractFilePath, ExtractFilaNameWOExt, ExtractFileExt. Спасибо Y.X.B. за "report".

[*] Все попытки обеспечить совместимость с Delphi2 оказались неуспешны. Отныне поддерживаются только Delphi3, Delphi4 и Delphi5. Текущая версия тестировалась в Win95, Win98, WinNT4SP5, Win2000.

 

KOL 0.24 (05-Сен-00)

[-] Исправлен TBitmap (в основном ASM-версия, и формат pf16bit).

[-] Исправлен: стиль fsBold для свойства Font (asm-версия).

[-] Исправлены: свойство DoubleBuffered временно заглушено из-за проблем его использования в Win9x. При этом LabelEffect немного подправлен для обеспечения корректной работы без двойной буферизации (но возможно некоторое мелькание при переотображении). Теперь GradientPanel и GradientPanelEx работают правильно под Win9x (небольшой баг в асм-версии GradientPanelEx устранен - для обеспечения корректной работы без DoubleBuffered).

[+] Новый объект TMediaPlayer (невизуальный). Хотя и более компактный, чем аналогичный в VCL, фактически даже более мощный по своим возможностям. Проверен для WAV, MID, RMI, AVI (включая AVI со звуком), CD audio tracks, MP3 звуковые файлы (под Win2000), MPG (video и sound - под Win2000).

[+] Несколько функций для упрощения работы с реестром:

  • RegKeyOpen( BaseKey:HKey, SubKey: String ): HKey
  • RegKeyGetDw( Key: HKey; ValueName: String ): DWORD
  • RegKeyGetStr( Key: HKey; ValueName: String ): String
  • RegKeySetDw( Key: HKey; ValueName: String; Value: DWORD ): Boolean
  • RegKeySetStr( Key: HKey; ValueName: String; Value: String ): Boolean
  • RegKeyClose( Key: HKey )

 

KOL 0.23 (30-Авг-00)

[+] TBitmap закончен полностью. Добавлен еще один конструктор NewDIBBitmap( width, height, pixelformat ): PBitmap, методы RotateRight и RotateLeft (и отдельно для каждого формата) - для поворота картинки на 90 градусов вправо и влево, свойства DIBPixels[ ] и Pixels[ ] для прямого доступа к отдельным пикселам, методы CopyRect, FlipVertical, FlipHorizontal и другие.

[+] TIcon портирован из XCL (там он назывался ZIcon). Добавлено несколько методов для загрузки из ресурсов и из внешнего файла (exe, dll).

[-] Исправлена: asm-версия TControl.GetCanvas

[+] TBitmap переведен в BASM.

[+] Добавлена еще одна разновидность панели с градиентной закраской: NewGradientPanelEx( Color1, Color2, Style: (gsHorizontal, gsVertical, gsRectangle, gsElliptic), Layout: (glTopLeft, glTop, glTopRight, glLeft, glCenter, glRight, glBottomLeft, glBottom, glBottomRight) ): PControl. Идея использовать несколько различных стилей - by Vladimir Stojiljkovic, код так же подготовлен с его участием (спасибо за поддержку).

 

KOL 0.22 (19-Авг-00)

[*] TStrList значительно усовершенствован в плане работы с большими массивами строк и переведен в BASM. Так же оттестирован и исправлен в паре мест на предмет потенциальных багов..

[+] Добавлен объект TBitmap. Некоторые из методов еще не реализованы (см. исходники), но рисование bitmap'а, так же как и рисование на bitmap'е (через его Canvas) сделано. Обеспечена качественная поддержка формата DIB, включая изменение свойства PixelFormat и HandleType, а так же прямой доступ к пикселам через свойство ScanLine[ ] - подобно классу TBitmap в VCL. Загрузка/выгрузка картинки из/в файла или потока так же обеспечена. Прочие возможности ( масштабирование, прозрачность, повороты и пр.) будет реализовано позже.

 

KOL 0.21 (13-Авг-00) Sorry, что по-английски - переведу на днях.

[+] Обеспечена совместимость с Delphi2.

[-] Исправлена ошибка изменения субсвойств свойства Font объекта TControl.

[+] Добавлено свойство FontWeight для шрифта (объект TGraphicTool).

[+] Портирован TThread из XCL, и теперь он использует только вызовы API функций. Так же добавлен метод Synchronize.

[+] Портирован объект TDirChange из XCL (оригинальный ZFileChange, by Tim Slusher). И теперь прекрасно работает в Windows9x тоже (с WatchSubtree = True).

[-] Исправлены функции AnsiCompareStrNoCase, _AnsiCompareStrNoCase (неправильно работали в Windows9x). Соответственно, TDirList.Sort теперь работает правильно в Win9x.

[+] Добавлен: метод TControl.AddDirList( filemask, attrs ) специально для добавления списка файлов, дисков, директорий в list box (фактически передает одно сообщение окну списка).

[+] Добавлен: метод TControl.ShowModal.

[-] Исправлено: работа с акселераторами текущей формы, когда используется окно, представляющее кнопку приложения на панели задач.

[-] Исправлено: asm-версия обработки сообщений мыши. (И немного уменьшена).

[+-] Все (почти) методы объекта TStrList переведены в BASM. Fixed: освобождение памяти в деструкторе. Improved: работа с большими списками строк намного быстрее.

[+] Для OnClick в toolbar'е, теперь возможно узнать, был ли щелчок сделан правой кнопкой мыши (property RightClick).

[-] Небольшое исправление в xHelpGen (выделение цветом зарезервированного слова 'then'). Добавлены комментарии об объекте TIniFile и некоторых других.

 

KOL 0.20 (8-Авг-00)

[-] Исправлен TStrList.SaveToFile. (Добавлен вызов SetEndOfFile для обеспечения установки нового конца файла). Так же, метод Write изменен подобным образом для 'WriteFileStream'. Сделаны комментарии относительно 'ReadWriteFileStream' о том, что необходимо самому позаботиться об установке свойства Size для обеспечения сокращения размера файла, если это необходимо.

[+] Метод Clear добавлен в TControl для обеспечения различных для каждого визуального объекта действий, связанных с этим словом. Например, для простых контролов типа label, button, и т.п. просто присваивается пустая строка свойству Caption (=Text), для агрегатных объектов типа listbox, listview, toolbar происходит удаление всех элементов (строк, кнопок и т.д.)

[+] Внесены некоторые улучшения в toolbar:

  • Добавлено свойство (Read/write) TBButtonImage[ BtnID ], позволяющее легко менять индекс картинки для кнопки.
  • Добавлено свойство TBButtonWidth[ BtnID ]. При его изменении, кнопка теряет способность менять свою ширину автоматически (теперь все кнопки изначально создаются со стилем TBSTYLE_AUTOSIZE).
  • Свойство TBButtonText[ BtnID ] перестало быть "только для чтения", т.е. его можно легко изменить.
  • Если toolbar создан со стилем выравнивания caNone, то он не изменяет свои размеры автоматически, и не является выровненным (т.е. можно изменять его положение и размеры на форме используя обычные свойства Left, Top, Width и т.п.)
  • Добавлена опция tboNoDivider.
  • Функция TBButtonAtPos возвращает теперь command ID = 0 для всех сеператоров, в то время как новый метод TBBtnIdxAtPos возвращает действительный индекс кнопки на тулбаре, в том числе для сепаратора.
  • Добавлена процедура TBDeleteBtnByIdx( Idx ), позволяющая удалять в том числе кнопки-сепараторы, не имеющие command ID (то есть, их нельзя было удалить прежней процедурой TBDeleteButton( BtnID ) ).
  • Все относящиеся к toolbar'у методы оптимизированы и переведены в basm, с экономией нескольких сотен байтов.

[-] Исправлены комментарии о сепараторах в toolbar'е. Необходимо передавать в списке индексов картинок для кнопок в функции NewToolbar и в методе TBAddButtons любое число (например, 0) в позиции, соответствующей сепаратору, чтобы прочие кнопки получили верные индексы изображений.

[+] Приложение Help Generator (изначально созданное для XCL) адаптировано к KOL.
xHelpGen.exe version 1.5 в настоящий момент доступен для загрузки now. (Для тех читателей, которые не в курсе: запустите его в директории KOL, и он сгенерирует > 480К документации о KOL в формате html. Документация формируется автоматически на основе комментариев, размещенных в интерфейсной части модуля KOL.PAS, так что с каждой новой версией KOL, Вы постоянно будете обеспечены самой свежей и полной документацией.)

[+] Подправлены комментарии в KOL.pas для использования с аннонсированным выше Help Generator'ом.

 

KOL 0.19 (2-Авг-00)

[~] Во-первых, немного о прозрачности. Как несложно заметить, некоторые виды визуальных объектов не дружат с этим свойством. Вообще, невозможно обеспечить полную прозрачность для большинства контролов, не используя само-отрисовку. Что противоречит одной из основных идей KOL - использованию способности стандартных контрольных объектов отрисовывать себя самостоятельно, не вводя дополнительного кода. Так что, прозрачность будет поддерживаться и далее лишь для простейших элементов формы (метки, панели, чек-боксы, радио-боксы).

[+] Объект TOpenSaveDialog портирован из XCL, с парой изменений. В настоящее время он запоминает новый выбранный FilterIndex, если вызов Execute был успешным (диалог не отменялся пользователем). Также исправлено выделение памяти для режима osAllowMultiSelect. Все переведено на встроенный ассемблер (метод TOpenSaveDialog.Execute уменьшился на 474 байта).

[+] Объект TOpenDirDialog портирован из XCL, и с очень существенными дополнениями: теперь возможно изменить его свойство InitialPath. Так же возможно центрировать вызываемый диалог на экране (свойство CenterOnScreen: Boolean), устанавливать обработчик события OnSelChanged и в нем разрешать/запрещать кнопку OK и/или менять строку состояния, отображаемую в окне диалога - в ответ на выделение (пользователем) другой директории. Дополнительный код, требующийся для реализации этих возможностей, включается в исполнимую программу только в случае, когда свойства CenterOnScreen / OnSelChanged устанавливаются в проекте. Все (что нужно) также переведено на ассемблер.

[-] Исправлен небольшой (правда небольшой) баг в функции TMenu.ParentItem (приводил к вставке скрытого пункта меню в конец меню, а не на прежнее место - но никаких других последствий не было).

[+] Еще один "common control" добавлен в реализацию TControl - toolbar. Конструктор: NewToolbar( parent, align: { caLeft, caTop, caRight, caBottom }, options: set of [ tboTextRight, tboFlat, tboTransparent, tboWrapable ], Bitmap, Buttons: array of PChar; BtnImgIdxArray: array of Integer ): PControl;
Свойства, события, методы:
   procedure TBAddBitmap( Bitmap ),
   function TBInsertButtons( Idx2InsertBefore, Buttons: array of PChar, BtnImgIdxArray: array of integer): Integer
   function TBAddButtons( Buttons, BtnImgIdxArray ): Integer
   TBButtonCount (read-only),
   function TBItem2Index(Item),
   function TBIndex2Item(Idx),
   TBButtonEnabled[ Item ],
   TBButtonVisible[ Item ],
   TBButtonChecked[ Item ],
   TBButtonMarked[ Item ],
   TBButtonPressed[ Item ],
   TBButtonText[ Item ] (read-only),
   TBButtonRect[ Item ] (read-only),
   function TBButtonAtPos(X,Y): integer (returns Item)
   TBRows,
   TBSetTooltips( Item1st, Tooltips: array of PChar ),
   OnTBDropDown event (= OnDropDown event)
   OnTBClick event (= OnClick event ), in both events CurItem, CurIndex properties can be used to determine which button is clicked.
   Toolbar протестирован на очень широком множестве различных опций и режимов, см.  демо-проект TestKOL3.

[+] Добавлено событие OnDropDown (общее по смыслу для "combobox"-а и выпадающей кнопки в "toolbar"-е), и событие OnCloseUp  (для "combobox"-а).

[+] Добавлены свойства  ProgressColor и ProgressBkColor для визуального индикатора "прогресса", реализованного ранее в TControl. Добавлен так же конструктор NewProgressbarEx( parent, options: set of [ pboVertical, pboSmooth ] ): PControl, который позволяет создавать "градусник" (progressbar) с двумя дополнительными стилями - вертикальный, и сплошной ("без кирпичиков").

[-] Исправлен баг с присваиванием значения (строки) свойству ListView.Items[ ] в случае колонки > 0 в версиях Windows < 2000.

[-] Добавлена инициализация TObj.fRefCount для Delphi3 (само не делалось, в результате проект, откомпилированный Delphi3 в случае наличия List view на форме не мог нормально завершиться - до бесконечности пытался вызвать Free для несуществующего Image list).

 

KOL 0.18 (21-Июл-00)

[*] TMenu переведен в BASM (стал ~1,5K меньше) и перемещен в Menus.inc.

[+] TImageList портирован из XCL (из класса XImageList).

[+] Еще один "common control" имплементирован: list view. Он может (частично) возместить отсутствие grid контролов в режиме lvsDetail (по крайней мере очень похоже на StringGrid, вот только нельзя выбирать отдельные ячейки).
   Конструктор: NewListView( parent, style:{ lvsIcon, lvsSmallIcon, lsvList, lvsDetail, lvsDetailNoHeader}, options: set of [ lvoIconLeft, lvoAutoArrange, lvoButton, lvoEditLabel, lvoNoLabelWrap, lvoNoScroll, lvoNoSortHeader, lvoHideSel, lvoMultiselect, lvoSortAscending,lvoSortDescending, lvoGridLines, lvoSubItemImages, lvoCheckBoxes, lvoTrackSelect, lvoHeaderDragDrop, lvoRowSelect, lvoOneClickActivate, lvoTwoClickActivate, lvoFlatsb, lvoRegional, lvoInfoTip, lvoUnderlineHot, lvoMultiWorkares ]; ImageListSmall, ImageListBig, ImageListState: PImageList ): PControl
   Следующие свойства и методы, специфичные для list view, добавлены вTControl:
   ImageListSmall, ImageListBig, ImageListState: PImageList
   LVStyle: { lvsIcon, lvsSmallIcon, lsvList, lvsDetail, lvsDetailNoHeader}
   LVOptions: ... see above
   LVTextColor, LVTextBkColor, LVBkColor: TColor
   LVColCount (read only), LVCount (=Count)
   procedure LVColAdd( text, align, width )
   procedure LVColInsert( idx, text, align, width )
   procedure LVColDelete( idx )
   procedure LVAdd( text, imgidx, state, stateimg, overlayimg, data )
   procedure LVInsert( row, imgidx, state, stateimg, overlayimg, data )
   procedure LVSetItem( row, col, imgidx, state, stateimg, overlayimg, data )
   LVItems[ Row, Col ]: string
   OnEndEditLVItem: function( Sender, Row, Col, NewText ): boolean
и др.

[*] Введен метод Perform( msgcode, wParam, lParam ) в TControl. Вызовы SendMessage повсюду, где можно, замещены на вызовы Perform.
   Директива index использована для объединения некоторых внутренних методов, обслуживающих свойства.
   Методы Tabulate и TabulateEx переведены в BASM. Теперь Tabulate стал очень "легким" - всего  270 байтов (в случае использования).
   Некоторые другие модификации и оптимизации улучшили ассемблерную версию кода еще более. До 1,5K экономии всего.

 

KOL 0.17 (15-Июл-00)

[-] Работа с анти-фильтрами (^filemask) исправлена в TDirList (NewDirListEx).
[*] TDirList оттранслирован в Basm и перемещен в fileutils.inc

[*] SortData переведена в BASM. 272 байта меньше и... кажется все еще работает. :-)

[+] Добавлен ProgressBar в TControl. Конструктор: NewProgressbar( parent ): PControl. Два специальных свойства: Progress и MaxProgress.

[+] Добавлен StatusBar в TControl - не не как отдельный объект (хотя специальный объект внутренним образом для него все-таки создается), а через свойства и методы объекта, представляющего форму, как то:
   property StatusText[ Idx ]: PChar
   property SimpleStatusText: PChar
   procedure RemoveStatus
   function StatusPanelCount: Integer
   property StatusPanelRightX[ Idx ]: Integer
   property StatusWindow: HWND (read only)
Тем не менее, никакой код к реализации формы не добавляется без того, чтобы не были использованы в программе какие-либо перечисленные выше методы и свойства.
   Дополнительно: StatusBar не включается в клиентскую часть формы, и форма при его добавлении/удалении аккуратно меняет свой размер. См. так же комментарии в исходниках - там все достаточно подробно.

[+] Новая разновидность визуального объекта на базе TControl:  - панель с градиентным заполнениемl. Конструктор: NewGradientPanel( Parent; Color1, Color2 ): PControl. (А так же добавлены два специальных свойства в объект TControl, используемые только этой его разновидностью: Color1 и Color2). Выглядит особенно хорошо, когда новое свойство TControl.Transparent выставлено в True для этого объекта (и тем самым для его дочерних объектов, поскольку это свойство наследуется ими в момент создания). Свойство Transparent использует так же DoubleBuffered отрисовку, введенную ранее. Данные возможности протестирваны во всех доступных (автору) версиях Windows (95, 98, NT, 2K). DoubleBuffered улучшено - оно предотвращает так же некоторые виды мельканий в статических контролах.

[-] Функция Num2Bytes исправлена для Delphi3 ("спасибо" фирме Inprise Inc. за улучшение функции  _TRUNC function в D4,D5).

[+] Объект TMenu - портирован из XCL с существенными изменениями и дополнениями. Теперь он полностью совместим с Delphi3 (и прочие изменения в KOL так же проверены на предмет совместимости с Delphi3).
   Конструкторы: NewMenu( AParent: PControl; FirstCmd: Integer; Template: array of PChar; aOnMenuItem: procedure( Sender; Item ) of object ): PMenu
   NewMenuEx( AParent, FirstCmd, Template, aOnItems: array of TOnMenuItem ): PMenu
   Объект TMenu может выполнять роль главного меню или контекстного (выпадающего) взависимости от того, является ли его родителький объект формой и создан ли объект TMenu первым для этой формы.
   Шаблон меню Template организован так же, как в меню в XCL. Например: [ '&File', '(', '&New', '&Open', '&Save', 'Save &as...', '-', 'E&xit', ')', '&View', '(' ... ]. Однако радио-итемы (начинаются в определении с символов '+!' или '-!') и пункты, определенные с ведущим '+' и '-' отмечаются / разотмечаются автоматически если выбраны (мышкой, например). Дополнительный метод AutoPopup позволяет показывать popup-меню автоматически (когда родительское окно получает сообщение WM_CONTEXTMENU). Кроме того, возможно изменить другие характеристики, такие как битмап-образ (только для неотмеченных пунктов: ItemBitmap[ ]: HBitmap), текст пункта: (ItemText[ ]: string), состояние разрешения (ItemEnabled[ ]: boolean), быстрые сочетания клавиш (ItemAccelerator[ ]: TMenuAccelerator) и даже визуальность (реализована парой методов и симулирует ее удалением и восстановлением пунктов меню: ItemVisible[ ]: boolean) - все это используя обычные для объекта свойства.

 

Внимание: Следующие подписчики не были доступны при рассылке новостей во время последних трех обновлений (приводится только часть e-mail'а до '@'):
jayan, ka.zio, x, aatlikan, aimagh, flank, v4sdk, odbc, boris, teslyuk, Bvo, ozoom, tuankm, brasa1999, gt, paulo, mastak, oracle, ae, dirbmo, delphian, syunlee, domass, xevious, aimagh, Alex.Ko..., borny, lubo_m, ruandy, TomB..., leejhn, Volker.Po..., graemeha..., fordom, jayanck.
   Большинство адресов с почтовых серверов, которые позволяют анонимность (которая кажется теперь запрещениа на Bravenet) и возможно используют фильтр, не пропускающий рассылку с Bravenet. Пожалуйста, перерегистрируйтесь с нормальным адресом или укажите мне другой сервер рассылки (требования: бесплатный, по крайней мере 500 адресов в одном списке, быстрый - последнее требование не слишком важно).

KOL 0.16 (11-Июл-00)

[*] Группа методов ResizeParent... еще раз модифицирована. Теперь при первом вызове размер изменяется безксловно, при последующих - размер родительского окна может только увеличиваться. В итоге, отпала надобность предварительно выставлять заведомо маленький размер родительского окна.

[+] Добавлена поддержка  "геометрического" карандаша в объект TGraphicTool, имплементирующий GDI-инструменты (свойство GeometricPen: Boolean). Если геометрический карандаш не используется, никакой код не добавляется. Добавлены следующие свойства для настройки геометрического карандаша: PenBrushStyle:TBrushStyle, PenBrushBitmap:HBitmap, PenEndCap:{pecRound, pecSquare, pecFlat}, PenJoin:{pjBevel,pjMiter,pjRound}.

[+] Из XCL портирован объект TTrayIcon (С оптимизацией и переводом на ассемблер)

[+] Функции JustOne и JustOneNotify портированы из XCL с небольшими изменениями:
- добавлен параметр Wnd: PControl для связи с главным окном приложения и освобождения мьютекса по завершении приложения
- не требуется и не создается специальный объект для приема сообщений от других экземпляров программы (JustOneNotify), используются только обычные процедуры (все четыре оптимизированы и переведены на ассемблер)

[+] Еще несколько процедур из strutils.inc оптимизированы и переведены в ассемблер(Hex2Int, Int2Ths, Num2Bytes, Str2Int, TrimLeft, TrimRight, Trim, CopyTail, DeleteTail, IndexOfChar, IndexOfCharsMin, IndexOfStr, Parse, StrPCopy, StrEq, AnsiEq, StrIn, StrSatisfy).

[+] Процедура SortData портирована из XCL

[+] Объект TStrList для хранения строк мигрировал их XCL - с некоторыми изменениями.

[+] Объект TDirList портирован из XCL - для удобной работы с директориями

 

 

KOL 0.15 (7-Июл-00)

[*] ResizeParentRight и ResizeParentBottom (а так же ResizeParent) изменены так, чтобы делать изменение размера родителя только в сторону увеличения. Для небольших форм и контролов, установите начальный размер не очень большим(например, SetSize(100,20) для формы немедленно после создания).

[-] Устранен баг в свойстве CreateVisible. Для приложений, имеющих отдельное окно Applet с   установленным свойством Visible = False, формы нормально отображаются при входе в процедуру Run. Так же метод StayOnTop не создает окно, если оно еще не создано.

[*] Небольшое изменение в реализации LabelEffect: тень теперь вычисляется как среднее между цветом шрифта и черным, а не cl3DDkShadow.

[+] TCanvas еще более оптимизирован и полностью переведен на ассемблер, то же для TGraphicTool. И их реализация вынесена в graphics.inc.

[+] DoubleBuffered: рисование улучшено - теперь возможно использовать канву объекта и не создавать специальную временную канву для рисования в случае рисования через буфер. Единственная неприятность: если устанавливается свойство DoubleBuffered, включается дополнительно несколько методов от TCanvas независимо от того, используется ли в программе где-нибудь канва вообще.
   Соответственно упрощена (чуть-чуть) реализация label effect.

[-] OnMouse... события пофиксены для формы (вызов обработчика по указателю перенесен в общий WndProc из WndProcCtrl, но как и раньше, код добавляется только в случае назначения в программе своих обработчиков OnMouse... Так же, пофиксена, ассемблерная версия (отдельный баг) и немного улучшена.

 

KOL 0.14 (4-Июл-00)

[+] dynwndmsg.pas - больше нет такого модуля. Две процедуры отсюда перемещены в kol.pas (хотя и не используются).

[+] Процедуры работы с файлами и директориями портированы в KOL из XCL. Некоторые функции изменены, код оптимизирован и во многоих случаях переведен на ассемблер. Объявления помещены прямо в kol.pas, имплементация вынесена в FileUtils.inc.

[+] Процедуры для работы с датой и временем портированы из XCL. Напоминаю, что тип TDateTime в KOL/XCL отсчитывает время от 01-янв-0001 нашей эры, а не с 1-дек-1899, как в VCL. Имплементация размещена в файле DateUtils.inc.

[*] Процедуры MsgOK / MsgBox могут теперь работать без установки переменной Applet (т.е., вне процедуры Run). В таких случаях в заголовке высвечивается заголовок по умолчанию 'Error'. Данное изменение привело к увеличению кода на 4 байта.

[+] Потоки имплементированы в KOL (иначе, чем в XCL). Оба основных типа потоков - memory stream и file stream инкапсулированы в одном объектном типе TStream. Вместо виртуальных методов, применена техника указателей на функции, заполняемых в "конструкторах":

  • NewMemoryStream: PStream
  • NewReadFileStream( filename: string ): PStream
  • NewWriteFileStream( filename ): PStream
  • NewReadWriteFileStream( filename ): PStream

     Так же добавлены две полезные глобальные функции: Stream2Stream (оптимизирован для случаев, когда источник и / или приемник является потоком в памяти) и Resource2Stream.

[+] Введен объектный тип TIniFile. Выполнен с использованием API-функций Get/WritePrivateProfile.... Сделан иначе, чем в XCL. Вместо передачи значения как var параметра, процедуры преобразованы в функции, и дополнительный параметр Value играет роль значения по умолчанию при чтении, либо записываемого значения - при записи. Тогда как в XCL приходилось выполнять двустороннюю передачу через промежуточную переменную.
   "Конструктор": OpenIniFile( filepath ): PIniFile. Основные методы: ValueInteger, ValueString, ValueBoolean и ValueData.

[+] Свойства TextAlign и VerticalAlign добавлены к TControl. TextAlign применим к кнопкам, меткам, панелям и окнам ввода, тогда как VerticalAlign - только к кнопкам (и еще к LabelEffect - см. ниже)

[+] Добавлен конструктор NewPaintbox, создающий аналог TPaintbox из VCL. Так же добавлено событие TControl.OnPaint( sender, dc ), приложимое только к нему. Можно в обработчике OnPaint использовать полученный DC для рисования с использованием только низкоуровневой API графики, или воспользоваться свойством Canvas объекта.

[+] Объект TCanvas портирован из XCL, но с некоторыми существенными улучшениями. Во-первых, он теперь не создает себе шрифт, кисточку, карандаш, пока соответствующие свойства не будут использованы в программе. Что позволяет уменьшить размер кода. Во-вторых, проведена большая работа по оптимизации методов и трансляции большей их части во встроенный ассемблер. В результате, использование "полотна" увеличивает размер программы всего на 1,5-2,5K. Введен специальный конструктор NewCanvas( DC: HDC ): PCanvas - для упрощения рисования в битмап в памяти.

[+] Добавлена поддержка вращающихся шрифтов подобная XCL (но в любом случае, требуется применение специального визуального объекта, который сам рисует свой текст - см. LabelEffect). Процедура, обеспечивающая вычисление области отрисовки повернутого текста, включается в код конечной программы только при модификации свойства Orientation для объекта шрифта - в канве или в визуальном объекте.

[+] Добавлена специальная метка:  NewLabelEffect( AParent, Caption, ShadowDeep:SmallInt ): PControl - создает метку, которая умеет изображаться 3-мерной (с тенью), поддерживает повернутый на заданный угол текст и свойство VerticalAlign (но не может переносить свой тест по словам). Выглядит замечательно, потребляет 1,5-2K дополнительного кода, и... очень мелькает при перерисовке (см. ниже - о двойной буферизации).

[+] Добавлено свойство DoubleBuffered: Boolean. После присваивания True это значение унаследуется всеми дочерними визуальными объектами. Позволяет объекту перерисовываться с меньшим мельканием при перерисовке (заготавливая изображение в буфере в памяти и выдавая на экран одной операцией BitBlt). Особенно полезно в отношении LabelEffect с тенью.

[+] Таймер TTimer портирован из XCL. Конструктор: NewTimer( Interval ): PTimer.

 

KOL 0.13 (29-Июн-00)

[!] KOL переехал на новое место. Здесь просторно, нет рекламы, и кажется, вполне удовлетворительная скорость. Заодно изменился несколько дизайн страницы. Так что, добро пожаловать. И спасибо Константину Носову, который указал мне на этот сервер (newmail.ru).

[*] Организация модулей слегка изменена. Теперь вся библиотека KOL состоит из единого модуля kol.pas, а в целях уменьшения размера его текста различные части кода выносятся во включаемые по директиве INCLUDE файлы. Таким образом, декларации глобальных функций из utls.pas перенесены в kol.pas, а их реализация находится в файле strutils.inc.

[+] Добавлена обработка клавиатуры. Бо'льшая часть кода при этом подключается только в случае изменения (новых) свойств (событий) OnKeyDown, OnKeyUp, OnChar.

[+] Добавлена табуляция между контролами с использованием клавиатуры. Здесь во избежание перманентного включения кода, ответственного за табуляцию, пришлось пойти на компромисс: для обеспечения табулируемости между контролами, необходимо явно вызвать для формы (или любого ее контрола) сквозную*** функцию Tabulate или TabulateEx. Или, если приложение имеет несколько форм, можно вызвать такую функцию для объекта приложения - чтобы обеспечить сразу табуляцию во всех формах.
   Форма Tabulate более простая и рассматривает клавиши Tab, Right, Down, PgDn как команду перехода к следующему контролу (в порядке создания), а клавиши Shift+Tab, Left, Up, PgUp - к предыдущему. Форма TabulateEx позволяет переходить между контролами более наглядно, используя стрелки. В первую очередь она пытается выполнить переход к контролу, наиболее близко расположенному к текущему в заданном направлении.
   Соответственно, добавлено свойство Tabstop, позволяющее регулировать возможность табулирования (и фокусирования контрола вообще). Присваивание Tabstop := False;  для кнопки (например) превращает ее в "speed-button".
   В то же время, для каждого контрола с помощью свойства LookTabKeys можно регулировать, какие клавиши следует использовать в качестве клавиш табуляции, какие - нет. Например, по умолчанию окно ввода (editbox) допускает только клавишу Tab, а Listbox - еще и Left/Right.
   В дополнение к перечисленному, табулирование может быть легко выполнено программно обращением к методу GotoControl формы или любого ее дочернего контрола.

***Напоминаю, что сквозная функция возвращает @Self в качестве результата, что позволяет использовать такую функция в операторе вызова конструктора контрола (через точку, например, MyForm := NewForm( nil, 'Form1' ).Tabulate; ). В дополнение замечу, что такая форма вызова позволяет компилятору сгенерировать чуть более эффективный код (экономит одну машинную команду).

[+] Выполнен дальнейший перевод некоторых методов (в основном из объекта TControl ) в BASM.

[-] Исправлено поведение функций GetItem, SetItem - для индексов, выходящих за границы диапазона номеров строк текста/списка.

[-] Исправлена инициализация полей объекта нулями в Delphi3 (вставлен принудительный вызов FillChar в метод TObj.Init).

[+] Добавлено свойство CurIndex (подобно ItemIndex в VCL, для listbox'а и combobox'а показывет / устанавливает номер текущей строки списка, в то время как для editbox'а - одно- или многострочного - позволяет работать с текущей позицией курсора в тексте).

 

KOL 0.12 (25-Июн-00)

[+] Продолжается формирование джентльменского набора контролов. Добавлен ряд конструкторов для новых контролов:

  • NewEditbox( parent, options ) - для создания как однострочного окна ввода (наподобие TEdit в VCL), так и для многострочного (наподобие TMemo).
  • NewListbox( parent, options )
  • NewCombobox( parent, options )

[+] Соответственно, в определении унифицированного визуального контрола появилось изрядное количество новых свойств и методов, как то:

  • Items[ Idx ]: string - для доступа к элементам списка или выпадающего списка (listbox, combobox), а также многострочного окна редактирования (memo = miltiline editbox)
  • Count - для получения количества элементов списка, числа строк в мемо
  • Item2Pos( ItemIdx ): integer / Pos2Item( Pos ): integer - для трансформации номера строки в позицию символа (и наоборот) в Editbox'е
  • ItemSelected[ Idx ]: boolean - для выяснения, выделен ли элемент списка (или является он текущим в выпадающем списке), а так же для установки значения "выделен" (для выпадающего списка возможно установить только в значение True)
  • SelStart / SelLength - для чтения/установки начала и длины выделения (обычно - для Editbox'а, но SelStart годится и для Listbox'а, созданного с режимом loMultiselect)
  • Add( string ) / Insert( Idx, string ) / Delete( Idx ) - очевидные операции работы как со списком, так и с многострочным Editbox'ом (созданным с опцией eoMultiline)

[+] А так же добавлен сопутствующий набор событий:

  • OnEnter
  • OnLeave
  • OnChange

Прочие улучшения:

  • [+] Введено свойство Ctl3D (по умолчании True). В момент создания объекта TControl первоначально наследуется от родительского окна (но не напрямую, а через внутренний флаг, так как некоторые визуальные элементы хороши без Ctl3D, и в то же время желательно и для них иметь возможность автоматически распространять "унаследованный" от родителя Ctl3D на свои дочерние окна - например, для панели). Так что Editbox, Listbox теперь по умолчанию имеют 3D-бордюр.
  • [+] Добавлена "сквозная" функция - метод Shift( dx, dy ). Удобна в момент конструирования для сдвига контрола уже после применения сквозной функции PlaceDown, PlaceRight, PlaceUnder.

Общий итог. Прилагаемый пример TestKOL2 уже содержит на форме все разработанные на данный момент контролы, сохраняя в минимальном случае размер исполнимой программы 16,5Кбайт.

 

KOL 0.11 (22-Июн-00)

Извинения: в прошлый раз был опубликован вариант уже с пятью визуальными объектами - конструкторы NewPanel и NewLabel в русском варианте описания не были упомянуты. Просьба сильно не ругать. Более существенная неприятность, однако, заключалась в том, что в архив по недосмотру не попал модуль dynwndmsg.pas (портированный из XCL - но пока не используемый фактически, а может быть он позже вообще будет не нужен). Исправляюсь.

В новой версии:

  • [+] Теперь форма создается в скрытом виде по умолчанию (во избежание мелькания в момент ее создания). в этом режиме она показывается далее автоматически при выполнении нормального вызова CreateWindow (например, из процедуры Run, запускающей цикл обработки сообщений). Если очень необходимо, чтобы форма мелькнула в момент конструирования, надо установить свойство CreateVisible в значение True (а оно кому надо?).
  • [+] Добавлено свойство StayOnTop. Имеет смысл для всех оконных контролов, не только для формы.
  • [+] Добавлен чек бокс. Создается "конструктором" NewCheckbox( parent, 'caption' ) и делает все автоматически, потребляя минимум кода. Соответственно, для TControl введено новое свойство Checked, которое имеет смысл только для чек-боксов и радио-боксов.
  • [+] Добавлен радио бокс. Конструктор: NewRadioBox( parent, 'caption' ). Группировка выполнена по упрощенному принципу - все альтернативные радио-боксы должны находиться на одном родителе. Первый созданный (в группе) маркирован, прочие - нет. Бо'льшую часть работы по-прежнему делает сама система Windows. Роль родителя может играть любой оконный контрол (панель, группа).
  • [+] Добавлен гроуп бохс. Конструктор: NewGroupBox( parent, 'caption' ). Введено поле fClientTop для корректировки неверно возвращаемого самой системой Windows прямоугольника ControlRect - в соответствии с документацией по Win32 API.
  • [-] Пофиксено несколько небольших бажков (например, ассемблерная версия GetCaption), улучшен в отдельных местах перевод на ассемблер (в двух местах 4 подряд MOVSD - 4 байта - заменили собой 6-бйтную загрузку четверки в ECX с последующим REP MOVSD).

   Небольшие рассуждения. Так как справки пока нет, пока что предлагается в качестве документации просмотреть исходники. Полагаю, что текст тестового проекта вполне ясно показывает основные возможности KOL и является более чем достаточным для того, чтобы начать делать программы с использованием KOL. Задача особенно упрощается, если Вы уже использовали XCL, ACL или просто программировали без VCL - что называется, на "голом API". В крайнем случае, попробуйте сохранить тестовый проект под другим именем и сделать в нем какие-то изменения. Прежде чем продолжить чтение этой статьи, рекомендую посмотреть в анонсе ниже основные шесть отличий KOL от XCL (полезно даже при отсутствии близкого знакомства с XCL) и краткую информацию по основным объектным типам.
   Замечу, что программирование в объектах практически ничем не отличается от программирования в классах. Следует только наложить табу на слово 'class', и если Вы собираетесь создать свой объектный тип, я предлагаю вместо класса TObject в качестве базового использовать объект TObj. Можно определить в нем свой конструктор или переопределить виртуальный метод Init - как пожелаете. Впрочем, я полагаю, что при построении действительно маленьких приложений Вас устроит существующий набор объектов (точнее, тот, который будет существовать к моменту завершения миграции классов XCL в объекты KOL).
   В KOL сохранено сопоставление каждому визуальному элементу интерфейса (форме, контролу) своего объекта, который отвечает за "интерфейс" между кодом программиста и кодом операционной среды, реализующей этот визуальный элемент. (И невизуальному тоже).  Другое дело, что этот элемент не обязан быть объектом другого типа. Все визуальные объекты укладываются в рамки некоего унифицированного контрола, имеющего типичный набор свойств. Конечно, здесь могут возникать накладки. Например, ясно, что такое Caption для формы, метки, кнопки, и - уже не совсем ясно - для EDIT - контрола (В Delphi принято называть это свойство Text, поэтому вводится параллельное свойство Text, равносильное Caption). То же самое для свойства Items: в списке (LISTBOX) или выпадающем списке (COMBOBOX) этому свойству вполне можно сопоставить строки списка. Чему должно соответствовать это свойство (а так же сопуствующее Count и соответствующие методы Add, Insert, Delete, Clear) для простых контролов типа кнопки - не совсем ясно. Будем пока полагать, что для тех контролов, для которых это не имеет смысла, список "поддерживается" пустым и доступ к нему игнорируется.

   Поскольку визуальной среды для разработки программ в KOL пока нет (и вближайшем будущем, скорее всего, не будет), определенные усилия были приложены к тому, чтобы упростить проектирование формы. А именно, в объект TControl введены "сквозные" (т.е. возвращающие в качестве результата сам объект @Self) методы-функции, позволяющие легко задать взаимное расположение и размеры визуальных элементов относительно друг друга. Таковыми являются: SetSize( cx, cy ) - для изменения ширины и/или высоты, PlaceRight / PlaceDown / PlaceUnder - для изменения позиции правее / ниже предыдущего контрола, ResizeParent / ResizeParentRight / ResizeParentLeft - для изменения размера родительского контрола (или формы), и т.п. Так как такие методы-функции являются сквозными, их можно записывать через точку сразу в операторе вызова конструктора, причем несколько подряд. И облегчить себе задачу взаимного размещения нескольких кнопок, меток, панелек и т.д.
   Позже будут введены свойства, позволяющие выполнять динамическое выравнивание объектов (по левой / правой / нижней / верхней сторонам или по всему родительскому контролу - подобно тому как это делается в Дельфи с помощью свойства Align). Причем, новая метода неявного включения кода "по требованию" допускает, что, опять же, не надо будет делать специальный вызов наподобие UseAligner в XCL, и в то же время - код будет вставлен только если он действительно востребован (в результате изменения свойства Align у какого-либо контрола). И не надо мне говорить, что по мере добавления новых возможностей код KOL будет раздуваться, и опять весь выигрыш будет съеден. Это было не так даже для XCL. Хотя код под XCL раздувался, конечно, очень быстро - до 120К и даже до 200 (хотя это и оставалось все-таки в 5 раз меньше по сравнению с объемом такого же приложения, изготовленного средствами VCL, многие - и прежде всего я сам - были этим, конечно, недовольны). Основная причина роста кода приложения под XCL заключалась в слишком разветвленном дереве визуальных классов (в KOL - всего один объект). И в неспособности компилятора отсекать виртуальные методы так, как этого хотелось бы (в KOL почти не используются виртуальные методы). А так же, в моей личной "любви" к "графическим" контролам (в KOL в первую очередь внимание будет уделяться "оконным" контролам). Так что, в случае с KOL я надеюсь (и мне кажется - не без основания), что ситуация не повторится. А теперь пожелаем мне удачи, и если можете - предложите какую-нибудь помощь.
   Кстати, насчет помощи. Интернет у меня слабый, сеансы большие я делать не могу. Поиск приличного (но бесплатного) сервера, который бы не гонял за мой (точнее, за Ваш) счет рекламу, в настоящий момент для меня довольно сложен. Поскольку мой основной хостер "космические порты", как раньше и "ксум", тоже пошел по пути вывешивания оплачиваемых баннеров (хотя видит Бог - мой сайт не содержит коммерческой рекламы), просьба подсказать мне что-нибудь приличное в этом плане. Критерии приличности: FTP ап-лоад, круглосуточный доступ, хорошая скорость, никаких баннеров или другой рекламы (на крайний случай, согласен на требование поместить баннер на главной странице в каком-нибудь кадре - желательно подальше от глаз людских; требование поместить его "впереди планеты всей" не принимается). Просьба присылать информацию о проверенных сайтах, не содержащих каких-либо серьезных ограничений на размеры странички (или запретов на прямые ссылки на download файлов с других сайтов), не ограничивающих язык странички (или, в крайнем случае, не запрещающих английский - так бывает, да-да!). Замечу, что при наличии такой информации, переезд может быть выполнен очень быстро - после чего "вечный" адрес xcl.cjb.net будет показывать уже на новое место.
Зачеркнуто, т.к. устарело - Вы имеете удовольствие наблюдать KOL на новом сервере, и (по крайней мере - пока) без этой уже набившей всем оскомину рекламы.

 

Открывается новый параллельный проект KOL - Key Objects Library. Он основан на опыте, полученном, в основном, во время работы над XCL, а так же на других подобных идеях. Основная цель та же - создание небольших программ с использованием замечательной среды разработки Delphi (редактор, отладчик, ... и справочная система, в основном win32.hlp). Основные отличия следующие:
   Первое: классы (class) не используются совсем, вместо них используются объекты (object - те самые, из турбо-Паскаля). Объекты имеют меньшую по размерам таблицу виртуальных методов, позволяют компилятору более умно делать smart-linking и... достаточно мощны.
   Второе: вместо создания разветвленного дерева кла... - пардон, объектов, все (или почти все) контролы будут представлены в одном объектном типе  PControl = ^TControl. Такой объект сможет играть роль нужного визуального элемента (приложения, формы, кнопки, окна ввода и т.д.) взависимости от того, каким конструктором он был создан. (***Я говорю здесь 'конструктор' но подразумеваю некоторую глобальную функцию, например NewButton, которая создает новый объект типа TControl и возвращает указатель на него типа PControl). В результате, все контролы оказываются одного и того же типа  PControl, исчезают все проверки типа "A is X...", исчезают все раздутые наследования и переопределения виртуальных методов, исчезают приведения типа ( "A as X..." ) и т.п. Для расширения функциональности объекта в желаемом направлении используется хорошо известный (в Delphi) механизм внутренних 'событий' (точнее, указателей на методы) - вместо производства новых наследников и переопределения в них виртуальных методов. Что позволяет компилятору Delphi более аккуратно выполнять smart linking и делает код результирующей программы меньше.
   Третье: будет применяться более продвинутая технология управления добавлением требуемого приложением кода, не требующая (в отличие от XCL) вызовов специальной инициализирующей процедуры. Например, процедура обработки сообщений мыши будет добавлена только в случае, если приложение явно изменяет значения свойств OnMouseMove, OnMouseDown, OnMouseUp, OnMouseDblClk, OnMouseWheel. То же для свойства Font и события OnClick.
   Четвертое: больше внимания будет уделено использованию природных mfc контролов, доступных через API (кнопки, метки, комбо боксы и т.п.) - вместо огромных усилий по разработке собственных оригинальных графических контролов (наступающий Windows2000 кажется менее критичным по отношению к GDI и USER ресурсам, так что нет больше столь великих нужд по экономии их).
   Пятое: количество различных модулей будет уменьшено насколько возможно (подобно ACL). Что должно позволить сэкономить (немного, но мы ведь жадные...) на размере таблиц инициализации / финализации и на коде этих разделов.
   Шестое: значительная часть кода транслируется с использованием встроенного ассемблера - как для экономии кода, так и для ускорения работы программы.


Что касается XCL: он так же остается представленным здесь, и вполне годится для быстрого создания небольших утилит - как и раньше. Большинство идей, наработанных в XCL, будут мигрировать в  KOL (с соответствующими изменениями, конечно). И если время позволит, некоторые полезные изменения будут вноситься и в код XCL по мере продолжения работы над KOL (такие, как оптимизация аналогичных процедур с использованием встроенного ассемблера), но KOL становится превалирующим и к концу 2000 года должен вполне заменить собой XCL.

   Сегодня представлен первый выпуск KOL (v0.1). На данный момент KOL состоит из двух модулей   objs и utls. Objs содержит определене базового объекта TObj и происходящих от него объектов TList, TGraphicTool и TControl.
   TObj имеет метод Free (подобный TObject.Free в VCL), позволяющий уничтожать объекты аккуратно (игнорировать вызов в случае параметра nil). В связи с тем, что операторы "as" и "is" неприменимы к объектам, добавлен метод-функция AncestorOfObject для замены оператора "is" (и простой операции приведения типа - type cast - достаточно для использования вместо оператора "as"). Так же, введены методы RefInc и RefDec для блокирования объекта в памяти на некотором участке исполнения (для предотвращения его разрушения между двумя [вложенными] вызовами RefInc и RefDec).
   TList представляет быстрый список элементов (подобно TList в VCL или, скорее, ZList в XCL).
   TGraphicTool инкапсулирует объекты GDI, такие как font, brush, pen и замещает собой XFont, XBrush, XPen из XCL (или TFont, TBrush, TPen из VCL - все сразу). Взависимости от того, как он сконструирован (используя конструкторы***/см. примечение выше/ NewFont, NewBrush, NewPen), он играет роль желаемого объекта GDI. Я могу с гордостью заявить, что никакие такие объекты не создаются и не включаются в код финальной программы (исключая несколько небольших процедур), если программа не обращается к свойствам Font, Brush объекта TControl или не создает объекты TGraphicTool самостоятельно.
   TControl призван исполнять роль любого контрола, формы или (кнопки) приложения - все в одном. Его роль так же зависит от конструктора. Сейчас определено три таких конструктора: NewForm, NewApplet, NewButton. Сейчас уже возможно создать очень маленькое приложение с формой, на которой имеется некоторое количество кнопок - с размером исполнимого файла всего около 14,5K без сжатия (примечание: цифры здесь (и далее будут) даны с учетом применения замены системных dcu-файлов, опубликованной на этой странице 10-Jun-2000).
   Модуль Utls в настоящее время представляет собой в основном конверсию из XStrUtils (XCL) с изменением кода некоторых функций, применением встроенного ассемблера и т.д. Позднее сюда будут добавляться другие полезные утилиты (для работы с файлами, датами, окнами и т.д.)

   Так же, хорошие новости для неанглоговорящих программистов (что, есть такие?). Начиная с этого момента, новости XCL и KOL будут дублироваться на Русском языке. Я не буду помещать русскоязычный вариант в лист рассылки, но если есть желание/необходимость, можно указать мне хороший (бесплатный) сервер рассылки русскоязычной почты - и я могу организовать отдельную рассылку. Да, и если кто-нибудь пожелает выполнять (бесплатно) роль переводчика на другие языки (приветствуются немецкий, испанский, французский, любые другие европейские), пожалуйста, напишите мне (на English или Русском, пожалуйста).

 

ИСТОРИЯ XCL (English)

См. здесь историю новую (KOL + MCK = Визуальный KOL)


XCL: (C) 1999-2000 by Vladimir Kladov
KOL: (C) 2000-2001 by Vladimir Kladov

[Главная страница KOL&MCK]