Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Справочник по компонентам Delphi.doc
Скачиваний:
146
Добавлен:
02.05.2014
Размер:
1 Mб
Скачать

Описание компонентов vcl

После знакомства с общими принципами работы компонентов перейдем к их предметному рассмотрению. В этом разделе описаны все элементы Палитры компонентов, сгруппированные по функциональному назначению. Вы встретите здесь и компоненты, не входящие в Палитру; как правило, они являются предками других компонентов, важными для понимания.

Для каждого из компонентов приводятся все методы и свойства, которые доступны программисту, работающему с этим компонентом, то есть описанные как public и published (в т. ч. недокументированные). Мы попытались проиллюстрировать некоторые неочевидные вещи хотя бы коротким фрагмен­том кода. В развернутом виде примеры использования компонентов можно найти на дискете, прилагаемой к книге.

3.2.1. Работа с меню

В приложениях, написанных на Delphi, могут быть реализованы меню двух основных видов:

• Главное меню. Такое меню принадлежит форме и отображается вместе с ней под ее панелью заголовка. Если в приложении несколько форм, то для удобства можно объединять меню всех активных форм в одном.

• Всплывающее меню. Такое меню предусмотрено почти у всех компонен­тов — элементов управления Windows. Оно возникает (всплывает) при нажатии правой кнопки мыши на этом компоненте. Предусмотрено такое меню и у формы.

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

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

Принципы создания и работы с меню в Delphi очень просты. Каждому пункту меню соответствует свой компонент класса TMenuItem. Вы добавляете к меню новые пункты (а к форме — новые компоненты) либо во время разработки (при помощи Конструктора меню), либо во время исполнения. При выбо­ре пункта меню для описывающего его компонента инициируется событие OnClick, в обработчике которого и нужно предусмотреть соответствующие действия.

Компонент TMenuItem

TObject—>TPersistent—”TComponent—>TMenuItein

Модуль MENUS

В Палитру компонентов не входит

Этот компонент, который является основой системы меню в Delphi, вы не встретите в Палитре компонентов — он входит в состав имеющихся там компонентов TMainMenu и

TPopupMenu.

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

(Pb) property Caption: string;

Помимо основной, он несет еще две дополнительные нагрузки. Во-первых, если в строке имеется амперсанд ('&'), то он вместе с следующим за ним символом является акселератором. Например, для строки '&File' нажатие <Alt>+<F> означает выбор этого пункта. Во-вторых, если текст состоит из

одного символа '-', то этот пункт служит в меню разделителем (имеет стиль MFJSEPARATOR);

Помимо акселератора может быть описана еще одна комбинация клавиш, нажатие которой равнозначно выбору пункта. Она должна содержаться в свойстве: •

(Pb) property Shortcut: TShortCut;

TShortCut = Low(Word)..High(Word);

Способы выбора пункта меню — щелчок мышью, нажатие <Enter> на сфо­кусированном пункте, нажатие акселератора или горячей комбинации, наконец, вызов метода

procedure Click;

приводят к возникновению события:

(Р1э) property OnClick: TNotifyEvent;

Компонент TMenuItem может различать только это событие, с которьм до­лжны быть связаны действия, ради которых вы ввели данный пункт в меню. Воспринимают это событие те пункты меню, которые в данный момент активны, что означает-установленное в True свойство:

(РЬ) property Enabled: Boolean;

Если Enabled равно False, пункт изображается серьм цветом и не воспринимает сообщений.

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

(Pb) property Checked: Boolean;

отвечает за то, является ли этот пункт отмеченным.

Если в меню слишком много команд, то их расположение одна под другой может вызвать серьезные неудобства для пользователя. Свойство

(Pb) property Break: TMenuBreak;

TMenuBreak = (mbNone, mbBreak, mbBarBreak) ;

призвано решить эту проблему. Если оно установлено в mbBreak, то ко­манды меню, начиная с этой, располагаются в новом — соседнем с преж­ним — столбце (при этом их принадлежность не изменяется). Если оно равно mbBarBreak, столбцы при этом разделяются вертикальной чертой. В Delphi все компоненты меню типа TMenuItem могут быть как простыми командами, так и подменю, имеющими собственный список пунктов. В случае, если у компонента дочерних подменю и пунктов нет, для него имеет смысл свойство:

(Ro) property Command: Word;

Прежде при написании меню нужно было выдумывать и присваивать уникаль­ный идентификатор каждому его пункту — то есть собственно код команды, который посылался в качестве параметра сообщения WM.COMMAND. Сейчас эта задача возложена на Delphi — программист не только не определяет, но может и не знать кода команды, связанного с этим пунктом меню. Система выберет уникальное значение автоматически и присвоит это значение свойству Command. Изменять его не разрешается.

