AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Ein Windows ShellMenu für eine Datei erscheinen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Windows ShellMenu für eine Datei erscheinen lassen

Offene Frage von "blackdrake"
Ein Thema von blackdrake · begonnen am 25. Aug 2008 · letzter Beitrag vom 26. Aug 2008
Antwort Antwort
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Ein Windows ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 20:22
Hallo.

Ich habe eine Listbox, die Dateinamen in den Captions besitzt. (Dateinamen ohne Pfadangaben)

Wenn der Benutzer einen Eintrag doppelklickt, wird die Datei geöffnet (über ShellExecute im OnDblClick)

Was ich jetzt noch realisieren möchte, ist ein Windows Kontextmenü (Öffnen, Umbenennen, Löschen, Eigenschaften etc.) für die jeweils angewählte Datei, wenn der Benutzer mit der rechten Maustaste auf eine Zeile klickt.

Wie realisiert man das?

Delphi-Quellcode:
procedure TMainForm.database_list_mousedown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  tmp: string;
begin
  if (Button = mbRight) and (database_list.SelCount > 0) then
  begin
    tmp := GetDownloadDirectory + database_list.Selected.Caption;
    if FileExists(tmp) then
    begin
      // ToDo: KontextMenue
      // KontextMenue(tmp);
      showmessage(tmp);
    end;
  end;
end;
Vielen Dank.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ein ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 20:25
Wenn ich mich nicht irre, kannst du der Listbox ein Popupmenü als Kontextmenü zuweisen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Ein ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 20:26
Ich möchte jedoch exakt das Kontextmenü von Windows (so wie man es bei WinZip WinRAR sieht)
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Ein Windows ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 20:53
Ach so, sag das doch auch:
Delphi-Quellcode:
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;
Ich weiß jetzt allerdings nicht, welche Units du noch eibinden muss. Probier es mal mit diesen hier: ActiveX, ShlObj, ComObj.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Ein Windows ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 22:02
Hallo Luckie.

Vielen Dank für deine Hilfe! Bei diesen API-Funktionen habe ich das große Problem, dass ich die Schlagwörter (ContextMenuHandler, ShellMenu, etc.) nicht weiß bzw. diese in anderen Problematiken quasi identisch sind (Beispiel: ShellMenu).

Die benötigte Funktion SHGetIDListFromPath() ist übrigens hier zu finden: http://www.delphipraxis.net/internal...=121338#121338 .

Hier mein Code:

Delphi-Quellcode:
procedure TMainForm.database_list_mousedown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  tmp: string;
begin
  if (Button = mbRight) and (database_list.SelCount > 0) then
  begin
    tmp := GetDownloadDirectory + database_list.Selected.Caption;
    if FileExists(tmp) then
    begin
      // The left border as well as the title line of the ListView is not included
      // in the X and Y parameter, so we have to add X+6 and Y+32... :-/

      ContextMenuForFile(tmp, MainForm.Left + database_list.Left + X + 6,
                              MainForm.Top + database_list.Top + Y + 32,
                              Application.Handle);
    end;
  end;
end;
Ich hab nur noch so ein seltsames Problem: Die X und Y Angaben sind abzüglich der Titelzeile und abzüglich des linken Randes der TSortListView (TListView), weswegen ich hier die Zahlen 6 und 32 "hard-coden" musste (Lösung?)

Ich bin erstaunt darüber, dass sich sofort auch mein sekundäres Problem von selbst gelöst hat - ich wollte nämlich die "Umbenennen"-Funktion deaktivieren bzw. zumindestens behandeln (Datenbankeintrag, der zu der Datei gehört, mit umbenennen). Das Shell-Menu hat den "Umbenennen"-Eintrag nicht Naja, man kann trotzdem die Datei löschen oder über den Eigenschafts-Dialog die Datei umbenennen. Ich muss mich da noch um ein Shell-Notify (?) für Änderungsereignisse des Zielordners beschäftigen.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Ein Windows ShellMenu für eine Datei erscheinen lassen

  Alt 25. Aug 2008, 22:11
Zitat von blackdrake:
Die benötigte Funktion SHGetIDListFromPath() ist übrigens hier zu finden: http://www.delphipraxis.net/internal...=121338#121338 .
Ah. Das ist code aus einem älteren Projekt ich wusste nicht mehr, was da noch alles zugehört und was nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Ein Windows ShellMenu für eine Datei erscheinen lassen

  Alt 26. Aug 2008, 13:11
Hallo.

Ich habe eine zusätzliche Frage, die sich auf die selbe Problematik bezieht:

Ich dachte mir, da jetzt ein ShellMenu existiert, kann man in der ListView auch ein MultiSelect erlauben. Somit kann der Nutzer z.B. mehrere Dokumente auf einmal über das Windows-Kontextmenü öffnen oder drucken. Wie müsste ich bei mehreren Dateien vorgehen?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz