Rambler's Top100


Виртуальный клуб начинающих программистов на Delphi


Заводь
Мелководье
Сокровищница
Рифы
Течения
Архивный грот
Дальние земли
Жемчужница
Ловцы жемчуга
Почтовый грот
Дельфинарий
Карта бухты

Rambler's Top100


Mastak.ru - качественный хостинг на двух континентах

The List of Russian Web Servers WebList.Ru

Общие свойства компонентов.

Размещение компонентов.
Размещение, перемещение и изменение размеров отдельного компонента
Невидимые компоненты
Двойня, тройня, четверня и так далее
Ученые объявляют об открытии в области размножения!
Выбор нескольких компонентов
Один размер для всех
Поставим наших уток гуськом
Согласование компонентов
Общие свойства компонентов.
Заголовки с физиономиями
Приукрась меня!
И все это - о размере
За кулисами
IS, WITH и AS
События мыши
События drag and drop
События клавиатуры
События системы
Специальные события

Размещение компонентов.

Размещать компоненты на форме очень просто. Требуется только щелкнуть на закладке нужной страницы палитры компонентов, нажать кнопку с пиктограммой соответствующего компонента и щелкнуть на форме. Все! Или, если вам так больше нравится, можно щелкнуть на компоненте, а затем отбуксировать прямоугольник в форму - компонент появится на форме. Если размеры компонента поддаются изменению, при появлении он заполнит собой прямоугольник.

Если вы забыли, на какой странице расположен конкретный компонент, выберите Component List из меню View, и на экране появится список компонентов в алфавитном порядке. Набирайте название компонента, и встроенный поиск покажет нужный компонент. (Если конечно вы набираете правильно.)

Размещение, перемещение и изменение размеров отдельного компонента

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

Выберите страницу Standard палитры компонентов и поместите курсор мыши на прямоугольник кнопки со словом ОК. После того как мышь побудет в недвижимом состоянии секунду или две, появится поле помощи, идентифицирующее этот компонент как Button. Щелкните на кнопке, затем щелкните на вашей форме. Появится кнопка среднего размера, озаглавленная Button1.

Щелкните на компоненте Button опять, но на этот раз, удерживая левую кнопку мыши, нарисуйте прямоугольник большого размера прямо на форме. Прямоугольник заполнит текст Button!. Обратите внимание, что кнопка имеет небольшие квадратные маркеры по углам и посередине каждой стороны, позволяющие изменять размер. Используйте их, чтобы с помощью мыши изменить размер кнопки. Теперь щелкните на Button1 и отбуксируйте ее в новое место.

Вы заметите, что при перемещении и изменении размера компоненты выравниваются по точкам координатной сетки формы. Как правило, это хорошо - такая возможность помогает поддерживать порядок в формах. Если вы захотите отменить эту возможность или изменить плотность точек координатной сетки, выберите Environment Option из меню Tools. Одна из страниц параметров связана с предпочтениями пользователя и содержит прямоугольную панель designer. Параметры Display grid и Snap to grid на этой вкладке определяют, видна ли координатная сетка и активна ли она. Можно также изменить значения Grid Size X и Grid Size Y, что приведет к изменению координатной сетки.

Для лучшего управления размещением и размерами своих компонентов попробуйте следующее. Установите значение размера координатной сетки равным 4 вместо 8, отключите изображение координатной сетки, но оставьте включенным параметр Snap to grid.

Невидимые компоненты

Не каждый компонент виден на форме во время запуска программы. Например, компонент MainMenu приводит к появлению на форме меню, но соответствующая пиктограмма во время запуска программы не появляется. Компоненты, представляющие диалоговые окна общего назначения, вообще никак не визуализируются во время работы программы. Размеры невидимого компонента не могут быть изменены - он всегда появляется как простая пиктограмма.

Размещайте свои невидимые компоненты в свободном углу формы, где их легко будет найти.

Двойня, тройня, четверня и так далее

Добавить в форму два или три компонента очень просто. Вы щелкаете на элементе в палитре, щелкаете на форме, щелкаете на элементе, щелкаете на форме и т.д., перемещая курсор мыши туда-сюда. Но если стоит задача разместить десяток компонентов одного типа, этот прием очень утомителен. Что же делать? Никаких проблем. Во время выбора компонента из палитры следует только держать нажатой клавишу <Shift>, и кнопка палитры останется нажатой. Затем можно разместить на форме любое количество компонентов этого типа. Когда закончите, щелкните на стрелке выбора в палитре компонентов. Не забудьте выполнить этот последний шаг, иначе в следующий раз вы по ошибке создадите другой компонент!

Ученые объявляют об открытии в области размножения!

После того как компонент размещен в нужном месте, имеет соответствующие размеры и все его свойства установлены согласно вашим вкусам, вы можете легко его тиражировать. Щелкните на компоненте, нажмите <Ctrl+C> для того, чтобы скопировать его в Clipboard, и нажмите <Ctrl+V> для размещения копии на форме. Все свойства копии будут идентичны свойствам оригинала, за исключением нескольких, которые должны быть уникальными, как, например, имя компонента. Для того чтобы не закрыть собой оригинал, копия размещается немного правее и ниже.

Если хотите увидеть кое-что поинтереснее, выберите компонент и нажмите <Ctrl+C>, а затем перейдите в окно Editor. Переместите курсор в самый конец модуля, за строку "end". Теперь нажмите <Ctrl+V>. Вы только что вставили в программу текстовое описание компонента! Это описание можно редактировать, вырезать или скопировать его в Clipboard, а затем вставить отредактированный компонент назад в форму. Возможна даже "мутация" компонента от одного типа к другому, если два типа сходны.

Найдите компонент ListBox на странице Standard палитры компонентов и поместите список на новую форму. Нажмите <Ctrl+X>, чтобы вырезать его и скопировать в Clipboard, переместите курсор в самый конец файла в редакторе и нажмите <Ctrl+V>. В качестве первой строки текстового описания должно быть "object ListBox1: TListBox". Измените это на "object ComboBox1: TComboBox". Отметьте, вырежьте и поместите модифицированный блок текста в Clipboard, перейдите опять в Form Designer (на форму) и нажмите <Ctrl+V>. Там, где был компонент ListBox, появится компонент ComboBox, хотя свойства Left и Тор остались прежними. Ура! Мы преобразовали простой список в комбинированный.

Выбор нескольких компонентов

Выбрать компонент на форме элементарно - нужно только щелкнуть на нем. Выбрать несколько компонентов нисколько не труднее. Если растянуть прямоугольник так, чтобы он охватывал все нужные компоненты, они все окажутся выбранными (правда если вы поместили компоненты на панели (Panel), то необходимо нажать клавишу Ctrl перед выделением, тогда вы без выделения панели выбираете все компоненты которые охватили указателем). Или, если вы хотите выбирать компоненты по одному, держите нажатой клавишу <Shift>, когда будете щелкать на каждом компоненте Можно даже комбинировать два эти метода. Если при этом в ваши сети попадет больше компонентов, чем нужно, следует щелкнуть при нажатой клавише <Shift> на лишних компонентах, чтобы снять с них выбор.

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

Один размер для всех

После волнения, связанного с размещением компонентов, вы, вероятно, обнаружите, что они разного размера, или не такого размера, как вам нужно. Чтобы исправить это, начните с преобразования одного из компонентов до желаемого окончательного размера Затем выберите с помощью либо очерчивания прямоугольником, либо щелчка при нажатой клавише <Shift> компоненты, размеры которых требуется изменить и подправьте в инспекторе объектов параметры Width и Height, просто нажмите на клавишу Enter. Тем самым вы определите один размер на всех. Только не определяйте свойство Top, иначе вы все свалите в кучу и отменить ваше творчество будет невозможно. Придется все опять растаскивать вручную.

Каждый эксперимент лучше проводить на новой форме.

Щелкните при нажатой клавише <Shift> на соответствующей кнопке в палитре компонентов и разместите шесть или восемь кнопок стандартного размера на новой форме. Для того чтобы прекратить размещение кнопок, щелкните на стрелке выбора. Выберите кнопку Button1 и сократите ее размеры так, чтобы заголовок едва помещался внутри. Очертив прямоугольником все кнопки, выберите Size из меню Edit. Выберите значение Shrink to smallest для обоих параметров Width и Height диалогового окна и щелкните на ОК. Теперь все кнопки приняли размер самой меньшей из них

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

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

Поставим наших уток гуськом

Если вы обожаете складывать кубики с буквами и разгадывать головоломки, заключающиеся в совмещении замысловатых плоских фигур, возможно, процесс выравнивания компонентов формы вручную покажется вам и успокаивающим, и занимательным. Но если у вас нет на это времени, на помощь придет палитра выравнивания Delphi (Alignment palette), замечательно представленная на рисунке. Если пиктограммы на кнопках компонентов для вас лишены смысла, оставьте курсор мыши в течение некоторого времени на каждой из них по очереди и воспользуйтесь информацией из поля помощи

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

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

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

