Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / "Таскание" компонентов / 22 сообщений из 22, страница 1 из 1
10.11.2003, 12:21
    #32318728
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Хочется сделать таскание Image мышью. Делаю Im.DragMode := dmAutomatic;
При Im.DragKind = dkDrag таскать не разрешает, а при ImDragKind = dkDock становится в отдельном окошке и не понятно как его вернуть обратно на панель. Как правильно сделать? Наверное нужно что-то еще настроить.
...
Рейтинг: 0 / 0
10.11.2003, 12:25
    #32318735
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Если под "тасканием" ты понимаешь docking - то посмотри примеры которые с Delphi идут - там есть достаточно подробный
...
Рейтинг: 0 / 0
10.11.2003, 13:18
    #32318817
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Есть у меня рисунок в TImage, который лежит на панели.
Я хочу чтобы его можно было мышью таскать в пределах этой панели(ну как в дельфях можно все компоненты таскать по форме при проектировании).

to funikovyuri
Спасибо, буду смотреть docking (хотя по-моему это не то что мне нужно...)
...
Рейтинг: 0 / 0
10.11.2003, 13:21
    #32318823
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Да - скорее всего - ты о Drag&Drop - там большей частью ручками
...
Рейтинг: 0 / 0
10.11.2003, 13:28
    #32318835
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
А где бы простенький примерчик посмотреть (никогда не занимался Drag&Drop)?
...
Рейтинг: 0 / 0
10.11.2003, 13:56
    #32318877
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Сделал все руками (на C++Builder-e):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int XDown,YDown;
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
   TImage* im = dynamic_cast<TImage*>(Sender);
   if (Shift.Contains(ssLeft))
   {
     im->Left += X-XDown;
     im->Top += Y-YDown;
   }
}
// ---------------------------------------------------------------------------
 

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   XDown = X;
   YDown = Y;
}

Не понятно почему ЭТО еще и имеет отдельное "понтовое" название Drag&Drop.
Или я чего-то не понял?
...
Рейтинг: 0 / 0
10.11.2003, 14:37
    #32318942
Ray Adams
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
автор писал:Не понятно почему ЭТО еще и имеет отдельное "понтовое" название Drag&Drop.
Или я чего-то не понял?
Ты чего то как раз и не понял :), Drag&Drop - это не компонент таскать и вообще не от Delphi/BCB он пришел, а от Windows. Ты же целый день это делаеш в индах, таская иконки и так далее. (хотя конечно есть различия между Дельфиским Drag&Drop и Виндовом). Тебе просто надо компоненты в ран тайме двигать?
...
Рейтинг: 0 / 0
10.11.2003, 14:50
    #32318963
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
автор писал:Тебе просто надо компоненты в ран тайме двигать?
Да мне нужно просто мышью гонять по панели компонент Image.
...
Рейтинг: 0 / 0
10.11.2003, 14:52
    #32318967
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Я уже много раз делал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
var
  _x,_y:integer;

procedure TfoAbout.FormCreate(Sender: TObject);
begin
    image1.OnMouseMove:=nil;
end;

procedure TfoAbout.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  image1.OnMouseMove:=Image1MouseMove;
  _x:=x;
  _y:=y;
end;

procedure TfoAbout.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
    image1.left:=x-_x+image1.left;
    image1.top:=y-_y+image1.top;
end;

procedure TfoAbout.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  image1.OnMouseMove:=nil;
end;

никаких проблем.

Viman
...
Рейтинг: 0 / 0
10.11.2003, 15:01
    #32318979
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
to viman

Да я именно так и сделал (см. мой пример на Builder-e).
Только я не понял зачем нужно image1.OnMouseMove:=nil;?
...
Рейтинг: 0 / 0
10.11.2003, 15:07
    #32318987
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
У тебя строка if (Shift.Contains(ssLeft)) проверяет нажата кнопка или нет. У меня не проверяется. Когда нажимаешь кнопку, процедура mousemove будет вызываться, отпускаешь, mousemove=nil и уже не вызывается...

Viman
...
Рейтинг: 0 / 0
10.11.2003, 15:17
    #32319015
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Странный способ проверки нажата ли клавиша...
Ведь именно для этого и существует TShiftState.

to Ray Adams

Хотелось бы узнать про то как применить Drag&Drop к моей задаче. И нужно ли это делать?
...
Рейтинг: 0 / 0
10.11.2003, 15:33
    #32319038
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Чего странного? Зачем обрабатывать какие то события если это уже не требуется...

Viman
...
Рейтинг: 0 / 0
10.11.2003, 15:51
    #32319076
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
to viman

В mousemove=nil вообще-то есть смысл.

to Ray Adams

Ах, да :
автор писал:Drag&Drop - это не компонент таскать
А для чего он нужен?
...
Рейтинг: 0 / 0
10.11.2003, 15:59
    #32319091
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Можно кстати и с Automatic сделать.
Дело в том что это так Док устроен, если ты на форме/панели поместишь еще два Image и подвигаешь их ручками (ManualFloat, ManualDock), и сделаешь их невидимыми, то видимый 3-й имаг и все остальные созданные после него, не будут выстраиваться в окошко и обратно при повторном клике, а будт нормально таскаться. Правда будут другие проблемы, например при выносе объекта вообще за пределы формы, надо будет отслеживать это. Но зато при автоматик Dock не надо рисовать квадратик самому (граница переносимого объекта)
...
Рейтинг: 0 / 0
10.11.2003, 16:00
    #32319094
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Это кстати в Архангельском описана методика, бывают и в дурацких книжках полезные весчи :)
...
Рейтинг: 0 / 0
10.11.2003, 16:51
    #32319189
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
to Sclif

В моем случае лучше так не делать. Таскать квадратик менее удобно (для пользователя), чем сразу рисунок. Да и за чем мне "гемморой" с невидимыми имеджами?
А проверку чтобы не вылезал за панель мне и так приходится делать.
...
Рейтинг: 0 / 0
11.11.2003, 11:58
    #32319873
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
Ну гемороя то нет никакого, 6 строчек кода. Надо только учитывать что у тебя на форме два лишних DockedComponents вот и все... Квадратик конечно не здорово, но зато глюки практически исключены.

Ну на вкус и цвет конечно :) Как хотите.
...
Рейтинг: 0 / 0
12.11.2003, 13:41
    #32321425
Nemec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
а попробуй на MouseDown:

const SC_DragMove = $F012
begin
ReleaseCapture;
TWinControl(Sender).SetFocus;
TWinControl(Sender).Perform(WM_SysCommand, SC_DragMove, 0);
TWinControl(Sender).Repaint;
end;
...
Рейтинг: 0 / 0
12.11.2003, 14:47
    #32321571
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
to Nemec

То что ты написал по-моему глупость.
У TImage нельзя сделать SetFocus.
Что-то не понял суть твоей идеи.
...
Рейтинг: 0 / 0
12.11.2003, 16:21
    #32321787
Nemec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
:) нет не глупость, а просто кусок, взятый из программы и не адаптированный к вашим нуждам. нужно зреть в корень!

пробуйте так:

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

и плюс передать нажатие:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1MouseDown(Panel1, Button, Shift, X, Y);
end;

у меня все перемещается, дальше уж вы как-нибудь сами, ок? :)
...
Рейтинг: 0 / 0
12.11.2003, 16:22
    #32321793
Nemec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Таскание" компонентов
рисунок, я поместил в панель и двигаю по сути панель
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / "Таскание" компонентов / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]