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 !

DÉPLACER LES ITEMS D'UNE TLISTVIEW PAR DRAG AND DROP


Information sur la source

Catégorie :Control Classé sous : Drag Drop, List View, deplacer Niveau : Débutant Date de création : 22/02/2008 Date de mise à jour : 24/02/2008 18:02:09 Vu / téléchargé: 3 143 / 251

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
DEPLACEMENTS DES ITEMS D'UNE LISTVIEW PAR DRAG AND DROP


       Suite à une recherche désespérée sur code source,
       Fortement inspiré du code de Japee (merci)
       Merci à JLN pour les conseils finaux

Comment déplacer en Drag & Drop les items d'un TListView

cahier des charges :

- Les items sont insérés à l'endroit du lâcher : ils sont insérés ou ajoutés,
  selon l'emplacement choisi dans la TListView.
- 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 TListView et entre deux TListView.

Une interface graphique pour tester toutes les possibilités.

 

Source

  • {
  • Auteur : Krzysiu
  • E-mail :
  • Internet :
  • Date création : 22/02/2008
  • Date révision : 23/02/2008
  • DEPLACEMENTS DES ITEMS D'UNE LISTVIEW PAR DRAG AND DROP
  • Suite à une recherche désespérée sur code source,
  • Fortement inspriré du code de Japee (merci)
  • Merci à JLN pour les conseils finaux
  • Merci à Delphiprog pour le TObjectList
  • Comment deplacer en Drag & Drop les items d'un list view
  • cahier des charges :
  • - Les items sont insérés à l'endroit du lâcher : ils sont insérés ou ajoutés,
  • selon l'emplacement choisi dans la List View.
  • - 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 ListView et entre deux ListView.
  • une interface graphique pour tester toutes les possibilités.
  • }
  • unit UMain;
  • interface
  • uses
  • Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  • StdCtrls, ExtCtrls, ComCtrls,Contnrs;
  • type
  • TfrmMain = class(TForm)
  • btnInitialize: TButton;
  • btnClearLV1: TButton;
  • btnClearLV2: TButton;
  • ListView1: TListView;
  • ListView2: TListView;
  • Panel1: TPanel;
  • Splitter1: TSplitter;
  • procedure FormCreate(Sender: TObject);
  • procedure btnInitializeClick(Sender: TObject);
  • procedure btnClearLV1Click(Sender: TObject);
  • procedure ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  • procedure btnClearLV2Click(Sender: TObject);
  • procedure ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  • State: TDragState; var Accept: Boolean);
  • private
  • { Déclarations privées }
  • public
  • { Déclarations publiques }
  • end;
  • var
  • frmMain: TfrmMain;
  • implementation
  • {$R *.DFM}
  • procedure TfrmMain.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  • State: TDragState; var Accept: Boolean);
  • begin
  • Accept:=(Sender is TListView);
  • end;
  • procedure TfrmMain.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  • var
  • i: Integer;
  • CursorPos: TPoint;
  • Index: Integer;
  • List: TObjectList;
  • SItems:TListItem;
  • begin
  • List := TObjectList.Create(true); //Creation d'un TObjectList qui va servir à transporter les items séléctioné
  • try
  • with TListView(Source) do
  • begin
  • for i:= 0 to Items.Count-1 do //Ajoute les items séléctioné dans le TObjectList dans l'ordre du ListView
  • begin
  • if Items.Item[i].Selected then
  • begin
  • SItems:=TlistItem.Create(Items);
  • SItems.Assign(Items.Item[i]);
  • List.Add(SItems);
  • end;
  • end;
  • for i:=Items.Count-1 downto 0 do //Supprime les items séléctioné dansd l'ordre inverse
  • begin
  • if Items.Item[i].Selected then
  • Items.Item[i].Delete;
  • end;
  • end;
  • CursorPos := Point(X, Y);
  • with TListView(Sender) do
  • begin
  • if GetItemAt(CursorPos.X,CursorPos.Y)=nil then
  • Index:=-1
  • else
  • Index := GetItemAt(CursorPos.X,CursorPos.Y).Index;
  • for i:=0 to List.Count-1 do
  • begin
  • if Index >-1 then
  • SItems:=Items.Insert(Index)
  • else
  • SItems:=Items.Add;
  • SItems.Assign(TlistItem(List[i])); //Reconstruis les items à leur nouvel emplacement
  • end;
  • end;
  • finally
  • List.Free; //Liberer les Objets du contenu dans le TObjectList
  • end;
  • end;
  • {--------------------- FONCTIONNEMENT DE L'INTERFACE --------------------------}
  • procedure InitializeMemos(const Mem1, Mem2: TListItems);
  • var
  • i: Integer;
  • begin
  • Mem1.Clear;
  • Mem2.Clear;
  • for i := 0 to 9 do
  • begin
  • Mem1.Add.Caption:=Format('ListView1.Items[%d]', [i]);
  • Mem1.Item[i].SubItems.Add(Format('Col 1 [%d]',[i]));
  • Mem1.Item[i].SubItems.Add(Format('Col 2 [%d]',[i]));
  • Mem2.Add.Caption:=Format('ListView2.Items[%d]', [i]);
  • Mem2.Item[i].SubItems.Add(Format('Col 1 [%d]',[i]));
  • Mem2.Item[i].SubItems.Add(Format('Col 2 [%d]',[i]));
  • end;
  • end;
  • procedure TfrmMain.FormCreate(Sender: TObject);
  • begin
  • InitializeMemos(ListView1.Items, ListView2.Items);
  • end;
  • procedure TfrmMain.btnInitializeClick(Sender: TObject);
  • begin
  • InitializeMemos(ListView1.Items, ListView2.Items);
  • end;
  • procedure TfrmMain.btnClearLV1Click(Sender: TObject);
  • begin
  • ListView1.Clear;
  • end;
  • procedure TfrmMain.btnClearLV2Click(Sender: TObject);
  • begin
  • ListView2.Clear;
  • end;
  • end.
{

   Auteur        : Krzysiu
   E-mail        :
   Internet      :
   Date création : 22/02/2008
   Date révision : 23/02/2008


 DEPLACEMENTS DES ITEMS D'UNE LISTVIEW PAR DRAG AND DROP


       Suite à une recherche désespérée sur code source,
       Fortement inspriré du code de Japee (merci)
       Merci à JLN pour les conseils finaux
       Merci à Delphiprog pour le TObjectList

Comment deplacer en Drag & Drop les items d'un list view

cahier des charges :

- Les items sont insérés à l'endroit du lâcher : ils sont insérés ou ajoutés,
  selon l'emplacement choisi dans la List View.
- 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 ListView et entre deux ListView.

une interface graphique pour tester toutes les possibilités.

}

unit UMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls,Contnrs;
type
  TfrmMain = class(TForm)
    btnInitialize: TButton;
    btnClearLV1: TButton;
    btnClearLV2: TButton;
    ListView1: TListView;
    ListView2: TListView;
    Panel1: TPanel;
    Splitter1: TSplitter;
    procedure FormCreate(Sender: TObject);
    procedure btnInitializeClick(Sender: TObject);
    procedure btnClearLV1Click(Sender: TObject);
    procedure ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure btnClearLV2Click(Sender: TObject);
    procedure ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

procedure TfrmMain.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept:=(Sender is TListView);
end;

procedure TfrmMain.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  i: Integer;
  CursorPos: TPoint;
  Index: Integer;
  List: TObjectList;
  SItems:TListItem;

begin
  List := TObjectList.Create(true);  //Creation d'un TObjectList qui va servir à transporter les items séléctioné
  try
    with TListView(Source) do
    begin
      for i:= 0 to Items.Count-1 do  //Ajoute les items séléctioné dans le TObjectList dans            l'ordre du ListView
      begin
        if Items.Item[i].Selected then
        begin
          SItems:=TlistItem.Create(Items);
          SItems.Assign(Items.Item[i]);
          List.Add(SItems);
        end;
      end;
      for i:=Items.Count-1 downto 0 do   //Supprime les items séléctioné dansd l'ordre inverse
      begin
        if Items.Item[i].Selected then
          Items.Item[i].Delete;
      end;
    end;
    CursorPos := Point(X, Y);

     with TListView(Sender) do
     begin
      if GetItemAt(CursorPos.X,CursorPos.Y)=nil then
        Index:=-1
      else
        Index := GetItemAt(CursorPos.X,CursorPos.Y).Index;

      for i:=0 to List.Count-1 do
      begin
        if Index >-1 then
          SItems:=Items.Insert(Index)
        else
          SItems:=Items.Add;
        SItems.Assign(TlistItem(List[i])); //Reconstruis les items à leur nouvel emplacement
      end;
    end;
  finally
    List.Free; //Liberer les Objets du contenu dans le TObjectList
  end;
end;


{--------------------- FONCTIONNEMENT DE L'INTERFACE --------------------------}

procedure InitializeMemos(const Mem1, Mem2: TListItems);
var
  i: Integer;
begin
  Mem1.Clear;
  Mem2.Clear;
  for i := 0 to 9 do
  begin
    Mem1.Add.Caption:=Format('ListView1.Items[%d]', [i]);
    Mem1.Item[i].SubItems.Add(Format('Col 1 [%d]',[i]));
    Mem1.Item[i].SubItems.Add(Format('Col 2 [%d]',[i]));
    Mem2.Add.Caption:=Format('ListView2.Items[%d]', [i]);
    Mem2.Item[i].SubItems.Add(Format('Col 1 [%d]',[i]));
    Mem2.Item[i].SubItems.Add(Format('Col 2 [%d]',[i]));
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  InitializeMemos(ListView1.Items, ListView2.Items);
end;

procedure TfrmMain.btnInitializeClick(Sender: TObject);
begin
  InitializeMemos(ListView1.Items, ListView2.Items);
end;

procedure TfrmMain.btnClearLV1Click(Sender: TObject);
begin
  ListView1.Clear;
end;

procedure TfrmMain.btnClearLV2Click(Sender: TObject);
begin
  ListView2.Clear;
end;



end.

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

22 février 2008 13:55:40 :
Ajout du source
22 février 2008 18:37:42 :
Correction des fautes ;-)
23 février 2008 22:10:16 :
Correction d’un oublie Modification du code en fonction des conseils de Delphiprog
23 février 2008 22:12:45 :
Correction d’un oublie Modification du code en fonction des conseils de Delphiprog
24 février 2008 18:02:09 :
Ajout d'une copie d'écran

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 23/02/2008 11:55:20 administrateur CS

ATTENTION : le fichier source du projet possède encore le nom PROJECT1 et, de ce fait, il n'est pas possible de compiler ce code source sans avoir modifié en :
program ListViewDragAndDrop;

signaler à un administrateur
Commentaire de Delphiprog le 23/02/2008 12:07:40 administrateur CS

Très bon code, clair et limpide.

A la place d'un TList dans ListView1DragDrop, j'ai utilisé un TObjectList, ce qui permet d'alléger le code au moment de libérer les objets de la liste de manière automatique :
  List := TObjectList.Create(true);
  try
    //le reste identique
  finally
    //Libération automatique des objets possédés
    List.Free;
  end;

En indiquant true lors de l'appel du constructeur de TObjectList, on le rend responsable de la libération des objets qu'il détient.
NB : ne pas oublier d'ajouter Contnrs dans la liste des uses pour pouvoir utiliser TObjectlist.

signaler à un administrateur
Commentaire de krzysiu le 23/02/2008 22:24:02

Merci, Delphiprog je suis très honoré.
Depuis le temps que je pompe des idées sur ce site, il fallait qu'à mon tour je donne quelque chose. Ce qui n'est pas évident, car il y a beaucoup de sujets traités et résolus.

J'espère que ce bout de code permettra à d'autres d'avancer.

Merci encore pour le TObjectList, je ne connaissais pas, je vais me coucher moins bête ce soir.

signaler à un administrateur
Commentaire de Delphiprog le 24/02/2008 10:20:45 administrateur CS

Ici, quand un code est médiocre, il ne faut surtout pas le dire sous peine de se faire incendier.
Mais quand il est bon, alors il ne faut pas hésiter à le souligner. Et là, pour moi, c'est le cas. Il y a le style et la manière, le tout agrémenté d'un français impeccable.
C'est tellement rare que je tenais à le mentionner.

signaler à un administrateur
Commentaire de Caribensila le 25/02/2008 00:59:42 10/10

« Ici, quand un code est médiocre, il ne faut surtout pas le dire sous peine de se faire incendier »
Heureusement qu'il y a quelques incombustibles...  :)

« il fallait qu'à mon tour je donne quelque chose »
Pour ce premier post, y'a rien à redire. Ca vaut 10/10 pour la qualité, pour la motivation participative et pour encourager l'auteur à récidiver.
On sent bien que ce code a été travaillé pour servir de modèle et ça nous change des trucs balancés négligemment sur le site dès que ça semble tourner + ou - rond

Merci pour l'effort.

signaler à un administrateur
Commentaire de krzysiu le 25/02/2008 21:54:12

Merci Caribensila,
Ben voilà, la barre est placée bien haut, il va falloir m'accrocher pour ma prochaine contribution.
Merci encore pour ces posts d'encouragement.

signaler à un administrateur
Commentaire de JoSyl le 14/05/2009 17:16:12

J'ai une question... Est-ce que ce serait mieux de mettre un "DeginUpdates" et "EndUpdates" dans la procedure "DragDrop" lors de la reconstruction des items dans le ListView ou bien étant donnée que c'est dans la procedure DragDrop justement, ce n'est pas nécessaire ??

signaler à un administrateur
Commentaire de krzysiu le 14/05/2009 18:15:06

c'est une bonne question, je ne connais pas ces fonctions. je ne peux vous répondre. Par contre une explication c'est pas de refus.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

deplacer une image [ par etrix ] Bonjour c'est ma premiere sur ce forum '(uper site !!) j'espere que je serai pas decu :)voila je voudrais inserer une image dans mon logiciel et qu'on Deplacement de colonnes dans un TstringGrid [ par Suic1de ] Bonjour, je voudrais qu'on m'explique en details comment, avec un seul TstringGrid, deplacer le contenu d'un colonne vers un autre avec la souris.Pour Deplacer le curseur d'un edit à un edit [ par nekinox ] Bonsoir,Le titre n'est pas très clair désolé, je m'explique :Il s'agit d'un programme avec plusieurs editX.text dans form1L'utilisateur rentre des don deplacer un memo [ par atb126 ] voila je veux deplacer un memo avec la sourie mais comment faire le test pour le deplacer ,tester le boutton gauche c ok mais la position et avec la s comment deplacer un rectangle dessiner sur une bitmap? [ par malsangn ] Je veut afficher un point sur une bitmap puis pouvoir le deplacer ou supprimer. Comment faire? Deplacer des fichiers [ par gpwebmaster ] Y'a t-il une fonction pour deplacer toutles fichiers d'un repertoire à un autre, parce qu'avec la fonction MoveFile ou MoveFileEx je ne deplacer un fichier commande movefile [ par couf ] Bonjour à Tous, Je vous remercie d'avance pour l'aide que vous allez m'apporter   Voila je suis sur windows XP avec delphi 7    Deplacer un composant [ par ffomnislash ] hello ;p j'ai un composant Tcapture qui affiche un flux videos provenant d'une webcam. Cette classe herite de TcustomControl. J'aimerais que l'utili Deplacer un TImage sur une form [ par ewertheimer ] Comment deplacer un TImage sur une form simplement en appuyant sur les fleches directionelles. Merci de vos reponses!!!! Comment deplacer un fichier vers un repertoire? [ par ewertheimer ] Bonjour, J'aimerais savoir comment deplacer un fichier en entrant comme information des types string : L'emplacement du fichier et le repertoire de de


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

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,733 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é.