Согласование компонентов

Можно заметить, что при выборе более одного компонента окно Object Inspector перерисовывается. Это обусловлено обновлением списка свойств, в результате которого он обычно становится короче. Что происходит? Давайте разберемся.

Поместите на форму два разных компонента. Один из них выберите, а над другой разместите курсор. Внимательно наблюдая за страницей свойств в окне Object Inspector, несколько раз щелкните при нажатой клавише <Shift> на другом компоненте. Эксперименты покажут, что некоторые исчезают из списка, когда оба компонента выбраны.

Когда выбрано более одного компонента, список свойств сокращается и включает только свойства, общие для всех выбранных компонентов. Предположим, вы выбрали компоненты "Дракон" и "Лошадь". В итоге в списке свойств будут "ноги" и "хвост", но не будет "гривы" или "чешуи". Свойства, значения которых должны быть уникальными, также исчезают из списка. В приведенном выше примере свойство Name исчезнет, так как Delphi не позволит двум компонентам иметь одно и то же ими (как их в таком случае различать?). Исчезнет и свойство TabOrder, поскольку его значение также должно быть оригинальным для каждого компонента формы.
Если свойство остается в списке, когда выбрано более одного компонента, его можно устанавливать для всех выбранных компонентов сразу. Именно это и произошло, когда мы изменили ширину - обе кнопки приобрели новое значение данного свойства. Чем больше компонентов различных типов вы выберете, тем меньше свойств окажется общими для всех них и тем короче будет список свойств. Например, выберите компонент CheckBox вместе с двумя ранее выбранными кнопками, и свойства Cancel, Default и ModalResult исчезнут. Это объясняется тем, что упомянутые свойства не имеют смысла для компонента CheckBox. Можно даже выбрать набор таких элементов управления, которые совсем не имеют общих свойств, за исключением вездесущего Tag.

Общие свойства компонентов.

Если просмотреть списки свойств различных компонентов, можно заметить, что некоторые пункты встречаются снова и снова. Например, почти каждый компонент имеет свойства Height и Width. Теперь же давайте посмотрим, что у них общего.

Заголовки с физиономиями

Самым заметным свойством многих компонентов является свойство Caption. В качестве значения Caption можно ввести почти все, что угодно, - слово, фразу, предложение, даже небольшое стихотворение. Заголовок зависит от конкретного компонента. Например, кнопки склонны иметь в качестве заголовков краткие слова, обозначающие действие, в то время как переключатели и выключатели параметров используют иногда целые предложения, описывающие параметры, которыми они управляют.

Удивительным свойством обладает амперсанд (&) при использовании его в заголовке компонента. Он превращает следующий символ в клавишу мнемонического доступа к данному компоненту. Если заголовком кнопки является &Print, буква P появится подчеркнутой, а нажатие <Alt+P> будет иметь тот же эффект, что и нажатие самой кнопки. Естественно, в форме не должно быть двух компонентов с одинаковыми клавишами мнемонического доступа. Что если в заголовке нужно иметь символ амперсанда, например Save & Exit (сохранить и выйти) или Ham & Eggs (ветчина и яйца)? Никаких проблем - используйте два амперсанда в свойстве Caption, например Ham && Eggs

Так же как и форма, каждый отображающий текст компонент имеет свойство Font. Однако если свойство ParentFont имеет значение True, компонент будет автоматически отображать свой текст шрифтом, выбранным для главной формы, а изменение шрифта главной формы приведет к изменению шрифта, используемого компонентом. Значение True для свойства ParentFont, как правило, будет нас устраивать. Для заголовков компонентов можно использовать нетекстовый шрифт, например WingDings, но здесь скрыто несколько ловушек. Во-первых, символ, занимающий в шрифте место, которое обычно занимает амперсанд, будет трактоваться как амперсанд - следующий символ в заголовке окажется подчеркнутым. Если вы захотите использовать такой символ, придется использовать два символа, так же как с амперсандом. Во-вторых, символ, соответствующий клавише быстрого доступа к компоненту, отобразится нетекстовым шрифтом, хотя срабатывать будет точно так же, как и при использовании обычного шрифта. Например, "&L" в шрифте WingDings будет выглядеть как подчеркнутая печальная рожица, но нажатие <Alt+L> сработает как нажатие соответствующей кнопки. Использовать клавиши мнемонического доступа с нетекстовыми шрифтами не рекомендуется.

Приукрась меня!

