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

Вниз

drag&drop в TListBox   Найти похожие ветки 

 
Найти   (2005-08-17 11:09) [0]

Здравствуйте! Подскажите, пожалуйста, как с помощью OnMouseDown и OnMouseMove можно менять положение итемов, как, например, в WinAmp или в Foobar?


 
Leonid Troyanovsky ©   (2005-08-17 11:43) [1]


> Найти   (17.08.05 11:09)  

> и OnMouseMove можно менять положение итемов, как, например,



Если OnMouse* необязательно, то, например

http://groups-beta.google.com/group/fido7.ru.delphi.chainik/msg/fb2c88d3e1a23e66

--
Regards, LVT.


 
злобная танька   (2005-08-17 14:16) [2]

установи DragMode у ListBox1: dmAutomatic
.таскается прямо как в винампе можно ещё DragCursor поменять на стрелочку чтоб уж совсем один в один. только вот что плохо листбокс помигивает слегка при таскании итемов.. некрасиво :(

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var
 P: TPoint;
 i: Integer;
begin
 if Source = ListBox1 then
 begin
   Accept := true;
   P := Point(X, Y);

   with ListBox1 do
   begin
     i := ItemAtPos(P, True);
     if i < 0 then
       Items.Move(ItemIndex, Items.Count - 1)
     else
       Items.Exchange(ItemIndex, i);
   end;

 end;
end;


 
з. танька   (2005-08-17 14:20) [3]

строчку "Accept := true;" можно выкинуть. не нужна она тама..


 
з. танька   (2005-08-17 14:41) [4]

но и это ещё не всё! в [2] обнаружены довольно злые баги. так что лучше вот так:

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var
 P            : TPoint;
 i,j          : Integer;
begin
 if Source = ListBox1 then
 begin
   if ListBox1.ItemIndex = -1 then
     exit;

   P := Point(X, Y);

   with ListBox1 do
   begin
     i := ItemAtPos(P, False);
     if (i > Items.Count - 1) then
       Items.Move(ItemIndex, Items.Count - 1)
     else
       if i > -1 then
         Items.Exchange(ItemIndex, i);
   end;

 end;
end;


 
Найти   (2005-08-18 04:35) [5]

Спасибо, работает, несмотря на мерцание, но ещё интересно, что эффективнее было бы применить: OnMouse* или DragDrop, DragOver и т.д., т.е. набор для работы с Drag&Drop?


 
Antonn ©   (2005-08-18 05:52) [6]

и при OnMouse тоже мерцает.
можешь глянуть:
http://an-files.narod.ru/_works/5016.html


 
КаПиБаРа ©   (2005-08-18 08:28) [7]

Что бы меньше мерцало
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
P            : TPoint;
i,j          : Integer;
begin
if Source = ListBox1 then
begin
  if ListBox1.ItemIndex = -1 then
    exit;

  P := Point(X, Y);

  with ListBox1 do
  begin
    i := ItemAtPos(P, False);
    if (i > Items.Count - 1) and (ItemIndex <> Items.Count - 1) then
      Items.Move(ItemIndex, Items.Count - 1)
    else
      if (i > -1) and (ItemIndex <> i) then
        Items.Exchange(ItemIndex, i);
  end;

end;
end;


 
KilkennyCat ©   (2005-08-18 09:56) [8]

а я по-другому делаю...

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 with (Source as TListBox) do
   if Sender = Source then Items.Move(ItemIndex,ItemAtPos(Point(x,y),true));
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
 Accept := (Source as TListBox).ItemIndex <> - 1;
end;


мерцаний не видел.


 
Antonn ©   (2005-08-18 11:58) [9]

KilkennyCat ©   (18.08.05 9:56) [8]
другая функциональность, нужно "реал-тайм":)

КаПиБаРа ©   (18.08.05 8:28) [7]
при перемещении ниже кол-ва итемов вылазит АВ


 
КаПиБаРа ©   (2005-08-18 12:26) [10]

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var
P            : TPoint;
i,j          : Integer;
begin
if Source = ListBox1 then
begin
 if ListBox1.ItemIndex = -1 then
   exit;

 P := Point(X, Y);

 with ListBox1 do
 begin
   i := ItemAtPos(P, False);
   if (i > Items.Count - 1) then
   begin
     if (ItemIndex <> Items.Count - 1) then
     Items.Move(ItemIndex, Items.Count - 1)
   end
   else
     if (i > -1) and (ItemIndex <> i) then
       Items.Exchange(ItemIndex, i);
 end;
end;
end;


 
НАйти   (2005-08-28 07:06) [11]

Antonn ©
А что такое АВ?

КаПиБаРа ©
Уменьшение мерцания происходит за счёт дополнительных условий?
--------------------------
На основе полученного, за что большое спасибо, решил попробовать перетащить несколько итемов. Схема действия та же самая остаётся? Извиняюсь за такой вопрос, просто с drag$drop впервые столкнулся. Вот, у меня есть код ещё, не "real-time", но перетаскиваются несколько итемов:

procedure TDualListDlg.DstListDragDrop(Sender, Source: TObject; X,Y: Integer);
var droppedOnIndex: integer;
   anItem:        integer;
   numberOfItems: integer;
begin
if (Sender is TListbox) and (Source is TListBox) then
begin
 droppedOnIndex := TListBox(Sender).ItemAtPos(Point(X,Y),false);
 numberOfItems := TListBox(Source).SelCount;
 anItem := 0;
 while numberOfItems > 0 do
  begin
   if TListBox(Source).Selected[anItem] = true then
    begin
     TListBox(Sender).Items.Insert(droppedOnIndex,TListBox(Source).Items[anItem]);
     TListBox(Source).Items.Delete(anItem);
     TListBox(Source).Update;
     TListBox(Sender).Update;
     numberOfItems := numberOfItems - 1;
    end
    else
     anItem := anItem + 1;
  end;
end;
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := true;
end;

Однако у него есть неприятная проблема. Я попробовал совместить коды, ничего не получилось. Их совместить вообще возможно или надо другое думать?



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

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

Наверх





Память: 0.48 MB
Время: 0.011 c
3-1123501238
Aleksandr.
2005-08-08 15:40
2005.09.18
В чем проблема обращения к TPFibDataBase по указателю в Dll?


14-1124453310
_Lex_
2005-08-19 16:08
2005.09.18
Новосибирск MP


3-1123480511
Ирина
2005-08-08 09:55
2005.09.18
Как перенести поле записи в чеклистбокс?


14-1124829067
Lomz
2005-08-24 00:31
2005.09.18
Как отправить вебформу насервер?


5-1099337235
Евгыш
2004-11-01 22:27
2005.09.18
Установка компонента





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