Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > CheckListBox и ListBox


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

Автор: Dynamic 12.5.2006, 08:06
у обоих компонентов установи 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;
 

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

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

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

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

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

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

Автор: MacTep 7.6.2006, 11:01
Так не работает:
Код

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'е такая фигня рисуется, которая перерисовывается только после того, как я мышку отпущу. Почму такое происходит? Как недопустить? 

Автор: Yanis 7.6.2006, 11:06
Наверное событие должно быть DragOver smile 

Автор: MacTep 7.6.2006, 11:22
Окей. Сделал так:
Код

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 

Автор: Yanis 7.6.2006, 11:28
Дык позицию надо тоже пересчитывать...
Код
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;
 

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

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

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

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

Автор: MacTep 9.6.2006, 18:22
Код

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. А мне этого не надо. И тем более этого не надо, когда правую кнопку мыши нажали и быстро отпустили. Что делать? Как правильно написать эту вещь, чтобы корректно работало. 

Автор: skyboy 9.6.2006, 19:07
Проверяй Button на mbLeft. Если оно другое - то не начинай перетаскивание. 

Автор: Dynamic 13.6.2006, 05:52
Цитата(MacTep @  9.6.2006,  18:22 Найти цитируемый пост)
То есть даже если я нажимаю правую кнопку мышки, то у меня уже стартует команда BeginDrag. А мне этого не надо. И тем более этого не надо, когда правую кнопку мыши нажали и быстро отпустили. Что делать? Как правильно написать эту вещь, чтобы корректно работало. 

попробуй вместо
Код

ListBox1.BeginDrag(true);
написАть
Код

ListBox1.BeginDrag(false, 4);

 

Автор: MacTep 15.6.2006, 08:53
Код

ListBox1.BeginDrag(false, 4);
Что это будет давать? 

Автор: Dynamic 15.6.2006, 11:05
а справку почитать?
Код

procedure BeginDrag(Immediate: Boolean; Threshold: Integer = -1);
 

Автор: MacTep 15.6.2006, 11:09
Отлично. Еще бы знать, как это переводится. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)