Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перетаскивание


Страницы:   1 2

Sergey_b ©   (2006-10-24 09:56:00) 

Привет всем.
Подскажите, пожалуйста, как оле(в нем картинка) таскать мышью в скрулбоксе. И почему при увеличении размеров оле в боксе не появляются полосы прокрутки?


novill   (2006-10-24 15:06:00) [1]

> [21] Elen ©   (24.10.06 13:21)

И от меня спасибо :)


Sergey_b   (2006-10-24 13:53:00) [2]


> EndDrag

не нужен


Sergey_b   (2006-10-24 13:52:00) [3]

Огромное спасибо. И вопрос: EndDrag - конец переноса(вроде так), но если он ничего не делает, то зачем нужен?


Elen   (2006-10-24 13:21:00) [4]


>  Мыша при зацепе перемещается в поз. (0,0) оле - не пойму
> почему?

потому что
OleContainer1.Top:=t.y;
OleContainer1.Left:=t.x;

Это не мыш прыгает туда, а OLE прыгает за мышку.  Вот пример другой

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, OleCtnrs;

type
 TForm1 = class(TForm)
   ScrollBox1: TScrollBox;
   OleContainer1: TOleContainer;
   procedure OleContainer1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure OleContainer1EndDrag(Sender, Target: TObject; X, Y: Integer);
   procedure OleContainer1DragDrop(Sender, Source: TObject; X,
     Y: Integer);
   procedure OleContainer1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public      ax,ay:integer;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OleContainer1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var t:Tpoint;
begin
t:=Mouse.CursorPos;
t:= ScrollBox1.ScreenToClient(t);
OleContainer1.Top:=t.y-ay;
OleContainer1.Left:=t.x-ax;
end;

procedure TForm1.OleContainer1EndDrag(Sender, Target: TObject; X,
 Y: Integer);
begin
tag:=0;
end;

procedure TForm1.OleContainer1DragDrop(Sender, Source: TObject; X,
 Y: Integer);
begin
tag:=0;
end;

procedure TForm1.OleContainer1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ax:=x; ay:=y ;
OleContainer1.BeginDrag(true);
end;

end.


DragMode для OLE должно быть Manual


Sergey_b   (2006-10-24 13:12:00) [5]


> Измени это условие и будет тебе счастье

Вот бы...


Sergey_b   (2006-10-24 13:09:00) [6]


> Это не мыш прыгает туда, а OLE прыгает за мышку.

Как?


Elen   (2006-10-24 13:04:00) [7]


>  Мыша при зацепе перемещается в поз. (0,0) оле - не пойму
> почему?

потому что
OleContainer1.Top:=t.y;
OleContainer1.Left:=t.x;

Это не мыш прыгает туда, а OLE прыгает за мышку. Измени это условие и будет тебе счастье


Sergey_b   (2006-10-24 13:00:00) [8]


> Elen ©   (24.10.06 12:29) [16]

Почти так, только переместить картинку можно лишь до начала коорд. контейнера. Мыша при зацепе перемещается в поз. (0,0) оле - не пойму почему?


Elen   (2006-10-24 12:29:00) [9]


> Sergey_b

[14] - вигня Sorry, не о том думаю
Попробуй так :

procedure TForm1.OleContainer1DragOver(Sender, Source: TObject; X,
 Y: Integer; State: TDragState; var Accept: Boolean);
var t:Tpoint;
begin
t:=Mouse.CursorPos;
t:= ScrollBox1.ScreenToClient(t);
OleContainer1.Top:=t.y;
OleContainer1.Left:=t.x;
end;


Sergey_b   (2006-10-24 12:12:00) [10]


> Elen ©   (24.10.06 12:09) [14]

Не понял


Elen   (2006-10-24 12:09:00) [11]


> Sergey_b

Я наверно не так выразилась. Приатач DragOver контейнера к процедуре DragOver Ole. Контейнер и Ole пусть вызывают одну и ту же OnDragOver.


Sergey_b   (2006-10-24 12:05:00) [12]


> Пропиши эти действия для контейнера.

Вот в таком случае не получается - механизм включается только когда мышь над контейнером, а олешка ес-но больше.
И передвинуть оле можно только до края бокса(left = 0 b top = 0).
Может надо менять координаты (как наз. не помню читал у Пачеко)


Elen   (2006-10-24 11:56:00) [13]


>  почему же картинка мечется

Думается мне тебе лучше сделать DragOver не для Ole, а для его контейнера. Потому как OleContainer1DragOver работает когда в ходе перетаскивания мыша висит над Ole - и соответственно координаты берутся не контейнеровские а Ole.

Пропиши эти действия для контейнера. Метаться не должно.


Sergey_b   (2006-10-24 11:51:00) [14]

Спасибо. Но почему же картинка мечется вроде как периодически х с у меняются местами?


Elen   (2006-10-24 11:47:00) [15]

DragOver - Происходит, когда потребитель протаскивает объект над контролем. Поставь себе переводчик (рекомендую Pragma) и переведи справку


Sergey_b   (2006-10-24 11:35:00) [16]


> Бывает...

Инглишь не знаю совсем. Можно рассказать когда есть событие DragOver?
Может есть еще какое - более подходящее?


Elen   (2006-10-24 11:34:00) [17]


> Изображение в этот момент дрожит.

Бывает...


Sergey_b   (2006-10-24 11:30:00) [18]


> Почему?

Сорри. Получается, но как-то корявенько.

procedure TForm1.OleContainer1DragOver(Sender, Source: TObject; X,
 Y: Integer; State: TDragState; var Accept: Boolean);
begin
 OleContainer1.Left := x;
 OleContainer1.Top := y;
end;
Изображение в этот момент дрожит.


Elen   (2006-10-24 11:27:00) [19]


> через DragDrop не получится

Почему?


Sergey_b   (2006-10-24 11:23:00) [20]


> Elen ©   (24.10.06 11:14) [4]

через DragDrop не получится...
где почитать про это ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо