OberonCore https://forum.oberoncore.ru/ |
|
Рисование: Views, Ports https://forum.oberoncore.ru/viewtopic.php?f=35&t=2588 |
Страница 1 из 1 |
Автор: | comm1x [ Пятница, 23 Апрель, 2010 13:56 ] |
Заголовок сообщения: | Рисование: Views, Ports |
Доброго времени! Ситуация следующая: пишу программу, которая рисует всякие штучки, например синусоида. Так выглядит модуль: Код: MODULE Painter; IMPORT Views, Ports, Math; TYPE View = POINTER TO RECORD (Views.View) END; PROCEDURE (v: View) Restore (f: Views.Frame;l, t, r, b: INTEGER); VAR ... BEGIN //рисую синусоиду END Restore; PROCEDURE Deposit*; VAR v: View; BEGIN NEW(v); Views.Deposit(v) END Deposit; END Painter. (!) "Painter.Deposit; StdCmds.Open" Т.е. как бы выходит некая линейность, которая меня смущает. Одна процедура прорисовывает, другая ее выводит. Хотелось бы сделать следующим образом: пользователь выбирает например не синус, а тангенс. Уже другая процедура прорисовывает, но выводит другая. PS если объясняю не понятно, будьте добры, подскажите хотя бы почему при изменении названия процедуры Restore, выводится ошибка: Missing NEW attribute, куда NEW лепить то? Спасибо! |
Автор: | Иван Горячев [ Пятница, 23 Апрель, 2010 14:21 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
comm1x писал(а): PS если объясняю не понятно, будьте добры, подскажите хотя бы почему при изменении названия процедуры Restore, выводится ошибка: Missing NEW attribute, куда NEW лепить то? Спасибо! NEW лепить после запятой. А запятую - после закрывающей скобки. как завещал великий Language Report: Код: PROCEDURE (v: View) Restore2 (f: Views.Frame;l, t, r, b: INTEGER), NEW; VAR ... А объясняете действительно непонятно. Процедура Restore рисует отображение каждый раз когда его попросит об этом вмещающий контейнер. А в Deposit просто создаётся один экземпляр требуемого отображения. который потом ещё куда-то вставить надо будет, в документ например. Иначе вообще ничего не отрисуется, а свежесозданный объект прибъёт в конце концов сборщик мусора в очередной сеанс экзорцизма. |
Автор: | comm1x [ Пятница, 23 Апрель, 2010 14:35 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Спасибо, я просто не до конца понимаю алгоритма прорисовки. А как быть, если у меня есть скажем 10 различных условий для рисования различных объектов. Т.е. грубо говоря, если n=1 -> Рисуем объект №1, если n=2 ->Рисуем №2, если n=3... и т.д. Как организовать все эти условия, ведь глупо же их все одновременно засовывать в Restore и фаршировать его одними ELSIF? Я думаю, может как-то отдельно создать различные процедуры прорисовки, т.е. Код: PROCEDURE Sin; рисуем синусоиду END; PROCEDURE Cos; рисуем косинусоиду END; PROCEDURE Tan; рисуем тангенсоиду END; ... а потом уже в зависимости от условия вызывать ту или иную процедуру. Но как это реализовать, если эти Restore и Depositы заранее предопределены и рисовать только ими нужно? |
Автор: | Иван Горячев [ Пятница, 23 Апрель, 2010 14:47 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Код: PROCEDURE (v : MyView) DrawSin (f: Views.Frame;l, t, r, b: INTEGER), NEW;
BEGIN ... END DrawSin; PROCEDURE (v : MyView) DrawTan (f: Views.Frame;l, t, r, b: INTEGER), NEW; BEGIN ... END DrawTan; PROCEDURE (v : MyView) Restore (f: Views.Frame;l, t, r, b: INTEGER); BEGIN IF условие THEN v.DrawSin(f, l, t, r, b) ELSE v.DrawTan(f, l, t, r, b) END END Restore; |
Автор: | comm1x [ Пятница, 23 Апрель, 2010 15:22 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Отлично, спасибо! Помогло =) Я счастлив =) |
Автор: | Info21 [ Пятница, 23 Апрель, 2010 18:46 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Иван Горячев писал(а): Код: PROCEDURE (v : MyView) DrawSin (f: Views.Frame;l, t, r, b: INTEGER), NEW;... А методы -- либо интерфейсные (ABSTARCT), либо реализации. |
Автор: | comm1x [ Пятница, 23 Апрель, 2010 19:14 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
А обычные процедуры как сделать? |
Автор: | Валерий Лаптев [ Пятница, 23 Апрель, 2010 20:33 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Info21 писал(а): Иван Горячев писал(а): Код: PROCEDURE (v : MyView) DrawSin (f: Views.Frame;l, t, r, b: INTEGER), NEW;... А методы -- либо интерфейсные (ABSTARCT), либо реализации. Не так делается. Делается абстрактный класс (запись) с абстрактным методом рисования. От него - наследники с конкретным методом рисования. И в основном классе, где расчеты, в нужный метод, передается объект конкретного класса. А этот метод пишется с параметром-объектом абстрактного класса. Тогда основной класс неизменен, а новые рисовалки наследуются от абстрактного класса. |
Автор: | Илья Ермаков [ Пятница, 23 Апрель, 2010 20:48 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Вы, по-моему, не про то... Речь о том, что если связанная процедура (метод) не экспортирована из модуля и не является определением для абстрактной из базового типа, то на кой её вообще делать связанной. Вместо (v: View) DrawSomething (f: Views.Frame,....) объявляется просто DrawSomething (v: View; f: Views.Frame...) |
Автор: | Валерий Лаптев [ Пятница, 23 Апрель, 2010 20:55 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Это я к тому, что в компонентном паскале процедуру в качестве параметра передавать нельзя, а объект с методом - можно. Тогда с помощью описанного известного метода выполняется разделение модели и вида. В данном случае модель - это вычисляемые данные, а вид обеспечивается отдельным классом. |
Автор: | Александр Ильин [ Пятница, 23 Апрель, 2010 21:06 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Валерий Лаптев писал(а): Это я к тому, что в компонентном паскале процедуру в качестве параметра передавать нельзя Разве? Может быть, и процедурные переменные уже отменили?
|
Автор: | Илья Ермаков [ Пятница, 23 Апрель, 2010 21:45 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Ну вот, забили человеку мозги. Совершенно неуместным образом. |
Автор: | comm1x [ Пятница, 23 Апрель, 2010 22:29 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Не, не забили. Я совершенно не понимаю о чем вы ведете диалог. |
Автор: | Валерий Лаптев [ Пятница, 23 Апрель, 2010 22:55 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Ничего, дойдет со временем... Но у меня почему-то отложилось, что процедурных параметров нельзя передавать. Или это шла речь об обероне? |
Автор: | Иван Горячев [ Суббота, 24 Апрель, 2010 01:38 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Валерий Лаптев писал(а): Ничего, дойдет со временем... Но у меня почему-то отложилось, что процедурных параметров нельзя передавать. Или это шла речь об обероне? О КП наверно. Просто в Сообщении о языке на процедурные типы написано "не рекомендуется к использованию и в дальнейшем может быть упразднено". А в методы я всё запихнул исключительно из лени - копипаст и меньше клавиш жать было надо. Понятно что вариантов может быть множество, и выбор каждого зависит от задачи. |
Автор: | Иван Горячев [ Суббота, 24 Апрель, 2010 02:14 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
comm1x писал(а): Не, не забили. Я совершенно не понимаю о чем вы ведете диалог. Есть разные варианты, в зависимости от задач. Тот что я показал - из разряда "наскоряк пойдёт для одного раза". Если каждая отрисовка имеет свои параметры (различные для разных объектов), то делать можно так: Основной модуль: Код: MODULE PrivViews; IMPORT Views; TYPE Drawer* = POINTER TO ABSTRACT RECORD v- : View; (* при отрисовке мы должны использовать данные объекта *) END; View* = POINTER TO RECORD(Views.View) d : Drawer (*у каждого объекта в каждый момент времени - один рисователь*) END; DefDrawer = POINTER TO RECORD (Drawer) (* изначально объект рисоваться не умеет - это заглушка *) END; PROCEDURE (d : Drawer) Draw- (f : Views.Frame; l, t, r, b : INTEGER), NEW, ABSTRACT; PROCEDURE (d : DefDrawer) Draw- (f : Views.Frame; l, t, r, b : INTEGER); BEGIN END Draw; PROCEDURE (v : View) Restore* (f : Views.Frame; l, t, r, b : INTEGER); BEGIN (* если бы не ввели DefDrawer, то здесь пришлось бы проверять на v.d # NIL *) v.d.Draw(f, l, t, r, b) END Restore; (* меняем рисователь для объекта *) PROCEDURE SetDrawer* (v : View; d : Drawer); BEGIN ASSERT (v # NIL, 20); ASSERT (d # NIL, 21); v.d := d; d.v := v END SetDrawer; (* создаём объект с пустым рисователем. Никто не мешает нам создать его и простым NEW, но тогда он не будет правильно инициализирован. Можно и это предусмотреть, но для примера - сойдёт *) PROCEDURE New* () : View; VAR res : View; d : DefDrawer; BEGIN NEW(res); NEW(d); SetDrawer(res, d); RETURN res END New; PROCEDURE Deposit*; BEGIN Views.Deposit(New()) END Deposit; END PrivViews. Модуль реализации рисователей: Код: MODULE PrivViewDrawers; IMPORT PrivViews, Views; TYPE SinDrawer = POINTER TO RECORD (PrivViews.Drawer) END; CosDrawer = POINTER TO RECORD (PrivViews.Drawer) END; TanDrawer = POINTER TO RECORD (PrivViews.Drawer) END; PROCEDURE (d : SinDrawer) Draw- (f : Views.Frame; l, t, r, b : INTEGER); BEGIN тут рисуем синус END Draw; PROCEDURE (d : CosDrawer) Draw- (f : Views.Frame; l, t, r, b : INTEGER); BEGIN тут рисуем косинус END Draw; PROCEDURE (d : TanDrawer) Draw- (f : Views.Frame; l, t, r, b : INTEGER); BEGIN тут рисуем тангенс END Draw; PROCEDURE SetSinDrawer* (v : Views.View); VAR s : SinDrawer; BEGIN WITH v : PrivViews.View DO NEW(s); PrivViews.SetDrawer(v, s) ELSE END END SetSinDrawer; PROCEDURE SetCosDrawer* (v : Views.View); VAR c : CosDrawer; BEGIN WITH v : PrivViews.View DO NEW(c); PrivViews.SetDrawer(v, c) ELSE END END SetCosDrawer; PROCEDURE SetTanDrawer* (v : Views.View); VAR t : TanDrawer; BEGIN WITH v : PrivViews.View DO NEW(t); PrivViews.SetDrawer(v, t) ELSE END END SetTanDrawer; END PrivViewDrawers. Пользуемся например так: Код: PROCEDURE DepositTan;
VAR v : Views.View; BEGIN v := PrivViews.New(); PrivViewDrawers.SetTanDrawer(v); Views.Deposit(v) END DepositTan; |
Автор: | Иван Горячев [ Суббота, 24 Апрель, 2010 02:24 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
Если отрисовка для всех объектов одинаковая, тогда можно проще: Основной модуль: Код: MODULE PrivViews; IMPORT Views; TYPE Drawer* = PROCEDURE (v : View; f : Views.Frame; l, t, r, b : INTEGER); View* = POINTER TO RECORD(Views.View) d : Drawer END; PROCEDURE DefDraw (v : View; f : Views.Frame; l, t, r, b : INTEGER); BEGIN END DefDraw; PROCEDURE (v : View) Restore* (f : Views.Frame; l, t, r, b : INTEGER); BEGIN v.d(v, f, l, t, r, b) END Restore; PROCEDURE SetDrawer* (v : View; d : Drawer); BEGIN ASSERT (v # NIL, 20); ASSERT (d # NIL, 21); v.d := d END SetDrawer; PROCEDURE New* () : View; VAR res : View; BEGIN NEW(res); SetDrawer(res, DefDraw); RETURN res END New; PROCEDURE Deposit*; BEGIN Views.Deposit(New()) END Deposit; END PrivViews. Модуль рисователей: Код: MODULE PrivViewDrawers; IMPORT PrivViews, Views; PROCEDURE SinDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER); BEGIN END SinDrawer; PROCEDURE CosDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER); BEGIN END CosDrawer; PROCEDURE TanDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER); BEGIN END TanDrawer; PROCEDURE SetSinDrawer* (v : Views.View); BEGIN WITH v : PrivViews.View DO PrivViews.SetDrawer(v, SinDrawer) ELSE END END SetSinDrawer; PROCEDURE SetCosDrawer* (v : Views.View); BEGIN WITH v : PrivViews.View DO PrivViews.SetDrawer(v, CosDrawer) ELSE END END SetCosDrawer; PROCEDURE SetTanDrawer* (v : Views.View); BEGIN WITH v : PrivViews.View DO PrivViews.SetDrawer(v, TanDrawer) ELSE END END SetTanDrawer; END PrivViewDrawers. Если в предыдущем варианте каждому объекту создавался свой рисователь, то здесь они все общие. Зато параметры рисования либо одинаковые у всех, либо должны храниться непосредственно в объекте |
Автор: | Info21 [ Суббота, 24 Апрель, 2010 10:10 ] |
Заголовок сообщения: | Re: Рисование: Views, Ports |
drawer (drô´er) noun 1. One that draws, especially one that draws an order for the payment of money. 2. (also drôr). A boxlike compartment in furniture that can be pulled out and pushed in. 3. drawers (drôrz). Underpants. Excerpted from The American Heritage® Dictionary of the English Language, Third Edition © 1996 by Houghton Mifflin Company. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |