Редактор алгоритмов dalvjaz2 v.0.9.3.2.0
Программа еще сырая, т.к. это первая версия под BlackBox.
Некоторые места еще не отлажены и некоторые задумки еще не
реализованы.
Диалог программы является макетным, т.к. главным для меня было
перенести алгоритмы работы dalvjaz2 из Delphi в BlackBox, а не
пригладить внешний вид. Одним из проявлений этого является то, что
в Delphi я сначала рисовал окно во внутреннем BMP-изображении, а
уже потом копировал его в канву формы, а в BlackBox я строю
изображение прямо в рамке отображения, что иногда приводит к
заметному мерцанию при перерисовке изображения. Как я понимаю,
надо будет разбираться, как работать с растрами.
В общем творческий процесс идет, завершено перетаскивание под
BlackBox алгоритмов работы dalvjaz2, удалось отобразить схему
"Морозко".
Вложение:
001.png [ 62.97 КБ | Просмотров: 164 ]
Разработка ведется в win32, но программа собирается и запускается
и под linux.
Но есть 3 проблемы, которыми хочу поделиться. Может, кто и
подскажет что-нибудь.
Чтобы было понятно, о чем я буду спрашивать, вкратце опишу логику
работы dalvjaz2 под BlackBox.
Основная логика работы
Программа dalvjaz2, в отличие от СДЧ, должна одновременно
работать с несколькими окнами.
Взяв за основу пример Twins, где в одном окне создаются 2
дочерних отображения, я заменил окна документов окнами простого
графического редактора из примера Lines и получил модуль Lines3,
который и послужил прототипом для оконной системы dalvjaz2.
Сейчас работа идет с пятью дочерними окнами:
- окно верхних кнопок num_top;
- левое окно текста записи num_left;
- правое окно схемы (рисунка) num_right;
- окно файла комментариев num_bottom;
- окно нижних кнопок и сообщений num_bot_kn.
В отличие от СДЧ, сейчас у меня не одна книга (файл), а
несколько.
Файлы хранятся в массиве VpMybook.My_books.
VpMybook.tek_book - индекс текущего файла.
Файл комментариев хранится в VpMybook.My_book2.
Указатель на текущий файл VpMybook.My_book в зависимости от
режима работы может указывать либо на один из файлов массива
My_books, либо на файл комментариев My_book2.
Переключение между окнами и, соответственно, файлами производится
следующим образом:
VpMyDialog.win_number := win_num;
VpMyDialog.form_My_book__ns(ns);
В form_My_book__ns задаются указатель My_book и номер скроллера для
выбираемого окна.
Альтернативный вариант:
VpMybook.focus_win := num_left;
Set_win_number;
аналогичен нервому:
PROCEDURE Set_win_number;
VAR ns:INTEGER;
BEGIN
VpMyDialog.win_number := VpMybook.focus_win;
VpMyDialog.form_My_book__ns(ns);
END Set_win_number;
При отрисовке окон:
VpDalvjaz2.View_2.Restore ->
VpRestore.Restore(v.num, f, l, t, r, b),
в начале которой тоже по полученному параметру задается номер
отрисосвываемого окна и указатель на файл.
Проблема 1:
В процедуре VpMyDialog.Insert_comment перед записью измененной
строки с добавленным комментарием :
VpPerekod.StrCopy(stro, VpMybook.My_book.GiveStr(
VpMybook.My_book.n_sel)^);
пришлось вставить защитное задание окна и указателя на нужный файл,
т.к. без этого строка записывалась в файл комментариев.
Вопрос:
Может ли прорисовка окон прерывать ход выполнения процедуры,
в результате чего содержимое указателя My_book меняется на файл,
окно которого было перерисовано в последнюю очередь ?
Проблема 2:
Иногда при попытке сдвинуть границу окон текста и схемы при
наведении указателя мыши на границу операция сдвига не
активируется. В этом случае следует навести указатель мыши на
левую границу окна программы, после чего снова попробовать
выполнить сдвиг границы окон текста и схемы, или воспользоваться
клавишами Alt+"<-" и Alt+"->".
Обработка сдвига вертикальной границы текста и схемы производится
в процедуре VpDalvjaz2.View.HandleCtrlMsg по событиям
msg: Controllers.CursorMessage
msg: Controllers.PollCursorMsg - здесь задается форма
указателя мыши
msg: Controllers.TrackMsg - здесь производится изменение
границы текста и схемы.
Примечание: Левые границы дочерних отображений задаются на 2 мм.
правее левой границы основного окна в процедуре
VpDalvjaz2.RecalcLayout
Проблема 3:
Иногда при вызове по клавише клавиатуры окна диалога
(редактирование, конфигурация) программа зависает по Trap division
by zero в процедуре Ports.Frame.Drawrect
Вложение:
002.png [ 23.63 КБ | Просмотров: 164 ]
При вызове диалогов по клику мышью на соответствующей кнопке
диалога такого у меня не было.
Раньше уже были падения в процедуре Ports.Frame.Drawrect по
нарушению предусловия: t > b, так что я написал процедуру
VpRestore.MyDrawRect, в которой ввел защиту на этот случай, а также
проверку рамки, в которой будет рисоваться прямоугольник - чтобы
это была одна из моих рамок, а не какая-нибудь другая и не NIL. Но
в данном случае это не помогло.
Сообщения от клавиатуры обрабатываются в процедуре
VpDalvjaz2.View.HandleCtrlMsg
При вызове окон диалога флаг
VpMyDialog.fl_redraw_after_key = FALSE
По значению переменной qqq = 1 видно, что Trap происходит при
первом вызове MyDrawRect в процедуре VpDalvjaz2.View.Restore,
когда производится перерисовка фона главного окна программы.
Краткое описание алгоритмического языка ДАЛВЯЗ 2 приведено
в файле dal2_short.pdf.
Вложение:
dal2_short.pdf [153.13 КБ]
Скачиваний: 4
Краткое описание программы dalvjaz2 приведено в файле
/Rsrc/txt/Dal2doc.utf8, находящемся в архиве dal2v09320.zip,
который следует развернуть в каталог Vp.
Вложение:
dal209320.zip [789.24 КБ]
Скачиваний: 3
Рисунки для схемы “Морозко” находятся в архиве morozko.zip,
а описание, что с ними делать, приведено в начале файла
Dal2doc.utf8.
Вложение:
morozko.zip [472.22 КБ]
Скачиваний: 4
Поздравляю всех с наступающим Новым Годом.