Методические указания для проведения практических и лабораторных занятий по дисциплине "Программирование на языке высокого уровня" для студентов специальностей 220200 Автоматизированные системы обработки информации и управления

Вид материалаМетодические указания

Содержание


Компонент TMainMenu
Компонент TPopupMenu
Модальная форма
Компонент TButton
Компонент TRadioGroup
Компонент TSpinButton
Компонент TEdit
Компонент ТМеmo
Подобный материал:
1   2   3   4   5   6   7   8   9   10   11

Компонент 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;

Под "любым способом" здесь подразумевается щелчок мышью, нажатие комбинации клавиши — акселератора, нажатие или (только для некоторых кнопок) или вызов метода Click из программы.

Текст кнопки, появляющийся на ее поверхности, определен в свойстве:

(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);

В модальной форме могут быть предусмотрены две специальные кнопки, со­ответствующие положительному и отрицательному решениям. Одна из них срабатывает при нажатии на клавиатуре , другая — . Любая кнопка может получить такой статус, установив в True соответственно одно из свойств:

(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. Ввод и выбор значений

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