Є два варіанта. Або вручну робити за допомогою події руху миші, щоб при затиснутою ліву кнопку миші кнопка на формі слідувала за курсором, або використовувати стандартні функції.
Простий спосіб - за допомогою події руху миші. Описуємо булеву змінну drag. При подію OnMouseDown присвоюємо drag: = true, тобто дозволяємо переміщення. У обробнику події OnMouseMove присвоюємо координатам кнопки координати миші, так само, як було зроблено в таймері, але з умовою if drag then [наші дії]. І, нарешті, при подію OnMouseUp скидаємо змінну - drag: = false.
Приклад коду:
Інший спосіб такий: властивості DragMode кнопки привласнити dmAutomatic (кнопка переміщається автоматично), ну і властивості DragKind - dkDock (кнопка буде стикуватися з іншими об'єктами, як я зрозумів). Далі. У деяких компонентів, особливо з великим і порожнім робочим простором (форма, панель, всякі бари), є властивість DockSite - щоб кнопка сідала на цей компонент, це властивість має мати значення true. Правда, кнопка може випадково опинитися сама по собі, не пристикованої, тому потрібно бути акуратніше (у неї з'явиться заголовок і кнопка закриття, тобто користувач може її випадково знищити). Зате це зручно. До речі, тут є додаткові події: OnDragDrop, OnDragOver, OnStartDock, OnStartDrag, OnEndDock, OnEndDrag. Сподіваюся, розберешся з ними сам, якщо знадобиться.
відповідь дан 5 Жовтня '11 о 15:18
А в чому проблема?)
Обробляємо подія, коли ми мишкою затиснули кнопку, MouseDown начебто) Ну, наприклад є змінна типу boolean Down, присвоюємо їй true. Далі обробляємо подія на формі, коли ми пересуваємо курсор миші, MouseMove. Тут пишемо щось на зразок цього:
де X, Y - поточні координати миші;
Якщо у кнопки положення задається через Location типу TPoint, то відповідно міняємо їх.
Далі, наприклад якщо ми досягли певної позиції по X і Y, то викликаємо button1.Click ();
Ну я думаю логіка зрозуміла, у мене Delphi щас не варто, так що повного коду привести не можу.