OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 14 Октябрь, 2019 11:13

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 13:56 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Доброго времени!
Ситуация следующая: пишу программу, которая рисует всякие штучки, например синусоида. Так выглядит модуль:
Код:
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 лепить то?

Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 14:21 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
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 просто создаётся один экземпляр требуемого отображения. который потом ещё куда-то вставить надо будет, в документ например. Иначе вообще ничего не отрисуется, а свежесозданный объект прибъёт в конце концов сборщик мусора в очередной сеанс экзорцизма.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 14:35 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Спасибо, я просто не до конца понимаю алгоритма прорисовки.

А как быть, если у меня есть скажем 10 различных условий для рисования различных объектов. Т.е. грубо говоря, если n=1 -> Рисуем объект №1, если n=2 ->Рисуем №2, если n=3... и т.д. Как организовать все эти условия, ведь глупо же их все одновременно засовывать в Restore и фаршировать его одними ELSIF?
Я думаю, может как-то отдельно создать различные процедуры прорисовки, т.е.
Код:
PROCEDURE Sin;
рисуем синусоиду
END;
PROCEDURE Cos;
рисуем косинусоиду
END;
PROCEDURE Tan;
рисуем тангенсоиду
END;
...

а потом уже в зависимости от условия вызывать ту или иную процедуру. Но как это реализовать, если эти Restore и Depositы заранее предопределены и рисовать только ими нужно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 14:47 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 15:22 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Отлично, спасибо! Помогло =) Я счастлив =)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 18:46 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8180
Откуда: Троицк, Москва
Иван Горячев писал(а):
Код:
PROCEDURE (v : MyView) DrawSin (f: Views.Frame;l, t, r, b: INTEGER), NEW;...
Только вряд ли рекомендуется делать подобные вспомогательные процедуры методами. Просто обычные процедуры.

А методы -- либо интерфейсные (ABSTARCT), либо реализации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 19:14 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
А обычные процедуры как сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 20:33 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3091
Откуда: Астрахань
Info21 писал(а):
Иван Горячев писал(а):
Код:
PROCEDURE (v : MyView) DrawSin (f: Views.Frame;l, t, r, b: INTEGER), NEW;...
Только вряд ли рекомендуется делать подобные вспомогательные процедуры методами. Просто обычные процедуры.
А методы -- либо интерфейсные (ABSTARCT), либо реализации.

Не так делается.
Делается абстрактный класс (запись) с абстрактным методом рисования. От него - наследники с конкретным методом рисования. И в основном классе, где расчеты, в нужный метод, передается объект конкретного класса. А этот метод пишется с параметром-объектом абстрактного класса.
Тогда основной класс неизменен, а новые рисовалки наследуются от абстрактного класса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 20:48 
Модератор
Аватара пользователя

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

Речь о том, что если связанная процедура (метод) не экспортирована из модуля и не является определением для абстрактной из базового типа, то на кой её вообще делать связанной.

Вместо (v: View) DrawSomething (f: Views.Frame,....) объявляется просто DrawSomething (v: View; f: Views.Frame...)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 20:55 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3091
Откуда: Астрахань
Это я к тому, что в компонентном паскале процедуру в качестве параметра передавать нельзя, а объект с методом - можно. Тогда с помощью описанного известного метода выполняется разделение модели и вида. В данном случае модель - это вычисляемые данные, а вид обеспечивается отдельным классом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 21:06 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Это я к тому, что в компонентном паскале процедуру в качестве параметра передавать нельзя
Разве? Может быть, и процедурные переменные уже отменили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 21:45 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9147
Откуда: Россия, Орёл
Ну вот, забили человеку мозги. Совершенно неуместным образом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 22:29 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Не, не забили. Я совершенно не понимаю о чем вы ведете диалог. :mrgreen:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Пятница, 23 Апрель, 2010 22:55 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3091
Откуда: Астрахань
Ничего, дойдет со временем... :)
Но у меня почему-то отложилось, что процедурных параметров нельзя передавать. Или это шла речь об обероне?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Суббота, 24 Апрель, 2010 01:38 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Валерий Лаптев писал(а):
Ничего, дойдет со временем... :)
Но у меня почему-то отложилось, что процедурных параметров нельзя передавать. Или это шла речь об обероне?

О КП наверно. Просто в Сообщении о языке на процедурные типы написано "не рекомендуется к использованию и в дальнейшем может быть упразднено".

А в методы я всё запихнул исключительно из лени - копипаст и меньше клавиш жать было надо. :oops:
Понятно что вариантов может быть множество, и выбор каждого зависит от задачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Суббота, 24 Апрель, 2010 02:14 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
comm1x писал(а):
Не, не забили. Я совершенно не понимаю о чем вы ведете диалог. :mrgreen:

Есть разные варианты, в зависимости от задач. Тот что я показал - из разряда "наскоряк пойдёт для одного раза".

Если каждая отрисовка имеет свои параметры (различные для разных объектов), то делать можно так:

Основной модуль:
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Суббота, 24 Апрель, 2010 02:24 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Если отрисовка для всех объектов одинаковая, тогда можно проще:

Основной модуль:
Код:
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.


Если в предыдущем варианте каждому объекту создавался свой рисователь, то здесь они все общие. Зато параметры рисования либо одинаковые у всех, либо должны храниться непосредственно в объекте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование: Views, Ports
СообщениеДобавлено: Суббота, 24 Апрель, 2010 10:10 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8180
Откуда: Троицк, Москва
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.


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

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


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

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


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

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