1) Объявляете свое свойство:
Код:
MODULE MyMod;
Prop* = POINTER TO RECORD (Properties.Property)
opt0: INTEGER; opt1: BOOLEAN ....
END;
(* Для каждого из полей свойства объявляете уникальную константу *)
CONST
opt0 = 0;
opt1 = 1;
...
(* У Properties есть поле valid: SET, которое определяет, какие из полей данного свойства корректны. Например, {opt0,opt1} - все корректны.
Аналогичные поля known и readOnly используются при показе диалога, определяют, как показывать эл-ты управления для данных полей *)
(* Затем задается операция сравнения для наших свойств. Сравниваются только поля, корректные у обоих переменных.
p.valid после выполнения определяет равные поля *)
PROCEDURE (p: Prop) IntersectWith* (q: Properties.Property; OUT equal: BOOLEAN);
VAR valid: SET;
BEGIN
WITH q: Prop DO
valid := p.valid * q.valid;
equal := TRUE;
IF p.opt0 # q.opt0 THEN
EXCL(valid, opt0)
END;
IF p.opt1 # q.opt1 THEN
EXCL(valid, transparent)
END;
IF p.valid # valid THEN
p.valid := valid;
equal := FALSE
END
END
END IntersectWith;
(* Затем в процедуре HandlePropMsg нашего отображения обеспечиваем считывание/установку тех свойств, каких надо.
В том числе своих собственных *)
| msg: Properties.PollMsg DO
... (* создаем и инициализируем наш prop *) ...
Properties.Insert(msg.prop, prop); (* цепляем к сообщению наш prop *)
| msg: Properties.SetMsg DO
p := msg.prop;
WHILE p # NIL DO (* смотрим, какие свойства прицеплены к сообщению *)
(* какие умеем, принимаем *)
WITH p: Prop DO
(* применяем свое родное *)
| (* применяем какие-то другие, если нужно *)
ELSE
END;
p := p.next
END
2) Создаем диалог, пишем процедуру его инициализации.
Код:
PROCEDURE InitDialog;
VAR p: Properties.Property;
BEGIN
Properties.CollectProp(p); (* Собираем все свойства текущего отображения *)
WHILE (p # NIL) & ~(p IS Prop) DO
p := p.next
END;
IF p # NIL THEN
... здесь устанавливаем все галочки, поля и т.п.
END
END InitDialog;
(* Процедура, отсылающая свойства к отображению по нажатию OK *)
PROCEDURE Ok;
VAR p: Prop;
BEGIN
NEW(p); ... все выставляем ...
p.valid := {те свойства. которые определены в диалоге}
Properties.EmitProp(NIL, p)
END Ok;
3) Пишем в Strings той подсистемы, в которой View:
<имя модуля без имени подсистемы>.Prop MyMod.InitDialog;StdCmds.OpenToolDialog('My/Rsrc/Dlg', 'Свойства')
Теперь при вызове контекста на отображении, которое отдает среди прочих свойство типа MyMod.Prop будет выполняться указанная команда, то есть, инициализироваться и открываться диалог.