Большинство компонентов имеет свойство Color, которое играет ту же роль, что и аналогичное свойство формы. Вы можете выбрать один из 16 имеющихся цветов, назначить цвет компонента по какому-либо экранному элементу Windows в качестве образца или отдать предпочтение любому пользовательскому цвету, который Windows в состоянии отобразить. Однако если разрабатываемая вами программа не предназначена для создания лоскутных одеял, скорее всего вам не понадобится менять цвет каждого компонента формы. Свойство ParentColor, принимающее значения True/False, исключает необходимость заниматься этим. Когда это свойство имеет значение True (по умолчанию), компонент принимает цвет формы. Стоит изменить цвет формы, изменится и цвет компонента. Если вы измените значение свойства Color компонента на любое, отличное от цвета формы, Delphi автоматически изменит значение свойства ParentColor на False.

Для отдельных компонентов можно также установить свойство Cursor, хотя необходимость в этом возникает редко. Значение crDefault определяет для большинства компонентов форму курсора в виде стрелки, а для компонентов ввода текста - в виде хорошо известного символа "I".

И все это - о размере

Каждый компонент, отображаемый на форме при запуске программы, обладает свойствами, которые определяют его размеры и расположение - Height, Width, Left и Тор. Значения всех четырех свойств выражаются в пикселях, а свойства Left и Тор определяются относительно левого верхнего угла формы. Если разместить компонент прямо в левом верхнем углу, его свойства Left и Тор будут равны 0.

Устанавливая эти свойства, можно управлять выравниванием и размерами группы компонентов. Если один из компонентов уже имеет нужные размеры, выберите его первым и щелкните на остальных компонентах при нажатой клавише <Shift>. Теперь, если вам придется устанавливать для группы одно из этих свойств, значение, используемое первым компонентом, для остальных будет значением по умолчанию.

Некоторые компоненты, такие как ListBox и Memo, обладают свойством Align, которое управляет тем, как эти компоненты размещаются на форме. Если этому свойству присвоить значение alTop, alBottom, alRight или alLeft, компонент сместится к соответствующему краю формы. Например, если Align имеет значение alBottom, компонент расположится в нижней части формы. При изменении размеров формы он сохраняет высоту, определенную при разработке, но изменяет ширину таким образом, чтобы заполнить всю ширину формы. Если другой компонент также находится в нижней части, они не наложатся друг на друга, а расположатся рядом и будут прижаты к нижнему краю. Присвоение Align значения alClient приведет к тому, что компонент заполнит клиентную область формы (или часть клиентной области, не занятой компонентами, прижатыми к краям). На рисунке показана форма, полностью заполненная компонентами, которые выровнены различными способами.

За кулисами

Некоторые из общих свойств оказываются невидимыми во время разработки, но проявляются во время запуска программы. Если свойству Enabled, например, присвоить значение False - компонент становится неактивным. Он приобретает мертвенно-бледный оттенок и не реагирует ни на какие события.

Если свойству Visible присвоить значение False, компонент становится невидимым во время запуска программы. Но он no-прежнему присутствует, и программа может позже сделать его видимым. Чаще всего компоненты делают невидимыми для того, чтобы разместить в одном месте формы несколько компонентов и делать их видимыми по очереди.

Вы можете испытать искушение сделать элементы управления невидимыми, если они недоступны. Например, кнопка File Save могла бы быть невидимой, когда ни один файл не загружен. Не делайте этого! Компоненты, которые появляются и исчезают, сбивают пользователя с толку. Если компонент недоступен, лучше его заблокировать (Enabled присвоить значение False).

Когда вы полностью овладеете программированием в Delphi, вам откроется возможность обратить свою энергию на решение действительно трудной задачи - создание систем справки Windows для своих программ. При наличии соответствующих средств это является вполне посильной задачей, но, увы, такие средства не поставляются в комплекте Delphi. Если вы создали файл справки для своей программы, можно связать компонент с соответствующей темой в системе справки, использовав номер темы в качестве значения свойства HelpContext компонента. После того как это будет сделано для всех компонентов, для вызова контекстно-зависимой справки пользователю будет достаточно нажать клавишу <F1>.

Если вы не ощущаете в себе готовности взяться за систему справки Windows, начните с подсказок. Делается это так. В качестве значения свойства Hint компонента вводится содержательная фраза, описывающая этот компонент. Чтобы эти подсказки отображались в полях помощи, свойству ShowHint главной формы следует присвоить значение True и оставить свойство ParentShowHint установленным в True. He трогайте собственное свойство ShowHint компонентов: если вам не нужна подсказка по конкретному компоненту, просто оставьте его свойство Hint пустым. Программа может также отображать подсказку по активному компоненту или пункту меню в своей строке состояния. Как это делается, мы узнаем позже.

