Помощь - Поиск - Пользователи - Календарь
Полная версия: Перетаскивание формы
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Cтасикявичус
Подскажите, ПЛИЗЗЗ!
Как мне сделать так, (и можно ли вообще) чтобы форму можно было перетаскивать с маста на место держась за TImage или TPaintBox.
Заранее очень благодарен.
xds
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if ssLeft in Shift then
   begin
     ReleaseCapture;
     SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
   end;
end;
BlackShadow
Мамочки, неужели всё так сложно?

Я бы делал так:
1). Ловлю нажатие, ставлю флажок, сохраняю координаты.
2). Ловлю MouseMove, проверяю флажок и при помощи Left и Top формы шевелю её в соответствии с сохранёнными координатами.
3). Ловлю отпускание кнопки, снимаю флажок.

Я так когда-то свой Caption рисовал...
xds
Это уже будет какая-то "эмуляция" перетаскивания формы: взять хотя-бы настройку Windows "Отображать содержимое окна при перетаскивании" - так она перестанет работать для такого приложения... <_<

Впрочем, таскать форму самому возможно более совместимый подход...
Atos
Подскажите, пожалуйста, такой простой вопрос: можно ли создать такой элемент формы, чтобы при некотором условии его можно было перетаскивать в пределах формы? Если да, то какой тип он должен иметь? Или это в любом случае надо делать программно, т. е. ловить нажатие, движение и отпускание мыши и соответственно изменять координаты?
BlackShadow
Почитай про Dock. В боровском хелпе всё вполне доступно...
trminator
Пусть хотим "потаскать" Panel1

// Начинаем тащить
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
   if Button = mbLeft then
       Panel1.BeginDrag(false);
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
begin
// решаем, разрешить ли кидать этот объект на форму
   Accept := Source is TPanel; // Форма принимает только объекты TPanel
end;

// Изменяем координаты перетащенного объекта
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
   (source as TPanel).left := x;
   (source as TPanel).top := y;
end;

BlackShadow
trminator, я так понял, что вопрос не о Drag'n'Dock был...
Atos
Drag'n'Dock меня тоже интересует... Спасибо за пример, trminator !
А просто перетаскивание - оказывается, я невнимательно смотрел FAQ :p2:
Там есть такой простой способ:


procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 ReleaseCapture;
 Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.