Содержание материала

 

Изменение позиций элементов ListBox с помощью Drag and Drop

 

Если вы хотите принимать перетаскиваемый объект, только если он представляет собой собственный элемент, то в обработчике OnDragOver вставьте строчку "Accept := Source=Sender;". Ниже приведен код, позволяющий сортировать элементы с помощью перетаскивания их мышкой внутри списка компонента. Вам также понадобится таймер для обеспечения функции автопрокручивания. Это означает, что при перетаскивании элемента в верхнюю часть списка, он при необходимости прокручивается вниз, дабы стали видны невидимые в верхней части списка элементы. Если вам не нужно такое поведение компонента, исключите из кода все строчки, имеющие отношение к таймеру, включая вторую строчку в обработчике события OnDragOver.

 

Code:

...

private

{ Private declarations }

GoingUp: Boolean;

 

procedure TForm1.ListBox1DragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

begin

Accept := (Sender = Source) and

   (TListBox(Sender).ItemAtPos(Point(X, Y), False) >= 0);

{устанавливаем таймер для автопрокрутки}

if Accept then

   with Sender as TListBox do

     if Y > Height - ItemHeight then

     begin

       GoingUp := False;

       Timer1.Enabled := True;

     end

     else if Y > ItemHeight then

     begin

       GoingUp := True;

       Timer1.Enabled := True;

     end

     else

       Timer1.Enabled := False;

end;

 

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject;

X, Y: Integer);

var

NuPos: Integer;

begin

with Sender as TListBox do

begin

   NuPos := ItemAtPos(Point(X, Y), False);

   if NuPos >= Items.Count then

     Dec(NuPos);

   Label1.Caption := Format('Перемещено из %d в %d',

     [ItemIndex, NuPos]);

   Items.Move(ItemIndex, NuPos);

   {выделяем перемещенный элемент}

   ItemIndex := NuPos;

end;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with ListBox1 do

   if GoingUp then

     if TopIndex > 0 then

       TopIndex := TopIndex - 1

     else

       Timer1.Enabled := False

   else if TopIndex < Items.Count - 1 then

     TopIndex := TopIndex + 1

   else

     Timer1.Enabled := False;

end;

 

procedure TForm1.ListBox1EndDrag(Sender, Target: TObject;

X, Y: Integer);

begin

Timer1.Enabled := False;

end;

 

https://delphiworld.narod.ru/

DelphiWorld 6.0

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить