Что такое FpGUI и с чем его едят. |
18.02.2013 Вадим Исаев |
19.10.2013 Алексей В. Логинов (AlexL): Обновление текста статьи и скриншотов.
ВведениеFpGUI - это ещё один набор визуальных компонентов (сайт - fpgui.sourceforge.net) для Free Pascal, позволяющий создавать пользовательский интерфейс для ваших программ в графической оболочке. Расшифровывается как "Free Pascal Graphic User Interface". Начат в 2000 году Себастьяном Гюнтером (Sebastian Gunther) как высокоуровневый интерфейс для GTK, однако в 2002 году проект был заброшен. В 2003 году проектом заинтересовался Виктор Наги (Viktor Nagy), который решил сделать его самостоятельным, независящим от высокоуровневых библиотек графического интерфейса пользователя, под именем lptk, но в 2005 году забросил. В 2006 году проект продолжил Грэм Гэлденхайз (Graeme Geldenhuys).
Все элементы FpGUI отрисовывает самостоятельно с помощью низкоуровневой библиотеки рисования, однако компоненты выглядят здесь также, как если бы вы пользовались любой стандартной средой программирования (см. рисунок 1). Так что пользователю вашей программы не придётся в ужасе шарахаться от её вида.
Рисунок 1. Вид программы, написанной с помощью fpGUI
Поддерживаемые операционные системы:
Компоненты без проблем компилируются как в 32-х, так и в 64-х разрядных ОС.
Кроссплатформенность обеспечивается отрисовкой компонентов с помощью низкоуровневых библиотек:
Какие здесь есть компоненты:
Рисунок 2. Вид дизайнера форм Uidesigner
CreateXXXX()где XXXX - это название компонента, например, label, button, ComboBox и т.п. Это удобно если разработка ведётся не с помощью идущего в комплекте дизайнера форм Uidesigner, а в каком-нибудь другом редакторе. А вот для создания самой формы такой функции, увы, не предусмотрено, хотя и было бы неплохо.
fpGUI распространяется в виде исходников. Порядок установки следующий:
-Fu/home/имя_пользователя/fpgui/lib
-FuДиск_и_каталог_где_установлен_Free_Pascal/fpgui/libгде имя_пользователя - это имя, под которым вы заходите в систему. Теперь компилятор будет знать где искать модули fpgui.
fpc uidesigner.lprОбычно компиляция проходит без малейших проблем.
Главным объектом любой вашей программы является объект fpgApplication типа TfpgApplication. Как и Application в Lazarus/MSEide+MSEgui он заведует отловом сообщений в программе и перераспределением их куда следует.
Хотя на самом деле fpgApplication - это функция, а не переменная, но при первом вызове она создаёт внутри себя скрытую переменную этого типа и при всех последующих вызовах обращение уже идёт к этой скрытой переменной на протяжении жизни программы. Поэтому, будем считать, что fpgApplication - это уже готовая переменная.
Отличие fpgApplication в fpGUI от Application в Lazarus/MSEide+MSEgui состоит в том, что созданием главной формы приложения она не заведует, поэтому основная программа немножко удлиняется, т.к. необходимо дописать код создания и показа формы:
{$mode objfpc}{$H+}
Program prog_kotomatrica;
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, fpg_main,
kotomatrica; //В этом модуле находится описание формы TForm1
var
MainForm: TForm1;
begin
fpgApplication.Initialize;
MainForm:=TForm1.Create(nil);
MainForm.Show;
fpgApplication.Run;
MainForm.Free;
fpgApplication.Terminate;
end.
Как видите, ничего необычного. Основная программа выполняет следующие функции:
Этот код вы можете использовать как шаблон главной программы при написании своих приложений.
Поскольку практически все учебные процессы по обучению программированию на сегодняшний день завязаны именно на визуальное программирование, то поговорим о дизайнере форм Uidesigner.
Uidesigner, в отличие от своих собратьев Lazarus/MSEide, при разработке форм не использует файл ресурсов, а генерирует код создания объектов формы в процедуре события формы AfterCreate() (см. рисунок 3). Практически так же ведёт себя Visual C#.
Рисунок 3. Код создания компонентов на форме
Надо сказать, что своего редактора кода в Uidesigner'е нет, поэтому не убивайте мышку бесконечным количеством двойных щелчков по кнопке или другому компоненту в бесплодных попытках вызвать код какого-нибудь события. Придётся параллельно пользоваться каким-нибудь сторонним редактором, например, для Linux есть очень хороший редактор для программистов - GEANY.
Как вы заметили, на рисунке 2 в колонке свойств объекта есть поля свойств, но совершенно отсутствуют поля событий. Ничего страшного, присваивать свойствам событий наименование процедур можно в поле Неизвестные строки(Unknown lines) (см. рисунок 2). Видимо разработчик до событий в дизайнере пока ещё не добрался. Вы можете ему помочь... Шаблоны и текст самих процедур придётся писать в редакторе ручками (см. рисунок 4). Как это делается и что в них писать, можно посмотреть в примерах к fpGUI.
Рисунок 4. Код процедуры события
Ещё один из недостатков Uidesigner - при добавлении компонентов на форму при генерации кода он забывает включить модуль добавляемого компонента в строку Uses (ошибка). Так что не забывайте их добавлять вручную. В пакете uidesigner для дистрибутива Mageia это исправлено.
Надо сказать, что если вы после работы с Uidesigner'ом потом добавили ещё кучу своего кода в сгенерированный им модуль и решили добавить ещё какие-нибудь визуальные компоненты на форму, то можете смело открывать модуль в Uidesignere'е, ваш код он не тронет.
Вот небольшой практический примерчик - краткая информация о системе. Алгоритм сбора информации строится на том, что в каталоге /proc содержатся файлы с описанием текущей системы. Информацию о процессоре мы возьмём из файла /proc/cpuinfo, информацию о памяти - из файла /proc/meminfo. Информация о ядре ОС берётся из файла /proc/version, информация о названии ОС - из файла /etc/issue. Последний файл есть не во всех дистрибутивах Linux, так что имейте это в виду. У меня получается вот такое окошко (см. рисунок 5):
Рисунок 5. Пример программы - информация о системе
Новые компоненты в uidesigner добавляются в файл uidesigner/vfdwidgets.pas, в процедуру RegisterWidgets. Для каждого компонента создаётся объект типа TVFDWidgetClass (переменная в процедуре для него уже есть - wc), в конструкторе Create которого в качестве параметра указывается название класса компонента, например TfpgLabel. Далее устанавливается имя компонента (Label) и добавляются его свойства методом AddProperty('Название_свойства', Тип_свойства, 'Комментарий_к_свойству'). Здесь Тип_свойства - это один из предопределённых типов (TPropertyString, TPropertyInteger, TPropertyFloat, TPropertyEnum, TPropertyStringList, TPropertyBoolean, TPropertyFontDesc, TPropertyColor).
Иконка для компонента добавляется в процедуре LoadIcons того же файла с помощью процедуры fpgImages.AddMaskedBMP(). Первый параметр этой процедуры - текстовый идентификатор иконки, второй параметр - ссылка на байтовый массив иконки, третий параметр - размер массива, четвёртый и пятый - левый верхний угол кнопки элемента, которую вы будете кликать, чтобы установить элемент на форму. Как правило два последних параметра - 0, 0. Байтовые массивы иконок хранится в файле uidesigner/icons.inc.
Возникает резонный вопрос - что такое этот самый байтовый массив и как его получить, если под рукой есть только рисунок? После недолгих исследований выяснилось, что байтовый массив - это не что иное, как рисунок формата BMP, считанный побайтно. Для этого можно использовать класс TFileStream.
Когда все свойства добавлены, компонент регистрируется с помощью функции RegisterVFDWidget().
Вот и всё. В принципе, ничего сложного, и как именно это делается можно посмотреть в самом файле uidesigner/vfdwidgets.pas. После добавления необходимых компонентов uidesigner нужно заново перекомпилировать (см. Где взять и как установить).
В архиве с fpGUI идёт комплект документации по его компонентам, свойствам и методам. Только документация эта "сырая", в виде xml-файлов. В каталоге, куда вы разархивировали fpGUI, есть подкаталог docs, а в нём скрипт build_html.sh. Необходимо запустить этот скрипт, и тогда в подкаталоге docs/html будут созданы HTML-файлы. Начало просмотра - открыть файл index.html в любом браузере.
В подкаталоге examples можно найти огромное количество примеров. В принципе, по ним можно спокойно пройти начальный курс обучения по работе с fpGUI.
fpGUI понравится тем людям, которые не любят визуальное программирование, но любят писать код руками. Для этого fpGUI весьма удобен из-за наличия в нём специальных функций создания компонентов, которые значительно сократят объём кода.
Кроссплатформенность (Windows/Unix/MacOS) позволяет даже при минимуме знаний особенностей той или иной ОС писать кроссплатформенные (переносимые) приложения.
Отсутствие привязки к определённой графической платформе (например, GNOME или KDE) делает программы более шустрыми, хотя с сегодняшним быстродействием процессоров это уже и не так актуально.
Uidesigner - программа для визуального проектирования форм, хотя ещё и далека от совершенства (не все наличествующие компоненты туда внесены и явно не хватает функции автоматического создания шаблона событий, как в Lazarus), тем не менее вполне работоспособна и позволяет сильно ускорить и упростить проектирование формы по сравнению с ручным написанием кода. Также хорошая поддержка русского языка.