274________________________________________________Глава 4

4.6 Перемещение компонентов в окне
приложения

4.6.1 Дискретное перемещение

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

Перемещение в заранее известные позиции может осуществляться многими
способами. Можно просто изменять координаты компонента Left и Тор. Приведем
простой и наглядный пример подобных перемещений. Давайте сделаем простень-
кую игру. Пусть на форме имеется 16 панелей, 15 из которых пронумерованы, а
шестнадцатая — с пустой надписью (см. рис. 4.17, показывающий один из приме-
ров, которые вы можете найти на диске, прилагаемом к книге). Требуется за мини-
мальное число ходов расставить панели по порядку номеров. Каждый ход заклю-
чается в щелчке на одной из панелей с цифрами, после чего она перемещается на
пустое место. В простой игре перемещать можно любые панели, в игре 15 — только
соседние с пустой позицией.

ПоИМеО                        ^рйРаспояожи по корявы             KrptIS         /        : Собери мртшч.э

Перемещение осуществляется в обработчике событий OnClick панелей с циф-
рами. Пишется один обработчик для всех панелей. Для одновременного задания в
панелях всех координат нового месторасположения используется свойство Bound-
sRect — структура типа TRect, в которой записаны координаты левого верхнего
угла компонента и его размеры. Чтобы хранить структуру с координатами панели,
в программе объявлена соответствующая переменная:

struct TRect rec;

Это объявление записано в заголовочном файле модуля вне описания класса
формы.

В упрощенном варианте без проверок допустимости перемещения данной па-
нели обработчик событий OnClick панелей может иметь вид:

void _fastcall TFormI::PanellClick(TObject *Sender)
{

//запоминание места и размеров панели
rec = ( (TPanel *)Sender)->BoundsRect;

//перемещение панели
((TPanel *)Sender)->BoundsRect = Panell6->BoundsRect;

//перемещение пустой панели
Panell6->BoundsRect = rec;

)