checklistbox1.dragmode := dmAutomatic

解决方案 »

  1.   

    我写在checklistbox的mousedown事件不能实现
      

  2.   

    procedure TForm1.CheckListBox1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       checklistbox1.Cursor:=crdrag;
       s_item:=checklistbox1.Items[checklistbox1.itemindex];
       s_index:=checklistbox1.ItemIndex;end;procedure TForm1.CheckListBox1MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       if checklistbox1.itemindex <> s_index then
         begin
            checklistbox1.Items.Delete(s_index);
            checklistbox1.Items.Insert(checklistbox1.ItemIndex+1,s_item);
            checklistbox1.Cursor:=crdefault;
         end;
    end;
      

  3.   

    哎,都是delphi惹的祸,如果你用loadcursor就可以得到返回值,然后通过返回值判断错误,delphi过度的封装真害人啊
      

  4.   

    这是我实现你的程序功能的方法:
    var
     s_item:String;
     s_index:Integer;procedure TForm1.Button1Click(Sender: TObject);
    begin
      CheckListBox1.Cursor:=crdrag;
    end;procedure TForm1.CheckListBox1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      s_item:=checklistbox1.Items[checklistbox1.itemindex];
      s_index:=checklistbox1.ItemIndex;
      CheckListBox1.BeginDrag(True);
    end;procedure TForm1.CheckListBox1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
      if Source=CheckListBox1 then
      begin
        Accept:=True;
        CheckListBox1.ItemIndex:=CheckListBox1.ItemAtPos(Point(x,y),True);
      end;
    end;procedure TForm1.CheckListBox1EndDrag(Sender, Target: TObject; X,
      Y: Integer);
    begin
      if checklistbox1.itemindex <> s_index then
        begin
            checklistbox1.Items.Delete(s_index);
            checklistbox1.Items.Insert(checklistbox1.ItemIndex+1,s_item);
        end;
    end;