Динамическое создание и удаление объектов

Общие сведения


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

Конечно, всегда можно было заранее создать все необходимые объекты, скрыть их от пользователя и затем отобразить в нужный момент. Но это было не очень удобным решением, особенно для игр или проектов со сложным кодом. Вот мы и подошли к главному. Начиная с версии 4.9.8, вы можете динамически создавать большинство основных объектов и даже удалять их (в целях экономии памяти) с помощью команды DeleteObject. Для изменения свойств динамически созданных объектов используйте команду SetObjectParam.

Вот список команд, позволяющих вам динамически создавать объекты:Где:
x - координата объекта по оси x
y - координата объекта по оси y
w - ширина объекта
h - высота объекта
r, g, b - цвет объекта в системе RGB (значения от 0 до 255)
text - текст объекта
inlabel - пользовательское имя объекта, допустим, Text. Если в проекте уже присутствует объект с таким именем, то к пользовательскому имени будет присоединено число и получившееся имя будет передано в выходную переменную outlabel$. Как вы возможно знаете, на одной странице не может быть два объекта с одинаковым именем.

Одним словом, если объект уже существует (скажем, Text), то будет использовано первое из возможных имен, основанных на пользовательском имени (например, Text13). Это имя будет передано в переменную outlabel$ и будет использоваться MMB. Если вам потребуется удалить или скрыть этот объект, то вы должны будете использовать переменную outlabel$ в соответствующей команде.

Все параметры являются входными (за исключением outlabel$) и могут быть заданы с помощью числовых или строковых переменных.

Все параметры необязательные, но рекомендуется указывать хотя бы текст/координаты ;)

Если параметр inlabel не указан, то функция будет использовать имена по умолчанию (например, TextBTN, Circle...). Если размеры/координаты не указаны, то объект будет создан в точке 0,0 и иметь размер по умолчанию.

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

CreateTextButton("inlabel","outlabel$,x,y,,,text")



CreateTextButton("польз_имя","имя$,x,y,w,h,текст")
Пояснение
С помощью этой команды вы можете создать кнопку. Возможно, эта команда будет самой популярной из команд создания объектов.

Возможные параметры:
пользовательское имя, выходная переменная
x, y - координаты x, y
w, h - ширина и высота
текст - надпись на кнопке

Чтобы задать другие параметры кнопки (цвет кнопки, цвет текста, шрифт и т.д.) используйте команду SetObjectParam сразу после CreateTextButton.
Примеры
** создание кнопки с именем "BTN"
CreateTextButton("BTN","outlabel$,10,10,50,25,OK")

** или то же самое, но с использованием переменных...
inlabel$='BTN'
x=10
y=10
w=50
h=25
text$='OK'
CreateTextButton("inlabel$","outlabel$,x,y,w,h,text$")
** а чтобы изменить цвет кнопки используйте этот код...
rgbcol$='255,0,255'
SetObjectParam("outlabel$","BGCOLOR=rgbcol$")
** вы также можете использовать выражения в командах создания объектов...
n=n+10
CreateTextButton("inlabel$","outlabel$,x,y,w+n,h+n,text$")



CreateText("польз_имя","имя$,x,y,текст")
Пояснение
С помощью этой команды вы можете создать текстовый объект.

Возможные параметры:
пользовательское имя, выходная переменная
x, y - координаты x, y
текст - надпись на кнопке

Чтобы задать другие параметры текстового объекта (цвет текста, шрифт и т.д.) используйте команду SetObjectParam сразу после CreateText.
Примеры
** создание текстового объекта с именем "TXT"
CreateText("TXT","outlabel$,10,10,Текст")

** или то же самое, но с использованием переменных...
inlabel$='TXT'
x=10
y=10
text$='Текст'
CreateText("inlabel$","outlabel$,x,y,text$")
** а чтобы изменить цвет текста используйте этот код...
rgbcol$='255,0,255'
SetObjectParam("outlabel$","TEXTCOLOR=rgbcol$")



CreateParagraph("польз_имя","имя$,x,y,w,h,текст")
Пояснение
С помощью этой команды вы можете создать текст с полосой прокрутки.

Возможные параметры:
пользовательское имя, выходная переменная
x, y - координаты x, y
w, h - ширина и высота
текст - надпись на кнопке

Чтобы задать другие параметры объекта (цвет текста, шрифт и т.д.) используйте команду SetObjectParam сразу после CreateParagraph.
Примеры
** создание текста с полосой прокрутки с именем "PARA"
CreateParagraph("PARA","outlabel$,10,10,320,200,Длинный текст")

** или то же самое, но с использованием переменных...
inlabel$='PARA'
x=10
y=10
w=320
h=200
text$='Lorem ipsum dolor sit amet et condimentum lectus sodales litora parturient.'
CreateParagraph("inlabel$","outlabel$,x,y,w,h,text$")
** а чтобы изменить цвет текста используйте этот код...
rgbcol$='255,0,255'
SetObjectParam("outlabel$","TEXTCOLOR=rgbcol$")



CreateCircle("польз_имя","имя$,x,y,w,h,r,g,b")
CreateRectangle("польз_имя","имя$,x,y,w,h,r,g,b")
Пояснение
С помощью этих двух команд вы можете создать круг и прямоугольник.

Возможные параметры:
пользовательское имя, выходная переменная
x, y - координаты x, y
w, h - ширина и высота
r, g, b - цвет заливки

Чтобы задать (или изменить) другие параметры круга или прямоугольника (цвет заливки, цвет или тип границы и т.д.) используйте команду SetObjectParam сразу после CreateCircle или CreateRectangle.
Примеры
** создание круга с именем "CIRC"
CreateCircle("CIRC","outlabel$,10,10,50,50,128,0,128")

** или то же самое, но с использованием переменных...
inlabel$='PARA'
x=10
y=10
w=50
h=50

** генерация случайного цвета
r=RND(254)+1
g=RND(254)+1
b=RND(254)+1
CreateCircle("inlabel$","outlabel$,x,y,w,h,r,g,b")
** а чтобы изменить цвет границы круга используйте этот код...
r=RND(254)+1
g=RND(254)+1
b=RND(254)+1
SetObjectParam("outlabel$","BORDERCOLOR=r,g,b")



CreateLine("польз_имя","имя$,x,y,w,h,r,g,b")
CreateLineAB("польз_имя","имя$,x1,y1,x2,y2,r,g,b")
Пояснение
С помощью команд CreateLine и CreateLineAB вы можете создать линию.

Возможные параметры для команды CreateLine:
пользовательское имя, выходная переменная
x, y - координаты x, y
w, h - ширина и высота
r, g, b - цвет

Возможные параметры для команды CreateLineAB:
пользовательское имя, выходная переменная
x1, y1 - координаты начальной точки
x2, y2 - координаты конечной точки
r, g, b - цвет

В то время как линия, созданная с помощью команды CreateLineAB, имеет абсолютные координаты начальной и конечной точек в окне проекта, положение линии, созданной с помощью CreateLine определяется длиной/высотой ограничивающего ее прямоугольника. Другими словами, две команды с абсолютно одинаковыми значениями дадут разные результаты, поскольку они по-разному интерпретируют заданные значения.

Пожалуйста, взгляните на иллюстрацию:



Вот код, который был использован при создании этого рисунка:

CreateLine("LINE","outlabel$,20,20,280,200,255,0,0")
CreateLineAB("LINE","outlabel$,20,20,280,200,0,0,255")


Как вы возможно знаете, координаты большинства объектов MMB определяются положением левого верхнего угла, а также длиной и высотой объекта, что фактически является координатами правого нижнего угла. То же касается и команды CreateLine. Несмотря на то, что это кажется бесполезным (указывать длину и высоту линии), это очень удобно в случаях, когда вам необходимо создать несколько линий с относительным позиционированием.
Примеры
** создание линии с именем "LINE" и использованием абсолютных координат
CreateLineAB("LINE","outlabel$,20,20,280,200,0,0,255")

** создание линии с именем "LINE" и использованием длины/высоты ограничивающего ее прямоугольника
CreateLine("LINE","outlabel$,20,20,280,200,255,0,0")



CreateHotSpot("польз_имя","имя$,x,y,w,h")
Пояснение
С помощью команды CreateHotSpot вы можете создать активную область. Но как вы уже знаете (или еще не знаете ;), активная область может использоваться в качестве контейнера изображения! Вы можете загрузить его в активную область с помощью команды ReplaceImage. После этого вы можете использовать те же функции, что и при работе с растровым объектом.

