Deplacer les items d'une listbox vers une autre par drag and drop

5/5 (9 avis)

Vue 12 514 fois - Téléchargée 1 366 fois

Description

- Les items sont insérés ou ajoutés, selon l'emplacement choisi dans la ListBox de destination.
- La multi-sélection est autorisée.
- Les items sont déposés dans l'ordre où ils ont été trouvés.
- Le glisser-déposer fonctionne dans les 2 sens.
- Le glisser-déposer à l'intérieur de la même ListBox est supporté.

L'interface graphique permet de tester toutes les possibilités.

Suite à une question posée sur le forum de delphifr.com :
http://www.delphifr.com/infomsg_LISTBOX-DRAG-DROP-MULTIPLE_1053999.aspx?p=1

La question a été posée par morinxav2.
La suggestion de Caribensila d'utiliser une TStringList est finalement à retenir dans la mesure où l'on veut pouvoir insérer les items dans l'ordre où ils se trouvaient dans la liste de départ.
Donc merci à vous deux, c'est un peu un travail collectif.

N'hésitez pas à signaler tout bug ou amélioration, ça fait avancer le schmilblic.

Source / Exemple :


Dans le zip.

Conclusion :


Fait sous D4 Pro. Testé OK sous D7.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Très sympa comme idée.
La réalisation est plus courte que ce que j'aurais pensé. Mais... il manque les objets ! Tu pourrais peut-être nous prévoir un petit truc pour eux, non ?
Et sinon, pourquoi ne pas en faire une procédure du genre:
procedure MoveListboxItems(Source, Destination: TListBox);

Après ça, ce sera parfait.
C'est quand même des trucs qui manquent à la VCL je trouve, il faudrait pouvoir les soumettre à CodeGear et qu'il soient intégrés dans des mises à jours (remarque, les possesseurs de D4 ne seraient pas contents !)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2007 à 21:57
« Il faudrait pouvoir les soumettre à CodeGear [] (remarque, les possesseurs de D4 ne seraient pas contents) »

Ca en déciderait peut-être au moins un à se moderniser...
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 déc. 2007 à 22:35
@Florenth
S'il y avait tout dans la VCL, qu'est-ce qu'on s'ennuierait... ^^
Et puis ça permet de créer des librairies perso bien plus performantes que celles fournies par Borland (je déconne).

C'est vrai, j'ai négligé les objets, mais ce n'était pas mon propos au départ. Je vais néanmoins réfléchir à ta suggestion.
Pareil pour une procedure : j'ai voulu rester concret et simple, en pensant plus particulièrement aux débutants (le drag & drop n'a plus de secrets pour les autres).
C'est vrai qu'on pourrait penser la réalisation plus complexe par rapport à l'objectif fixé.

@Caribensila
Ce qui est moderne aujourd'hui sera désuet demain. J'ai décidé que Delphi 4 Entreprise était la version la plus aboutie jamais sortie par Borland/CodeGear... à moins que quelqu'un ne m'offre une version plus récente, auquel cas j'assouplirai peut-être mon point de vue. ^^
Sérieusement, je vérifie toujours la compatibilité avec les versions ultérieures, il n'y a jamais de problème, ce n'est hélas pas toujours le cas dans l'autre sens.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
31 déc. 2007 à 18:21
Tiens, Florenth, c'est rien que pour toi :

procedure ListBoxToListBoxDragDrop(const Sender, Source: TObject; X, Y: Integer);
var
i: Integer;
CursorPos: TPoint;
Index: Integer;
List: TStringList;
begin
List := TStringList.Create;
try
with TListBox(Source) do
begin
for i := 0 to Items.Count - 1 do
if Selected[i] then
List.AddObject(Items[i], Items.Objects[i]);
for i := Items.Count - 1 downto 0 do
if Selected[i] then
Items.Delete(i);
end;
CursorPos := Point(X, Y);
with TListBox(Sender) do
begin
Index := ItemAtPos(CursorPos, True);
for i := List.Count - 1 downto 0 do
if Index > -1 then
Items.InsertObject(Index, List[i], List.Objects[i])
else
Items.AddObject(List[List.Count - 1 - i], List.Objects[List.Count - 1 - i]);
end;
finally
List.Free;
end;
end;

J'ai passé les ListBox en const bien que ça ne soit pas indispensable.
Ça marche très bien avec des objets, mais également si l'on ne manipule que des strings.

Bonnes fêtes de fin d'année à tous.
Delphiphi Messages postés 12 Date d'inscription vendredi 1 décembre 2006 Statut Membre Dernière intervention 25 novembre 2008
25 sept. 2008 à 11:39
J'ai m... pendant 2-3 heures avant de tomber sur ton code.
Bravo ! Excellent ! C'est exactement ce dont j'avais besoin ;-)
Juste une petite chose : serait-il possible une fois qu'un item a été déplacé de ListBox1 vers ListBox2 de la laisser visible dans la ListBox1 mais en grisé pour montrer qu'on ne peut plus d'envoyer vers la ListBox2

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.