5/5 (8 avis)
Vue 9 748 fois - Téléchargée 1 262 fois
{ 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.
14 mai 2009 à 18:15
14 mai 2009 à 17:16
25 févr. 2008 à 21:54
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.
25 févr. 2008 à 00:59
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.
24 févr. 2008 à 10:20
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.
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.