- •Delphi Справочник по компонентам. Класс tList
- •Класс tStream
- •Функции работы с файлами
- •Функции преобразования чисел с плавающей точкой
- •Функции работы с датами и временем
- •Элементы управления
- •Положение, размеры и выравнивание элементов управления
- •Активность и видимость элементов управления
- •Внутренний интерфейс Drag&Drop
- •Ярлычки и оперативная подсказка
- •Оконные элементы управления
- •Фокус ввода
- •Графическая подсистема
- •Класс tFont
- •Класс тРеn
- •Класс tBrush
- •Класс tCanvas
- •Класс tGraphic
- •Класс tPicture
- •Класс tMetafile
- •Класс tIcon
- •Класс tBitmap
- •Описание компонентов vcl
- •TPopupMenu.
- •Компонент tMainMenu
- •Компонент tPopupMenu
- •Компонент tBitBtn
- •Компонент tSpeedButton
- •Компонент tRadioGroup
- •Компонент tSpinButton
- •Ввод и редактирование текста
- •Компонент tEdit
- •Компонент тМеmo
- •Компонент tMaskEdit
- •Функции для форматирования текста
- •Оформление приложения
- •Компонент tPaintBox
- •Компонент tBevel
- •Компонент tImage
- •Компонент tHeader
- •Ввод и выбор значений
- •Компонент tListBox
- •Компонент tComboBox
- •Компонент tScrollBar
- •Компонент tSpinEdit
- •Компонент tDrawGrid
- •Многостраничные диалоговые окна
- •Компонент tNotebook
- •Компонент tTabSet
- •Компонент tTabbedNotebook
- •Группирование компонентов
- •Компонент tGroupBox
- •Компонент tPanel
- •Компонент tScrollBox
- •Компоненты — стандартные диалоговые окна Windows
- •Компоненты tOpenDialog и tSaveDialog
- •Компонент tColorDialog
- •Компонент tFontDialog
- •Компонент tPrintDlalog
- •Компонент tFindDialog
- •Компонент tReplaceDialog
- •Работа с файловой системой
- •Компонент tDriveComboBox
- •TDirectoryListBox
- •Компонент tFileListBox
- •Компонент tFilterComboBox
- •Компонент tDirectoryOutline
- •Работа со средствами мультимедиа
- •Динамический обмен данными (dde)
- •Компонент tdDeServerConv
- •Компонент tdDeServerltem
- •Компонент tddeciIentConv
- •Компонент tddecIientltem
- •Дополнительные компоненты
- •Компонент tGauge
- •Компонент tCalendar
- •Компонент tColorGrld
- •Использование интерфейса ole
- •Компонент toleContainer
- •Форма и ее свойства
- •Управление дочерними элементами
- •Приложение и среда его выполнения
- •Объект Application
- •Объект Clipboard
- •Компонент tScreen
- •Файлы инициализации
- •Печать данных из приложения
- •Компонент tSession
- •Компонент tDatabase
- •Компонент tDataSource
- •Компонент tTable
- •Компонент tQuery
- •Компонент tStoredProc
- •Компонент tReport
- •Компонент tBatchMove
- •Компонент tField
- •Объект tFieldDef
- •Важнейшие типы данных
- •Компоненты отображения данных и управления данными
- •Компонент tdbGrid
- •Компонент tdbNavigator
- •Компонент tdbText
- •Компонент tdbEdit
- •Компонент tdbMemo
- •Компонент tdbImage
- •Компонент tdbListBox
- •Компонент tdbComboBox
- •Компонент tdbCheckBox
- •Компонент tdbRadioGroup
- •Компонент tdbLookupUst
- •Компонент tdbLookupCombo
Описание компонентов 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;