Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

СТАТЬЯ
11.12.02


Предыдущая часть

Изучаем программирование
в Team Developer/Gupta

Шаг 3 : Меню, массивы, диалоги и прокрутка

© Большаков С. А., к.т.н.,
технический консультант Interface Ltd.

Массивы статические и динамические

Следующий шаг изучения программирования в TD мы сделаем в направлении знакомства со статическими и динамическими массивами. Отметим, что массивы в TD могут быть статическими и динамическими, с одной размерностью и несколькими размерностями. Размер статического массива фиксирован и определен заранее. Количество элементов в динамических массивах может программно изменяться. В принципе, работа с одноразмерными и много размерными массивами одинакова (нужно указывать несколько индексов для доступа к элементам и несколько размерностей для их описания размерности). Мы остановим, для простоты, свое рассмотрение классом одномерных массивов. Работу с многомерными массивами предлагаем читателю освоить самостоятельно. Ниже дано окно приложения для изучения работы с массивами. Назовем его (приложение) step3_array.app.

Рис. 22. Окно приложения для изучения статических массивов TD

В данном окне показаны все основные возможности для иллюстрации работы с массивами. Мы будем отдельно рассматривать особенности работы со статическими и динамическими массивами, поэтому представленное окно может со статическими и динамическими массивами (этим управляет радиокнопка - "Тип массива").

Описание и создание массивов

В окне приложения предусмотрено:

  1. Создание массива с заданными границами ("Создать массив"),
  2. Его заполнение периодической последовательностью чисел ("Заполнить массив"),
  3. Выполнение функций работы с массивами ("Сумма", "Среднее", "Максимум" и "Минимум"),
  4. Динамическое добавление заданного числа элементов в массив ("Добавить"),
  5. Автоматическая индикация содержимого массива в списке.
  6. Опрос конкретного элемента массива ("Показать").

Пример описания статических и динамических массивов одной размерности дан на рисунке, расположенном ниже.

Рис. 23. Описание статических и динамических целочисленных массивов в TD

Массивы могут быть описаны в разделе Windows Variables окна (или приложения). В данном примере описан статический целочисленный массив nStaticArray, размерностью 5 элементов и динамический массив nArray, размерность которого не определяется при описании (вместо размерности поставлена "*"). Описанные здесь же вспомогательные целочисленные переменные nCount и nIndex, которые использованы в программе. Перечень объектов приложения для иллюстрации работы с массивами в TD дан ниже во фрагменте текста.

Рис. 24. Объекты окна статических и динамических целочисленных массивов в TD

Названия объектов приложения подобраны таким образом, что несложно определить их назначение и соответствие визуальным объектам окна, представленного выше. Здесь мы не будем тратить время на их подробное пояснение, его мы сделаем при описании соответствующих процедур работы с массивами.

Функции массивов

Для работы с массивами в TD предусмотрены специальные функции, позволяющие получить основные характеристики массива. Это суммирование, формирование среднего, минимального и максимального значения массивов.

Рис. 25. Вызов стандартных функций для массивов

Во фрагменте текста на рисунке, приведенном выше, показано использование этих стандартных функций для: получения суммы элементов массива (SalArraySum), подсчета среднего значения (SalArrayAvg), нахождения максимума (SalArrayMax) и минимума (SalArrayMin) массива.

Заполнение и границы массивов

Заполнение массива выполняется обычным циклом, вид которого приведен ниже.

Рис. 26. Заполнение массива последовательностью значений

В данном фрагменте текста на языке SAL, первоначально, с помощью функции SalArrayGetUpperBound вычисляется верхняя граница массива (nCount). Так как по умолчанию индексация статического массива выполняется с 0 до N-1, то начальное значение индекса (nIndex) задается равно нулю.

Далее с помощью функции SalListClear очищается список (lbArray), в котором в окне предусмотрена индикация значений массива. Далее в цикле присваиваются новые значения элементов массива, для чего используется традиционная, как в СИ, конструкция с индексами: [<индексное выражение>]. Кроме этого, запомненный элемент заносится в список (функция - SalListAdd), изменяется индекс и проверяется на достижения его граничного значения (nIndex >nCount) для завершения цикла (Break).

Для изменения или задания границ массива применяется функция SalArraySetUpperBound, которая имеет три параметра. Применение этой функции дано на рисунке ниже.

Рис. 27. Динамическое задание границы массива

Параметры имеют следующие назначение:

  1. Первый определяет имя массива (у нас nArray),
  2. Второй параметр определяет номер размерности для изменения (для динамических массивов можно изменять только первую размерность, для статических любую, но в заданных границах). В нашем случае это 1.
  3. Третий параметр задает верхнюю границу массива. У нас эта граница определяется значением, занесенным в целочисленное поле (dfMasEnd). Нужно помнить, что реальный размер массива, устанавливаемого программно, будет больше на единицу, так как нумерация элементов динамического массива начинается с нуля.

При работе с массивами можно динамически контролировать их размерность для задаваемых индексов. Это, как показано на примере фрагмента текста, приведенного ниже, делается с помощью стандартных функций: SalArrayGetLowerBound, для получения нижней границы массива (dfMasBeg) и SalArrayGetUpperBound, для получения верхней границы массива (dfMasEnd).

Рис. 28. Выбор элемента массива с контролем границ

Далее в программе проверяются границы массива. При несоответствии индекса границам выдается сообщение о неверном индексе.

Наращивание массивов

В программе SAL предусмотрено динамическое наращивание массива. Для этой операции используется также знакомая Вам функция SalArraySetUpperBound. В примере (см. ниже) количество элементов массива наращивается (исходное число - dfMasEnd) на величину dfAddNum, которая задается вручную в соответствующем поле ввода. Отметим, что после добавления новых элементов в динамический массив существующие элементы не изменяют свое значение, поэтому такие массивы можно использовать в алгоритмах с неопределенными граничными значениями. В этом случае массив можно наращивать поэлементно. Отметим также, что в TD обеспечивается автоматическое наращивание при использовании нового значения индекса вне текущих границ массива.

Рис. 29. Динамическое изменение верхней границы массива (dfMasEnd)

Работа с динамическими массивами аналогична работе со статическими массивами. Окно для изучения динамических режимов в режиме работы с динамическими массивами представлено ниже. Напомним, что нумерация динамических массивов всегда начинается с 0.

Рис. 30. Окно изучения массивов в режиме "Динамический" массив

Процедура создания и заполнения динамического массива приведена на рисунке ниже. Комментарии в тексте поясняют выполняемые операции.

Рис. 31. Чтение размерности динамического массива (dfMasEnd, dfMasBeg)

Отметим, что здесь для заполнения и вычисления суммы массива используется механизм сообщений. К кнопкам pbFillArr и pbSumm с помощью функции SalSendMsg посылается сообщение SAM_Click, что имитирует нажатие кнопки.

В результате работы над массивами Вы получите приложение step3_array.app, которое для проверки усвоения материала можно скачать здесь.

Линейки прокрутки и кнопки режимов

Для оживления интерфейса в программах и его большей наглядности можно использовать стандартные объекты TD: линейки прокрутки (Scroll Bar) и режимные кнопки (Option Button). Линейки прокрутки позволяют выполнять индикацию значений целочисленных параметров визуально и плавно изменять эти значения с помощью специальных оконных элементов управления. Ниже представлено главное окно приложения для изучения принципов работы с линейками прокрутки и кнопками режимов. Назовем его (приложение) step3_scroll.app.

Рис. 32. Окно приложения для изучения линеек прокрутки

Режимные кнопки обеспечивают задание переключателей с фиксированными значениями. Эти объекты, по сути, похожи на переключатели, но имеют другое визуальное представление и более гибкие возможности для построения программного интерфейса. Ниже представлено окно для изучения линеек прокрутки и режимных кнопок в исходном варианте. Для изучения линеек прокрутки используется горизонтальная линейка (можно использовать и вертикальные), в окно встроена индикация границ и текущего положения линейки, предусмотрены операции изменения диапазона прокрутки ("Установить Range") и центрирования положения ("Установить центр"). Изучаются также операции установки позиции ("Установить позицию") и опроса позиции ("Читать позицию"). Режимы кнопки представлены тремя связанными кнопками, одна из которых "Режим 2" специально имеет другой цвет, что позволяет наглядно иллюстрировать позицию переключателя в специальном поле (см. ниже в примерах). На рисунке ниже показаны основные объекты окна для изучения данных объектов.

Рис. 33. Объекты окна приложения для изучения линеек прокрутки

Кнопки и их названия соответствуют тестируемым операциям (pbClose, pbSetSbRange, pbSetSbCenter, pbSetPos, pbGetPos). Горизонтальная линейка прокрутки названа hScrollBar1 (объект типа Horizontal Scroll Bar). Поля для индикации границ прокрутки: нижней (dfMinSB, dfMin), верхней (dfMaxSB, dfMax) и текущей (dfCurentSB). Специальные поля для установки позиции (dfPos) и чтения позиции (dfCurrPos). Три кнопки режимов: obReg1, obReg2 и obReg3. Для индикации текущего режима используется неизменяемое поле (Data Field) - dfIndicator.

После выполнения следующих действий, которые мы рассмотрим в данном подразделе окно видоизмениться. Измененное состояние показано на рисунке ниже. Здесь установлена позиция "33" в линейке прокрутки (нажата кнопка "Установить позицию"), получено значение после опроса позиции после нажатия кнопки "Читать позицию". Также нажата кнопка "Режим 2", причем индикатор "Выбран" не только изменил свое значение, но и цвет.

Рис. 34. Изменение позиции, опрос позиции линейки и установка "Режима 2"

Рассмотрим теперь, как обеспечить выполнение этих операций программно.

Линейки прокрутки

Начальные установки линейки прокрутки при запуске окна показаны на рисунке ниже. Начальные границы прокрутки устанавливаются в программе равными единица и сто (1 и 100), а текущее положение задается равным единице (1). Установка диапазона прокрутки выполняется функцией SalScrollSetRange, которая вызывается с пятью следующими параметрами:

  1. Название объекта прокрутки hScrollBar1,
  2. Минимальное и максимальное значение прокрутки - dfMin и dfMax соответственно,
  3. Шаг перемещения при прокрутке на "строку" (нажатие крайних кнопок прокрутки). В нашем случае мы устанавливаем равным 1.
  4. Шаг перемещения при прокрутке на "страницу" (нажатие на зоны между центральной кнопкой "движком" и крайними кнопками прокрутки). Мы установим его равным 10 (dfMax/10).

Рис. 35. Фрагмент текста начальных настроек линейки прокрутки

В программе, при нажатии кнопки "Установить Range", можно изменить диапазон прокрутки. Фрагмент программы, приведенный ниже, это иллюстрирует.

Рис. 36. Фрагмент текста изменения диапазона прокрутки

Текущее значение устанавливается равным минимальному значению (dfCurentSB), затем задается новый диапазон, и потом с помощью функции SalScrollSetPos устанавливается новая начальная позиция. Отметим, что эта позиция не обязательно должна быть равна 1.

Для установки центральной позиции выполняется нижеследующий фрагмент программы. Сначала рассчитывается значение нового текущего положения (среднее), а затем производится установка.

Рис. 37. Фрагмент текста установки средней позиции линейки

Для получения позиции прокрутки используется функция SalScrollGetPos, текущее значение заносится в переменнуюполу ввода dfCurrPos (фрагмент ниже на рисунке).

Рис. 38. Фрагмент текста установки заданной позиции прокрутки (dfCurrPos)

Для установки заданной позиции выполняются действия показанные ниже. Предварительно считываются граничные значения границ. Это выполняется функцией SalScrollGetRange, параметры которой аналогичны функции установки новых границ.

Рис. 39. Фрагмент текста программной установки
заданной позиции прокрутки с контролем границ

Далее выполняется контроль и установка новой позиции. При неверно заданной новой позиции выдается диагностическое сообщение (SalMessageBox).

Для того чтобы при манипулировании с линейкой прокрутки информация о перемещениях оперативно отображалась на экране, необходимо обработать сообщение SAM_ScrollBar, для данного объекта. Это сообщение посылается объекту hScrollBar1 при любых манипуляциях с объектом. Код выполняемой операции посылается в первом параметре сообщения (wParam), дополнительная информация, например новая позиция, задается во втором параметре сообщения (lParam). Отмечу, попутно, что при обработке любых доступных сообщений, в том числе и WM автоматически эти параметры всегда становятся доступными в специальных, локализованных, системных переменных (wParam, lParam). При обработке сообщения доступны следующие события с линейкой прокрутки (выполняемая операция определяется константой типа -SB_*):

  1. Константы SB_Bottom, SB_Top - операция перемещения в начало и конец линейки.
  2. Константы SB_LineDown,SB_LineUp - перемещение на "строку" вверх и вниз.
  3. Константы SB_PageDown, SB_PageUp - перемещение на "страницу" вверх и вниз.
  4. Константы SB_ThumbPosition, SB_ThumbTrack - перемещение движка прокрутки.

    Примечание: 1. Для констант SB_ThumbPosition, SB_ThumbTrack в стандартных библиотеках указано неверное значение вместо 4 и 5 соответственно нужно использовать значение 276 (экспериментально установлено).

На рисунке представленном ниже дан фрагмент текста, в котором обрабатываются сообщения линейки прокрутки.

Рис. 40. Фрагмент текста обработки сообщения SAM_ScrollBar

Если перемещается "движок", то положение текущей позиции (dfCurentSB) меняется на новое в соответствии с параметром lParam. При любых других операциях с линейкой прокрутки поле dfCurentSB заполняется опросом линейки с использованием знакомой нам функции SalScrollGetPos.

Режимы кнопки

Работа с кнопками режимов достаточно проста. После нажатия на кнопку она меняет свое состояния ("вжатое" состояние), а связанные с ней другие кнопки режима свое состояние восстанавливают. Для такого эффекта данные объекты должны быть расположены рядом в тексте OUTLINE. В нашем примере, три кнопки (obReg1 - "Режим 1", obReg2 - "Режим 2", obReg3 - "Режим 3"), предназначены для выбора одного из трех режимов (это очень похоже на применение радиокнопок). При нажатии на кнопку "Режим 2" кроме этого меняется и цвет текста в поле индикатора - dfIndicator. Если режим включен то переменная, соответствующая его имени, принимает булевский тип TRUE, в противном случае - FALSE. Первоначально в поле индикатора передается текст на кнопке выбранного режима с помощью функции SalGetWindowText, а затем устанавливается цвет текста (по умолчанию или красный для второго режима).

Рис. 40. Фрагмент текста манипулирования режимами с индикацией цветом

Это только один из вариантов работы с кнопками режимов. Далее, проверить работу с другими вариантами и пофантазировать на тему построения оригинального программного интерфейса мы предоставляем читателю самому.

В результате изучения линеек прокрутки и режимов Вы получите приложение step3_scroll.app, которое для проверки успешности усвоения материала можно скачать здесь.

Заключение

В следующей статье этого цикла мы рассмотрим работу со списками и таблицами, а также начнем осваивать основы работы с БД в рамках TD. Для этого мы ознакомимся с работой встроенного в TD приложения DataBase Explorer и утилиты администратора БД SQLTalk.

Продолжение статьи

Дополнительная информация

За дополнительной информацией обращайтесь в компанию Interface Ltd.

Обсудить на форуме Gupta Technologies

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 11.12.02