Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2012, 17:24   #1
ondar
Пользователь
 
Регистрация: 06.10.2010
Сообщений: 10
Вопрос перетаскивание элементов между тремя ListBox

Здравствуйте!

Помогите пожалуйста с реализацией перетаскивания элементов между тремя ListBox.

Между двумя ListBox перетаскивание элементов получается.
А при добавлении 3-го ListBox, перетаскивание с 3-го на 1-й или 2-ой не происходит либо выдает ошибку.

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Button1.Caption:='Close';

    ListBox1.DragMode:=dmAutomatic;
    ListBox2.DragMode:=dmAutomatic;

    ListBox1.Items[0]:='1';
    ListBox1.Items[1]:='2';
    ListBox1.Items[2]:='3';

end;

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

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

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


procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
  ListBox1.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
  ListBox2.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;

procedure TForm1.ListBox3DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
  ListBox3.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;
ondar вне форума Ответить с цитированием
Старый 14.09.2012, 18:22   #2
ondar
Пользователь
 
Регистрация: 06.10.2010
Сообщений: 10
По умолчанию

Разобрался с перетаскиванием.
Только вот ошибка осталась -> raised exception class EOutResources with message 'Unable to insert a line'.

Последний раз редактировалось ondar; 14.09.2012 в 18:24. Причина: грамматическая ошибка
ondar вне форума Ответить с цитированием
Старый 14.09.2012, 22:24   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

У Вас перетаскивание происходит из одного Листа в другой без смены индекса элемента в списке? То бишь был в первом листе вторым - во втором тоже должен стоять вторым?

Или должно свободное перемещение происходить?

Если у Вас список-получатель пустой изначально - то вот этот код:

Код:
  ListBox1.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex]);
естественно вызовет ошибку: не может быть второго номера там, где и первого то не существует. А вот при перемещении по порядку (с нулевого элемента и далее) прога будет работать корректно.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 14.09.2012 в 22:28.
Sciv вне форума Ответить с цитированием
Старый 14.09.2012, 22:42   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Для свободного перемещения решение примерно такое:

Код:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
    if ListBox1.Items.Count-1>TListBox(Source).ItemIndex then
      ListBox1.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex])
    else
      ListBox1.Items.Insert(ListBox1.Items.Count-1, TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
    if ListBox2.Items.Count-1>TListBox(Source).ItemIndex then
      ListBox2.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex])
    else
      ListBox2.Items.Insert(ListBox2.Items.Count-1, TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;

procedure TForm1.ListBox3DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TListBox) then
    if ListBox3.Items.Count-1>TListBox(Source).ItemIndex then
      ListBox3.Items.Insert(TListBox(Source).ItemAtPos(Point(X,Y), true), TListBox(Source).Items[TListBox(Source).ItemIndex])
    else
      ListBox3.Items.Insert(ListBox3.Items.Count-1, TListBox(Source).Items[TListBox(Source).ItemIndex]);
  TListBox(Source).Items.Delete(TListBox(Source).ItemIndex);
end;
Хотя и этот код будет выдавать ошибку, если случайно щелкните и потащите не элемент списка, а пустое белое поле... Потому что ItemAtPos(Point(X,Y), true) будет выдавать "ничто" - тот же индекс (-1)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 14.09.2012 в 22:50. Причина: Забыл уточнить
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Webbrowser (перетаскивание элементов) nls Общие вопросы Delphi 3 20.06.2012 14:54
Сортировка элементов listbox в builder 6 25LioN52 Помощь студентам 3 19.11.2011 19:30
связь между тремя таблицами sear БД в Delphi 1 30.09.2011 23:44
Перетаскивание Bans'ов между двумя CoolBar'ами? chandrasecar Общие вопросы Delphi 0 12.02.2009 16:47
Перемещение элементов в ListBox kodov Общие вопросы Delphi 3 31.03.2007 11:44