Каркас Блекбокса позволяет расширять доступные элементы управления, которые возможно затем везде использовать в формах и составных документах.
Элемент управления связывается с данными в вашем модуле, и может отображать данные графически.
Ниже предлагаю простой пример элемента управления, отображающего связанную с ним переменную типа INTEGER в виде круга цвета Ports.color = переменной.
Код:
MODULE LumiInd;
IMPORT Controls, Meta, Ports, Properties, Views;
TYPE
Indicator = POINTER TO RECORD (Controls.Control) END;
PROCEDURE (ind: Indicator) Restore (f: Views.Frame; l, t, r, b: INTEGER);
BEGIN
IF ind.item.Valid() & ~ ind.disabled THEN
f.DrawOval(0, 0, 20 * f.dot, 20 * f.dot, - 1, ind.item.IntVal())
END;
IF ind.disabled THEN
f.DrawOval(0, 0, 20 * f.dot, 20 * f.dot, f.dot, Ports.grey50)
ELSE
f.DrawOval(0, 0, 20 * f.dot, 20 * f.dot, f.dot, Ports.black)
END
END Restore;
PROCEDURE (ind: Indicator) HandlePropMsg2 (VAR msg: Properties.Message);
BEGIN
WITH msg: Properties.SizePref DO
IF (msg.w = Views.undefined) OR (msg.h = Views.undefined) THEN
msg.w := 15 * Ports.point; msg.h := 15 * Ports.point
END
ELSE END
END HandlePropMsg2;
PROCEDURE (ind: Indicator) Update (f: Views.Frame; op, from, to: INTEGER);
BEGIN
ind.Restore(f, f.l, f.t, f.r, f.b)
END Update;
PROCEDURE (ind: Indicator) CheckLink (VAR ok: BOOLEAN);
BEGIN
ok := ind.item.typ = Meta.intTyp
END CheckLink;
PROCEDURE NewControl (p: Controls.Prop): Views.View;
VAR ind: Indicator;
BEGIN
NEW(ind);
Controls.OpenLink(ind, p);
RETURN ind
END NewControl;
PROCEDURE Deposit*;
VAR p: Controls.Prop;
BEGIN
NEW(p); p.link := ""; p.label := ""; p.guard := ""; p.notifier := "";
Views.Deposit(NewControl(p))
END Deposit;
END LumiInd.
Чтобы вставить элемент управления в форму или документ, необходимо выполнить команду "LumiInd.Deposit; StdCmds.PasteView".