OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 13:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Properties.Property
СообщениеДобавлено: Суббота, 29 Апрель, 2006 18:17 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Как связать свой диалог свойств с выбором в контекстном меню пункта Properties.. для собственного View? Вроде есть какая-то связь между строкой в файле Strings.odc по типу -
Scrollers.Prop StdScrollers.InitDialog; StdCmds.OpenToolDialog('Std/Rsrc/Scroller', 'Scroller').
Как мою форму со свойствами для моего же вида отобразить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 29 Апрель, 2006 22:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
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 будет выполняться указанная команда, то есть, инициализироваться и открываться диалог.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 15:33 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Всё, что Вы написали, я сделал до того как послал сюда вопрос :). Послал вопрос, вытащил "красный глаз", компьютер перезагрузился (почему-то), запустил BlackBox и всё заработало :)
Вот только нигде в помощи я не нашел, что именно так и надо делать со свойствами. Плохо документированна среда, несмотря на примеры. Помощь можно искать только в исходном коде (кстати, информацию о свойствах нашел именно в исходниках), в котором практически нет комментариев и очень много чего не описано. Пример:
Код:
Views.InstallFrame(host, view, 0, 0, 0, TRUE);
g := Views.ThisFrame(host, view);

Теперь g.mark = TRUE - а в помощи ни слова :(. А пытаюсь эту рамку пометить, а она, оказывается, уже помечена, эффекта ноль. Выходит, что время на понимание среды уйдет столько же, как на дельфи + winapi для нестандартных задач.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 15:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Cardinal писал(а):
Выходит, что время на понимание среды уйдет столько же, как на дельфи + winapi для нестандартных задач.

Надо чтобы кто-то опытный написал хорошую книгу по блэкбоксу... :roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 19:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А можно, кстати, и без Prop привязать диалог к контекстному меню - непосредственно к типу отображения:
<имя_модуля_без_имени_подсистемы>.MyView <команды открытия диалога>
Только это менее гибко, т.к. возникает жесткая привязка к конкретному типу. А одно и то же Property могут поддерживать много разных отображений, о которых диалог может вообще ничего не знать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 17 Октябрь, 2006 15:08 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Есть отображение. Для получения его свойств жму Ctrl + пробел, вокруг отображения появляется рамка, жму правую кнопку мыши и в появившемя контекстном меню выбираю Properties..... , появляется мое окно свойств.
Вопрос: как вызвать окно свойств моего отображения, не нажимая ctrl + пробел, .... а например, по двойному клику на отображении?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 17 Октябрь, 2006 19:08 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я делал такую вещь, вот пример:

Код:
   PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Views.CtrlMessage;
      VAR focus: Views.View);
      VAR res: INTEGER;
            host: Views.View;
            c: Containers.Controller;
   BEGIN
         WITH msg: Controllers.TrackMsg DO
            host := Views.HostOf(f).view;
            WITH host: Containers.View DO
               c := host.ThisController();
               IF c # NIL THEN
                  c.SetSingleton(v)
               END
            ELSE
            END;
            Dialog.Call("StdCmds.ShowProp", "", res)
         | msg: Controllers.PollCursorMsg DO
            msg.cursor := Ports.refCursor
         ELSE
         END
   END HandleCtrlMsg;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 18 Октябрь, 2006 13:47 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Спасибо :). К Вашему способу ещё добавил удаление рамки
Код:
v.controller.SetSingleton( NIL )


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB