![]() |
Explorer Kontextmenü einbinden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich möchte in meinem Programm wenn ich da rechtsklicke so ein Popup haben wie im Windows Explorer wenn man auf ne Datei rechtsklickt.(Habs mit einem Bildchen verdeutlicht)
Es sollte aber voll funktionsfähi sein (z.B. Eigenschaften oder Umbenennen). |
Re: Explorer Kontextmenü einbinden
Ich verstehe deine Frage nicht ganz, willst du das gesamte Windowskontext-Menü in dein Programm einbinden, oder wie?
Das wäre aber unlogisch, wenn due auf ein Panel klickst und dann kommt der Eigenschaften Dialog. Kannst du nochmal erklären was du willst, dann könnte ich versuchen dir zu helfen :gruebel: |
Re: Explorer Kontextmenü einbinden
ich geh mal davon aus das er dateien auflistet und bei nem rechtsklick halt das Contextmenü dazu haben will wie bei dem TreeView unter Samples
|
Re: Explorer Kontextmenü einbinden
SirThornberry: Genau! Aber ich will des nicht nur fürs ListView verwenden halt einfach so ein Datei-Container als Panel und wenn du rechtklickst soll ein KontextMenü für diese Datei angezeigt werden.
|
Re: Explorer Kontextmenü einbinden
guck mal im ordner source oder einfach die declaration für TShellTreeView suchen. Hab zu Hause leider nur ne personal sonst hätt ich selbst nachgeschaut
|
Re: Explorer Kontextmenü einbinden
Damit gings leider nicht, hab jetzt aber eine Funktion gefunden, wenn ihr wollt könnt ihr sie haben:
Delphi-Quellcode:
procedure ContextMenuForFile(FileName: TFileName; X, Y: Integer; Handle: HWND);
//... |
Re: Explorer Kontextmenü einbinden
na dann poste mal die komplette funktion oder ist die schon in irgend ner unit?
|
Re: Explorer Kontextmenü einbinden
Hier die Kontextmenü-Funktion: (eigentlich sinds 3 funktionen)
Delphi-Quellcode:
Beispielaufruf:
function SlashDirName(ADir: String): String;
var S: String; RootDir: Boolean; begin if ADir<>'' then begin S:=ADir; RootDir:=((Length(S)=3) and (S[2]=':')) or (S='\'); if not RootDir then if S[Length(S)]<>'\' then S:=S+'\'; Result:=S; end; end; function SHGetIDListFromPath(Path: TFileName; var ShellFolder: IShellFolder): PItemIDList; var TempPath, NextDir: TFileName; SlashPos: Integer; Folder, subFolder: IShellFolder; PIDL, PIDLbase: PItemIDList; ParseStruct: TStrRet; ParseNAme: String; EList: IEnumIDList; DidGet: Cardinal; ScanParam: Integer; begin SHGetDesktopFolder(Folder); SHGetSpecialFolderLocation(0, CSIDL_DRIVES, PIDLbase); OLECheck(Folder.BindToObject(PIDLbase, nil, IID_IShellFolder, Pointer(SubFolder))); TempPath:=Path; NextDir:=''; while Length(TempPath)>0 do begin SlashPos:=Pos('\', TempPath); if SlashPos > 0 then begin if Pos(':', TempPath) > 0 then NextDir:=Copy(TempPath, 1, 3) else NextDir:=SlashDirName(NextDir)+Copy(TempPath, 1, SlashPos-1); TempPath:=Copy(TempPath, SlashPos+1, Length(TempPath)); end else begin if NextDir='' then NextDir:=TempPath else NextDir:=SlashDirName(NextDir)+TempPath; TempPath:=''; end; PIDL:=PidlBase; ScanParam:=SHCONTF_FOLDERS or SHCONTF_INCLUDEHIDDEN; if (NextDir=Path) and (not DirectoryExists(Path)) then ScanParam:=ScanParam or SHCONTF_NONFOLDERS; if S_OK=SubFolder.EnumObjects(0, ScanParam, EList) then while S_OK=EList.Next(1, pidl, DidGet) do begin OLECheck(SubFolder.GetDisplayNameOf(PIDL, SHGDN_FORPARSING, ParseStruct)); case ParseStruct.uType of STRRET_CSTR: ParseName:=ParseStruct.cStr; STRRET_WSTR: ParseName:=WideCharToString(ParseStruct.pOleStr); STRRET_OFFSET: Parsename:=PChar(DWORD(Pidl)+ParseStruct.uOffset); end; if UpperCase(Parsename)=UpperCase(NextDir) then Break; end else begin Folder:=nil; Result:=nil; Exit; end; if DidGet=0 then begin Folder:=nil; Result:=nil; Exit; end; PIDLBase:=PIDL; Folder:=subFolder; if not FileExists(NextDir) then OLECheck(Folder.BindToObject(Pidl, nil, IID_IShellFolder, Pointer(SubFolder))); end; ShellFolder:=Folder; if ShellFolder=nil then Result:=nil else Result:=PIDL; end; procedure ContextMenuForFile(FileName: TFileName; X, Y: Integer; Handle: HWND); var aContextMenu: IContextMenu; aPrgOut: Pointer; aPopup: HMENU; aCmd: Integer; aCmdInfo: TCMInvokeCommandInfo; PIDL: PItemIDList; ShellFolder: IShellFolder; begin PIDL:=SHGetIDListFromPath(FileName, ShellFolder); if not Assigned(PIDL) then Exit; aPrgOut:=nil; OLECheck(ShellFolder.GetUIObjectOf(0, 1, PIDL, IID_IContextMenu, aPrgOut, Pointer(aContextMenu))); aPopup:=CreatePopUpMenu; if aPopup=0 then Exit; try OLECheck(aContextMenu.QueryContextMenu(aPopup, 0, 1, $7FFF, CMF_NORMAL)); aCmd:=Integer(TrackPopupMenuEx(aPopup, TPM_LEFTALIGN or TPM_RETURNCMD or TPM_RIGHTBUTTON or TPM_HORIZONTAL or TPM_VERTICAL, X, Y, Handle, nil)); if aCmd<>0 then begin FillChar(aCmdInfo, Sizeof(aCmdInfo), 0); with aCmdInfo do begin cbSize:=SizeOf(TCMInvokeCommandInfo); lpVerb:=MakeIntResource(aCmd-1); nShow:=SW_SHOWNORMAL; end; try aContextMenu.InvokeCommand(aCmdInfo); except end; end; finally DestroyMenu(aPopup); end; end;
Delphi-Quellcode:
Es gibt leider nur noch nen kleinen Fehler: Wenn mann in dem Kontextmenü auf "Senden an" fährt klappt da nur "Senden an" aus und nicht die richtigen Einträge...(Win98)
ContextMenuForFile('Dateiname'{Dateiname}, 100{X-Koordinate}, 200{Y-Koordinate}, Form1.Handle{Fenster-Handle in dem das Popup angezeigt wird});
Wenn íhr ne Lösung wisst könnt ihr sie ja posten! :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz