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

Вниз

Вопрос про 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 вся ветка

Форум: "KOL";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.036 c
14-1117717481
evvcom
2005-06-02 17:04
2005.07.11
Продолжение дискуссии "Как избежать гонок в потоках"


14-1118602142
Kerk
2005-06-12 22:49
2005.07.11
ЦСКА получит Суперкубок просто так


6-1112546332
San Sanich
2005-04-03 20:38
2005.07.11
Как узнать открыт ли определенный UDP-порт на заданой машине


6-1113053840
Виталик
2005-04-09 17:37
2005.07.11
Получить IP в виде байтового массива


4-1115809155
_Anton
2005-05-11 14:59
2005.07.11
RichEdit отображает символ вопроса вместо unicode





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский