Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CheckListBox и ListBox, drag&drop 
:(
    Опции темы
MacTep
Дата 12.5.2006, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Как реализовать перетаскивание какой-либо строчки из ListBox в CheckListBox? А если конкретнее, то как узнать при перетаскивании номер той строки в CheckListBox на которую указывает курсор мыши? 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Dynamic
Дата 12.5.2006, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



у обоих компонентов установи dragmode = dmautomatic и сделай так:
Код

var
  idx: integer;

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     idx := ListBox1.ItemAtPos(Point(x, y), true);
     ListBox1.BeginDrag(true);
end;

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

procedure TForm1.CheckListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
  var j: integer;
begin
     j := CheckListBox1.ItemAtPos(Point(x, y), false);
     if idx >= 0 then
      CheckListBox1.Items.Insert(j, ListBox1.Items[idx]);
end;
 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
MacTep
Дата 12.5.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Dynamic, огромное спасибо за оперативное реагирование. Совет помог. Слегка поколдовал над кодом и вот уже все в порядке. Благодарю и повышаю репутацию. 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Dynamic
Дата 12.5.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



Цитата(MacTep @  12.5.2006,  11:32 Найти цитируемый пост)
Слегка поколдовал над кодом и вот уже все в порядке

Вот это главное! Что не просто copy/paste!
 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
MacTep
Дата 7.6.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



А еще нужно, чтобы отображалось при перетаскивании на CheckListBox выделение в этом компоненте на той строке, на которую перетаскивают. А то как-то кривовато получается, не очень красиво... 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Yanis
Дата 7.6.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(MacTep @  7.6.2006,  11:18 Найти цитируемый пост)
А то как-то кривовато получается, не очень красиво...  

Значит недоколдовал ты... Тебе же j известна, вот и выделяй Item с этой позицией. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MacTep
Дата 7.6.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Так не работает:
Код

procedure TForm1.CheckListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
  var j: integer;
begin
     j := CheckListBox1.ItemAtPos(Point(x, y), false);
     CheckListBox1.Selected[j]:=true;   
     if idx >= 0 then
      CheckListBox1.Items.Insert(j, ListBox1.Items[idx]);
end;

Так тоже:
Код

procedure TForm1.CheckListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
  var j: integer;
begin
     j := CheckListBox1.ItemAtPos(Point(x, y), false);
     checkListBox1.ItemIndex:=j;
     if idx >= 0 then
      CheckListBox1.Items.Insert(j, ListBox1.Items[idx]);
end;

Как же тогда правильно?
И еще, при перетаскивании на самом ListBox'е такая фигня рисуется, которая перерисовывается только после того, как я мышку отпущу. Почму такое происходит? Как недопустить? 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Yanis
Дата 7.6.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Наверное событие должно быть DragOver smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MacTep
Дата 7.6.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Окей. Сделал так:
Код

var
  idx: integer;
  DragJ:integer;

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     idx := ListBox1.ItemAtPos(Point(x, y), true);
     ListBox1.BeginDrag(true);
end;

procedure TForm1.CheckListBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
     Accept := Source = ListBox1;
     CheckListBox1.ItemIndex:=DragJ;
end;

procedure TForm1.CheckListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
  var j: integer;
begin
     DragJ := CheckListBox1.ItemAtPos(Point(x, y), false);
     if idx >= 0 then
      CheckListBox1.Items.Insert(DragJ, ListBox1.Items[idx]);
end;
И все равно не работает. И прорисовывается так же криво. smile 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Yanis
Дата 7.6.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Дык позицию надо тоже пересчитывать...
Код
procedure TForm1.CheckListBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
    Accept := Source = ListBox1;
    DragJ := CheckListBox1.ItemAtPos(Point(x, y), false);
    CheckListBox1.ItemIndex := DragJ;
end;

procedure TForm1.CheckListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
     //DragJ := CheckListBox1.ItemAtPos(Point(x, y), false);
     if idx >= 0 then
      CheckListBox1.Items.Insert(DragJ, ListBox1.Items[idx]);
end;
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MacTep
Дата 7.6.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(Yanis @  7.6.2006,  11:28 Найти цитируемый пост)
Дык позицию надо тоже пересчитывать...
Точно. smile Спасибо. smile А что делать с кривой прорисовкой... smile
 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Yanis
Дата 7.6.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(MacTep @  7.6.2006,  12:59 Найти цитируемый пост)
А что делать с кривой прорисовкой...

Непонимаю что это значит. smile  


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MacTep
Дата 7.6.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(MacTep @  7.6.2006,  11:01 Найти цитируемый пост)
И еще, при перетаскивании на самом ListBox'е такая фигня рисуется, которая перерисовывается только после того, как я мышку отпущу. Почему такое происходит? Как недопустить?
 Вот что это значит. smile  

Это сообщение отредактировал(а) MacTep - 7.6.2006, 12:19


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 9.6.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Код

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     idx := ListBox1.ItemAtPos(Point(x, y), true);
     ListBox1.BeginDrag(true);
end;

То есть даже если я нажимаю правую кнопку мышки, то у меня уже стартует команда BeginDrag. А мне этого не надо. И тем более этого не надо, когда правую кнопку мыши нажали и быстро отпустили. Что делать? Как правильно написать эту вещь, чтобы корректно работало. 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
skyboy
Дата 9.6.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Проверяй Button на mbLeft. Если оно другое - то не начинай перетаскивание. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.