Интерпретация сообщений меню скрыта от программиста. Система сама опре­деляет, какой пункт выбран, и вызывает его обработчик события OnClick.

Если для каких-то целей понадобился код команды, можно воспользоваться вышеуказанным свойством (см. пример в описании компонента TMenu).

Если у компонента TMenuItem имеются дочерние пункты, то он является подменю, имеет статус MF_POPUP и дескриптор меню Windows, доступный для чтения через свойство:

(ro) property Handle: HMENU;

Пункты меню иерархически связаны. Методы и свойства для работы с до­черними пунктами меню приведены в таблице.

J. ^

(До) property Parent: TMenuItem;

Содержит указатель на родительское подменю.

(Ro) property I terns[Index: Integer]: TMenuItem;

Содержит список дочерних пунктов меню.

fRo) property Count: Integer;

Содержит количество дочерних пунктов меню.

procedure Insert(Index: Integer; Item: TMenuItem) ;

Вставляет пункт Item в меню на место Index. Поскольку структура меню строго иерархическая, вставляемый пункт не должен быть частью другого меню (его свойство Parent должно быть равно nil).

procedure Delete(Index: Integer) ;

Удаляет пункт с индексом Index из меню.

function IndexOf(Item: TMenuItem): Integer;

Возвращает индекс пункта Item.

procedure Add(Item: TMenuItem);

Добавляет пункт Item в конец меню.

procedure Remove(Item: TMenuItem);

Удаляет пункт Item из меню.

Если пункт меню находится в фокусе, нажатие <F1> вызовет систему помощи с контекстом, определенным в свойстве:

(Pb) property HelpContext: THelpContext;

Свойство

(Pb) property Grouplndex: Byte;

используется при объединении нескольких меню между собой. Подробное объяснение его назначения см. в описании компонента TMainMenu.

Компонент TMenu

TObject—”TPersistent->TComponent->TMenu

Модуль MENUS

В Палитру компонентов не входит

Этот компонент отсутствует в Палитре компонентов, но содержит методы и свойства, приведенные в таблице, общие для двух потомков — TMainMenu и TPopupMenu, которые туда входят.

(Ro) property Handle: HMENU;

Содержит дескриптор меню.

property WindowHandle: HWND;

Содержит дескриптор окна Windows (формы или оконного элемента управления), с кото­рым связано меню.

(Ro) property Items: TMenuItem;

Содержит список элементов меню. На самом верху иерархии меню есть единственный элемент (со статусом MFPOPUP), чей список и используется.

function DispatchCoinn>and(ACommand: Word): Boolean;

Отыскивает пункт меню с заданной командой, в случае успеха вызывает его метод Click и возвращает True.

function DispatchPopupfAHandle: HMENU): Boolean;

Работает как Di spatchCommand, но отыскивает пункт меню с дескриптором AHandle.

function Findltem(Value: Word; Kind: TFindItemKind): TMenuItem; TFindItemKind = (fkComrriand, fkHandle, fkShortCut);

Возвращает указатель на объект, соответ­ствующий заданному пункту меню. Параметр Value должен содержать величину, которая интерпретируется в соответствии с одним из трех способов поиска (по команде, дескрип­тору или комбинации горячих клавиш).

function GetHelpContext(Value: Word; ByComniand: Boolean) : THelpContext;

Возвращает значение контекста помощи элемента меню. Если параметр ByCommand установлен в True, Value содержит связанную с пунктом команду, в противном случае — дескриптор. Если контекст у пункта отсут­ствует (равен 0), то отыскивается ближайший родительский ненулевой контекст. Если и он не найден, возвращается 0.

function IsShortCut(var Message: TWMKey): Boolean;

Определяет, какая комбинация горячих клавиш ShortCut нажата, и отыскивает соот­ветствующий пункт меню. Если пункт с таким значением ShortCut найден, и его метод Click отработал успешно, метод возвращает True.

В следующем примере метод обрабатывает сообщение Windows WM_MENUSELECT, которое возникает при перемещении фокуса между пунк­тами меню. В зависимости от типа пункта показывается его дескриптор или команда:

procedure TFormI.wmMenuSelect(var Msg :TWMMenuSelect) ;

var Anitem : TMenuItem;

begin with Msg do begin

if (MenuFlag and MF_POPUP <>0 ) then begin Anitem := Formi.Menu.Findltem(Idltem, fkHandle);

if Anitemonil then Labell .Caption :=

'Handle:'+IntToHex(Anitem.Handle,4) ;

end else begin

Anitem := Formi.Menu.Findltem(Idltem, fkCommand);

if Anitemonil then Labell .Caption :=

'Command:'+IntToHex(Anitem.Command,4) ;

end;

end;

inherited;

end;

Соседние файлы в папке Delphi