![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перетаскивание
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 не получится...
где почитать про это ?