Возможные параметры для команды CreateHotSpot:
пользовательское имя, выходная переменная
x, y - координаты x, y
w, h - ширина и высота
Пример
** В этом примере показано, как создать галерею изображений с расчетом максимального числа изображений, умещающихся в окне проекта
pw=PubWidth()
ph=PubHeight()
** расстояние между изображениями
coef=10
w=50
h=50
** число изображений для текущей ширины окна
n_imgs_w=pw/(w+coef)
RoundNum1=INT(n_imgs_w)
RoundNum2=n_imgs_w-RoundNum1
If (RoundNum2>=0.5) Then
n_imgs_w=RoundNum1 + 1
End
** число столбцов
n_imgs_w=n_imgs_w-1
** число изображений для текущей высоты окна
n_imgs_h=ph/(h+coef)
RoundNum1=INT(n_imgs_h)
RoundNum2=n_imgs_h-RoundNum1
If (RoundNum2>=0.5) Then
n_imgs_h=RoundNum1 + 1
End
** число строк
n_imgs_h=n_imgs_h-1
********************
x=coef
y=coef
For j=1 To n_imgs_h
For i=1 To n_imgs_w
Pause("50")
CreateHotSpot("HSpot","object[i]$,x,y,w,h")
** новая координата x (для столбца)
x=x+w+coef
** добавим код для активной области
script$='CurObj$=CurrentObject()'+CHR(13)+CHR(10)
script$=script$+'Message("SelectedObject","CurObj$")'+CHR(13)+CHR(10)
SetObjectParam("object[i]$","MOUSEUPSCRIPT:1=script$")
/* зададим повторение изображений. Если у вас в каталоге только 3
изображения, а число активных областей больше, то вам придется
повторять изображения. В нашем примере в каталоге всего лишь 3 файла,
поэтому, если число областей больше или равно 3,
выполняем сброс счетчика изображений */

If (ni>=3) Then
ni=1
Else
** иначе увеличиваем значение счетчика
ni=ni+1
End
imgpath$='<SrcDir>\Images\\'+CHAR(ni)+'.jpg'
** загрузка изображения в активную область
ReplaceImage("object[i]$","imgpath$")
** перемещаем объект на задний план
ReorderObject("object[i]$","BACK")
Refresh("")
Next i
** сброс координаты x (для столбца)
x=coef
** новая координата y (для строки)
y=y+h+coef
Next j



CreateScript("польз_имя","имя$")
Пояснение
С помощью этой команды вы можете создать скрипт.

Возможные параметры:
пользовательское имя, выходная переменная

Объект-скрипт это маленький желтый квадратик, который содержит скрипты, которые можно вызывать с помощью команд RunScript и ScriptTimer. Это нечто вроде процедуры, которая может быть вызвана из другой выполняющейся (с помощью RunScript) части вашего проекта, или запущена параллельно (через ScriptTimer). Обычно объекты-скрипты создаются в процессе разработки проекта. Но теперь благодаря команде CreateScript вы можете создать новый объект-скрипт и во время выполнения приложения и сопоставить ему определенный код с помощью команды SetObjectParam, которая позволяет (начиная с версии 4.9.8) заменять текущий скрипт объекта новым. Код скрипта может быть сгенерирован в другом скрипте, загружен из файла или просто набран в эдитбоксе ;)
Примеры
** создание скрипта с именем "SCRIPT"
CreateScript("SCRIPT","outlabel$")
** назначение нового кода
ScriptParam$='SCRIPT:1='+'Message("Привет!","")'
SetObjectParam("outlabel$","ScriptParam$")
** выполнение созданного скрипта
RunScript("outlabel$")

** создание скрипта с именем "SCRIPT", на этот раз с несколькими строками кода
CreateScript("SCRIPT","outlabel$")
** назначение нового кода
script$='SCRIPT:1='+'For i=1 To 10'+CHR(13)+CHR(10)
script$=script$+'loop$=CHAR(i)'+CHR(13)+CHR(10)
script$=script$+'Message("Loop:","loop$")'+CHR(13)+CHR(10)
script$=script$+'Next i'
SetObjectParam("outlabel$","script$")
** выполнение созданного скрипта
RunScript("outlabel$")



DeleteObject("ИмяОбъекта$")
Пояснение
С помощью этой команды вы можете удалять как динамически созданные объекты, так и объекты, созданные в редакторе. Все что вам нужно, это передать правильное имя (имя существующего объекта) в параметр команды. Будьте осторожны с этой командой! Если вы удалили объект, то единственный путь вернуть его обратно - перезапустить проект или создать объект с помощью команд динамического создания объектов.
Примеры
** удаление объекта "TextBTN"
DeleteObject("TextBTN")

** удаление всех кнопок с TextBTN1 до TextBTN10
For i=1 To 10
DeleteObject("TextBTN[i]")
Next
i

MMB Программирование без границ :: dgilmour, перевод на русский язык, 2007 :: Все права защищены :: www.mmbscript.ru