OberonCore
https://forum.oberoncore.ru/

Простейший пример нового элемента управления
https://forum.oberoncore.ru/viewtopic.php?f=35&t=4166
Страница 1 из 1

Автор:  Иван Денисов [ Четверг, 22 Ноябрь, 2012 07:06 ]
Заголовок сообщения:  Простейший пример нового элемента управления

Каркас Блекбокса позволяет расширять доступные элементы управления, которые возможно затем везде использовать в формах и составных документах.

Элемент управления связывается с данными в вашем модуле, и может отображать данные графически.

Ниже предлагаю простой пример элемента управления, отображающего связанную с ним переменную типа 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".

Автор:  adva [ Среда, 19 Март, 2014 08:50 ]
Заголовок сообщения:  Re: Простейший пример нового элемента управления

Я правильно понял, что создание элемента управления делается только в коде, никаких форм при этом не используется? Вопрос вообще про элементы управления, не обязательно про конкретный

Автор:  Иван Кузьмицкий [ Среда, 19 Март, 2014 10:44 ]
Заголовок сообщения:  Re: Простейший пример нового элемента управления

adva писал(а):
Я правильно понял, что создание элемента управления делается только в коде, никаких форм при этом не используется? Вопрос вообще про элементы управления, не обязательно про конкретный
Блэкбокс - документоориентированная среда. В документ можно встраивать любые отображения. Контролы тоже являются отображениями. И формы - тоже отображения, контейнерного типа. На формах можно размещать любые контролы. Эталон ББ имеет стандартный набор контролов, которые можно бросать на форму и визуально корректировать их геометрию.

Если говорить про создание своего типа контрола, то это только программно, расширяя тип стандартного контрола. Если говорить про порождение нового экземпляра контрола и встраивание его в визуальный контейнер, то тут цепочка такая - надо выделить память под контрол и разместить его в системной очереди отображений. Дальше можно использовать команды каркаса по вытаскиванию отображения из очереди.

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