Справочник по компонентам Дельфи

Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа

Описание работы

Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.

Работа содержит 1 файл

componens.doc

— 980.33 Кб (Скачать)

одного символа '-', то этот пункт служит в меню разделителем (имеет стиль 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;

 

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

Более подробно о механизмах работы OLE см. соответствующий раздел этой главы.

Конструктор меню 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 = '-').


 

Все функции в случае успешного завершения возвращают указатель на созданный объект.

 

Кнопки

Группа элементов управления-кнопок в VCL велика и разнообразна. Здесь и стандартные кнопки Windows, и популярные в последнее время кнопки с картинками, и специальные кнопки для работы в модальных формах (диалогах), и даже группы кнопок. Многие из них имеют одинаковые свойства, которые мы и рассмотрим сначала.

Основным событием, связанным с нажатием кнопки (любым способом) является:

(Pb) property OnClick: TNotifyEvent;

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

Информация о работе Справочник по компонентам Дельфи