2010-02-01 7 views
2

J'ai deux listes de sélection. Le listbox1 contient une liste des noms de DB. Listbox2, d'autre part, a une liste des titres du contenu associé par le DB sur listbox1. Fondamentalement, vous cliquez sur listbox1 et il charge dans listbox2 tous les titres pour le contenu de la base de données.Comment puis-je détecter sur quel objet de la liste déroulante un autre objet a été déposé?

Je veux implémenter maintenant une fonctionnalité glisser-déposer. Je sais comment faire glisser entre deux listes de sélection; c'est pas le problème. Ce que je suis en train de mettre en œuvre est la suivante:

  1. cliquez sur un titre dans ListBox2

  2. élément de glisser dans un élément lisbox1

  3. le titre fait maintenant partie de la DB pointée par l'élément dans listbox1

Maintenant, tout le code backend pour déplacer les données réelles est déjà codé. Comment puis-je faire en sorte que la listbox1 sélectionne (et sache) l'élément sur lequel la souris est sur le point de déposer l'élément de la liste2? En implémentant un simple glisser-déposer entre les deux listboxes, l'item de listbox2 sera ajouté dans listbox1 car je ne peux pas sélectionner un élément dans listbox1 pendant que je fais glisser quelque chose.

J'espère que j'ai expliqué cela de la bonne façon.

Le code est apprécié.

Répondre

3

Si je comprends bien, vous essayez de voir quel élément est abandonné. Ce dont vous avez besoin, c'est la fonction ItemAtPos de la ListBox. Il prend un paramètre TPoint et le gestionnaire d'événements OnDragDrop a les coordonnées X et Y.

Dans cet exemple, ListBox2 est la source et ListBox1 est le contrôle en cours de suppression. iItem me donne le ItemIndex de l'élément ListBox1 étant déposé sur.

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; 

Il n'y a pas le contrôle d'exécution ici, il est juste un exemple pour illustrer la fonction ItemAtPos.

+0

Le nom de l'article alors je suppose serait dans Items.name [Listbox2.ItemIndex]? – Uri

+0

Uri, ListBox2.Items [ListBox2.ItemIndex] contient le texte de l'élément supprimé. –

+0

Merci. Donc, puisque je ne veux pas ajouter le nouvel élément, je vais supprimer la dernière ligne (ListBox1.Items.Insert). Comment pouvez-vous mettre en évidence l'élément sur listbox1 lorsque la souris est au-dessus de celui-ci? Vous ne savez pas où cela va aller jusqu'à ce que vous relâchiez le bouton de la souris. – Uri

Questions connexes