Процедура BDimClick является обработчиком щелчка на кнопке BDim - Установить и обеспечивает настройку на выбранную размерность задачи. В начале процедуры в глобальную переменную N заносится значение размерности, содержащееся в свойстве Value компонента SEDim. Затем в таблицах SGA, SGB и SGC задается соответствующее число колонок и ширина таблиц. После этого выполняется цикл по числу столбцов. В цикле в первую строку таблиц заносятся в качестве заголовков номера элементов, а во вторую строку - нулевые значения. В заключение вызываются функции Create Vector, создающие объекты векторов размера N.

Процедура CBOperChange является обработчиком события OnChange списка операций СВОрег. Эта процедура выполняется, когда пользователь выбрал из списка требуемую ему операцию с векторами. Весь текст процедуры состоит из одной структуры case, которая в зависимости от выбора пользователя выдает тот или иной текст в метки STFunc и STDescr.

Процедура BRunClick является обработчиком щелчка на кнопке BRun - Выполнить. В начале процедуры следуют два практически одинаковых цикла, переносящих числа, введенные пользователем в таблицы SGA и SGB, соответственно в векторы А и В. Поскольку в ячейках таблиц данные хранятся в текстовом виде, они переводятся в действительные числа функцией StrToFloat. Но надо иметь в виду, что пользователь может при записи чисел по ошибке нажать какую-то не ту клавишу и в результате формат числа может быть неверным. В этом случае функция сгенерирует исключение EConvertError. Чтобы перехватить это исключение, в код введены блоки try ... except ... end. Если обнаруживается ошибка, в разделе except пользователю выдается методом Application.MessageBox соответствующее сообщение (см. рис. 2.3) и в таблице выделяется ячейка с неверным числом. Для того чтобы осуществить это выделение, в процедуре введена локальная переменная Rect типа TGridRect. В эту переменную заносятся первая и последняя

Рис. 2.3

Сообщение о неверном формате числа

2.1.3 Тестовое приложение

строка выделения (поля Rect.Top и Rect.Bottom) и первый и последний столбец выделения (поля Rect.Left и Rect.Right). Строки всегда равны 1 и эти значения заносятся в начале процедуры. А столбцы определяются индексом i и заносятся в цикле в случае генерации исключения.

После того как векторы А и В сформированы, в структуре case вызывается выбранная пользователем функция. Результат заносится в R, если это число, и в С, если результат - вектор. Затем по индексу CBOper.Itemlndex проверяется, является ли результат числом или вектором. Если вектор, то заполняется таблица SGC, она делается видимой, а окно EResult делается невидимым. Если результат - число, то оно заносится в окно EResult, оно делается видимым, а таблица SGC - невидимой.

Последняя процедура кода ScrollBox2Resize является обработчиком события OnResize панели ScrollBox2. Она используется для того, чтобы при изменении пользователем ширины окна компонент EResult всегда размещался в середине панели GroupBox2. Событие OnResize, связанное с изменением размеров панели, отсутствует в компонентах типа TGroupBox. Поэтому для отслеживания момента изменения размеров используется соответствующее событие расположенной на Gro-upBox2 панели ScrollBox2. Поскольку привязана ScrollBox2 своим свойством Anchors к левой и правой границам GroupBox2, то ее размер изменяется синхронно с изменением GroupBox2. В процедуре ScrollBox2Resize координата левой грани EResult изменяется так, что окно всегда расположено в центре родительской панели.

Мы рассмотрели все процедуры тестового приложения. Опробуйте его в работе. А такое подробное рассмотрение этого, в общем-то не сложного приложения было сделано потому, что в нем вы можете увидеть многие приемы, используемые в приложениях с изменяющимися размерами окна и компонентов.

2.1.2 Программная реализация операций с векторами || Оглавление || 2.1.4 Вариант реализации векторов с помощью типа variant


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Июнь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31