AFFICHER LE MENU CONTEXTUEL D'UN FICHIER

cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 - 20 mai 2003 à 10:01
cs_alll Messages postés 11 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 7 février 2008 - 11 févr. 2008 à 21:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12549-afficher-le-menu-contextuel-d-un-fichier

cs_alll Messages postés 11 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 7 février 2008
11 févr. 2008 à 21:25
bonjour a tous
tres chouette source pour moi qui debute en dlephi j'ai trouver un source tres bien commenter pour m'y retrouver sa c'est au poil felicitation

je me suis eclater a creer un editeur filelistbox et un access au menu contextuel de windows, pour ne pas avoir d'erreur au passage sur les separateur avec la sourie j'ai supprimer
{procedure Handle_WMMENUSELECT(var Msg : TMessage); message WM_MENUSELECT;}
appel de procedure
var
rep, dd: string;
ContextMenu: TShellContextMenu;
fich: Boolean;
begin
rep := ExtractFilePath(Paramstr(0));
ContextMenu := TShellContextMenu.Create(Self, Self.Handle);
fich := ContextMenu.Init(filelistbox1.FileName);

ContextMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
encore un grand bravos et merci a vous de la part de personne comme moi qui debut en delphi
cs_jpt Messages postés 7 Date d'inscription samedi 12 octobre 2002 Statut Membre Dernière intervention 25 août 2007
25 oct. 2007 à 22:08
Bon, voilà, en supprimant complètement la procédure TShellContextMenu.Handle_WMMENUSELECT(var Msg : TMessage); (la dernière de l'unité ContextMenu), ça ne plante plus.
Et comme je ne sais pas à quoi elle sert (à part afficher un truc dans le lblContextText sur Form1), ben, zap !

Et maintenant, tout fonctionne bien, menu contextuel et ses sous-menus (if any).
Mes 2 cts,
cs_jpt Messages postés 7 Date d'inscription samedi 12 octobre 2002 Statut Membre Dernière intervention 25 août 2007
23 oct. 2007 à 21:00
Salut tout le monde.
Je viens de constater avec stupeur et retardement que malgré la correction de Shagshag, ça plante quand même lors du passage sur un séparateur ou si l'on veut passer sur un sous-menu ! (opération de pointeur incorrecte...)
Je suis sous w2k-sp4 et D7 perso.
Je vais chercher, mais je ne sais pas du tout si je vais trouver (ça dépasse un peu mes compétences)...
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
16 sept. 2007 à 13:49
Salut,
Shagshag et jpt : merci à vous. Je viens de mettre à jour la source pour prendre en compte vos remarques. Par contre, c'est non testé, faute d'installation de Delphi sous la main ;)
Je suis heureux de voir que ma source rend encore service 4 ans après !

bgK
cs_jpt Messages postés 7 Date d'inscription samedi 12 octobre 2002 Statut Membre Dernière intervention 25 août 2007
11 sept. 2007 à 10:37
Salut,
il y a une 'tite fuite mémoire (merci Memcheck !) dans la dernière procédure (GetMem sans FreeMem).
Je l'ai modifiée ainsi (en y incluant la modif du post précédent) :
If (Msg.WParamLo > 0) and (Msg.WParamLo < MaxMenuItemId) then
begin // Si ok récupère le texte adapté puis déclenche
GetMem(Texte, 255); // l'évènement OnItemSelect
if not ( ICM3.GetCommandString(Msg.WParamLo - MinMenuItemId, GCS_HELPTEXTA, nil, Texte, 255) = NOERROR ) then
Texte := '';

If Assigned(FOnItemSelect) then FOnItemSelect(Self, Texte);

FreeMem(Texte); // jpt, 9/2007
end;

// If Assigned(FOnItemSelect) then FOnItemSelect(Self, Texte); // jpt, 9/2007

Merci pour tout ce code,
cs_Shagshag Messages postés 2 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 18 mai 2005
18 mai 2005 à 10:14
Salut, j'ai fait un petit changement car ça plantait chez moi (XP) quand on survole un séparateur de menu avec la souris.

ligne 248 de l'unité ContextMenu :
[If Msg.WParamLo < MaxMenuItemId then] devient [If (Msg.WParamLo > 0) and (Msg.WParamLo < MaxMenuItemId) then]

Merci pour ce code.
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
20 mai 2003 à 10:01
Arf, encore un bon code sur l'intégration au shell !! ;o)

Bonne prog' !
Rejoignez-nous