Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перетаскиваемая кнопка, Как сделать? 
:(
    Опции темы
Oleg
Дата 15.9.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 16.9.2002

Репутация: нет
Всего: нет



Как сделать чтобы кнопку можно было таскать по всей форме? Не в док но в драг-режиме.
--------------------
...Знающий не доказывает.   Доказывающий не знает...
PM MAIL   Вверх
Akella
Дата 15.9.2005, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Почитай в DRKB или FAQ`е статью про Drag&Drop
PM MAIL   Вверх
Poseidon
Дата 15.9.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Oleg @ 15.9.2005, 09:36)
Как сделать чтобы кнопку можно было таскать по всей форме?
Вот, набрасал на скорую руку:

Код
var
  Form1: TForm1;
  move: boolean;
  tX, tY: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:= True;
tX:= Mouse.CursorPos.X - Form1.Left - Button1.Left;
tY:= Mouse.CursorPos.Y - Form1.Top - Button1.Top;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then
  begin
  Button1.Left:= Mouse.CursorPos.X - Form1.Left - tX;
  Button1.Top:= Mouse.CursorPos.Y - Form1.Top  - tY;
  end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Move:= false;
end;




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Vet
Дата 15.9.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Очень просто smile

Код

var
 Coord: TPoint;

...

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if ssLeft in Shift then
  begin
   Button1.BeginDrag(true);
   Coord := Point(X, Y);
  end;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
 Accept := Source is TButton;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 Button1.Left := X - Coord.X;
 Button1.Top := Y - Coord.Y;
end;


Это сообщение отредактировал(а) Vet - 15.9.2005, 17:02
PM MAIL   Вверх
Poseidon
Дата 15.9.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Vet, не плохой пример. Но я бы добавил еще в FormDragDrop вот что:

Код
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Button1.Visible:= False;
Button1.Left := X - Coord.X;
Button1.Top := Y - Coord.Y;
Button1.Visible:= True;
end;


Мелькание кнопки раздражает. smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Vet
Дата 15.9.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Цитата
Мелькание кнопки раздражает

Poseidon, а ты ничего не перепутал? У меня ничего не мелькает, во время перетаскивания (FormDragOver) ничего же не перерисовывается, только разрешается перетаскивание:
Код

Accept := Source is TButton;

PM MAIL   Вверх
Poseidon
Дата 15.9.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Vet, а ты попробуй сам, потягай. Мелькание заметно. Не все время, но есть. smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Yanis
Дата 15.9.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



To Oleg
Можно ещё седлать это так:
Код

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  ReleaseCapture;
  Button1.perform(WM_SysCommand, SC_DragMove, 0);
end;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Vet
Дата 15.9.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Poseidon, хоть убей, а не мелькает! smile Форма, на ней кнопка и больше ничего..

To Yanis:
Так тоже ничего, даже с рамкой smile
Только надо бы это дело в OnMouseMove засунуть, а то кнопка не нажимается. Интересно, откуда такое значение константы?
PM MAIL   Вверх
Yanis
Дата 16.9.2005, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



To Vet
А как ты себе представляешь кнопку которую можно и таскать и нажимать!? Я с трудом.... Но твою идею можно реализовать, если ввести флаг, который будет указывать в каком режиме кнопка: таскающаяся smile, нажимающаяся. Мне видится это так:
Код

...

var
  Form1: TForm1;
  Dragging: Boolean = false;

...

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  if (not Dragging) then Exit;
  ReleaseCapture;
  Button1.perform(WM_SysCommand, SC_DragMove, 0);
end;

Цитата(Vet @ 15.9.2005, 20:35)
Интересно, откуда такое значение константы?
Если честно, то мне тоже очень хочется узнать smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 16.9.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Yanis @ 16.9.2005, 00:23)
А как ты себе представляешь кнопку которую можно и таскать и нажимать!?
Yanis, все предыдущие примеры (мой и Vetа) имеено так и делали. И тоскать можно и нажимать. smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Vet
Дата 17.9.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Согласен, зачем нужна такая кнопка, которую нажать нельзя?
PM MAIL   Вверх
Poseidon
Дата 17.9.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Vet @ 17.9.2005, 13:58)
зачем нужна такая кнопка, которую нажать нельзя?
Что бы её таскать smile

Oleg, ну что, хоть помогло что-нибудь?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Yanis
Дата 18.9.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



To Poseidon
Цитата(Poseidon @ 16.9.2005, 16:08)
Yanis, все предыдущие примеры (мой и Vetа) имеено так и делали. И тоскать можно и нажимать.

Я же написал:
Цитата(Yanis @ 15.9.2005, 19:31)
Можно ещё седлать это так:

(пускай и с ошибкой в слове "сделать" smile Я своего мнения не навязываю...)

Это сообщение отредактировал(а) Yanis - 18.9.2005, 22:00


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.