Для хранения информации, не соответствующей ни одному из существующих свойств, можно использовать свойство Tag. Это свойство может содержать любое число от -2147483647 до 2147483648! Имея в своем распоряжении 4 миллиона чисел, можно представить самую разнообразную информацию.

Всплывающие (pop-up) меню сегодня прочно вошли в моду. Правой кнопкой мыши вы щелкаете на объекте экрана, и появляется меню, связанное с этим объектом. Неудивительно, что такие меню называют всплывающими. Компоненты Delphi обладают такой встроенной возможностью. Сначала требуется создать всплывающее меню, затем выбрать его для свойства PopupMenu компонента. Если вы не встречались с меню такого типа, обратитесь к самой Delphi. Вызовите Code Editor и щелкните на нем правой кнопкой мыши. Пункты появившегося всплывающего меню будут доступны или заблокированы, в зависимости от того, где вы щелкнули и выбран ли какой-либо текст.

При использовании Windows мышь важна, но иногда не хочется отрывать рук от клавиатуры. Свойства TabStop и TabOrder помогут обеспечить эффективную работу программ без мыши. Нажатие клавиши <Таb> перемещает фокус к следующему компоненту, у которого свойство TabStop имеет значение True. Слово "следующему" в данном случае указывает на компонент со следующим наибольшим значением TabOrder. Если ввести значение TabOrder, которое уже используется другим компонентом, Delphi изменит TabOrder других компонентов, чтобы освободить место для нового значения.

Программы должны быть максимально удобными - используются ли они с мышью или без.

Свойства DragMode и DragCursor автоматизируют для компонентов возможность буксировки (drag-and-drop). Если DragMode имеет значение dmAutomatic, можно щелкнуть на компоненте и буксировать курсор, представляющий собой объект. Если компонент, над которым в данный момент находится курсор, способен принимать опускаемые на него объекты, курсор отображается в соответствии с выбором пользователя для DragCursor; иначе он имеет вид перечеркнутой окружности - универсального символа НЕТ.

Начните с новой формы и поместите на нее компонент Label (обозначен на палитре компонентов прописной буквой А). В качестве заголовка компонента напишите, например, "Возьмите на буксир!" и дважды щелкните на его свойстве DragMode, чтобы изменить значение на dmAutomatic.

Щелкните на форме и перейдите на страницу Events в окне Object Inspector. Дважды щелкните на событии OnDragOver и вставьте следующий код:

Accept = Source IS TLabel;

Это означает, что форма будет принимать буксируемые компоненты, если их тип TLabel. Теперь дважды щелкните на строке события OnDragDrop в окне Object Inspector и вставьте следующие строки:

WITH Source AS TLabel DO BEGIN
    Left = X, Top = Y,
END;

Эти строки обеспечат перемещение буксируемого компонента к месту, на которое указывает курсор.

IS, WITH и AS

Слова IS, WITH и AS в Delphi имеют очень узкое значение. Они аналогичны обычным английским словам, только более конкретны. В программе слово IS может использоваться для определения того, соответствует ли данный компонент какому-то конкретному типу компонентов. В приведенном выше примере выражение Source IS TLabel является истиной, если буксируемый над формой компонент является компонентом Label.

Мы говорим: "Буцефал - это лошадь" или "Буцефал - это млекопитающее", потому что лошадь относится к млекопитающим. Так же и в Delphi TLabel является видом TGraphicControl, TGraphicControl относится к TControl и т.д., вплоть до первичного TObject. Окно Browser показывает эти взаимосвязи. В Delphi IS значит " ..является видом..."

В Delphi слово WITH позволяет экономить время. Обычно, если в программном коде Delphi требуется обозначить свойство компонента, мы вводим имя компонента, точку и имя свойства, например Button1.Caption. Это не очень удобно, если компонент имеет длинное имя или если нужно установить множество свойств. Слово WITH, за которым следует имя компонента, и слово DO сообщают Delphi, что в следующем блоке begin - end все ссылки на свойства имеют отношение к данному компоненту. Наконец, слово AS предписывает Delphi рассматривать компонент как относящийся к указанному виду компонентов. Слово AS действительно, только если компонент, по терминологии Delphi, ЯВЛЯЕТСЯ (IS) компонентом такого вида. В предыдущем примере программы мы использовали слова WITH и AS вместе, чтобы указать, что переменную Source следует рассматривать как TLabel, а ее свойствам Left и Тор следует присвоить новые значения. В последующих примерах программ мы также иногда будем использовать эти слова.

Запустите программу и попробуйте буксировать метку. Обратите внимание, что сразу после нажатия кнопки мыши курсор меняется на символ запрета. Это объясняется тем, что он находится над самой меткой, а она не способна принимать буксируемые компоненты. Как только курсор сместится за пределы метки, он примет вид, установленный по умолчанию для буксируемого курсора, - стрелку с прямоугольником. Если освободить кнопку мыши, чтобы опустить метку на форму, обработчик события OnDragDrop формы переместит метку на новое место. (Попробуйте буксировать метку таким образом, чтобы она вышла за пределы формы справа - при этом, словно по волшебству, возникнет горизонтальная полоса прокрутки.)

Каждый компонент имеет уникальное свойство Name. Первоначально Delphi назначает имя по умолчанию, например Form1 или Button2, выбирая первое незанятое имя. Его впоследствии можно изменить по своему усмотрению, подчиняясь при этом некоторым ограничениям: это имя не может уже использоваться другим компонентом; оно должно состоять исключительно из букв, цифр и символа подчеркивания; имя не может начинаться с цифры. Можно также полностью удалить имя, если программе не требуется обращаться к компоненту по имени - это характерно для меток. В целом вы обнаружите, что вполне можно обходиться именами, предоставляемыми Delphi по умолчанию. Если создаваемое Delphi имя компонента должно состоять из символов национального алфавита (например для пункта меню "Файл" или "Выход"), Delphi в качестве имени по умолчанию использует N1, N2, N3 и т.д.
Вы не сможете удалить имена всех компонентов данного типа. Если ваша программа использует метки, например, необходимо оставить имя хотя бы одной из них. Эта информация необходима Delphi для того, чтобы определить, какой из ее многочисленных модулей кода нужен вашей программе.

Подобно формам, многие компоненты реагируют на события мыши, клавиатуры и системы. Однако имеются исключения - например, метки со статичным текстом не реагируют на события клавиатуры, а компоненты Timer реагируют только на событие OnTimer.
Большинство компонентов имеют событие, назначенное по умолчанию, - двойной щелчок на компоненте в Form Designer немедленно предоставляет доступ к коду такого события. Если событие OnChange доступно, то оно будет событием по умолчанию, в противном случае событием по умолчанию будет OnClick. Компоненты, не реагирующие на оба эти события, не имеют события по умолчанию.

События мыши

Ваш уставший указательный палец отлично знает, что самым частым событием мыши является щелчок, особенно щелчок левой кнопкой. Событие OnClick, определенно, является самым популярным событием мыши. Для компонента событие OnClick будет иметь место при освобождении левой кнопки мыши, когда курсор находится над компонентом. Кроме того, многим компонентам при их активизации с клавиатуры Delphi также сообщает о событии OnClick.

Время от времени вам может требоваться более подробная информация о том, что происходит во время событий OnMouseDown и OnMouseUp. Эти события сообщают о том, какая кнопка мыши нажата, где расположен курсор мыши и даже какая из клавишей <Shift> нажата. Можно также использовать OnMouseUp вместо OnClick, если необходимо отличить действительный щелчок мышью от нажатия клавиши мнемонического доступа.

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

События drag and drop

События, происходящие при буксировке объектов, являются разновидностью событий мыши, но они достаточно своеобразны, чтобы упомянуть их особо. Как мы видели раньше при обсуждении свойства DragMode, событие OnDragOver компонента имеет место, когда пользователь буксирует поверх него другой компонент. Обычно это событие устанавливает свойство Accept в True или False, указывающее, можно или нет принять конкретный компонент. Событие OnDragDrop компонента происходит, когда пользователь непосредственно опускает на него другой компонент.

С другой стороны, буксируемым компонентом воспринимается и генерируется событие OnEndDrag, независимо от того, был или нет компонент опущен. Не существует соответствующего события OnBeginDrag, но компонент может определить начало буксировки, отслеживая свое событие OnDragOver.

Поместите метку в новую форму, измените заголовок на "Возьмите на буксир!" и присвойте ее свойству DragMode значение dmAutomatic. Поместите в форму еще несколько меток, выберите их все и измените для всех заголовок на "Причал". Затем перейдите на страницу Events окна Object Inspector и создайте обработчик события OnDragOver для меток " Причал" - он должен содержать всего одну строку:

Accept := True;

Выберите метку "Возьмите на буксир!" и создайте для нее обработчик события OnDragOver, содержащий следующие строки:

WITH Sender AS TLabel DO
    Caption := 'Буксировка';
Accept := False;

Создайте для нее OnEndDrag:

IF Target <> NIL THEN
    WITH Target AS TLabel DO
        Caption := 'Приплыли!' ;
WITH Sender AS TLabel DO
    Caption := 'Возьмите на буксир!';

Выражение WITH Sender AS TLabel DO трактует переменную Sender (которая теоретически может быть любым буксируемым компонентом) как TLabel. Использовать такое выражение - все равно, что заверить Delphi, что Sender относится к типу TLabel. Если это не так, Delphi пожалуется, что имеет место недопустимое приведение типов.

Запустите программу и попытайтесь буксировать метку "Возьмите на буксир!" Ее заголовок изменится на "Буксировка". Сама форма не воспринимает события, связанные с буксировкой и опусканием объектов, поэтому курсор имеет вид символа НЕТ (перечеркнутый круг). Когда буксируемая метка находится над меткой "Причал", курсор меняется на стрелку, говорящую о том, что данная метка способна принять опускаемый объект. Стоит это сделать, и заголовок метки "Причал" изменится на "Приплыли!" Независимо от того, было ли выполнено опускание или нет, при освобождении кнопки мыши заголовок первой метки изменится на первоначальный "Возьмите на буксир!"

Итак, OnEndDrag является событием, предназначенным для буксируемого компонента. Оно возникает по завершении процесса буксировки, независимо от того, был или не был один компонент опущен на другой. События OnDragOver и OnDragDrop предназначены для компонента, на который опускается другой компонент. Технология drag and drop, применяемая во всех новейших программах, основана на использовании этих событий.

События клавиатуры

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

Поместите на пустую форму одну-единственную кнопку. В качестве заголовка используйте "В&ыкл" и присвойте ее свойству Default значение True. Обработчики событий кнопки заполните следующим образом:

Обработчик Код события
OnClick: MessageBeep(O);
OnMouseDown: Button 1.Caption := '&Вкл';
OnMouseUp: Button 1. Caption := 'В&ыкл';
OnKeyDown: IF Key = 32 THEN Button 1.Caption: = '&Вкл'
OnKeyUp:

IF Key = 32 THEN Button 1.Caption: = 'В&ыкл'

Запустите программу и попробуйте манипулировать кнопкой. Если нажать клавишу мыши, когда курсор находится на кнопке, заголовок кнопки изменится на "Вкл"; если отпустить клавишу - восстановится заголовок "Выкл". Нажмите клавишу пробела, и заголовок изменится на "Вкл", отпустите - и восстановится заголовок "Выкл". При освобождении кнопки мыши или клавиши пробела возникает событие OnClick, что подтверждается звуковым сигналом. Стоит нажать <Alt+Ы> или <Enter> - также произойдет событие OnClick, сопровождаемое звуковым сигналом. Никаких других событий мыши или клавиатуры при этом не происходит.

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

События системы

Форма для программы является большим боссом и берет на себя основную часть переговоров с бюрократической системой Windows. Отдельные компоненты не обладают таким разнообразием системных событий, как форма. Как правило, когда фокус передается компоненту, он принимает событие OnEnter, а когда компонент лишается фокуса - событие OnExit. На этом обычно взаимоотношения компонентов и системных событий заканчиваются. Давайте разберемся, как все это работает.

При нажатой клавише <Shift> щелкнем в палитре компонентов на пиктограмме компонента Edit. Она выглядит как небольшой прямоугольничек с буквами ab внутри. Поместите на форму пять или шесть таких компонентов, выберите все их, присвойте свойству AutoSelect значение False и используйте следующие строки в качестве обработчика события OnEnter:

WITH Sender AS TEdit DO
    Font.Color := clRed;

Используйте следующие строки в качестве обработчика события OnExit:

WITH Sender AS TEdit DO
    Font.Color := clWindowText;

Запустите программу и попытайтесь выбирать различные строки редактирования с помощью мыши или многократно нажимая клавишу <Tab>. Текст активной строки ввода всегда будет представлен красным цветом. Используйте этот прием, когда вам придется создавать большие формы ввода данных с десятками строк ввода.

Специальные события

Для некоторых компонентов, которые реагируют на OnChange, это событие по умолчанию предшествует обработке события OnClick. Если вы дважды щелкнете на строке ввода в Form Designer, например, появится заготовка обработчика события OnChange. Для компонента Edit событие OnChange имеет место каждый раз, когда происходит изменение текста, независимо от того, исходит ли это изменение от ввода с клавиатуры или от команды из самой программы.

На новой форме поместите метку рядом со строкой ввода и измените размеры обоих компонентов таким образом, чтобы они заполнили форму по ширине. Дважды щелкните на строке ввода и вставьте следующий оператор в ее обработчик события OnChange:

Label1.Caption := UpperCase(Edit1 Text);

Запустите программу и введите в строке ввода какой-либо текст. Заголовок метки послушно отобразит то, что вы будете вводить с клавиатуры, конвертируя все буквы в прописные. Только это сработает если текст набран латиницей.

Label1.Caption := AnsiUpperCase(Edit1 Text);

А, вот этот оператор работает с русской раскладкой клавиатуры.

Положение компонентов на форме определяется их свойствами Left и Тор. Эти свойства аналогичны осям X и Y в графиках, которые вы, возможно, помните из школьного курса алгебры. При размещении компонентов используются еще два измерения - Tab-порядок и Z-порядок.

Мы уже кратко обсуждали Tab-порядок - это порядок, определяемый свойствами TabOrder компонентов формы. В каждый момент только один компонент имеет фокус - этот компонент принимает ввод пользователя с клавиатуры. Свойство TabOrder определяет порядок перемещения фокуса при нажатии пользователем клавиши <Таb>. Обычно TabOrder обеспечивает логичное перемещение фокуса слева направо и сверху вниз. Естественно, два компонента не могут иметь одинакового значения TabOrder.

К сожалению, компоненты добавляются в форму не в логическом порядке, а так, как они приходят на ум программисту. В результате часто Tab-порядок имеет в значительной степени произвольный характер, поскольку каждый добавляемый элемент получает следующее неиспользованное значение TabOrder. Прежде чем завершить создание формы, необходимо упорядочить значения TabOrder ее компонентов. Для этого выберите TabOrder из меню Edit (или из локального меню любого компонента), и в появившемся диалоговом окне Edit Tab Order просто разместите компоненты так, чтобы они располагались в нужном порядке. Для этого проще всего выбрать сначала компонент, который должен быть первым в Tab-порядке, и переместить его на первую позицию в списке. Затем то же проделать со вторым, третьим и т.д.

Если у вас возникают проблемы, связанные с соответствием имен компонентов в диалоговом окне Edit Tab Order с реальными компонентами формы, можно попробовать другой метод. Прежде всего, необходимо определить, как фокус должен перемещаться по форме - перемещение слева направо и сверху вниз является стандартом. Затем щелкните на последнем компоненте в выбранном вами порядке и установите его TabOrder в значение 0. Delphi найдет компонент, у которого до этого свойство TabOrder имело значение 0, и изменит его на 1. И такие изменения произойдут со всеми другими компонентами, насколько это необходимо, чтобы избежать совпадения свойств. После этого следует щелкнуть на том компоненте, который вы хотите сделать предпоследним, и установить его TabOrder в 0. Опять Delphi согласует все остальные компоненты. Повторяйте эту процедуру, пока не достигнете первого компонента, - в результате каждый компонент будет иметь нужное значение TabOrder, согласно выбранному вами порядку.
Комбинация возможностей мыши и клавиатуры облегчит этот процесс. Щелкните на самом первом компоненте, затем щелкните на TabOrder в Object Inspector, введите 0, нажмите <Enter>. Вам нет необходимости каждый раз возвращаться в Object Inspector, так как Delphi предполагает, что вы хотите ввести новое значение свойства, которое использовалось последним.

Z-порядок, вероятно, лучше всего назвать измерением. Измерение X ориентировано слева направо, измерение Y - сверху вниз, а измерение Z - перпендикулярно плоскости экрана и направлено к вам. Добавьте в форму несколько компонентов и разместите их так, чтобы они накладывались один на другой. Один из компонентов расположен выше всех остальных - он имеет самый высокий Z-порядок. Компонент, на который накладывается только компонент, имеющий самый высокий Z-порядок, имеет следующий за самым высоким Z-порядок и т.д.

Z-порядок редко имеет такое же значение, как порядок табуляции, - это даже не свойство. Но если необходимо установить Z-порядок, сделать это так же легко, как определить порядок табуляции. Предположим, имеется три компонента, накладывающихся друг на друга. Щелкаем на том, который должен быть выше всех остальных, и выбираем Send to Back из меню Edit. Щелкаем на компоненте, которому следует быть посередине, и тоже отсылаем его на задний план. Наконец, щелкаем на компоненте, который должен быть ниже двух остальных и повторяем команду Send to Back. На этом работа закончена.

Идеи и пожелания с удовольствием почитаем.

Хостинг от uCoz