Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DEPLACER LES ITEMS D'UNE LISTBOX VERS UNE AUTRE PAR DRAG AND DROP


Information sur la source

Catégorie :Control Classé sous : draganddrop, listbox, deplacer, items Niveau : Débutant Date de création : 30/12/2007 Date de mise à jour : 30/12/2007 16:28:32 Vu / téléchargé: 4 536 / 355

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
- 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.
 

Conclusion

Fait sous D4 Pro. Testé OK sous D7.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

30 décembre 2007 16:25:11 :
Légère retouche de la mise en page.
30 décembre 2007 16:28:32 :
Mise en page retouchée.

Commentaires et avis

signaler à un administrateur
Commentaire de Caribensila le 30/12/2007 21:57:11

« 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...

signaler à un administrateur
Commentaire de japee le 30/12/2007 22:35:46 administrateur CS

@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.

signaler à un administrateur
Commentaire de japee le 31/12/2007 18:21:30 administrateur CS

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.

signaler à un administrateur
Commentaire de Delphiprog le 08/01/2008 23:23:33 administrateur CS

Code sympa et toujours bien expliqué, c'est du Made in Japee !

Comme il me semblait bien avoir déjà publié un code de même nature (http://www.delphifr.com/codes/DRAG-DROP-ENTRE-CONTROLES-MEME-NATURE_12296.aspx) en janvier 2003, je propose les quelques modifications suivantes :

1/ Eviter de comparer des chaines telles que le nom des composants mais plutôt leur référence. Le code produit est bien plus rapide :
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TListBox) and
  (cbAutoDD.Checked or (Source <> Sender));
end;

2/ Pour la gestion des objets liés aux chaines visibles dans le contrôle, l'emploi de AddObject et de InsertObject s'impose :
{Gestionnaire partagé, noter le pluriel}
procedure TForm1.ListBoxesDragDrop(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
      { récupération des items sélectionnés dans l'ordre croissant }
      for i := 0 to Items.Count - 1 do
        if Selected[i] then
          List.AddObject(Items[i], Items.Objects[i]);
      { suppression des items sélectionnés }
      DeleteSelected; {<<< allège sérieusement le code !}
    end;
    CursorPos := Point(X, Y); { position du curseur }
    with TListBox(Sender) do { ListBox destinataire }
    begin
      { index de l'item désigné par le curseur }
      Index := ItemAtPos(CursorPos, True);
      for i := List.Count - 1 downto 0 do
        if Index > -1 then { ListBox non vide, permet l'insertion }
          Items.InsertObject(Index, List[i], List.Objects[i])
        else { ListBox vide, insertion impossible }
          Items.AddObject(List[List.Count - 1 - i], List.Objects[List.Count - 1 - i]);
    end;
  finally
    List.Free;
  end;
end;

Pour tester et vérifier, j'ai créé une classe basique :
  //Déclaration d'une classe pour tester
  TIntObject = class
  private
    FInt: integer;
  public
    constructor Create(AInt: integer);
    property Int: integer read FInt;
  end;
{ TIntObject }

constructor TIntObject.Create(AInt: integer);
begin
  inherited Create;
  FInt := AInt;
end;

et ajouté un label sur la fiche qui doit indiquer la valeur stockée dans la ligne sur laquelle on a clické :
procedure TForm1.ListBoxesClick(Sender: TObject);
var
  index: integer;
begin
  //Gestionnaire partagé par les TListBox
  index := TListBox(Sender).ItemIndex;
  if (index <> -1) and (TListBox(Sender).Items.Objects[index] <> nil) then
    ValueSelected.Caption :=
      IntToStr(TIntObject(TListBox(Sender).Items.Objects[index]).Int)
  else
    ValueSelected.Caption := 'Nul';
end;

Bien entendu, il faudra aménager la procédure InitializeMemo :
Mem1.AddObject(Format('ListBox1.Items[%d]', [i]), TIntObject.Create(i));
    Mem2.AddObject(Format('ListBox2.Items[%d]', [i]), TIntObject.Create(i));

Joyeuses Pâques. Ben quoi ? J'ai raté le joyeux Noel, alors je me mets en avance au cas où...;o)

signaler à un administrateur
Commentaire de japee le 09/01/2008 00:16:20 administrateur CS

Hello Delphiprog,

J'avais pourtant lancé une recherche pour être sûr de ne pas poster en double... et je n'avais pas vu ton code.
Je vais étudier tout ça tranquillement, car là (Bruni^^) j'étais passé à autre chose et il faut que je me replonge dans le sujet.
Je note au passage le "DeleteSelected". Diantre, je veux que ça allège le code, je ne sais pas comment je suis passé à côté...
Joyeuses Pâques à toi aussi ^^

A +

signaler à un administrateur
Commentaire de amiga68 le 14/01/2008 06:20:26

:) Japee

Merci pour le code !!! Me servira çui-là !

Ps Evite de mettre des phrases telles que "Ça marche très bien avec des objets, mais également si l'on ne manipule que des strings.", si mon épouse passe j'aurai l'aire con à lui expliquer que c'est de la programmation !

signaler à un administrateur
Commentaire de japee le 14/01/2008 08:29:09 administrateur CS

amiga68 > lol !
J'avais même pas fait gaffe.
Comme quoi, quand on est pris par la programmation, on ne pense plus qu'à ça... ^^

signaler à un administrateur
Commentaire de Delphiphi le 25/09/2008 11:39:23 10/10

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

handle [ par lugdanum ] bonsoir voilà je récupère toutes les fenetres d'ouvertes dans une listbox et je voudrais qu'elles se ferment toutes. j'ai regardé les exemples sur le scrollbar des listbox [ par Nebula ] Bonjour &#224; tous, J'aimerais faire en sorte que mes listbox d&#233;sactivent leur scrollbar verticale au lieu de la masquer lorsqu'il n'y a pas as Listbox erreur [ par Valeriu ] J'ai mit une timer sur un form.A chaque 300 ms il prenne le contenu d'un fichier text et il le met dans une listbox.La pb c'est qu'il le met aussi sur Comment faire la somme d'items [ par Francky23012301 ] Salut à tous : Voila j'ai une listbox contenant différents items : J'ai besoin de récuperer dans un TEdit l'ensemble des itemps par exemple "Edit1.t listbox items [ par TouTSpeed ] bonjour à tous voila je débute en delphi (dephi 6)et j'ai un léger problèmesj'ai deux listbox      listbox1 et listbox2dans la première j'arrive à sél Deplacer des items dans un listbox [ par seba31stien ] Bonjour, j'utilise un composant TUpDown pour déplacer les items d'un listbox. or je n'arrive pas à modifier la propriété itemindex de l'élément sélect RAJOUT D'UN STRING DANS LISTBOX ET SAUVEGARDE [ par guy jeuniaux ] JE reformule car il y a eu erreur dans le message pr&#233;c&#233;dentJe met un listbox sur ma form.Dans la propri&#233;t&#233; items je rentre quelque Erreur d'imbrication des boucles? Comparer 2 listbox [ par dhp9951 ] Bonsoir, par utilisation des boucles, je veux comparer le contenu d'une listbox2 avec le contenu d'une listebox1 et si un item est identique, copier c Calculer le nombre d'Items dans ma ListBox [ par kangourouxxx ] Bonjour, je cherche désespérément comment faire pour connaitre combient d'items sont enregistrer dans le corp de ma listBox.Car j'ai fait un petit log listbox et items selectionné [ par shell13010 ] Bonjour a tous, je me trouve fasse a un probleme que j'arrive pas a resoudre j'ai un listbox et je voudrais que quand une personne click sur une item


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,686 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.