Как сделать интерфейс в pascal
Модуль FormsABC: создание простого интерфейса
FormsABC предназначен для простого создания пользовательских интерфейсов без дизайнера форм. Все компоненты размещаются автоматически, при этом используется потоковый менеджер размещения.
Рассмотрим использование этого модуля на примере создания простого приложения, вычисляющего определенный интеграл методом прямоугольников.
Создадим каркас приложения:
После запуска мы увидим на экране главную форму с заданным размером и заголовком, центрированную относительно экрана.
После запуска мы увидим следующее окно:
Здесь f1 := new FlowBreak и аналогичные добавляют переход на новую строку при вставке следующего компонента, f5 := new FlowBreak(50) пропускает дополнительно 50 пикселей по вертикали, s1 := new Space(20) пропускает 20 пикселей по горизонтали.
Обратим внимание, что на самом деле компоненты вставляются не на саму форму, а на панель MainPanel, которая лежит поверх формы и обеспечивает последовательное добавление компонентов.
Теперь разместим справа на форме компонент TextBox, на который будем выводить результаты. Для этого необходимо знать, что MainPanel выровнена на форме так, что заполняет всё пространство формы. Изменим выравнивание MainPanel на выравнивание по левому краю формы и ширину MainPanel:
После этого добавим на форму компонент TextBox. Обратим внимание, что TextBox должен размещаться именно на форме, а не на MainPanel. Для этого изменим вначале переменную ParentControl на значение MainForm, что означает, что все следующие компоненты будут размещаться на главной форме:
Выравнивание нашего TextBox, наоборот, изменим так, чтобы он занимал оставшееся от MainPanel пространство формы:
В итоге получим приложение:
Запустив его, увидим окончательное размещение компонентов:
Инициализируем свойства компонентов начальными значениями переменных (a=0, b=1, N=10), а также заполним выпадающий список cb выражениями функций, от которых будем далее вычислять опеределнный интеграл :
В начале программы разместим описание необходимых типов, переменных и код, вычисляющий определенный интеграл:
Массив funs будет содержать все возможные функции, от которых мы сможем вычислять определенный интеграл.
Наконец, самое главное: создадим обработчик кнопки ok и присвоим его событию нажатия на кнопку ok.Click:
В обработчике MyClick происходит основная работа: из массива funs выбирается нужная функция, вычисляется интеграл (исходные значения параметров берутся из свойств компонент), после чего в TextBox выводится строка результата.
В заключение перенесем инициализацию компонент в процедуру InitControls.
Ниже приводится полный код приложения:
Запустив его, будем менять параметры вычислений и, нажимая на кнопку «Вычислить», отображать результаты в окне TextBox:
Методы создания пользовательского интерфейса в Pascal
Любая программа, написанная на языке Pascal, может работать с экраном в двух режимах: в текстовом или в графическом. По умолчанию всегда используется текстовый режим.
Просмотр содержимого документа
«Методы создания пользовательского интерфейса в Pascal»
Любая программа, написанная на языке Pascal, может работать с экраном в двух режимах: в текстовом или в графическом. По умолчанию всегда используется текстовый режим.
Рассмотренные в лекции 6 процедуры write() и writeln() работают именно с текстовым экраном: они выводят информацию посимвольно, начиная с текущей позиции курсора.
Если при выводе информации в текстовый файл любой символ записывается туда в виде своего изображения, то при выводе на экран существуют четыре исключения из этого правила:
Вместо изображения символа #7 компьютер издаст звуковой сигнал.
Вместо изображения символа #8 курсор на экране будет передвинут на одну позицию влево.
Вместо изображения символа #10 курсор на экране будет передвинут на одну строку вниз.
Вместо изображения символа #13 курсор на экране будет передвинут на начало текущей строки.
Остальные символы выводятся на экран в «правильном» виде.
Процедуры модуля Crt
В предыдущей лекции мы уже упоминали, что модуль Crt, входящий в состав стандартных библиотек языка Pascal, содержит средства для работы с экраном в текстовом режиме.
Для того чтобы сделать работоспособными все описанные ниже процедуры и функции, ваша программа должна подключить стандартный модуль Crt:
Активная область ввода / вывода
Процедура Window(x1,y1,x2,y2: byte) создаст на экране окно с координатами левого верхнего угла в точке (x1,y1) и координатами правого нижнего угла в точке (x2,y2). Теперь активная область экрана будет ограничена этим окном. Текущие координаты курсора будут отсчитываться не от левого верхнего угла экрана, а от левого верхнего угла этого окна.
Процедура ClrScr очистит весь экран (или активное окно); курсор будет помещен в верхний левый его угол.
Процедура ClrEol очистит текущую строку, начиная с текущей позиции курсора и до правого края экрана (окна).
Процедура DelLine удалит строку, в которой находится курсор.
Процедура InsLine очистит текущую строку целиком. Курсор останется на прежней позиции.
Процедура TextBackground(color: byte) установит цвет фона.
Процедура TextColor(color: byte) установит цвет выводимого текста.
Замечание: Вместо номера цвета возможно использовать соответствующую константу (см. табл. 14.1).
Таблица 14.1. Стандартные цвета языка Pascal
Помимо этого, можно использовать константу blink = 128 (мерцание).
Процедура Sound(hz: word) включит звуковой сигнал с частотой hz герц.
Процедура NoSound выключит звуковой сигнал.
Процедура GotoXY(x,y: byte) переместит курсор в заданную позицию в пределах текущего окна (экрана).
Функция WhereX: byte вычислит положение курсора в текущем окне (или на экране): его горизонтальную составляющую. Напомним, что координата X отсчитывается от левого края экрана (окна).
Функция WhereY: byte вычислит положение курсора в текущем окне (или на экране): его вертикальную составляющую. Напомним, что координата Y отсчитывается от верхнего края экрана (окна).
Процедура Delay(ms: word) приостановит исполнение программы на ms миллисекунд.
Функция KeyPressed: boolean отслеживает нажатия клавиш (на клавиатуре).
Функция ReadKey: char возвращает код символа, чья клавиша (или комбинация клавиш) была нажата.
Пример использования текстовой графики
преобладание черного фона;
регулярная смена позиций цветовых пятен;
прекращение работы при нажатии произвольной клавиши на клавиатуре.
writeln(‘scrsav [density: byte] (=10 by default)’);
while not keypressed do
Замечание: Параметр, регулирующий густоту и скорость изменения символов на экране, можно задавать как аргумент из командной строки во время вызова программы (см. лекцию 13).
Создание дружественного интерфейса
Информационная часть интерфейса, появляющаяся на экране сразу после запуска программы, называется заставкой. Заставка может содержать:
пояснение (краткую или подробную информацию о решаемой задаче);
информацию об авторе(-ах) программы;
номер версии программы;
Заставка может состоять как из отдельного экрана, который исчезает после нажатия произвольной клавиши (его сменяет рабочая область программы), так и лишь из одной строки, которая остается на экране до конца работы программы (или пока ее не вытеснит объемный вывод). Например:
Сортировка линейного массива (до 10 000 элементов) методом пирамиды.
Нахождение кратчайшего пути в связном графе.
Зодиак. Определение знака гороскопа по дате рождения.
Поиграем в крестики-нолики на доске 5х5!
Пользователь может вводить информацию двумя способами: свободным вводом или выбором из предоставленных возможностей.
Свободный ввод информации может потребоваться, например, при запросе имени файла, хранящего какие-либо объемные данные. Можно также просить пользователя ввести свое имя или несколько небольших чисел. Напомним, что ввод больших объемов информации (например, таблиц или матриц) желательно организовывать через файлы. В противном случае многократно возрастает вероятность ошибки и, как следствие, необходимость программировать дополнительные блоки, позволяющие эти ошибки исправлять.
Каждый раз, когда программа ждет свободного ввода от пользователя, она должна сообщать об этом, выводя на экран приглашение к вводу.
Приглашение вида » Введите х:» невозможно считать удовлетворительным, поскольку оно не содержит никакой информации об ожидаемых данных. Хорошее приглашение должно сообщать пользователю, что именно от него хотят получить в данный момент: тип, формат и размер вводимых данных.
При свободном вводе пользователь, вообще говоря, может вводить что угодно (а то и вовсе что попало) и совсем не обязательно информацию в ожидаемом программой формате. А в языке Pascal, как мы уже знаем, недопустимы несоответствия типов данных. Например, если не отключен контроль ввода/вывода (см. лекцию 6), то попытка ввести букву «О», когда ожидается цифра «0», приведет к аварийной остановке программы. Еще сложнее бывает разобраться с форматами дат, вещественных чисел (часто вместо десятичной точки пользователи ставят привычную русскому человеку запятую) и т.п.
Таким образом, для надежности работы программы необходимо предусмотреть проверки любой введенной пользователем информации. Такой контроль получил в среде программистов не слишком вежливое название » защита от дурака «. При правильной организации этой защитываша программа «не сломается» даже в том случае, если вместо ввода данных пользователь просто сядет на клавиатуру.
Если по каким-либо причинам ввод все-таки получился ошибочным, сообщение об этом должно появиться немедленно, вместе с предложением ввести информацию заново. Кроме того, даже в случае правильного ввода полезно сразу же напечатать значение, которое получила переменная. Так можно уменьшить вероятность возникновения ошибки из-за ввода нескольких переменных там, где ожидается лишь одна: увидев, что результатом стало только первое число из введенной строки, пользователь тут же скорректирует свои действия.
Способы создания более сложных и красивых форм меню мы здесь рассматривать не будем, поскольку современные интерфейсно-ориентированные языки (например, Delphi) предоставляют для этого гораздо более мощные средства. Курсы по этим языкам мы и порекомендуем всем желающим.
Не следует думать, что вывод информации происходит только в конце работы программы. Напротив, операторами вывода прошита вся ее ткань.
Какими же должны быть сообщения программы, выводимые на экран? В любом случае они обязаны быть доброжелательными и вежливыми. И, кроме того:
Адекватными выполняемой задаче
Это означает, что терминология сообщений должна соответствовать той области, к которой относится задача.
Учитывающими контингент пользователей, на которых рассчитана программа
Например, если вы пишете обучающую программу для младших школьников, то в пояснениях не должно быть сложных предложений и «заумных» слов. А если вы создаете игру для своих сверстников, то в ее сообщениях возможен и молодежный сленг (однако мы настоятельно советуем избегать табуированной лексики, даже иноязычной).
Все запросы данных, относящихся к одному и тому же логическому блоку, стоит объединять и на экране. Например, если необходимо ввести информацию по нескольким налогоплательщикам, то не стоит сначала запрашивать все фамилии, а затем только номера банковских счетов.
Пример пользовательского интерфейса
Автор программы попытался застраховать ее и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность «сдваивания» нажатой на клавиатуре клавиши, «промаха» мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру.
Мы приводим программу в полном, работающем виде, поскольку лишь 10% ее текста не относятся к обеспечению интерфейса:
Как сделать интерфейс в pascal
страницы: 1 2 3 4
Дружественный интерфейс и методы его создания. Возможности текстового режима. Простейшая графика.
Содержание
Текстовый режим
Если при выводе информации в текстовый файл любой символ записывается туда в виде своего изображения, то при выводе на экран существуют четыре исключения из этого правила:
Остальные символы выводятся на экран в «правильном» виде.
Процедуры модуля Crt
Для того, чтобы сделать работоспособными все описанные ниже процедуры и функции, ваша программа должна подключить стандартный модуль Crt :
Активная область ввода / вывода
Очистка
Процедура ClrScr очистит весь экран (или активное окно); курсор будет помещён в верхний левый его угол.
Процедура ClrEol очистит текущую строку, начиная с текущей позиции курсора и до правого края экрана (окна).
Процедура DelLine удалит строку, в которой находится курсор.
Процедура InsLine очистит текущую строку целиком. Курсор останется на прежней позиции.
Цвета
Процедура TextBackground (color : Byte ) установит цвет фона.
Процедура TextColor (color : Byte ) установит цвет выводимого текста.
Замечание: Вместо номера цвета возможно использовать соответствующую константу (см. табл. 14.1 или справочник ).
Таблица 14.1. Стандартные цвета языка Pascal
Константа | Номер | Цвет | Константа | Номер | Цвет | ||
---|---|---|---|---|---|---|---|
Black | 0 | Чёрный | DarkGray | 8 | Тёмно–серый | ||
Blue | 1 | Синий | LightBlue | 9 | Ярко–синий | ||
Green | 2 | Зелёный | LightGreen | 10 | Ярко–зелёный | ||
Cyan | 3 | Голубой | LightCyan | 11 | Ярко–голубой | ||
Red | 4 | Красный | LightRed | 12 | Розовый | ||
Magenta | 5 | Фиолетовый | LightMagenta | 13 | Ярко–фиолетовый | ||
Brown | 6 | Коричневый | Yellow | 14 | Жёлтый | ||
LightGray | 7 | Светло–серый | White | 15 | Белый |
Помимо этого, можно использовать константу Blink = 128 (мерцание).
Процедура Sound (hz : Word ) включит звуковой сигнал с частотой hz Герц.
Процедура NoSound выключит звуковой сигнал.
Позиционирование
Процедура GotoXY (x, y : Byte ) переместит курсор в заданную позицию в пределах текущего окна (экрана).
Функция WhereX : Byte вычислит положение курсора в текущем окне (или на экране): его горизонтальную составляющую. Напомним, что координата X отсчитывается от левого края экрана (окна).
Функция WhereY : Byte вычислит положение курсора в текущем окне (или на экране): его вертикальную составляющую. Напомним, что координата Y отсчитывается от верхнего края экрана (окна).
Ожидание
Процедура Delay (ms : Word ) приостановит исполнение программы на ms миллисекунд.
Функция KeyPressed : Boolean отслеживает нажатия клавиш (на клавиатуре).
Функция ReadKey : Char возвращает код символа, чья клавиша (или комбинация клавиш) была нажата.
Статья: Методы создания пользовательского интерфейса в Pascal
Для дошкольников и учеников 1-11 классов
Рекордно низкий оргвзнос 25 Р.
Если при выводе информации в текстовый файл любой символ записывается туда в виде своего изображения, то при выводе на экран существуют четыре исключения из этого правила:
Вместо изображения символа #7 компьютер издаст звуковой сигнал.
Вместо изображения символа #8 курсор на экране будет передвинут на одну позицию влево.
Вместо изображения символа #10 курсор на экране будет передвинут на одну строку вниз.
Вместо изображения символа #13 курсор на экране будет передвинут на начало текущей строки.
Остальные символы выводятся на экран в «правильном» виде.
Процедуры модуля Crt
Для того чтобы сделать работоспособными все описанные ниже процедуры и функции, ваша программа должна подключить стандартный модуль Crt :
Активная область ввода / вывода
Процедура ClrScr очистит весь экран (или активное окно); курсор будет помещен в верхний левый его угол.
Процедура ClrEol очистит текущую строку, начиная с текущей позиции курсора и до правого края экрана (окна).
Процедура DelLine удалит строку, в которой находится курсор.
Процедура InsLine очистит текущую строку целиком. Курсор останется на прежней позиции.
Процедура TextBackground(color: byte) установит цвет фона.
Процедура TextColor(color: byte) установит цвет выводимого текста.
Помимо этого, можно использовать константу blink = 128 (мерцание).
Процедура Sound (hz: word) включит звуковой сигнал с частотой hz герц.
Процедура NoSound выключит звуковой сигнал.
Процедура GotoXY(x,y: byte) переместит курсор в заданную позицию в пределах текущего окна (экрана).
Функция WhereX: byte вычислит положение курсора в текущем окне (или на экране): его горизонтальную составляющую. Напомним, что координата X отсчитывается от левого края экрана (окна).
Функция WhereY : byte вычислит положение курсора в текущем окне (или на экране): его вертикальную составляющую. Напомним, что координата Y отсчитывается от верхнего края экрана (окна).
Процедура Delay (ms: word) приостановит исполнение программы на ms миллисекунд.
Функция KeyPressed : boolean отслеживает нажатия клавиш (на клавиатуре).
Пример использования текстовой графики
преобладание черного фона;
регулярная смена позиций цветовых пятен;
прекращение работы при нажатии произвольной клавиши на клавиатуре.
writeln(‘scrsav [density: byte] (=10 by default)’);
while not keypressed do
Замечание : Параметр, регулирующий густоту и скорость изменения символов на экране, можно задавать как аргумент из командной строки во время вызова программы (см. лекцию 13).
Создание дружественного интерфейса
пояснение (краткую или подробную информацию о решаемой задаче);
информацию об авторе(-ах) программы;
номер версии программы;
Заставка может состоять как из отдельного экрана, который исчезает после нажатия произвольной клавиши (его сменяет рабочая область программы), так и лишь из одной строки, которая остается на экране до конца работы программы (или пока ее не вытеснит объемный вывод). Например:
Сортировка линейного массива (до 10 000 элементов) методом пирамиды.
Нахождение кратчайшего пути в связном графе.
Зодиак. Определение знака гороскопа по дате рождения.
Поиграем в крестики-нолики на доске 5х5!
Пользователь может вводить информацию двумя способами: свободным вводом или выбором из предоставленных возможностей.
Свободный ввод информации может потребоваться, например, при запросе имени файла, хранящего какие-либо объемные данные. Можно также просить пользователя ввести свое имя или несколько небольших чисел. Напомним, что ввод больших объемов информации (например, таблиц или матриц) желательно организовывать через файлы. В противном случае многократно возрастает вероятность ошибки и, как следствие, необходимость программировать дополнительные блоки, позволяющие эти ошибки исправлять.
Приглашение вида » Введите х :» невозможно считать удовлетворительным, поскольку оно не содержит никакой информации об ожидаемых данных. Хорошее приглашение должно сообщать пользователю, что именно от него хотят получить в данный момент: тип, формат и размер вводимых данных.
Защита
При свободном вводе пользователь, вообще говоря, может вводить что угодно (а то и вовсе что попало) и совсем не обязательно информацию в ожидаемом программой формате. А в языке Pascal, как мы уже знаем, недопустимы несоответствия типов данных. Например, если не отключен контроль ввода/вывода (см. лекцию 6), то попытка ввести букву «О», когда ожидается цифра «0», приведет к аварийной остановке программы. Еще сложнее бывает разобраться с форматами дат, вещественных чисел (часто вместо десятичной точки пользователи ставят привычную русскому человеку запятую) и т.п.
Таким образом, для надежности работы программы необходимо предусмотреть проверки любой введенной пользователем информации. Такой контроль получил в среде программистов не слишком вежливое название » защита от дурака «. При правильной организации этой защиты ваша программа «не сломается» даже в том случае, если вместо ввода данных пользователь просто сядет на клавиатуру.
Если по каким-либо причинам ввод все-таки получился ошибочным, сообщение об этом должно появиться немедленно, вместе с предложением ввести информацию заново. Кроме того, даже в случае правильного ввода полезно сразу же напечатать значение, которое получила переменная. Так можно уменьшить вероятность возникновения ошибки из-за ввода нескольких переменных там, где ожидается лишь одна: увидев, что результатом стало только первое число из введенной строки, пользователь тут же скорректирует свои действия.
Способы создания более сложных и красивых форм меню мы здесь рассматривать не будем, поскольку современные интерфейсно-ориентированные языки (например, Delphi ) предоставляют для этого гораздо более мощные средства. Курсы по этим языкам мы и порекомендуем всем желающим.
Вывод информации
Не следует думать, что вывод информации происходит только в конце работы программы. Напротив, операторами вывода прошита вся ее ткань.
Какими же должны быть сообщения программы, выводимые на экран? В любом случае они обязаны быть доброжелательными и вежливыми. И, кроме того:
Адекватными выполняемой задаче
Это означает, что терминология сообщений должна соответствовать той области, к которой относится задача.
Учитывающими контингент пользователей, на которых рассчитана программа
Например, если вы пишете обучающую программу для младших школьников, то в пояснениях не должно быть сложных предложений и «заумных» слов. А если вы создаете игру для своих сверстников, то в ее сообщениях возможен и молодежный сленг (однако мы настоятельно советуем избегать табуированной лексики, даже иноязычной).
Все запросы данных, относящихся к одному и тому же логическому блоку, стоит объединять и на экране. Например, если необходимо ввести информацию по нескольким налогоплательщикам, то не стоит сначала запрашивать все фамилии, а затем только номера банковских счетов.
Пример пользовательского интерфейса
Автор программы попытался застраховать ее и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность «сдваивания» нажатой на клавиатуре клавиши, «промаха» мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру.
Мы приводим программу в полном, работающем виде, поскольку лишь 10% ее текста не относятся к обеспечению интерфейса :
const cifr: set of ‘0’..’9′ = [‘0’..’9′];
yes: set of char = [‘Y’,’y’,’ Д ‘,’ д ‘,’L’,’l’];
cifr10: set of 0..9 = [0..9];
type cifr_char = ‘0’..’9′;
vector = array[1..10] of 0..9;
var zagadano,popytka: vector;
set_of_popyt,set_of_zagad: set of 0..9;
procedure error_(st: string; x,y: integer);
function check(cc: char):integer;
then begin clrscr; halt end
if popytka[j]= zagadano[j]
else if popytka[j] in set_of_zagad
writeln(‘Недостаточно цифр! Введите число заново.’);
writeln(‘ Поиграем в «Быков и коров»?’);
writeln(‘ Итак. Я загадываю число из разных цифр. Вам отгадывать! ‘);
write(‘Введите количество цифр в угадываемом числе: ‘);
then error_(‘введена не цифра!’,-27,0);
error_(‘в числе должна быть хотя бы одна цифра!’,-3,-1)
‘0’ : begin n:=10; writeln(c1) end;
error_(‘в числе может быть не более 10 разных цифр!’,-7,-1);
else begin val(c1,n,err); flag:= true; end;