Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Вниз

Drag n Drop   Найти похожие ветки 

 
Andy BitOff   (2003-01-10 19:45) [0]

Подскажите как мне подвигать несколько определенных компонентов одновременно. Один я двигаю так:
ReleaseCapture;
компонент.Perform(WM_SysCommand, $F012, 0);


 
Andy BitOff   (2003-01-10 23:41) [1]

Неужели ни кто не знает!!!!!!!!!!


 
Бандерлоги   (2003-01-11 01:00) [2]

Абы как комп-ты на панель и её подвигать слабо.


 
Rouse_   (2003-01-11 01:08) [3]

Ну а в чем проблема? Данный код в обработчик OnMouseMove нужных компонентов и всех их можно будет перемещать.

Желаю успехов


 
Бандерлоги   (2003-01-11 01:31) [4]

"Ни кто" пишется слитно... а... проблемы в самом деле нет.
> Too Rouse_ Однако:
Суть - OnMouseMove с флагом? Значительно проще Perform(WM_SysCommand, $F012, 0), ибо если Panel2.Parent := Panel1, тогда:
procedure TMainForm.Panel2MouseDown
begin
ReleaseCapture;
Panel1.Perform(WM_SysCommand, $F012, 0);
end;

И мы двигаем панель со всеми её элементами, которые (Andy BitOff) при необходимости, можно вставить в панель-родителя непосредственно в обработчике, ибо если.. тогда...

Желаем успехов солидарно с [rauz_]


 
Rouse_   (2003-01-11 01:56) [5]

> Бандерлоги (11.01.03 01:31)
Я просто понял что нужно перемещать каждый компонент по отдельности, а не все в куче :)

Желаю успехов


 
Andy BitOff   (2003-01-11 16:35) [6]

К сожалению не все так легко. Усли бы это было так, я бы сюда и не написал. Дело в том, что на лету создается n-ное количество компонентов и должна быть возможность их подвигать. Один подвигать легко:
//ImageMouseDown
if (button=mbLeft) and (TControl(sender).ClassType=TImage)then begin
ReleaseCapture;
TControl(Sender).Parent.Perform(WM_SysCommand, $F012, 0);
end;
А вот если еще и нажат Shift, то надо двигать их все. Так вот здесь и проблема. Конструкция типа:
if ((ssShift in Shift) and (ssLEFT in Shift)) and (TControl(sender).ClassType=TImage) then begin
for i:=0 to ScrollBox.ControlCount-1 do begin
ReleaseCapture;
TControl(ScrollBox.Controls[i]).Perform(WM_SysCommand, $F012, 0);
end;
end;
Не работает!!!
Да, кстати, суть-то в следующем; на ScrollBox"е создается Panel на нее впихивается рисунок. Так вот, рисунок можно подвигать, и при этом надо иметь возможность подвигать их все, учитывая, конечно, их текущее положение.


 
Andy BitOff   (2003-01-11 19:29) [7]

Всплываем.


 
Бандерлоги   (2003-01-11 20:10) [8]


> Andy BitOff © (11.01.03 19:29)
> Всплываем.?

Нам непонятно, что ввиду, но мы бы в конце концов сделали так:



var
MainForm: TMainForm;
StartPt: TPoint;
DxInt: Integer;
DyInt: Integer;
MutliDragFlag: boolean = false;

implementation

{$R *.dfm}

procedure TMainForm.ContourControls;
var
R: TRect;
DC: HDC;
I: Integer;
begin
DC := GetDCEx(ScrollBox1.Handle, 0, DCX_CACHE);
for I:=0 to ScrollBox1.ControlCount-1 do
with TControl(ScrollBox1.Controls[I]) do
begin
R := BoundsRect;
OffsetRect(R, DxInt, DyInt);
Windows.DrawFocusRect(DC, R);
end;
ReleaseDC(HWND_DESKTOP, DC);
end;

procedure TMainForm.AnyImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

if ((ssShift in Shift) and (ssLEFT in Shift)) and (TControl(sender).ClassType=TImage) then
begin
MutliDragFlag := True;
DxInt := 0; DyInt := 0;
ContourControls;
StartPt := TControl(Sender).ClientToParent(Point(X, Y));
Exit;
end;

if (button=mbLeft) and (TControl(sender).ClassType=TImage)then
begin
ReleaseCapture;
TControl(Sender).Parent.Perform(WM_SysCommand, $F012, 0);
end;
end;

procedure TMainForm.AnyImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
CurPt: TPoint;
begin
if MutliDragFlag then
begin
CurPt := TControl(Sender).ClientToParent(Point(X, Y));
ContourControls;

Inc(DxInt, CurPt.X - StartPt.X);
Inc(DyInt, CurPt.Y - StartPt.Y);

ContourControls;
StartPt := CurPt;
end;
end;

procedure TMainForm.AnyImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var I: integer;
begin
if MutliDragFlag then
begin
MutliDragFlag := False;
for i:=0 to ScrollBox1.ControlCount-1 do
with TControl(ScrollBox1.Controls[i]) do
begin
Left := Left + DxInt;
Top := Top + DyInt;
end;
end;
end;



Если есть предложения порациональней, плз.


 
Andy BitOff   (2003-01-11 21:03) [9]

(робко) я... я... конечно попробую... но... я и не думал... а как это работае??? 8-)


 
Andy BitOff   (2003-01-11 21:05) [10]

А всплываем, это - сегодня с утра эта ветвь была на третьей странице, вот я ее на верх и вывел.


 
Бандерлоги   (2003-01-11 21:12) [11]

Получилось? Хоть не ново, но это развитие идеи

> Rouse_ © (11.01.03 01:08)

А как это работае??? Там написано. Есть вопросы поконкретней - мы пока недалеко.


 
Rouse_   (2003-01-11 21:19) [12]

> Бандерлоги © (11.01.03 21:12)

Чего-чего? я то тут при чем? не я вопрос задавал ... а как это работае??? 8-).


 
Бандерлоги   (2003-01-11 21:24) [13]


> Rouse_ © (11.01.03 21:19)

Да, это сделал он! Идея - твоя. Мистейк.


 
Andy BitOff   (2003-01-11 22:39) [14]

Оформил. Все прекрасно работает, как раз то, что доктор прописал. Буду теперь разбираться. Но по первому просмотру такой вопрос: можно ли сделать так, чтобы перемещаемые компоненты перерисовывались в момент их таскания.


 
Нежить   (2003-01-11 22:56) [15]


> Andy BitOff © (11.01.03 22:39)

Можно. Но именно поэтому мы всё оформили именно так, как оформили.
Во-первых, при перетаскивании имиджа возникает мерцание изображения, особенно если оно крупное.
Во-вторых, Perform(... рисует фокусрект. Поэтому мы тоже рисуем фокусректы.
В-третьих, этот перформ - очень удобный метод, поскольку помимо того, что он позволяет перетащить компонент, он его ещё и BringToFront того этого, отказываться от него неохота.

Если очень хотса, можно вот этот код:

for i:=0 to ScrollBox1.ControlCount-1 do
with TControl(ScrollBox1.Controls[i]) do
begin
Left := Left + DxInt;
Top := Top + DyInt;
end;
убрать из AnyImageOnMouseUp и вставить после фразы:

Inc(DxInt, CurPt.X - StartPt.X);
Inc(DyInt, CurPt.Y - StartPt.Y);

и везде убрать ContourControls.

Но тогда следует отказаться от:
ReleaseCapture;
TControl(Sender).Parent.Perform(WM_SysCommand, $F012, 0);

И добавить пару строчек куда-нибудь.
Ибо всё будет выглядеть в этом случае вразнобой, т.е. по-уродски.


 
Diamond Cat   (2003-01-12 00:14) [16]

а вот еще идея правда не доведена до конца но...

implementation
var
re:Trect;
cross:Tpoint;
controler:hwnd;
{$R *.DFM}

function me(p:tpoint;wnd:hwnd):Tpoint;
begin
//вычисление абсолютных координат
clienttoscreen(getparent(wnd),p);
result:=p;
end;

procedure Tform1.Mes(var Msg: TMsg; var handleIn: Boolean);
var
d:tpoint;
begin
if msg.message=wm_rbuttondown then
begin
//вычисление координатов на передвигаемом компоненте
d:=me(msg.pt,msg.hwnd);
getwindowrect(msg.hwnd,re);
cross.x:=d.x-re.Left;
cross.y:=d.y-re.top;
controler:=msg.hwnd;
end;
//гдето тут вычислять координаты остальных нуждающихся в перетаскивании компонентов
if (msg.message=wm_mousemove) and (msg.wparam=MK_Rbutton ) then
begin
//Передвигание компонента
setwindowpos(controler,HWND_TOP,msg.pt.x-cross.x,msg.pt.y-cross.y,0,0,SWP_SHOWWINDOW or SWP_NOSIZE);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage:=mes;
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
1-72242
AndreiR
2003-01-14 16:41
2003.01.23
Как создать полную копию объекта?


14-72496
sancho
2003-01-05 19:23
2003.01.23
RTL порт


4-72581
Slavik99
2002-12-06 20:53
2003.01.23
Уважаемые профи, помогите исправить ошибку....


1-72398
solo
2003-01-12 22:40
2003.01.23
Вопрос по пространству имен Windows.


4-72608
Dimitry
2002-12-10 06:11
2003.01.23
Как удалить файл с помощью WinAPI?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский