— блок описания важнейших констант, определяющих размерность таблицы и расположение информации на экране
MAXCOLS = 100; { Maximum is 702 } {Размер таблицы}
MAXROWS = 100;
MINCOLWIDTH = 3; {Минимальная ширина столбца}
MAXCOLWIDTH = 77; {Максимальная ширина столбца}
….
— блок описания цветов всех полей экрана, модификация констант которого позволяет оперативно изменять цвета;
— основные константы, мнемоника имен которых облегчает восприятие текстов программы
HIGHLIGHT = True; {Подсвеченная текущая клетка}
NOHIGHLIGHT = False; {Неподсвеченная клетка}
{Атрибут содержимого клетки}
ТХТ = 0;
VALUE = 1;
FORMULA = 2;
….
{Разрешенные буквы}
LETTERS: set of Char = ['A'..'Z', 'a'..'z'];
— коды управляющих клавиш клавиатуры.
Следует отметить, что приведены даже коды неиспользуемых в программе управляющих клавиш клавиатуры. Это соответствует факту копирования данных кодов из кода какой-то другой разработки.
Далее следуют описания типа информации содержимого табличной клетки и типа указателя на клетку:
type
CellRec = record
Error: Boolean;
case Attrib: Byte of
TXT: (T: IString);
VALUE: (Value: Real);
FORMULA: (Fvalue: Real;
Formula: IString);
end;
CellPtr = ^CellRec; {Указатель на клетку}
Данный тип организован так, что клетка всегда может содержать признак ошибки расчетов Error и размещать три варианта информации: текст, значение и формулу.
Далее описаны основные глобальные переменные. Описания начинаются с определения двухмерного, постоянно находящегося в памяти массива Cell указателя на клетки таблицы. Это позволяет не расходовать память на пустые клетки. Память под информацию клетки выделяется динамически в количестве, строго соответствующем информации клетки. Без использования динамически выделяемой памяти было бы невозможно разместить информацию клеток таблицы в 640К памяти машин того времени.
MAXCOLS*MAXROWS*[SizeOf(Istring)+SizeOf(Extened)] = 100*100*[80+10] = 900K
Далее следуют описание переменной, являющейся указателем на текущую клетку таблицы, описание массива форматов клеток и переменных позиционирования информации на экране.
Cell: array [1..MAXCOLS, 1..MAXROWS] of CellPtr;
CurCell: CellPtr; {Указатель на текущую клетку}
Format: array [1..MAXCOLS, 1..MAXROWS] of Byte;
LeftCol, RightCol, TopRow, BottomRow,
{Позиционирование}
CurCol, CurRow, LastCol, LastRow: Word;
….
Следует отметить, что выделение отдельного массива форматов информации клеток является не оправданным. Практичнее ввести байт информации формата клетки в тип CellRec.
Сравните этот проект структуры данных с проектом структуры данных электронной таблицы, представленной в гл. 3.
Для составления оставшейся проектной документации выполним трассировку программы. После двойного нажатия клавиши начинает исполняться настроечный код, содержащийся в файлах *.TPU, и далее начинают выполняться операторы основной программы program Mcalc, находящейся в файле mcalc.pas.
В результате исследований была выявлена схема иерархии модулей программы, изображенная на рис. 7.3–7.5. Расшифровка обозначений схемы иерархии представлена в табл. 7.1.
Рис. 7.3. Фрагмент схемы иерархии основных модулей программы
Рис. 7.4. Схема иерархии модуля RedrawScreen
Рис. 7.5. Сокращенная схема иерархии модуля Run
Таблица 7.1
Расшифровка обозначений схемы иерархии
| Имя модуля |
Файл |
Назначение модуля |
| Act |
Mclib |
Обрабатывает информацию введенной строки, занося ее в клетку |
| CenterColString |
Mcutil |
Рассчитывает X координату центрируемой в поле вывода строки |
| ChangeAutoCalc |
Mclib |
Устанавливает автоматический и ручной режимы рекалькуляции таблицы |
| ChangeFormDisplay |
Mclib |
Устанавливает режим видимости значений формул или текста формул |
| ClearInput |
Mcdisplay |
Очищает на экране поле строки ввода |
| ClrScr |
Crt |
Очищает информацию в окне экрана |
| DisplayCell |
Mclib |
Выводит на экран информацию клетки |
| DisplayScreen |
Mclib |
Отображает на экране внутреннюю информацию таблицы |
| EditCell |
Mcommand |
Осуществляет редактирование содержимого клетки |
| EditString |
Mcinput |
Редактор текстовой строки |
| EgaInstalled |
Mcdisplay |
Функция, определяющая наличие видеокарты EGA |
| FillChar |
Dos |
Присваивает элементам массива значение символа |
| GetCursor |
Mcdisplay |
Считывает толщину курсора в переменную |
| GetInput |
Mcinput |
Получив первый введенный символ, продолжает ввод информации клетки |
| GetKey |
Mcinput |
Формирует слово расширенного кода клавиши |
| GetSetCursor |
Mcdisplay |
Считывает толщину курсора в переменную и устанавливает новую толщину курсора |
| GotoXY |
Mcdisplay |
Перемещает курсор в соответствии с заданными координатами дисплея |
| InitColorTable |
Mcdisplay |
Инициализирует массив пересчета цветов для монохромного монитора |
| InitDisplay |
Mcdisplay |
Инициализирует видеокарту на работу в режиме 80-25 |
| InitVars |
Mcutil |
Инициализирует значения основных переменных программы |
| Intr |
Dos |
Вызывает прерывание MS DOS |
| LoadSheet |
Mcommand |
Загружает информацию таблицы из файла |
| MainMenu |
Mcommand |
Реализует выбор тем меню программы |
| Mcalc |
Mcalc |
Главная программа |
| ParamCount |
Dos |
Счетчик полей командной строки запуска программы Mcalc |
| ParamStr |
Dos |
Возвращает значения заданного поля командной строки запуска программы Mcalc |
| PrintCol |
Mcdisplay |
Выводит значение координаты колонки таблицы |
| PrintFreeMem |
Mcdisplay |
Выводит на экран значение остатка свободной памяти |
| PrintRow |
Mcdisplay |
Выводит значение координаты строки таблицы |
| ReadKey |
Mcinput |
Считывает короткий код одной нажатой клавиши |
| Recalc |
Mclib |
Осуществляет перерасчет значений формул клеток таблицы |
| RedrawScreen |
Mclib |
Отображает на экране всю информацию таблицы |
| Run |
Mcalc |
Главный цикл программы |
| Scroll |
Mcdisplay |
Прокручивает информацию экрана в указанном направлении; устанавливает цвет фона освободившейся части экрана |
| SetBottomRow |
Mcdisplay |
Выводит на экран столбец с номерами строк таблицы |
| SetColor |
Mcdisplay |
Устанавливает цвет вывода строк на экран |
| SetCursor |
Mcdisplay |
Устанавливает заданную толщину курсора |
| SetRightCol |
Mcdisplay |
Выводит на экран строку с наименованиями столбцов таблицы |
| ShowCellType |
Mcdisplay |
Выводит на экран надпись о типе текущей клетки таблицы |
| TextMode |
Dos |
Переводит экран в указанный текстовый режим |
| Window |
Crt |
Определяет окно на экране дисплея |
| Write |
- |
Оператор вывода языка Pascal |
| WriteXY |
Mcdisplay |
Осуществляет вывод заданного числа символов заданной строки по заданным координатам дисплея |
Рассмотрим функциональное описание основного ядра программы. В файле mcutil.pas исполняется рудиментарный, оставшийся от прежних разработок код:
Читать дальше