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

Вниз

Усовершенствование drag&drop   Найти похожие ветки 

 
AngelOfDeath   (2005-10-26 10:35) [0]

Здравствуйте, уважаемые мастера! Я нашёл код для перетаскивания элементов в ListBox"е как в Winamp"е, для количества итемов > 1, поэтому код не мой. Но если взять достаточно большое количество, то начинаются зверские тормоза. Как от этого можно избавиться, т.е. повысить быстродействие (drag&drop в WinAmp"е, например)? Вот код:

var
ArrSelected: array of integer;//массив номеров выделенных строк
MoveableItemIndex:integer;  //номер элемента в массиве  ArrSelected
          //тот элемен за который мы перетаскиваем

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var APoint: TPoint;
index,i:integer;
begin
if Button=mbRight then
begin
 //выделенный номера помещаются в ArrSelected
  setlength(ArrSelected,0);
  for i:=0 to ListBox1.Items.Count-1 do
  if ListBox1.Selected[i] then
    begin
      setlength(ArrSelected,Length(ArrSelected)+1);
      ArrSelected[Length(ArrSelected)-1]:=i;
   end;
//тот элемент на котором нажали помещается в MoveableItemIndex
  MoveableItemIndex:=-1;
  APoint.X := X;
  APoint.Y := Y;
  index:= ListBox1.ItemAtPos(APoint, True);
  if (index<>-1)and(Length(ArrSelected)>0) then
   begin
     for i:=0 to Length(ArrSelected)-1 do
      if  ArrSelected[i]=index then  MoveableItemIndex:=i;
   end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Setlength(ArrSelected,0);
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var APoint: TPoint;
   index, offset,i,j:integer;
   pr:boolean;
begin
 if  (ssRight in Shift) and (MoveableItemIndex>-1) then
  begin
    //вычисляем новую позицию текущей строки MoveableItemIndex
    //и вычисляем индекс верхней выделеной строки, если она при передвижении
    //не выходит за границы списка, перемещаем все выделение
     APoint.X := X;
     APoint.Y := Y;
     index:= ListBox1.ItemAtPos(APoint, True);
     if (index>-1) and (index<>ArrSelected[MoveableItemIndex]) then
       begin
         //вычисляем смещение  MoveableItemIndex
         offset:=index-ArrSelected[MoveableItemIndex];
         //вычислим расстояние от первого выделенного элемента до начала списка
         if (ArrSelected[0]+offset>-1) and
            (ArrSelected[Length(ArrSelected)-1]+offset<ListBox1.Items.count)
          then
            begin
//само пережвижение по списку
            if offset>0 then
             for i:=Length(ArrSelected)-1 downto 0  do
              begin
                ListBox1.Items.Move(ArrSelected[i],ArrSelected[i]+offset);
                ArrSelected[i]:=ArrSelected[i]+offset;
              end
             else
                for i:=0 to Length(ArrSelected)-1  do
              begin
                ListBox1.Items.Move(ArrSelected[i],ArrSelected[i]+offset);
                ArrSelected[i]:=ArrSelected[i]+offset;
              end;

//помечаем выделением только те что в ArrSelected
             for i:=0 to ListBox1.Items.count-1 do
               begin
                pr:=false;
                for j:=0 to Length(ArrSelected)-1 do
                 if  i=ArrSelected[j] then pr:=true;
                ListBox1.selected[i]:=pr;
               end;
            end;
       end;
  end;
end;


Кстати, кто-нибудь знает, как устранить мерцание?


 
clickmaker ©   (2005-10-26 11:13) [1]


> Кстати, кто-нибудь знает, как устранить мерцание?

LB.Items.BeginUpdate / EndUpdate


 
AngelOfDeath   (2005-10-26 23:25) [2]

BeginUpdate / EndUpdate конечно хорошо. Но есть ли какие-нибудь предложения по оптимизации кода, т.к. это основной вопрос?



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

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

Наверх





Память: 0.46 MB
Время: 0.033 c
2-1131098827
Максим
2005-11-04 13:07
2005.11.20
Поедание память


14-1130263029
Arazel
2005-10-25 21:57
2005.11.20
Где взять модуль HSLUtils?


4-1127275499
RDS
2005-09-21 08:04
2005.11.20
права NTFS


1-1130392333
Zaletchik
2005-10-27 09:52
2005.11.20
Большой буфер при рботе с TFileStream


1-1130321591
Prohodil Mimo
2005-10-26 14:13
2005.11.20
Как добавлять VCL (Win32) компоненты в Delphi 2005?





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