Привет!
Со временем можно приспособить Free Oberon и для работы с Ofront+. Уверен, что это будет совсем несложно. Я выбрал voc, потому что мне срочно нужна была рабочая версия для того, чтобы начать обучение группы по Оберону. Кстати, у нас уже было 7 занятий, в группу поступили ещё 4 новичка. Пока усиленно пишем циклы WHILE, и используем почти только тип INTEGER. Скоро будем вводить процедуры и массивы. Всем очень нравится, особенно мне
Одной девушке эти занятия помогли сдать программирование в институте на отлично (первый курс компьютерных наук), другому парню пригодилось для Паскаля в школе, остальные просто учат, некоторые дома решают задачи.
Многомодульные проекты обязательно надо делать, это будет следующий существенный шаг в развитии Free Oberon.
Кроме того, для этого надо бы сделать многооконную систему, то есть чтобы можно было держать открытыми сразу несколько текстовых файлов. В свою очередь, для этого нужна полноценная система (псевдо-)графического интерфейса, я её как раз и разрабатываю в свободное время. Модуль Gui.Mod, который работает на Graph.Mod. Написано уже очень много кода, получилась система, напоминающая VCL в Делфи и подобные вещи. При этом я использовал метод построения объектов из Оберон-07 (см. запись MethodDesc), а не систему Оберон-02. Решил посмотреть, насколько это удобно. Вроде бы, неплохо.
Пример:
Код: "OBERON"
MODULE TestGui;
IMPORT G := Graph, Gui, Out;
VAR screen: G.Bitmap; f: Gui.Form; b: Gui.Button;
BEGIN
G.Settings(640, 480, {G.fullscreen, G.spread, G.sharpPixels, G.initMouse});
screen := G.Init();
IF screen = NIL THEN Out.String('Grpah init failed.'); Out.Ln
ELSE
Gui.Init(screen);
f := Gui.NewForm();
f.do.setBounds(f, 0, 0, screen.w, screen.h);
b := Gui.NewButton('Finish');
b.do.setBounds(b, f.w - 100, f.h - 33, 90, 23);
f.do(Gui.ContainerMethod).append(f, b);
Gui.Run(f);
G.Close
END
END TestGui.
Весь интерфейс, включая указатель мышки, отрисовывается в Обероне. На снимке отпечатался указатель ОС, но в программе он не виден.
А обработчики событий подключаются так:
(При нажатии кнопки она будет двигаться на 5 пикселей влево.)
Код: "OBERON"
PROCEDURE FinishClick(c: Gui.Component);
BEGIN
c.do.setX(c, c.x - 5)
END FinishClick;
...
b.do.setOnClick(b, FinishClick);
Пока что есть события MouseDown, MouseUp, MouseMove, MouseEnter, MouseLeave, KeyDown, TextInput, Click, GetFocus, LostFocus.
Седалны компоненты: Form, Button, Edit, Panel, ScrollBox и можно создавать свои.
Модуль Gui занимает 1172 строки. Graph и SDL2 тоже кое-как подправлен, в SDL2 исправлено несколько глюков.
* * *
Что-то я увлёкся рассказом о Gui, но эту наработку и надо будет использовать в Free Oberon, чтобы сделать многооконный режим, как в Турбо Паскале.
Ещё одна проблема, которую предстоит решить — это понять, как среда будет понимать, что ей делать, когда пользователь нажимает F9 (компиляция и запуск). Хотелось бы сделать, чтобы простые одномодульные программки можно было писать также, как сейчас — чтобы не надо было создавать «проект» под каждый HelloWorld как в каком-нибудь Делфи, и, соответственно, выделять под него каталог и прочее...
При этом, нельзя сделать и так, чтобы среда сама определяла, что́ перед ней: многомодульный проект или просто модуль, который надо бы запустить. В Обероне нет отдельного слова "PROGRAM" (и это хорошо), но это только одна сторона проблемы. А что если человек создаст проект в отдельном каталоге, а потом в тот же каталог накидает файлов-одиночек? Что среда должна делать, когда открывает файл-одиночку: предполагать, что это часть проекта или нет? В общем, надо как-то придумать, чтоб удобно было. Задача это, как оказалось, нетривиальная, учитывая что мы используем язык Оберон для создания обычных «приложений», а не «новой части модульной системы» ОС Оберон.
* * *
Насчёт шрифтов, мне пару человек тоже про это сказали. Кому-то не нравится, что шрифт смазанный, когда окно раздвинуто на весь экран. SDL2 выводит всё через текстуру, то есть увеличение (даже в оконном режиме) можно производить на дробные числа, например, увеличить шрифт в 1,7 раза.
Есть ещё другая идея — позволять пользователю выбирать шрифт, ну и, разумеется, сделать несколько шрифтов на выбор: побольше, поменьше, посовременней, поаркадней… Но для этого сначала надо как-то переделать кодировку, чтобы всё работало через UTF-8, а то сейчас получается, что файлы сохраняются в UTF-8, откомпилированная программа работает в UTF-8, а Free Oberon всё воспринимает и внутренне представляет в кодировке CP866. В итоге, если кто-то использует русский язык в программе, то в Терминале Оберона она работает правильно, а в Command Prompt — нет (там UTF-8 не работает), на Линуксе такой проблемы нет. В общем-то, что делать с Command Prompt'ом — непонятно.
Может быть, сделать, чтобы каждый шрифт был представлен не BMP-файлом, а каталогом с BMP-файлами, в котором будет текстовый файл с настройками, а в каждом BMP-файле — какой-либо диапазон юникода.
Ещё надо предусмотреть какой-нибудь модуль для людей, чтобы можно было с русскими буквами работать нормально. Например, перебирать их в строке. Дейв мне объяснял, что придётся делать так.
Артур