LENIN INC WIN32API Library - новый виток в написании программ на API в DELPHI.
Статья анализирует новую библиотеку для написания компактных программ в среде DELPHI.

Любой современный начинающий программист входит в мир построения программ на VCL (библиотека визуальных компонентов). Оно то и понятно: ведь нет ничего проще кинуть на форму визуальные компоненты, а потом обрабатывать их события. Многие из нас помнят, как создали свою первую программу, которая в принципе ничего не делала, а просто запускалась и при этом содержала кучу различных компонентов. Эта была одна из самых счастливых минут жизни. Позже мы научились многому, но нас стал беспокоить размер нами создаваемых программ. Мы стали замечать, что пустая форма в скомпилированном виде весит 175 Кб. Причем, с выпуском каждой очередной версии DELPHI этот стартовый размер вырастает еще на несколько десятков ни в чем неповинных килобайт. Это плата за визуальность и объектность. Простая форма, это не так просто как кажется. Код простой формы включает в себя:

1. Обработчик событий от Windows
2. Базовые классы оконного приложения: TApplication, TMouse, TScreen и т.д.
3. Весь класс TForm + все его предки + все используемые им классы. И многое другое...

Зачем это нужно? Ну например вы не используете метод формы "Close", зачем его реализацию совать в код? Логика в том, что чужое приложение может послать сообщение вашему окну и инициализировать работу этого метода. Или допустим вы не используете какое-нибудь свойство или метод - но его можно передать в ваше приложение как строку и инициализировать их использование. Т.е. на этапе сборки программы компиллятор совершенно не имеет понятия какие из методов объектов будут использоваться. Вы даже можете использовать методы родительских классов формы и компиллятор не будет знать об этом - логика программы может "решить" их использовать по ходу дела, при определенных обстоятельствах. Так например работают многие руссификаторы - в файле национальных установок прописаны свойства компонентов, и эти свойства при выполнении программы используются. При написании программы программист "разрешает" изменять любые свойства любых объектов и это реализовано. Таким образом компиллятор вынужден загружать всю библиотеку, вместе с реализацией методов которые вообще никогда не будут реализованы.

Кстати, если вы бросите на форму несколько органов управления и откомпиллируете, затем добавите еще сотню таких же компонентов, то код вырастет не на много - на пару килобайт. Т.е. раз будучи прикомпиллированной библиотека теперь будет использоваться и размер программы расти будет медленно, но будет. Вот тут и приходит на помощь WIN32API, с помощью которого можно создавать компактные и быстрые приложения, но в этом случае можно попращатся с визуальной обработкой - все придется делать самому.

Но российские программисты не захотели мирится с этим и создали очень мощный инструмент, заточенный под DELPHI - KOL (Key Objects Library) или ключевая объектная библиотека. Данный набор компонентов позволяет изготавливать не менее мощные приложения, чем стандартная библиотека DELPHI - VCL. И при этом добиваться уменьшения размеров программ в 5-15 раз. KOL - не только объектно-ориентированная, но и визуальная библиотека. Программы и их графический интерфейс возможно проектировать практически так же, как и в визуальной среде VCL. В дополнение к KOL идет библиотека MCK (Mirror Classes Kit) - библиотека зеркальных классов, которая содержит VCL-компоненты, устанавливающиеся на палитру обычным образом. Единственное отличие в том, что зеркальные компоненты библиотеки MCK существуют только на стадии разработки (design time), участвуя в генерации "настоящего" кода, совместимого с требованиями библиотеки KOL. Во время работы (run time) выполняется этот код, и тот, который был добавлен самим разработчиком. В коде времени исполнения нет ссылок на компоненты VCL, есть только объекты KOL, компактные и эффективные.

KOL - это мощная библиотека, но целью данной статьи есть ознакомление читателя с другой, совершенно новой библиотекой: LENIN INC WIN32API Library. Частично она построена на основе KOL, многие функции и процедуры позаимствованы с различных модулей, а также форумов и т.п. Автор библиотеки собрал воедино многие программерские решения, а также добавил множество своих. Кроме модулей в архив библиотеки вошли примеры программ (их 77). Особенностью библиотеки является тот факт, что все прекрасно работает под управление WIN9X/ME/NT/2000/XP. Конечно, библиотека очень свежая и есть свои подводные камни, но вы можете свободно в случае необходимости все исправить, т.к. библиотека полностью бесплатная и распространяется с открытым исходным кодом.

Библиотека LENIN INC WIN32API Library также содержит все для придания программам XP-стиля, реализован пример бегущего "msctls_progress32", прозрачность окна и т.п.

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

Чтобы иметь небольшое представление о том, как работать с библиотекой, разберем небольшой пример. Архив библиотеки можно извлечь в любой каталог или в каталог, который находится в переменных окружения DELPHI. В каталоге Demos будет множество примеров программ, обратим внимание на подкаталог Shortcut. Здесь находится пример создания и удаления ярлыка на рабочем столе (см. Рис.1). Файл dialog.rc - ресурс диалогового окна, который содержит три кнопки с идентификаторами 1, 78, 79 - закрытие программы, создание и удаления ярлыка соответственно. Файл sample.dpr - проект программы. Мы не будем останавливаться на работе с ресурсами, т.к. это неоднократно описывалось, а перейдем сразу к использованию библиотеки. Открыв проект программы sample.dpr, вы увидите следующий код:

program sample;

uses
 //Подключаем стандартные модули
 Windows, Messages, 
 //Подключаем модуль бибилотеки Lenin_Shortcut.pas
 Lenin_Shortcut in '..\..\Lenin_Shortcut.pas';

//Подключаем ресурс диалогового окна
{$R dialog.res}        

//Обработчик команд от элементов управления окна
function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
begin
 Result := False;
  case uMsg of
   //Обработка команд окна
   WM_COMMAND:
    case LoWord(wp) of
     //При нажатии на кнопку с ID = 1 закрываем программу
     1: EndDialog(hWin, 0);
     //При нажатии на кнопку с ID = 78 создаем ярлык
     78: LnkFile('c:\windows\notepad.exe', '', 'Блокнот', '', SC_DESKTOP, True);
     //При нажатии на кнопку с ID = 79 удаляем ярлык
     79: LnkFile('c:\windows\notepad.exe', '', 'Блокнот', '', SC_DESKTOP, False);
    end;
   //Нажав кнопку "Х" в шапке программы, закрываем приложение
   WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
 end;
end;

//При запуске программы…
begin
 //…загружаем из ресурсов диалоговое окно MAIN_WINDOW
 DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);

end.

Пример работы с ярлыками
Рис.1. Пример работы с ярлыками.

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

Одним недостатком библиотеки есть тот факт, что она заточена под DELPHI3 и при использовании в другой версии компилятора возникают мелкие ошибки, в основном в модуле Lenin_SysUtils.pas. Это связано с постоянными переделками разработчиками DELPHI возвращаемых значений функций. Но хорошему программисту не будет большого труда это исправить. А файл справки DELPHI вам в этом поможет! Ну, если уж совсем вас одолеет лень - используйте стандартный модуль DELPHI - SysUtils.pas.

На последок немного тестовой информации. Обычное окно без органов управления (см. Рис.2) было создано с помощью VCL, MCK и LENIN INC WIN32API Library в DELPHI.

Окно без органов управления
Рис.2. Окно без органов управления.

Размеры приложения стали следующими:

VCL - 175 Кб.
MCK - 23 Кб.
LENIN INC WIN32API Library - 18 Кб.

Как видите, чистый API выигрывает у MCK на 5 Кб.

Заказать диск с библиотекой LENIN INC WIN32API Library вы можете в разделе WIN32API.

Copyright © 2002-2008 by Vladimir Drigalkin aka LENIN INC. All Rights Reserved.