Déplacer les items d'une tlistview par drag and drop

Soyez le premier à donner votre avis sur cette source.

Vue 9 033 fois - Téléchargée 1 185 fois

Description

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 / Exemple :


{

   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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
22
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
3 septembre 2011

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.
Messages postés
9
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
19 avril 2010

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 ??
Messages postés
22
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
3 septembre 2011

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.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
14
« 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.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
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.
Afficher les 8 commentaires

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.