Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизВопрос про Drag&Drop в TreeView Найти похожие ветки
← →
Slay (2004-11-14 20:33) [0]Подскажите pliz как реализовать Drag&Drop между двух KOLTreeView. Может есть пртимер. Спосибо.
← →
Gandalf © (2004-11-17 18:24) [1]Так же как и DnD между любыми другими контролами. Где загвозки?
← →
Slay (2004-11-17 19:10) [2]Загвоздки втом что я вобще не могу найти каких либо примеров по Drag&Drop, а в KOL контролах нет таких свойств и событий как VCL.
Если у кого то есть хоть какойто прымер или инфа Plizzz! скиньте на mybook84@mail.ru СПОСИБО!
← →
Slay (2004-11-20 15:17) [3]ПОМОГИТЕ а то сам никак не разберус :(
← →
MTsv DN (2004-11-21 09:04) [4]Кстати, довольно интересный вопрос, а ответов нет... Мне тоже интересен D&D...
← →
z007 (2004-11-21 23:15) [5]У меня есть пример переноса элементов TreeView внутри дерева (изменение структуры) - пойдет?
← →
MTsv DN (2004-11-22 15:16) [6]Мне пойдет...Под себя сам подгоню...Скинь на мыло, plz...
← →
Slay (2004-11-22 15:25) [7]Да конечно пойдьот любой пример по D&D на KOL буду оооочень благодарен если скинеш на mybook84@mail.ru.
← →
DmiSb (2004-11-22 15:39) [8]А мне можно такую штуку, на мыло, пли-и-з ?
← →
Slay (2004-11-24 17:32) [9]z007 когда ты вышлеш свой пример???
← →
Gandalf © (2004-11-25 22:07) [10]ftp://delphi-jedi.org/api/sapi.zip
← →
Gandalf © (2004-11-25 22:08) [11]Ой сорри не туда. У меня есть D&D из ListView в ListView/Panel/ListBox
← →
MTsv DN (2004-11-26 13:24) [12]Gandalf ©,дай ссылочку на любой D&D,плиз. Дальше додумаем...
MTsv DN
← →
Gandalf © (2004-11-28 17:58) [13]На ftp DnDemo - это не чистая дема - это проект - работает...
← →
Slay (2004-11-28 20:32) [14]Gandalf спосибо за проект но мне очень сложно в ньом разобратса к тому же в проекте только DCU модули и компилятор ругаетса что они зделаны под другой KOL. Пыталса запустить бинарник но он после запуска даже не создайот главное окно только сидит в памяти и кушает 95% процесорного времени. У меня Windows XP SP2.
Может у кого найдьотса время написать Demo по Drag&Drop между двума TreeView буду оооочень благодарен и не только я. Plizzz
← →
Gandalf © (2004-11-28 23:30) [15]Хмм... давайте так.
1) Захтав окна. Делаем через OnMessage Формы
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var
Where: TWherePosLVItem;
begin
Result := FALSE;
if Msg.message = WM_LBUTTONDOWN then
begin
GetCursorPos(MousePoint);
if WindowFromPoint(MousePoint)=ListView1.Handle then
begin
Dragging1 := TRUE;
ListView1.CallDefWndProc(Msg);
SetCapture(Form.Handle);
Rslt := 0;
Result := True;
end;
if WindowFromPoint(MousePoint)=ListView2.Handle then
begin
Dragging2 := TRUE;
ListView2.CallDefWndProc(Msg);
SetCapture(Form.Handle);
Rslt := 0;
Result := True;
end;
end;
end;
Т.е. берем точку - и смотрим какой контрол мы захватили.
ListView2.CallDefWndProc(Msg); - специфично для ListView
SetCapture(Form.Handle); - нужно чтоб захватить мышь.
Работаем через OnMessage формы - потому как иначе не получиться - это специфика ListView - самый надежный способ.
Для контролов по проще можно ловиться их MouseDown - код схожий.
2)
procedure TForm1.KOLForm1MouseMove(Sender: PControl;
var Mouse: TMouseEventData);
var
tmp:TPoint;
Buts:array [0..2] of Boolean;
begin
Buts[0]:=(GetKeyState(VK_LBUTTON) and $80)=$80;
Buts[2]:=(GetKeyState(VK_RBUTTON) and $80)=$80;
Buts[1]:=(GetKeyState(VK_MBUTTON) and $80)=$80;
GetCursorPos(tmp);
if Dragging1 then
if (ScreenCursor = 0) then
if (not Eq(tmp,MousePoint)) and (Buts[0] or Buts[1] or Buts[2]) then
begin
ScreenCursor := LoadCursor(0, IDC_HAND);
SetCursor(ScreenCursor);
end
else
begin
Dragging1:=False;
ReleaseCapture();
end;
if Dragging2 then
if (ScreenCursor = 0) then
if (not Eq(tmp,MousePoint)) and (Buts[0] or Buts[1] or Buts[2]) then
begin
ScreenCursor := LoadCursor(0, IDC_HAND);
SetCursor(ScreenCursor);
end
else
begin
Dragging2:=False;
ReleaseCapture();
end;
end;
Тут сам драг. Просто тестим есть ли драг если есть - то меняем курсор или что там хотите. Такие заморочки нужны чтоб работали простые клики/дабл клики и т.п. - т.е. если мышь после захвата не трогалась с места - то это НЕ захват - многим это может и не нужно.
3) Drop
Поскольку у нас был захват мыши - сообщение придет тому контролу который захватил. MouseUp
Далее проверяем на кого оно пришлось WindowFromPoint - и думаем что делаеть. В итоге возвращаем мышь. ReleaseCapture.
Т.е. если кратко все соостоит из Mouse/Up/(Move)/Down.
В Up - захват и выставление статуса что идет DnD (запоминаем контрол).
Down - проверка назначения (можо в Move) и сам бросок и возвратом мыши.
Думаю что ситуация малек проянилась.
Отбращаю внимае на серию методов. Они мне не помогли с ListView - но удобны для простых контролоы - они неявно делают тио того что изложил.
property Dragging: Boolean read FDragging;
{* |<#splitter>
True, if splitter control is dragging now by user with left
mouse button. Also, this property can be used to detect if the control
is dragging with mouse (after calling DragStartEx method). }
procedure DragStart;
{* Call this method for a form or control to drag it with left mouse button,
when mouse left button is already down. Dragging is stopped when left mouse
button is released. See also DragStartEx, DragStopEx. }
procedure DragStartEx;
{* Call this method to start dragging the form by mouse. To stop
dragging, call DragStopEx method. (Tip: to detect mouse up event,
use OnMouseUp event of the dragging control). This method can be used
to move any control with the mouse, not only entire form. State of
mouse button is not significant. Determine dragging state of the control
checking its Dragging property. }
procedure DragStopEx;
{* Call this method to stop dragging the form (started by DragStopEx). }
procedure DragItem( OnDrag: TOnDrag );
{* Starts dragging something with mouse. During the process,
callback function OnDrag is called, which allows to control
drop target, change cursor shape, etc. }
← →
z007 (2004-11-29 02:22) [16]Обещанный,
{Пример DragDrop внутри TreeView
Для наглядности рекомендуется прицепить к TreeView ImageList
У TreeView ДОЛЖНА быть включена опция tvoDragDrop}
{Глобальные}
var
Dragging:boolean=False;
SCROLLFLAG:boolean=False;
DragItem:Cardinal;
PrevIDX:Cardinal;
{Заполнение TV}
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var hItem,hI:Cardinal;
i,j:integer;
begin
for i:=0 to 4 do begin
hItem:=TV.TVInsert(0,TVI_SORT,"ROOT_"+int2Str(i));
{! Если не приделать к TV ImageList, MouseMove надо подправить}
TV.TVItemImage[hItem]:=0;
for j:=0 to 4 do begin
hI:=TV.TVInsert(hItem,TVI_SORT,"Level2_" + int2Str(j) + "ROOT_"+int2Str(i));
TV.TVItemImage[hItem]:=1;
end;
end;
end;
procedure TForm1.TVTVBeginDrag(Sender: PControl; Item: Cardinal);
var
himl:HIMAGELIST; // handle of image list
rcItem:TRECT ; // bounding rectangle of item
dwLevel:DWORD; // heading level of item
dwIndent:DWORD ;
hico:HICON;
ih,iw:integer;
begin
If GetKeyState( VK_CONTROL )<0 then begin
Dragging:=True;
DragItem:=Item;
rcItem:=TV.TVItemRect[DragItem,false];
himl:=TV.Perform(TVM_CREATEDRAGIMAGE,TV.Handle, DragItem);
ImageList_GetIconSize(himl,iw,ih);
ImageList_BeginDrag(himl, 0, ih, 0-ih-8);
ImageList_DragEnter(TV.handle,0,0);
TV.TVItemSelected[DragItem]:=False;
PrevIDX:=DragItem;
end;
end;
{Примерно так:}
procedure TForm1.TVMouseMove(Sender: PControl; var Mouse: TMouseEventData);
var
where,CurItem:Cardinal;
itemRect:tRect;
begin
If Dragging then begin
If GetKeyState( VK_CONTROL )<0 then begin
CurItem:=TV.TVItemAtPos(mouse.x,mouse.y,where);
if CurItem<>PrevIDX then begin
TV.TVItemSelected[PrevIDX]:=False;
TV.TVItemSelected[CurItem]:=True;
PrevIDX:=CurItem;
TV.Update;
end;
if mouse.y<2 then begin
TV.Perform(WM_VSCROLL, MakeWParam(SB_LINEUP, 0),TV.Handle);
TV.Update;
end
else begin
itemRect:=TV.TVItemRect[PrevIDX,False];
if //(mouse.Y > ((itemrect.Bottom-itemrect.Top)div 2)) then
itemRect.Bottom >= TV.Height-2 then
TV.Perform(WM_VSCROLL, MakeWParam(SB_LINEDOWN, 0),TV.Handle);
end;
ImageList_DragMove(mouse.x,mouse.y);
TV.Update;
end
else begin
Dragging:=false;
ImageList_DragLeave(Form.handle);
ImageList_EndDrag;
TV.Invalidate;
end;
end;
end;
{Отпускаем мышь}
procedure TForm1.TVMouseUp(Sender: PControl; var Mouse: TMouseEventData);
var CurItem,Where:Cardinal;
PathPos,i:integer;
SelectedName,FullPath,aNewPath,DragName,OldCaption:string;
begin
If Dragging then begin
Dragging:=false;
ImageList_DragLeave(Form.handle);
ImageList_EndDrag;
CurItem:=TV.TVItemAtPos(mouse.x,mouse.y,where);
{Дальше можно обрабаотывать варианты}
ShowMEssage(TV.TVItemText[CurItem] + ":" +TV.TVItemText[DragItem]);
if (CurItem=DragItem) and ((where=TVHT_ONITEMLABEL) or (where=TVHT_ONITEMICON))then begin
TV.Update;
end else
begin
{Меняем структуру}
TV.TVInsert(CurItem,TVI_FIRST,TV.TVItemText[DragItem]);
TV.TVDelete(DragItem);
TV.EndUpdate;
TV.Invalidate;
end;
end;
end;
← →
Slay (2004-11-29 17:27) [17]Всем огромное спосибо за примери. Я почти розобралса. Позже напишу Demo с подробными коментариями.
PS. Ще 100 раз дякую :о)
← →
Gandalf © (2004-11-29 23:59) [18]Рад если помогло.
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.04 c