Како се програмираат компоненти во Gambas
Вовед
Gambas се поделени библиотеки напишани во C, C++ или директно во Gambas, кои додаваат нови класи на Gambas интерпретерот.
A
компонента напишана во gambas е нормален gambas проект со следниве карактеристични особини:
- Во јазичето за опции на дијалогот за поставувања на проектот опцијата „project is a component“ се поставува на „Yes“.
- Некои од класите на проектот се експортирани (т.е. „извезени“).
- Експортираните класи се контроли што мoраат да декларираат некои специјални јавни константи што ќе му ги достават на ИРО сите информации што се потребни за управување со контролата.
- Во јазичето „Provides“ („нуди“) на дијалогот за поставувања на проектот се пополнуваат разновидни информации за експортираните класи на компонентата.
- Во јазичето „Requires“ („бара“) на дијалогот за поставувања на проектот се пополнуваат зависностите на новата компонента.
 |
Многу официјални компоненти на gambas веќе се напишани во gambas, па можете да ги користите како примени.
Изворниот код на овие компоненти се наоѓа во директориумот /comp/src на архивата со изворниот код на gambas.
Ова е листата на тие компоненти:
Забележете дека и некои компоненти напишани во C/C++ имаат и дел напишан во gambas:
Изворниот код на делот напишан во gambas се наоѓа во директориумот со изворен код на овие компоненти. На пример, делот напишан во gambas на gb.qt се наоѓа во /gb.qt/src.
|
Експортирани класи
Намената на
Gambas компонентата е да додаде нови класи на
Gambas интерпретерот.
Класите што сакате да ги додадете мораат да се
експортираат од вашиот проект, инаку корисникот на вашата компонента нема да може да ги види.
За да ја одбележите
класата како
експортирана, единствено треба да го додадете клучниот збор
EXPORT на почетокот на датотеката со изворниот код на класата.
 |
Ако некој метод или својство на експортираната класа враќа објект на друга класа декларирана во вашата компонента, тогаш и оваа друга класа треба да биде експортирана. Инаку, корисникот нема да може да чува референца на неа, доколку не го користи податочниот тип Object.
|
 |
Ако експортираната класа наследува друга класа што е декларирана во вашата компонента, тогаш и оваа друга, т.е. родителската класа треба да биде експортирана. Во спротивно, ќе добиете грешка од интерпретерот дека не може да ја вчита компонентата.
|
 |
За добар пример на едноставна компонента со само неколку експортирани класи погледнете го изворниот код на gb.settings и нејзината класа Settings.
|
Скриени експортирани класи
Ако треба да експортирате некои класи што не сакате да бидат видливи за корисникот, можете да ги скриете на тој начин што ќе го почнете нивното име со карактерот потцртичка („_“).
За пример, погледнете во изворниот код за
gb.desktop за да видите многу класи што не можат експлицитно да се видат.
Со оваа постапка можете да го замените концептот на „
виртуелни класи“ што постојат само кај компонентите пишувани во C/C++.
Контроли
Контролите се специјални експортирани класи што се појавуваат во алатникот со контролите на ИРО.
Контролите се обично графички контроли што нешто прикажуваат и вршат интеракција со корисникот.
Но, исто така, тие можат да бидат и нормални класи и да не прикажуваат ништо, на пример, контролата
Timer. Во тој случај, тие се нарекуваат
виртуелни контроли.
Контролите на графичкиот кориснички интерфејс (
gb.qt или
gb.gtk) нудат две класи што можете да ги користите како родителски класи за создавање на сопствени контроли:
UserControl и UserContainer се, всушност, директни потомци на
класата Container. На тој начин можете да создадете нови контроли или нови содржатели со комбинирање на веќе постоечки контроли или содржатели.
 |
За добар пример на употребата на UserControl, погледнете го изворниот код на контролата FileView.
Оваа контрола содржи една контрола TreeView и една контрола IconView во внатрешноста на UserControl, прикажувајќи една од нив според видот на прегледот што ќе го побара корисникот.
Исто така, за пример на употреба на UserContainer, можете да го видите изворниот код на контролата ListContainer.
Оваа контрола е содржател што ви овозможува создавање на ListBox чии ставки се други контроли.
|
Понатаму, контролите треба да декларираат некои специјални скриени константи што ИРО ги користи за управување со контролите.
Постојат пет константи што можат да се декларираат. Константата
_Properties е задолжителна, додека другие се опциони:
- _Properties
- _DefaultEvent
- _DefaultSize
- _DrawWith
- _Arrangement
Константата _Properties
Оваа константа е најважна и таа е задолжителна. Таа ги опишува сите својства што ќе се покажат во листата на ИРО со
својствата на контролата, како и нивниот тип, нивната предефинирана вредност како и други информации во зависност од типот на својството.
Синтакса
Оваа специјална константа е стринг што ја има следнава форма:
PUBLIC CONST _Properties AS String = " [ * , ] Property1 , Property2 , ... "
Секое
својство ја има следнава синтакса:
[-] Name [ { Kind [ Arguments ] } ] = Default
- Аргументот Name е името на константата. Се разбира, својството мора да биде декларирано и имплементирано во изворниот код на контролата.
- Аргументот Kind е видот на својството. Тој треба да биде попрецизно дефиниран од податочниот тип на својството. На пример, „Color“ значи дека својството е цел број, но листата со својства на ИРО ќе отвори дијалог за одбирање бои за да ја дефинира неговата вредност. Ако не е дефиниран, видот на својството е еднаков на неговиот податочен тип.
- Аргументот Arguments се опционите аргументи што зависат од вредноста на аргументот Kind.
- Аргументот Default е предефинираната вредност на својството. Оваа синтакса зависи од видот на својството.
Првото својство може да биде ѕвездичка, што значи дека контролата автоматски ги презема сите својства декларирани во константата
_Properties на нејзината родителска
класа.
Во тој случај, името на својството може да почне со знакот минус. Тоа значи дека својството мора да биде отстрането од листата наследена од родителската класа.
Видови својства
Ова се различните вредности на аргументот
Kind што се поддржани во овој момент:
|
Property kind
|
Опис
|
Аргументи
|
|
Color
|
Цел број што претставува боја.
ИРО ќе покаже дијалог за одбир на боја што се користи за поставување на вредноста на ова својство.
|
|
|
Font
|
Фонт.
ИРО покажува дијалог за избор на фонт со кој се определува вредноста на ова својство.
|
Font [ :Fixed ]
Употребете Font:Fixed за да дозволите само фиксирани фонтови.
|
|
Path
|
Патека до датотека.
ИРО отвора дијалог за одбир на датотека со кој се поставува вредноста на ова својство.
|
|
|
Picture
|
Слика што се наоѓа во директориумот на проектот или стандардна системска икона.
ИРО ќе отвори дијалог за избор на слика со кој се поставува вредноста на ова својство.
|
|
|
Range
|
Целобројна вредност со минимум и максимум.
ИРО ќе користи SpinBox контрола за поставување на вредноста на ова својство.
|
Range:Minimum;Maximum
|
Аргументот
Default со кој се дава предефинираната вредност на својството мора да одговара на податочниот тип на својството. За логички (boolean) својства, можете да специфицирате „True“ или „False“ како предодредена вредност.
 |
Морате да бидете претпазливи кога дефинирате (или НЕ дефинирате) предефинирана (Default) вредност на својство.
- Прво, ако не е специфицирана, за предефинирана вредност се зема предефинираната вредност асоцирана со податочниот тип на својството (FALSE за Boolean својство, 0 за нумеричко својство...).
- Второ, предефинираната вредност мора да биде исправна во однос на имплементацијата на својството. Ова е бидејќи кога својството ќе се постави на предефинирана вредност во уредувачот за форми на ИРО, не се уфрла никаков код за иницијализација на својството при извршувањето на програмата.
|
Листи на константи
За својствата што ја примаат вредност од листа на предефинирани константи од иста
класа,
наместо вид на
својство можете да специфицирате класа, со опциона листа на константи.
Ова е синтаксата:
|
Property kind
|
Опис
|
Аргументи
|
|
Class name
|
Листа на константи.
ИРО ќе користи ComboBox контрола за доделување на вредност на ова својство и ќе ја пополни со специфицираните константи.
|
Class . ( * | Constant1 ; Constant2 ; ... ) [ = Default ]
Ако наместо листа на константи се употреби ѕвездичката, тогаш ќе се користат сите константи од наведената класа.
|
 |
Ако е наведена, предодредената вредност (Default) мора да биде името на некоја од константите. Никако вистинската бројна вредност!
|
Примери
На пример, вредноста на
Control._Properties е:
X{Position},Y{Position},Width{Dimension},Height{Dimension},Visible=True,Enabled=True,Font{Font},
Background{Color}=-1,Foreground{Color}=-1,Tag,
Mouse{Mouse.Default;Blank;Arrow;Cross;Wait;Text;SizeAll;SizeH;SizeV;SizeN;SizeS;SizeW;SizeE;SizeNWSE;SizeNESW;SplitH;SplitV;Pointing}=Default,
ToolTip,Drop,Expand,Ignore
Ова го наследуваат сите останати контроли и содржатели.
Ова е вредноста на
ListBox._Properties:
*,List,Mode{Select.*}=Single,Sorted
Другите специјални константи
Константата _DefaultEvent
Оваа константа е стринг што го претставува главниот
Настан на контролата. Овој главен настан се користи при двоен клик на контролата во уредувачот на форми во ИРО.
На пример:
PUBLIC CONST _DefaultEvent AS String = „Click“
Оваа константа е опциона, но во секој случај треба да ја декларирате.
Константата _DefaultSize
Оваа константа е стринг што ја дефинира стандардната големина на контролата кога таа ќе се стави од алатникот на уредувачот на форми. Тој се искажува во помножоци на
Desktop.Scale, одделени со запирки.
На пример:
PUBLIC CONST _DefaultSize AS String = „36,36“
Оваа константа е опциона. Ако не се декларира ИРО ќе се обиде да направи нешто што има смисла.
Константата _DrawWith
Оваа константа е стринг што му кажува на ИРО која контрола ќе се користи за цртање во уредувачот на формите.
По стандард, контролите што припаѓаат на
gb.qt,
gb.qt.ext,
gb.form и
gb.form.mdi се цртаат со инстанцирање со дизајнерско множество на
својства.
Ако контролата не припаѓа во некоја од горенаведените контроли, тогаш ИРО ќе нацрта рамка со иконата и името на контролата.
Со дефинирањето на оваа константа, ИРО нема да користи
DrawingArea, туку контролата што сте ја специфицирале.
На пример:
PUBLIC CONST _DrawWith AS String = „TextBox“
Константата _Arrangement
Оваа константа е целобројна вредност што го претставува стилот на подредување што ИРО го спроведува над подконтролите во содржателот пред да ги зачува на дискот.
Оваа вредност е една од целобројните вредности на константите од класата
Arrange.
На пример:
PUBLIC CONST _Arrangement AS Integer = 2 ' Arrange.Vertical
Константите од
Arrange не можете да ги користите директно бидејќи се наоѓате во декларирање на константа.
Ова е ограничување на јазикот на
Gambas.
Оваа константа се користи само ако контролата е содржател и претставува опциона константа. Ако не е дефинирана, не се спроведува подредување.
Икони на контролите
Секоја контрола мора да има икона што ќе се покажува во алатникот на ИРО.
За да доделите икони на контролите од вашата
компонента, во коренот на вашиот проект морате да создадете директориум со име
/control и во него да ставите по една икона во вид на PNG-датотека за секоја контрола.
Името на иконата за контролата мора да биде името на
класата на контролата
напишано со мали букви со наставка
.png.
На пример:
$ cd gb.db.form
$ cd control
$ ls
databrowser.png datacombo.png datacontrol.png datasource.png datatree.png dataview.png
Општи информации за компонентата
Повеќе информации за
компонентата се задаваат во дијалогот за поставувања на проектот, во јазичињата „Provides“ и „Requires“.
Забележете дека овие јазичиња не се видливи кога проектот не е компонента.
Информации во јазичето „Provides“
Во ова јазиче имате листа на сите експортирани класи.
За секоја класа морате да наведете:
- Во колоната „Type“: дали е контрола и каков вид на контрола.
- Во колоната „Group“: името на јазичето од ИРО во кое ќе биде поставена иконата на контролата.
Ова е листа на различни видови класи:
|
Тип
|
Опис
|
|
Class
|
Обична Класа што не е контрола.
|
|
Control
|
Контрола што не е содржател.
|
|
Virtual
|
„Виртуелна“ контрола, т.е. обична класа што може да се стави на форма во уредувачот на формите.
На пример, контролата Timer.
|
|
Container
|
Контрола што е содржател. Со ова му се соопштува на ИРО дека во контролата може да става други контроли.
|
|
MultiContainer
|
Контејнер што дејствува како TabStrip. Тоа значи дека ги распределува подконтролите помеѓу различни подконтејнери и дека во еден момент е видлива само една група на подконтроли.
|
|
Form
|
Во овој момент не се користи. Во Gambas 3, ова ќе означува содржател кој имплементира некој вид на форма што може да се уредува од страна на ИРО.
|
Информации во јазичето „Requires“
Во ова јазиче ќе ги наведете сите зависности на вашата
компонента од другите компоненти.
Делот „Features“ има четири места за чекирање, од кои секое претставува особина што е обезбедена од една или повеќе компоненти.
Овој дел можете да го користите ако на вашата компонента ѝ е потребна специфична особина, што не се однесува на специфична компонента.
Ако навистина ви се потебни некои специфични компоненти, нив можете да ги одберете во делот од јазичето означен со „Components“.
 |
Компонентите што ги селектирате во јазичето „Components“ во дијалогот за поставувањата немаат ништо заедничко со компонентите наведени во јазичето „Requires“ tab.
Тие се користат само кога го стартувате проектот со компонентата од ИРО за цели на отстранување бубачка.
|
Отстранување бубачка, инсталација и пакување на компонентите
Отстранување бубачка
За да отстраните бубачка од вашата компонента, можете директно да го користите проектот и да го стартувате онаков каков што е!
Почетната класа на проектот и компонентите одбрани во јазичето „Components“ во дијалогот за поставувања нема да влијаат на однесувањето на компонентата кога таа ќе се инсталира и ќе се користи од други проекти.
Инсталирање
Компонентата можете да ја инсталирате во вашиот матичен директориум со чекирање на соодветната опција во дијалогот „Make executable“.
Откако ќе се инсталира, компонентата ќе биде видлива во јазичето
Components на дијалогот за поставувања на проектот, како и сите останати глобално инсталирани компоненти.
За да ја деинсталирате компонентата од вашиот матичен директориум, само отчекирајте ја опцијата во дијалогот
„Make executable“ и повторно изградете ја извршната датотека.
Пакување
ИРО може да направи бинарни пакети со вашата компонента, како и со сите останати проекти.
Потребно е само да дефинирате помалку опции: компонентата, на пример, нема ставка за мени.
Бинарниот пакет ќе ја инсталира компонентата на системско ниво и ќе биде употреблива како и секоја друга официјална компонента што се испорачува со
Gambas.
Ако сакате да ја дистрибуирате вашата компонента, ќе треба да ја именувате според прецизно наведената шема, така што не се јавуваат конфликти во пакетите со компоненти.
Името на вашата компонента мора да биде:
gambas2-vendor-name, каде што:
- gambas2 е префикс за сите gambas 2 компоненти.
- vendor е називот на оној што ја издава компонентата. За официјалните gambas компоненти, името на издавачот е едноставно gb.
- name е името на компонентата.
 |
Иако помошникот за пакување ви помага да го внесете стрингот на издавачот на пакетот во името на пакетот, ве молам ова да го одбегнувате.
Ставете го името на издавачот во името на проектот на компонентата, така што се појави во конечното име на компонентата, така што корисникот може да го види.
|
 |
Во овој момент има недостаток во пакувачот кој не ја зема предвид верзијата на проектот на компонентата при генерирањето на зависните. Последователно, ќе морате да ја ставите верзијата на вашиот проект со компонентата да биде иста со верзијата на Gambas со која работите!
|
Заклучок
Се обидов да најдам најлесен начин за изработка на компоненти со ИРО. Тоа сѐ уште не е совршено, но ако имате каков било коментар или прашање во врска со ова, ве молам да ја користите мејлинг листата!
Забележете дека работите сигурно ќе се променат во
Gambas 3.
И, се разбира, ако сакате да ја поправите или подобрите оваа статија, ќе бидете добредојдени.