【问题标题】:How can I detect which listbox item another item was dropped onto?如何检测另一个项目被拖放到哪个列表框项目上?
【发布时间】:2010-02-01 15:37:08
【问题描述】:

我有两个列表框。 listbox1 包含一个 DB 名称列表。另一方面,Listbox2 列出了与 listbox1 上的 DB 关联的内容的标题。基本上,您单击 listbox1,它会将 DB 内容的所有标题加载到 listbox2 中。

我现在想实现一个拖放功能。我知道如何在两个列表框之间拖动;这不是问题。我要实现的是以下内容:

  1. 点击listbox2中的标题

  2. 将项目拖入 lisbox1 中的项目

  3. 标题现在是 listbox1 中的项目所指向的 DB 的一部分

现在,所有用于移动实际数据的后端代码都已编码。如何使 listbox1 选择(并知道)鼠标将要从 listbox2 中删除该项目的项目?通过在两个列表框之间实现简单的拖放操作,将导致 listbox2 中的项目被添加到 listbox1 中,因为我在拖动某些东西时无法选择 listbox1 中的项目。

我希望我以正确的方式解释了这一点。

感谢代码。

【问题讨论】:

    标签: delphi listbox drag-and-drop


    【解决方案1】:

    如果我理解正确,您正在尝试查看正在掉落的物品。您需要的是 ListBox 的ItemAtPos 函数。它采用TPoint 参数,OnDragDrop 事件处理程序具有 X 和 Y 坐标。

    在本例中,ListBox2 是 Source,ListBox1 是被拖放到的控件。 iItem 给了我正在放置的 ListBox1 项目的 ItemIndex

    procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      iItem: Integer;
      MyPoint: TPoint;
    begin
      MyPoint.X := X;
      MyPoint.Y := Y;
    
      iItem := ListBox1.ItemAtPos(MyPoint, True);
    
      ListBox1.Items.Insert(iItem, ListBox2.Items[ListBox2.ItemIndex]);
    end;
    

    这里没有范围检查,只是说明ItemAtPos函数的一个例子。

    【讨论】:

    • 然后我假设项目的名称将在 Items.name[Listbox2.ItemIndex]?
    • Uri, ListBox2.Items[ListBox2.ItemIndex] 包含要删除的项目的文本。
    • 谢谢。因此,由于我不想添加新项目,我将删除最后一行 (ListBox1.Items.Insert)。当鼠标在 listbox1 上时,如何突出显示该项目?你不知道它会去哪里,直到你松开鼠标按钮
    • 您可以在 OnDragOver 中再次使用 ItemAtPos。
    • 谢谢。您可以更改 OnMouseMove 事件中的 ListBox1.ItemIndex 以执行您想要的操作。
    猜你喜欢
    • 2015-01-16
    • 2015-06-04
    • 2016-03-26
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多