Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

1.11. Ограничение пределов изменения размеров окон и компонентов

Все рассмотренные ранее методы изменения размеров панелей и компонентов на них имеют общий недостаток: при чрезмерном уменьшении пользователем размеров окна какие-то компоненты могут исчезать из поля зрения. Иногда к некрасивым с точки зрения эстетики результатам приводит и чрезмерное увеличение размеров окна. Хотелось бы иметь средства, ограничивающие пользователя в его манипуляциях с окном и не позволяющие ему чрезмерно уменьшать и увеличивать размеры.

Начиная с Delphi 4 такие средства имеются. Это свойство Constraints, присущее всем компонентам и позволяющее задавать ограничения на допустимые изменения размеров. Свойство имеет четыре основных подсвойства: MaxHeight, Max-Width, MinHeight и MinWidth — соответственно максимальная высота и ширина и минимальная высота и ширина. По умолчанию значения всех этих подсвойств равны 0, что означает отсутствие ограничений. Но задание любому из этих свойств положительного значения приводит к соответствующему ограничению размера заданным числом пикселей.

Чтобы какие-то компоненты не исчезали из поля зрения, можно задать им ограничения минимальной высоты и длины. Таким образом, можно поддерживать нормальные пропорции отдельных частей окна. Можно задать ограничения на минимальные и максимальные размеры формы, т.е. всего окна.

Контрольные вопросы:

  1. Перечислите требования к графическому интерфейсу пользователя.

  2. Дайте определение графическому интерфейсу пользователя.

  3. Что включает в себя система подсказок в приложении?

  4. Какие требования предъявляются к разработке меню?

  5. Какой цвет оптимально подходит для интерфейса приложения?

Рекомендуемая литература: 1.1. Лекция № 21 Тема: Перетаскивание объектов

План:

1. Перетаскивание информации об объектах — технология Drag&Drop

2. Перетаскивание и встраивание объектов — Drag&Doc. Плавающие окна

1. Перетаскивание информации об объектах — технология Drag&Drop

Процесс перетаскивания с помощью мыши информации из одного объекта в другой (Drag&Drop), коротко называемый перетаскиванием, очень широко используется в Windows. Например, вы можете перемещать файлы между папками, перемещать сами папки, включая их в другие папки, и т.д. Посмотрим, как осуществляется подобное перетаскивание информации объектов в Delphi.

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

Начало процесса перетаскивания определяется свойством DragMode, которое может устанавливаться в процессе проектирования или программно равным dmManual или dmAutomatic. Значение dmAutomatic (автоматическое) определяет автоматическое начало процесса перетаскивания при нажатии пользователем кнопки мыши над компонентом. Имейте в виду, что в этом случае событие OnMouseDown, связанное с нажатием пользователем кнопки мыши, для этого компонента вообще не наступает. Значение же dmManual (ручное) говорит о том, что начало процесса перетаскивания должен определять программист. Для этого он должен в соответствующий момент вызвать метод BeginDrag. Например, он может поместить вызов этой функции в обработчик события OnMouseDown, наступающего в момент нажатия кнопки мыши. В этом обработчике он может проверить предварительно какие-то условия (режим работы приложения, нажатие тех или иных кнопок мыши и вспомогательных клавиш) и при выполнении этих условий вызвать BeginDrag.

Пусть, например, процесс перетаскивания должен начаться, если пользователь нажал левую кнопку мыши и клавишу Alt над списком ListBox1. Тогда свойство DragMode этого компонента надо установить в dmManual, а его обработчик события OnMouseDown может иметь вид:

procedure TForml.ListBoxlMouseDown(Sender: TObject;Button: MouseButton; Shift: TShiftState; X, Y: Integer);

Begin

if (Button = mbLeft) and (ssAlt in Shift) then ListBoxl.BeginDrag(false);

end;

