begin process at 2010 02 10 00:21:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Control

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :5 092 / 421

Auteur : japee

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
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-DRO P-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

Les Membres Club peuvent 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.

 Sources du même auteur

Source avec Zip Source avec une capture DÉMINEUR UTILISANT UNE TDRAWGRID ET AVEC LEQUEL ON PEUT TRIC...
Source avec Zip Source avec une capture SIGNIFICATION DES CODES D'ERREUR DE L'API WIN32 - UTILISATIO...
Source avec Zip Source avec une capture CONVERSION LITTÉRALE D'UN NOMBRE ENTIER OU FLOTTANT
Source avec Zip Source avec une capture TPULSEBUTTON - RÉPÉTITION PROGRESSIVE D'UN EVENT PENDANT ONK...
Source avec Zip Source avec une capture PUCE S'AJUSTANT EN FONCTION DE LA LARGEUR D'UN LABEL

 Sources de la même categorie

Source avec Zip Source avec une capture GESTION DE CASES À COCHER PERSONNALISÉES DANS UN STRINGGRID par Jean_Jean
Source avec Zip UN TASKDIALOG EN TROIS CLICKS par chramade
Source avec Zip Source avec une capture DÉPLACER LES ITEMS D'UNE TLISTVIEW PAR DRAG AND DROP par krzysiu
Source avec Zip Source avec une capture SELECTDIRECTORY AVEC UNE CHECKBOXE. par ROCABDEL
Source avec Zip CRÉATION UNE TABLE PARADOX PAR PROGRAMMATION par delyes

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [ASTUCE] COMMENT VOIR UN ITEM, D'UNE LISTBOX, TRONQUÉ DANS U... par cirec
Source avec Zip Source avec une capture COMPOSANT "LISTE DE CHOIX ORDONNÉS DEPUIS UNE LISTE TRIÉE" par jihelb
Source avec Zip Source avec une capture DÉPLACER LES ITEMS D'UNE TLISTVIEW PAR DRAG AND DROP par krzysiu
Source avec Zip Source avec une capture TRI DANS LISTBOX/COMBOBOX (TSTRINGS) par MAURICIO
Source avec Zip Source avec une capture QUICK DRAG & DROP par bubulemaster

Commentaires et avis

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

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.

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.

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)

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 +

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 !

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

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 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 listbox et savoir si il y a une items qui est vide alors supprime.. [ par shell13010 ] Bonsoir a tous,J'aimerais savoir si dans un listbox il y a des items qui son vide alors on les supprimes... exemplecooooo      //ici c'est vide alors


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales