OberonCore https://forum.oberoncore.ru/ |
|
Properties.Property https://forum.oberoncore.ru/viewtopic.php?f=24&t=190 |
Страница 1 из 1 |
Автор: | Cardinal [ Суббота, 29 Апрель, 2006 18:17 ] |
Заголовок сообщения: | Properties.Property |
Как связать свой диалог свойств с выбором в контекстном меню пункта Properties.. для собственного View? Вроде есть какая-то связь между строкой в файле Strings.odc по типу - Scrollers.Prop StdScrollers.InitDialog; StdCmds.OpenToolDialog('Std/Rsrc/Scroller', 'Scroller'). Как мою форму со свойствами для моего же вида отобразить? |
Автор: | Илья Ермаков [ Суббота, 29 Апрель, 2006 22:18 ] |
Заголовок сообщения: | |
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 будет выполняться указанная команда, то есть, инициализироваться и открываться диалог. |
Автор: | Cardinal [ Вторник, 02 Май, 2006 15:33 ] |
Заголовок сообщения: | |
Всё, что Вы написали, я сделал до того как послал сюда вопрос ![]() ![]() Вот только нигде в помощи я не нашел, что именно так и надо делать со свойствами. Плохо документированна среда, несмотря на примеры. Помощь можно искать только в исходном коде (кстати, информацию о свойствах нашел именно в исходниках), в котором практически нет комментариев и очень много чего не описано. Пример: Код: Views.InstallFrame(host, view, 0, 0, 0, TRUE);
g := Views.ThisFrame(host, view); Теперь g.mark = TRUE - а в помощи ни слова ![]() |
Автор: | Сергей Губанов [ Вторник, 02 Май, 2006 15:44 ] |
Заголовок сообщения: | |
Cardinal писал(а): Выходит, что время на понимание среды уйдет столько же, как на дельфи + winapi для нестандартных задач.
Надо чтобы кто-то опытный написал хорошую книгу по блэкбоксу... ![]() |
Автор: | Илья Ермаков [ Вторник, 02 Май, 2006 19:39 ] |
Заголовок сообщения: | |
А можно, кстати, и без Prop привязать диалог к контекстному меню - непосредственно к типу отображения: <имя_модуля_без_имени_подсистемы>.MyView <команды открытия диалога> Только это менее гибко, т.к. возникает жесткая привязка к конкретному типу. А одно и то же Property могут поддерживать много разных отображений, о которых диалог может вообще ничего не знать. |
Автор: | Cardinal [ Вторник, 17 Октябрь, 2006 15:08 ] |
Заголовок сообщения: | |
Есть отображение. Для получения его свойств жму Ctrl + пробел, вокруг отображения появляется рамка, жму правую кнопку мыши и в появившемя контекстном меню выбираю Properties..... , появляется мое окно свойств. Вопрос: как вызвать окно свойств моего отображения, не нажимая ctrl + пробел, .... а например, по двойному клику на отображении? |
Автор: | Илья Ермаков [ Вторник, 17 Октябрь, 2006 19:08 ] |
Заголовок сообщения: | |
Я делал такую вещь, вот пример: Код: 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; |
Автор: | Cardinal [ Среда, 18 Октябрь, 2006 13:47 ] |
Заголовок сообщения: | |
Спасибо ![]() Код: v.controller.SetSingleton( NIL )
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |