Методические указания для проведения практических и лабораторных занятий по дисциплине "Программирование на языке высокого уровня" для студентов специальностей 220200 Автоматизированные системы обработки информации и управления
Вид материала | Методические указания |
СодержаниеКомпонент TMainMenu Компонент TPopupMenu Модальная форма Компонент TButton Компонент TRadioGroup Компонент TSpinButton Компонент TEdit Компонент ТМеmo |
- Рабочая программа по дисциплине Программирование на языке высокого уровня для специальности, 182.97kb.
- Соболева Наталья Владимировна методические указания, 73.26kb.
- Методические указания к проведению лабораторных работ. Специальность 23. 01. 02 «Автоматизированные, 1178.37kb.
- Рабочая программа По дисциплине «Системы искусственного интеллекта» для специальности, 86.74kb.
- Рабочая программа По дисциплине «Программирование на языке высокого уровня» По специальности, 280.81kb.
- Р. Е. Алексеева кафедра ису программирование на языке высокого уровня методические, 57.65kb.
- Рабочая программа по дисциплине «Алгоритмические языки и программирование» Для специальности, 208.45kb.
- Рабочая программа дисциплины «Объектно-ориентированное программирование» для специальности, 325.53kb.
- А. В. Яковлев Операционные системы и системное программирование Раздел Операционная, 1847.03kb.
- Рабочая программа дисциплины «Автоматизированные информационные системы» для специальности, 301.29kb.
Компонент TMainMenu
TObj ect—”TPersi stent-”TCornponent->TMenu->TMainMenu
Модуль MENUS
Страница Палитры компонентов Standard
Этот компонент представляет главное меню формы и наследует все методы и свойства TMenu. Особенность его в том, что в нем реализован сложный механизм объединения меню. Это необходимо по следующим причинам:
• Если в приложении имеется несколько форм со своими меню, то для упрощения работы целесообразно соединить их в одно и управлять меню из главной формы.
• Объединение меню нужно при работе с интерфейсом MDI и его подокнами.
• Механизм объединения меню используется серверами OLE, запускаемыми по месту нахождения объекта OLE. Загружаясь, сервер дописывает осуществляемые им операции к меню другого приложения.
Для того чтобы реализовать объединение меню, у тех форм, меню которых будут присоединены к главному, установите в True свойство:
(Р1э) property AutoMerge: Boolean;
При этом у главного меню оно должно оставаться равным False, иначе главное меню будет вообще невидимым. Объединение будет происходить автоматически при активизации новых форм или серверов OLE. Кроме автоматического режима, объединение меню можно выполнить при вызове метода:
procedure Merge(Menu: TMainMenu);
Присоединяемое меню при необходимости может быть легко отсоединено вызовом метода:
procedure Unmerge(Menu: TMainMenu) ;
При установленном в True свойстве AutoMerge ссылка на присоединенное меню будет сохраняться в специальном поле компонента и отсоединяться в нужных случаях автоматически (например, при закрытии формы, которой оно принадлежит).
Объединение меню происходит по специальным правилам, в основе которых лежит использование группового индекса (свойства Group Index) каждого объекта TMenuItem.
У пунктов меню одного уровня, в частности всех подменю верхнего уровня в главном меню, свойство Grouplndex является неубывающим, т. е. у последующего пункта групповой индекс больше либо равен индексу предыдущего. Это требование отслеживается как на этапе разработки, так и на этапе исполнения. Например, пусть пункты меню имеют индексы О, 3, 4, 5, 6. Если вы включите пункт меню с индексом 5 между пунктами с индексами 0 и 3, то 3
и 4 будут изменены на 5. А вот изменить большее значение Х на меньшее Y, если впереди есть пункты с индексом, большим Y, невозможно. Если в этом примере попытаться изменить индекс 6 на 4, то это приведет к возникновению исключительной ситуации EMenuError.
Для обычных форм объединение происходит только на верхнем уровне в главном меню во время их активизации. В объединенном меню все подменю будут располагаться по возрастанию номера группового индекса, при этом:
• если в присоединяемом меню есть пункты с таким же групповым индексом, что и в исходном, то все их множество заменяет все множество таких пунктов в исходном меню;
• все пункты присоединяемого меню, групповой индекс которых не встречается в исходном, добавляются к нему и вставляются на соответствующие их индексу места.
К окнам интерфейса MDI все сказанное относится только при запуске приложения. Если в формах приложения со стилем fsMDIChild есть свои главные меню, то в этот момент они автоматически сольются с главным меню формы fsMDIForm независимо от состояния AutoMerge.
На уровне работы с серверами OLE предусмотрены дополнительные возможности по объединению меню. Если в компонент TOLEContainer загружен объект OLE, то в конец подменю Edit обычно добавляется подменю, из которого можно вызвать функции открытия и редактирования этого объекта. После активизации сервера он может не только вставлять свои подменю в главное, но и добавлять новые пункты к уже существующим подменю.
Три метода TMainMenu используются для работы с меню OLE:
procedure PopulateOle2Menu(SharedMenu: HMenu; Groups:array of Integer; var Widths: array of Longint);
procedure GetOle2AcceleratorTable(var hAccel : THandle;
var numAccels: Word; Groups: array of Integer) ;
procedure Set01e2MenuHandle(Handle: HMENU);
Конструктор меню Delphi поможет значительно упростить разработку меню. В нем имеются готовые шаблоны типовых подменю верхнего уровня: File, Edit и др; пример их использования см. в проекте DEMOEDIT на дискете, прилагаемой к книге. Можно также определить свои шаблоны.
Компонент TPopupMenu
TObject-”TPersistent—”TComponent->TMenu->TPopupMenu
Модуль MENUS
Страница Палитры компонентов Standard
Этот компонент описывает всплывающее меню. В отличие от главного, собственное меню такого типа может быть почти у каждого оконного элемента управления на форме (кроме переключателей), а также у самой формы.
Всплывающее меню обычно связывают с нажатием правой кнопки мьппи. Чтобы это правило соблюдалось, нужно установить в True свойство
(Pb) property AutoPopup: Boolean;
Для вызова этого меню из программы используйте метод:
procedure Popup(X, Y: Integer);
который показывает его, помещая в точку экрана (X,Y) точку панели меню, определенную свойством:
(Pb) property Alignment: TPopupAlignment;
TPopupAlignment = (paLeft, paRight, paCenter) ;
В зависимости от его значения в точке щелчка появится:
paLeft — левый верхний угол;
paRight — правый верхний угол;
paCenter — середина верхней стороны.
Разумеется, если нажатие произошло в самом низу экрана и развернуться вниз невозможно, меню автоматически будет сдвинуто вверх.
При вызове всплывающего меню перед его показом на экране программист извещается событием:
(Pb) property OnPopup: TNotifyEvent;
Одно и то же всплывающее меню могут разделять несколько компонентов. Свойство
property PopupComponent: TComponent ;
показывает, который из них инициировал меню (на котором был щелчок правой кнопки мыши). Если меню вызвано из метода Popup, значение этого свойства не определено, и присвоить ему значение должен сам программист.
Контекст помощи всплывающего меню задается свойством:
(Pb) property HelpContext: THelpContext;
Функции для работы с меню
Рассмотрим также описанные в модуле Menus полезные функции для управления меню.
Четыре функции предназначены для преобразования типа TShortCut, представляющего горячую комбинацию клавиш:
а) в символ+состояние специальных клавиш и обратно:
procedure ShortCutToKey(Shortcut: TShortCut; var Key: Word;
var Shift: TShiftState);
function Shortcut(Key: Word; Shift: TShiftState): TShortCut;
б) в текст и обратно:
function ShortCutToText(Shortcut: TShortCut): string;
function TextToShortCut(Text: string): TShortCut;
Новые меню и их составные части можно создавать, пользуясь функциями:
function NewMenu(Owner: TComponent; const AName: string; Items: array of TMenuItem): TMairiMenu; | Создает новое главное меню с именем AName и пунктами Items, которое будет принадлежать владельцу Owner. |
function NewPopupMenu(Owner: TCoiriponent; const AName: string; Alignment: TPopupAlignment; AutoPopup: Boolean; Items: array of TMenuItem): TPopupMenu; | Создает новое всплывающее меню. Назначение дополнительных параметров см. описание TPopupMenu. |
function NewSubMenu(const ACaption: string; hCtx: Word; const AName: string; Items: array of TMenuItem): TMenuItem; | Создает новое подменю. Здесь AName — имя объекта, ACaption — его текст, hCtx — контекст системы помощи. |
function Newltemfconst ACaption: string; AShortCut: TShortCut; AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: Word; const AName: string): | Создает новый объект типа TMenuItem. Параметры метода соответствуют свойствам класса. |
function NewLine: TMenuItem; | Создает новый элемент меню типа разделитель (TMenuItem с Caption = '-'). |
Все функции в случае успешного завершения возвращают указатель на созданный объект.
3.2. Работа с кнопками
Группа элементов управления-кнопок в VCL велика и разнообразна. Здесь и стандартные кнопки Windows, и популярные в последнее время кнопки с картинками, и специальные кнопки для работы в модальных формах (диалогах), и даже группы кнопок. Многие из них имеют одинаковые свойства, которые мы и рассмотрим сначала.
Основным событием, связанным с нажатием кнопки (любым способом) является:
(Pb) property OnClick: TNotifyEvent;
Под "любым способом" здесь подразумевается щелчок мышью, нажатие комбинации клавиши — акселератора, нажатие
Текст кнопки, появляющийся на ее поверхности, определен в свойстве:
(Pb) property Caption: string;
Если в составе текста есть амперсанд ('&'), то следующий за ним символ используется в акселераторе, и нажатие комбинации клавиш <АН>+<символ> вызывает нажатие кнопки.
Водораздел среди кнопок проходит по тому, что именно означает нажатие. Ряд кнопок — TRadioButton, TCheckBox и группа TRadioGroup — предназначен для ввода или переключения фиксированных параметров, и программиста более интересует их состояние в некоторый момент времени, чем сам факт нажатия. Кнопки TButton, TSpinButton и TBitBtn напротив, как правило, своим нажатием инициируют немедленные действия. Кнопка TSpeedButton может успешно служить для решения обеих задач.
Как уже было сказано, нажатие влечет за собой OnClick. Но это не означает, что всегда нужно писать код для обработки всех нажатий. Например, исключением из этого правила является использование кнопок в модальных формах.
Модальная форма, или модальный диалог — специальная разновидность окон Windows (и форм Delphi), предназначенная для ввода пользователем необходимых программе данных или выбора одного ответа из нескольких вариантов. Обычно при этом ему предоставляется несколько кнопок, соответствующих вариантам. Вплоть до получения ответа в модальном диалоге пользователь не может переключиться на другие окна той же задачи, а в системном модальном диалоге — и на другие задачи. Для использования в таких случаях предназначены стандартная кнопка Windows TButton и ее младшая сестра TBitBtn, отличающаяся только наличием картинки на ее поверхности. При их нажатии значение свойства ModalResult кнопки передается одноименному свойству формы, где такое изменение означает вывод формы из модального состояния и ее закрытие:
(Pb) property ModalResult: TModalResult;
TModalResult = Low(Integer) ..High(Integer);
В модальной форме могут быть предусмотрены две специальные кнопки, соответствующие положительному и отрицательному решениям. Одна из них срабатывает при нажатии на клавиатуре
(Pb) property Default: Boolean;
(Pb) property Cancel: Boolean;
У двух рассмотренных кнопок результат, который при нажатии кнопки передается модальной форме, будет соответственно равен mrOk и mrCancel.
Ниже рассмотрим имеющиеся в распоряжении программиста варианты кнопок. Описанные выше свойства перечисляются, но не комментируются.
Компонент TButton
TObject-”TPersistent->TCornponent->TControl->TWinControl->
-*TButtonControl—>TButton
Модуль STDCTRLS
Страница Палитры компонентов Standard
Обычная кнопка Windows. В этом компоненте опубликованы только приведенные выше свойства Default, Cancel, Caption, ModalResult и OnClick. Двойной щелчок на кнопке не предусмотрен.
Компонент TRadioGroup
TObject->TPersistent->TComponent-”TControl-”TWinControl-”TCustomControl->
-”TCustomGroupBox—”TCustomRadioGroup-”TRadioGroup
Модуль EXTCTRLS
Страница Палитры компонентов Standard
Готовая группа радиокнопок, содержащая все средства для управления ими. Каждая радиокнопка в группе наследует все свойства TRadioButton. Радиокнопки могут располагаться в несколько столбцов.
Свойство
(Pb) property Columns: Integer;
устанавливает число столбцов с радиокнопками. Оно не должно превышать 16. Индекс нажатой радиокнопки в группе определяется свойством:
(Pb) property Itemlndex: Integer;
Индекс исчисляется от 0. Если он равен -1, mi одна радиокнопка в группе не нажата.
Набор строк с заголовками радиокнопок содержится в свойстве:
(Pb) property Items: TStrings;
Все изменения этого свойства — добавление, удаление, переименование и т. п. — немедленно отражаются на радиокнопках в составе группы. Но доступ к методам и свойствам каждой радиокнопки пользователь компонента получить не может, т. к. сами объекты-радиокнопки содержатся в отдельном скрытом списке.
Компонент TSpinButton
TObject->TPersistent—”TComponent-”'TControl-”TWinControl-”TSpeenButton
Модуль SPIN
Страница Палитры компонентов Samples
Пара кнопок с двумя противоположно направленными стрелками, предназначенная для увеличения или уменьшения какой-то величины нажатием. Компонент не имеет своего заголовка.
Рисунки на кнопках по умолчанию представляют собой треугольники, указывающие вверх и вниз. Их можно изменить, используя свойства:
(Pb) property DownGlyph: TBitmap;
(Pb) property UpGlyph: TBitmap;
Кнопка не имеет события OnClick. При нажатии нижней и верхней кнопок соответственно возникают события:
J property OnDownClick: TNotifyEvent;
property OnUpClick: TNotifyEvent;
Этот компонент может работать в паре с другими, например, редактором (см. компонент TSpinEdit). В этом случае, получая фокус, он передает его "напарнику", указатель на который содержится в свойстве:
(Pb) property FocusControl: TWinControl;
3.3. Ввод и редактирование текста
В Палитру компонентов входят три компонента, позволяющие вводить и редактировать текст (далее — редактирующие элементы). На базе стандартного редактирующего элемента управления Windows построены два основных компонента — строка ввода TEdit и многострочный редактор TMemo. На базе первого из них для ввода данных по шаблону создан третий компонент — TMaskEdit.
В начале раздела опишем компонент TCustomEdit. Хотя вы не найдете его в Палитре компонентов, он является общим предком для трех доступных вам редактирующих элементов. Поэтому здесь рассмотрим только его свойства, общие для всех трех.
В отличие от других визуальных компонентов, у перечисленных в этой группе текст содержится не в свойстве Caption, а в свойстве Text:
property Text: TCaption;
TCaption = string[255] ;
Часть текста может быть выделена. Свойства
property SelStart: Integer;
property SelLength: Integer;
определяют начало и длину выделенного в редакторе текста (измеряемые в количестве символов). Сам выделенный текст содержится в строке, определяемой свойством:
property SelText: string;
Метод
procedure ClearSelection;
исключает из текста весь выделенный фрагмент, а метод
procedure SelectAll;
выделяет весь текст в редакторе. Доступны также рабочие методы по чтению/записи выделенного текста, которые используются свойством SelText:
function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer-procedure SetSelTextBuf(Buffer: PChar);
Они могут быть полезны для получения текста типа pChar, который применяется в функциях API Windows.
Текст можно передавать и принимать из буфера обмена Windows — для этого предназначены три следующих метода. Если в окне редактора выделен текст, то передается (заменяется) именно он. В противном случае в операции участвует весь текст:
procedure CopyToClipboard;
procedure CutToClipboard;
procedure PasteFromClipboard;
Очистить весь текст в редакторе можно при помощи метода: procedure Clear;
Наконец, свойство property Modified: Boolean; устанавливает, изменялся ли текст в процессе редактирования.
Компонент TEdit
TObject-TPersistentTComponent-”TControl->TWinControl-”TCustomEdit-”TEdit
Модуль STDCTRLS
Страница Палитры компонентов Standard
Этот компонент не содержит собственного кода, в нем только опубликованы свойства его предка TCustomEdit. Он представляет собой редактируемую строку (далее — просто редактор).
Стиль обрамления этого компонента
(Pb) property BorderStyle: TBorderStyle;
по умолчанию равен bsSingle.
Если свойство
(Pb) property AutoSize: Boolean;
равно True, компонент изменяет свою высоту в зависимости от размера шрифта (свойство Font). Для того чтобы изменения имели место, должен еще быть установлен стиль обрамления bsSingle.
Вводимый в редактор текст может автоматически подвергаться некоторым преобразованиям.
Преобразование, задаваемое свойством CharCase, позволяет автоматически преобразовывать все символы только в верхний или только в нижний регистр:
(Pb) property CharCase: TEditCharCase;
TEditCharCase = (ecNormal, ecUpperCase, ecLowerCase) ;
По умолчанию установлен стиль ecNormal и преобразования не происходит. Аналогично, свойство
(Pb) property OEMConvert: Boolean;
определяет необходимость автоматического преобразования вводимых символов из кодировки OEM в ANSI и обратно. Такое свойство часто бывает нужно при обработке текста в кодировке MS-DOS.
Два следующих свойства описывают поведение выделенного текста при переходе фокуса. Первое из них
(Pb) property AutoSelect: Boolean;
описывает реакцию редактирующего элемента при получении фокуса. Если оно установлено в True (по умолчанию это так), то при получении фокуса ввода весь текст в нем выделяется независимо от состояния свойства SelText. Если AutoSelect установлено в False, то при получении фокуса выделяется лишь то, что было выделено до его утери.
После утери фокуса редактором выделенный в нем текст обычно теряет цветовое выделение. Чтобы оно оставалось, установите в False второе свойство:
(Pb) property HideSelection: Boolean;
На длину текста может быть наложено ограничение. Свойство
(Pb) property MaxLength: Integer;
определяет максимальную длину текста редактора в символах. Если значение этого свойства равно 0, то ограничений на длину текста нет.
Свойство PasswordChar предназначено для ввода пароля с использованием редактора:
(Pb) property PasswordChar: Char;
Его значение — это символ, используемый для отображения вместо любых вводимых символов.
Можно запретить возможность редактирования текста. Если значение свойства:
(Pb) property Readonly: Boolean;
равно True, текст изменить нельзя.
Вы можете отследить изменения текста в редакторе, обрабатывая поступающие события:
(Pb) property OnChange: TNotifyEvent;
Компонент ТМеmo
TObject->TPersistent->TComponent->TControl->TWinControl->TCustomEdit->
—”TCu s t omMerno-”TMemo
Модуль STDCTRLS
Страница Палитры компонентов Standard
Компонент представляет собой многострочный редактор текста. Содержимое редактора представлено как объект, содержащий текст в виде набора строк:
(Pb) property Lines: TStrings;
Текст в редакторе может выравниваться по левому, правому краям и по центру:
(Р1э) property Alignment: TAlignment;
TAlignment = (taLeftJustify, taRightJustify, taCenter) ;
При наборе текста пользователь может ввести различные управляющие символы, в частности, клавишами
§ property WantReturns: Boolean;
property WantTabs: Boolean;
обращены в True, символы передаются редактору. Обратим внимание на то, что если установлено WantTabs, то с помощью клавиатуры передать фокус такому редактору можно, а после этого отдать другому компоненту — нельзя. Если свойства равны False, символы передаются форме. В этом случае для ввода этих символов в редактор можно воспользоваться комбинациями
Два свойства отвечают за организацию прокрутки текста в окне редактора:
(Pb) property Wordwrap: Boolean ;
— отвечает за поведение редактора при достижении правой границы во время набора текста. Если свойство равно True, то при этом происходит переход на новую строку. В случае False при достижении правой границы происходит горизонтальная прокрутка текста и пользователь может продолжать набор; на новую строку можно перейти, нажав
(Pb) property ScrollBars: TScrollStyle;
TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth) ;
— устанавливает наличие полос прокрутки в вертикальном и горизонтальном направлениях. Если есть горизонтальная полоса, то свойство Wordwrap теряет смысл: вместо переноса происходит прокрутка.
Следующие свойства аналогичны определенным в TEdit — BorderStyle, HideSelection, MaxLength, OEMConvert и ReadOnly.
Для получения полноценного приложения — текстового редактора, в него нужно включить компонент TMemo и снабдить средствами чтения, записи и печати файлов, поиска и замены текста и т. п. Такой редактор вы найдете в примере DEMOEDIT на дискете, прилагаемой к книге.
3.4. Ввод и выбор значений
Общим для описанных в этом разделе компонентов является то, что с их помощью можно интерактивно выбрать или установить значения каких-то величин, которые доступны через их свойства и могут в нужный момент быть считаны. Для выбора эти компоненты предоставляют пользователю различные упрощающие приемы, поэтому "чистые" редакторы не рассматриваются в этой группе.