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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перетаскивание панели за пределы формы, Возможно ли? 
:(
    Опции темы
TP@MB@Y
Дата 10.5.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В своей программ я реализовал панель, которую таскаю мышкой куда захочу... Но только в пределах формы. Но было бы просто замечательно, если бы сделать возможным перетаскивать панельку за пределы формы, т.е. в любую точку экрана(это сэкономит мне много рабочего места в интерфейсе)

Вот как я реализовываю перетаскивание:
Код

procedure TfMain.gbGrifMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  ReleaseCapture;
  gbGrif.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
  

Это сообщение отредактировал(а) TP@MB@Y - 10.5.2006, 23:35
PM   Вверх
Rouse_
Дата 10.5.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Говори что ты на заголовке, и будешь таскать куда хочешь... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
TP@MB@Y
Дата 11.5.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rouse_, поясни пожалуста smile 
PM   Вверх
Poseidon
Дата 11.5.2006, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(TP@MB@Y @  10.5.2006,  23:35 Найти цитируемый пост)
реализовал панель
 Это TPanel что-ли? Если так, то почему бы просто не установить
Код
Panel1.DockSite:= True;
Panel1.DragKind:= dkDock;
Panel1.DragMode:= dmAutomatic;

и сможешь тягать эту панель даже за пределы формы 


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


Опытный
**


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

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



Poseidon, спасибо, работает  smile  А можно как то убрать крестик(верхний правый угол) на панели.  
PM   Вверх
Snowy
Дата 11.5.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно. Через SetWindowLong - изменить Style при окончании драгэндока. 
PM MAIL   Вверх
Alexeis
Дата 11.5.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Snowy, это здесь не пройдет. После создания окна такие стили не работают. VCL стили окна меняет так
Код

procedure TCustomPanel.SetBorderStyle(Value: TBorderStyle);
begin
  if FBorderStyle <> Value then
  begin
    FBorderStyle := Value;
    RecreateWnd;
  end;
end;

т.е. пересоздает окно
для Value разрешены только два варианта bsNone и bsSingle
так что нужно создовать наследника и перекрыть функцию. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 11.5.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexeis1 @  11.5.2006,  14:28 Найти цитируемый пост)
Snowy, это здесь не пройдет.
Позволю себе с Вами не согласиться.
То, что окно пересоздается, совсем не значит, что оно перестает существовать.
Просто меняет владельца.
Код

procedure TForm1.PanelkaEndDock(Sender, Target: TObject; X, Y: Integer);
var wnd: HWND;
begin
  wnd := GetParent(Panelka.Handle);
  if wnd = Handle then Exit;
  SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) xor WS_DLGFRAME);
end;


Добавлено @ 16:21 
Здесь Panelka - это панель с установленным драгэндоком. 
PM MAIL   Вверх
Alexeis
Дата 11.5.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Snowy, 
Цитата(Snowy @  11.5.2006,  15:20 Найти цитируемый пост)
То, что окно пересоздается, совсем не значит, что оно перестает существовать.
Просто меняет владельца.


Очень интересно! Не знал...

Однако этот код делает заглоловок неактивным, не удаляя его, тоже самое происходит если применить подобный код к форме. Напимер, во время работы программы (после application.run) уже нельзя удалить таким образом кнопки свернуть и развернуть. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 11.5.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexeis1 @  11.5.2006,  16:38 Найти цитируемый пост)
Однако этот код делает заглоловок неактивным, не удаляя его
???
Какой заголовок? У меня после этого кода не остается никакого заголовка.

Добавлено @ 16:58 
Прикладываю проект для D7  

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Panelka.zip 7,15 Kb
PM MAIL   Вверх
Alexeis
Дата 12.5.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Snowy, пробовал ваш экзешник - ситуация анологичная заголовок неактивный, но вполне видимый (синяя полоска с крестиком) 

Тестировал на Microsof Windows 2000 5.00.2195 Service Pack 4. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 12.5.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда немного поправим - сделаем по честному.
Код

procedure TForm1.PanelkaEndDock(Sender, Target: TObject; X, Y: Integer);
var wnd: HWND;
begin
  wnd := GetParent(Panelka.Handle);
  if wnd = Handle then Exit;
  SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not WS_DLGFRAME);
end;

У меня на 2003 отлично работает.

Добавлено @ 10:30 
Пришиваю новый вариант.
В нем панелька еще и обратно ставится.  

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Panelka.zip 7,16 Kb
PM MAIL   Вверх
Yanis
Дата 12.5.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



У меня как и у Snowy, всё работает как требуется. 


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Snowy, тот же эффект !
Кстати, вариант с "and not WS_DLGFRAME" - я уже раньше пробовал с тем же результатом. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 12.5.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Под XP и 2003 на D7 работает корректно.
Я бы рад поправить, но у меня данная проблема не возникает... 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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