OberonCore
https://forum.oberoncore.ru/

Неожиданные или недокументированные находки
https://forum.oberoncore.ru/viewtopic.php?f=1&t=4344
Страница 1 из 1

Автор:  Иван Кузьмицкий [ Вторник, 07 Май, 2013 11:33 ]
Заголовок сообщения:  Неожиданные или недокументированные находки

Есть понятие процедуры-охранника (или процедуры-предохранителя, как угодно). Эта процедура семантически привязана к одному контролу. Но иногда удобно обрабатывать одним охранником сразу группу контролов, при этом возникает потребность различать, какой контрол в данном случае "предохраняется".

В документации (в исходнике такого нет) модуля Dialog объявлена сигнатура расширенного охранника
Код:
PROCEDURE (n: INTEGER; VAR par: Par);
но как им пользоваться, не указано (по крайней мере, мне не удалось найти в документации ничего подобного).

Такая сигнатура используется в Controls, а используемый в редакторе свойств синтаксис вызова охранника выглядит так:
Код:
PrivInteractors.Guard(1)
Цифра, указанная в скобках, передаётся в процедуру расширенного охранника как параметр n и это даёт возможность различать контролы.

P.S. Пример использования я обнаружил в CpcBookmarks

Автор:  Александр Ильин [ Вторник, 07 Май, 2013 11:43 ]
Заголовок сообщения:  Re: Неожиданные или недокументированные находки

Иван Кузьмицкий писал(а):
P.S. Пример использования я обнаружил в CpcBookmarks
Хе-хе : )

Автор:  Пётр Кушнир [ Вторник, 07 Май, 2013 15:37 ]
Заголовок сообщения:  Re: Неожиданные или недокументированные находки

Уведомитель тоже такое поддерживает:
Цитата:
PROCEDURE DefaultNotifier* (n: INTEGER; op, from, to: INTEGER);

Автор:  Евгений Темиргалеев [ Среда, 08 Май, 2013 20:08 ]
Заголовок сообщения:  Re: Неожиданные или недокументированные находки

Кх... кому неожиданная находка, кому --- неожиданный вопрос. :) вот ещё пример: http://oberoncore.ru/wiki/blackbox/ex/c ... ean_as_set

Автор:  Пётр Кушнир [ Вторник, 04 Июнь, 2013 13:06 ]
Заголовок сообщения:  Re: Неожиданные или недокументированные находки

Код из StdLog:
Код:
   PROCEDURE* Guard (o: ANYPTR): BOOLEAN;
   BEGIN
      RETURN
         (o # NIL) &
         ~(      (o IS TextModels.Model) & (o = text)
            OR   (o IS Stores.Domain) & (o = text.Domain())
            OR   (o IS TextViews.View) & (o(TextViews.View).ThisModel() = text)
         )
   END Guard;

   PROCEDURE* ClearBuf;
      VAR subBuf: TextModels.Model;
   BEGIN
      subBuf := subOut.rider.Base(); subBuf.Delete(0, subBuf.Length())
   END ClearBuf;

   PROCEDURE* FlushBuf;
      VAR buf: TextModels.Model;
   BEGIN
      buf := subOut.rider.Base();
      IF buf.Length() > 0 THEN
         IF ~Log.synch THEN Open() END;
         text.Append(buf)
      END
   END FlushBuf;

   PROCEDURE* SubFlush;
   BEGIN
      IF Log.synch THEN
         FlushBuf;
         IF Log.force THEN Views.RestoreDomain(text.Domain()) END
      END;
   END SubFlush;


Вот ещё одна необычная штука. Обратите внимание на звёздочки.

Автор:  Иван Кузьмицкий [ Среда, 05 Июнь, 2013 13:26 ]
Заголовок сообщения:  Re: Неожиданные или недокументированные находки

В документации к Controls написано, что контрол CheckBox можно связывать с интерактором типа Dialog.Selection:
Цитата:
A check box can also be linked to a Dialog.Selection field or variable. The level property then indicates which element of the val set of the selection is inspected.

Additional property:
level if a check box is linked to a set or to a Dialog.Selection variable, then the level field
indicates which set element is displayed by the control.
Это было неожиданно. Но на самом деле, это невозможно сделать, так как проверка интерактора для CheckBox делается только для BOOLEAN и SET:
Код:
PROCEDURE (c: CheckBox) CheckLink (VAR ok: BOOLEAN);
BEGIN
   ok := (c.item.typ = Meta.boolTyp) OR (c.item.typ = Meta.setTyp)
END CheckLink;
А жаль...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/