2


0

他のアイテムがドロップされたリストボックスアイテムを検出するにはどうすればよいですか?

リストボックスは2つあります。 listbox1には、DB名のリストが含まれています。 一方、Listbox2には、listbox1のDBによって関連付けられたコンテンツのタイトルのリストがあります。 基本的に、listbox1をクリックすると、listbox2にDBのコンテンツのすべてのタイトルが読み込まれます。

ドラッグアンドドロップ機能を実装したいと思います。 2つのリストボックス間をドラッグする方法を知っています。それは問題ではありません。 私が実装しようとしているのは次のとおりです:

  1. listbox2のタイトルをクリックします

  2. lisbox1のアイテムにアイテムをドラッグします

  3. タイトルは、listbox1のアイテムが指すDBの一部になりました

現在、実際のデータを移動するためのすべてのバックエンドコードは既にコード化されています。 マウスがlistbox2からアイテムをドロップしようとしているアイテムをlistbox1で選択(および認識)するにはどうすればよいですか? 2つのリストボックス間に単純なドラッグアンドドロップを実装すると、何かをドラッグしている間はlistbox1の項目を選択できないため、listbox2の項目がlistbox1に追加されます。

これを正しい方法で説明したと思います。

コードは大歓迎です。

1 Answer


3


私が正しく理解していれば、どのアイテムがドロップされているかを確認しようとしています。 必要なのは、ListBoxの ItemAtPos`関数です。 `TPoint`パラメータを取り、 OnDragDrop`イベントハンドラにはX座標とY座標があります。

この例では、ListBox2がソースであり、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`関数を説明するための例にすぎません。