Probléme shellexecute (lancer des dossier par clic sur les items d'un listview)

Résolu
Messages postés
123
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
9 février 2010
-
Messages postés
123
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
9 février 2010
-
Bonjour,


Je souhaite gérer une liste de racourcis. Pour celà j'utilise un
ListView dans lequel j'ajoute mes fichiers par drag and drop depuis
windows.Cette partie là fonctionne, voici le code (au cas où):

var

FileNbr, i: Integer;

FileName: String;

Files: Array[0..255] of Char;

ListItem: TListItem;

procedure TFichier.FormCreate(Sender: TObject);
begin

DragAcceptFiles(Self.Handle,True);
end;

procedure TFichier.DropMsg(var msg: TWMDropFiles); // faire le drag and drop
begin

FileNbr:= DragQueryFile(Msg.Drop, $FFFFFFFF, Files, SizeOf(FileName));

for i:=0 to FileNbr-1 do
begin

FileName: =copy(Files, 0, DragQueryFile(Msg.Drop, i, Files, 255));

ListItem:= ListView1.Items.Add;

ListItem.Caption:=ExtractFileName(FileName); //Column 0 - Nom

ListItem.SubItems.Add(FileName); //Column 1 - Origine
end;

Msg.Result: =0;

DragFinish(msg.Drop);
end;


Ce qui ne marche pas c'est lorsque je souhaite ouvrir l'un des racourci en cliquant dessus. J'utilise shellexecute comme ceci:

procedure TFichier.ListView1SelectItem(Sender: TObject; Item: TListItem;

Selected: Boolean);
begin


ShellExecute(0,'open',PChar(filename) , Nil, Nil, SW_SHOW);
end;


Avec cette ligne je n'obtient que des erreurs, je pense que c'est a cause de "FileName".

Donc est-ce que quelqu'un saurait comment lancer les raccourcis(qui sont des dossiers, des fichiers textes...comme "mes documents" par exemple)en cliquant dessus?


J'espére avoir été clair dans ma demande.


Merci.

6 réponses

Messages postés
123
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
9 février 2010

alors avec cette modif ça fonctionne et je n'ai plus de bug:

procedure TFichier.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
ShellExecute(0,'open',PChar(Item.SubItems.Strings[0]  ) , Nil, Nil, SW_SHOW);
end;

Il me reste un léger souci, je m'explique:
   lorsque je clic sur l'item j'ouvre le fichier ou dossier en question mais celà se produit aussi au 2nd clic peut importe l'item et même si je clic sur un espace vide du listview.

    J'ai remarquer que l'item sur lequel j'ai cliqué reste en surbrillance jusqu'au second clic (je pense donc qu'il y a un rapport entre le relencement du fichier et cette surbrillance) ce qui m'améne a poser cette question:

comment faire pour enlever cette surbrillance...enfin je veut dire déselectionner l'item apres l'ouverture du fichier?

merci
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Il faut que tu testes la valeur du param Selected.

<hr size= "2" width="100%" /> procedure TFichier.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
  if Selected then
    ShellExecute(0, 'open', PChar(Item.SubItems.Strings[0]) , nil, nil, SW_SHOW);
end;<hr size ="2" width="100%" />
Logiquement, le dossier ne devrait s'ouvrir que lorsque tu sélectionne l'item.
++
Messages postés
120
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
15 novembre 2007
1
bjr

as-tu essayé de mettre un point d'arrèt et de visualiser le contenu de filename  au moment du shellexecute ?
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Son filename est forcément faux puisqu'il sera toujours égal au dernier fichier ajouté par drag&drop.

Ce qu'il faut faire, c'est récupérer le fichier sélectionné dans ton listview....
Messages postés
123
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
9 février 2010

daccord, je comprend mieux....je vais essayer de faire ça
Messages postés
123
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
9 février 2010

ça y est plus de problémes

merci à vous deux pour votre aide!

@+