Параметр Button обработчика события OnMouseDown показывает, какая кнопка мыши была нажата, а параметр Shift является множеством, содержащим обозначения нажатых в этот момент кнопок мыши и вспомогательных клавиш клавиатуры. Приведенный выше оператор проверяет, нажата ли левая кнопка мыши и клавиша Alt. Если нажаты, то вызывается метод BeginDrag данного компонента.

В предыдущем примере в функцию BeginDrag передано значение false. Это означает, что процесс перетаскивания начнется не сразу, а только после того, как пользователь сдвинет мышь с нажатой при этом кнопкой. Это позволяет отличить простой щелчок мыши от начала перетаскивания. Если же передать в BeginDrag значение true, то перетаскивание начнется немедленно.

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

В процессе перетаскивания компоненты, над которыми перемещается курсор, могут информировать о готовности принять информацию от перетаскиваемого объекта. Для этого в компоненте должен быть предусмотрен обработчик события OnDragOver, наступающего при перемещении над данным компонентом курсора, перетаскивающего некоторый объект. В этом обработчике надо проверить, может ли данный компонент принять информацию перетаскиваемого объекта, и, если не может, задать значение false передаваемому в обработчик параметру Accept. По умолчанию этот параметр равен true, что означает возможность принять перетаскиваемый объект. Обработчик для списка ListBoxl может иметь, например, следующий вид:

procedure TForml.ListBoxlDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

begin

if(Source as TControl <> Sender) : then

Accept:= Source is TListBox else Accept := false;

end;

В нем сначала проверяется, не является ли данный компонент (Sender) и перетаскиваемый объект (Source) одним и тем же объектом. Это сделано, чтобы избежать перетаскивания информации внутри одного и того же списка. Если источник и приемник являются одним и тем же объектом, то срабатывает else и параметр Accept становится равным false, запрещая прием информации. Если же это разные объекты, то Accept делается равным true, если источником является какой-то другой список (компонент класса TListBox), и равным false, если источник является объектом любого другого типа. Таким образом, компонент ListBoxl сообщает, что готов принять информацию из любого другого списка.

Значение параметра Accept, задаваемое в обработчике события OnDragOver, определяет вид курсора, перемещающегося при перетаскивании над данным компонентом. Этот вид показывает пользователю, может ли данный компонент принять перетаскиваемую информацию. Если в компоненте не описан обработчик события OnDragOver, то считается, что данный компонент не может принять информацию перетаскиваемого объекта.

Процедура приема информации от перетаскиваемого объекта записывается в обработчике события OnDragDrop принимающего компонента. Это событие наступает, если после перетаскивания пользователь отпустил кнопку мыши над данным компонентом. В обработчик этого события передаются параметры Source (объект-источник) и X и Y координаты курсора. Если продолжить начатый выше пример перетаскивания информации из одного списка в другой, то обработчик события OnDragDrop может иметь вид:

procedure TForml.ListBoxlDragDrop(Sender, Source: TObject; X, Y: Integer);

begin

(Sender as TListBox).Items.Add((Source as TListBox).Items[(Source as TListBox).Itemlndex]);

end;

В этом обработчике строка, выделенная в списке-источнике (Source as TListBox).Items[(Source as TListBox).Itemlndex], добавляется в список-приемник методом (Sender as TListBox).Items.Add, и используется операция as, позволяющая рассматривать параметры Sender и Source как указатели на объекты класса TListBox. Это делается потому, что эти параметры объявлены в заголовке процедуры как указатели на объекты класса TObject. Но в классе TObject нет свойств Items и Itemlndex, которые нам требуются. Эти свойства определены в классе TListBox, являющемся наследником TObject. Поэтому с параметрами Sender и Source в данном случае надо оперировать как с указателями на объекты TListBox, что и выполняет операция as.

После завершения или прерывания перетаскивания наступает событие OnEndDrag, в обработчике которого можно предусмотреть какие-то дополнительные действия. Имеется также связанное с перетаскиванием событие OnStartDrag, которое позволяет произвести какие-то операции в начала перетаскивания. Это событие полезно при автоматическом начале перетаскивания, когда иным способом этот момент нельзя зафиксировать.