Помощь - Поиск - Пользователи - Календарь
Полная версия: Перетаскивание формы
Форум «Всё о Паскале» > 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; 
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.