Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Kontextmenüpunkt Drucken (https://www.delphipraxis.net/175789-kontextmenuepunkt-drucken.html)

Thomas Feichtner 18. Jul 2013 13:30

Kontextmenüpunkt Drucken
 
Hallo,

woher weiß das Kontextmenü, dass ich eine Datei drucken kann?
Wo steht das genau in der Registry?

z.b. für eine .txt, .ini oder .jpg

Ich möchte bei unserer Dokumentenverwaltung einen Menüpunkt erstellen, mit dem ich dokumente Drucken kann. Dieser Menüpunkt solle aber nur enabled sein, wenn ich die Datei auch über das Kontextmenü drucken kann.

Volker Z. 18. Jul 2013 14:22

AW: Kontextmenüpunkt Drucken
 
Hallo,

schau mal unter HKEY_CLASSES_ROOT. Dort findest Du Schlüssel mit den jeweiligen Dateiendungen (.txt, .ini, .jpg etc.). Für die jeweilige Dateiendung dann den Datenwert für Standard auslesen (für den Schlüssel .txt z. B. ist das txtfile). Anschließend nach diesem Unterschlüssel suchen. Unter diesem Unteschlüssel (z. B. txtfile) existiert ggf. der Unterschlüssel shell und darunter print (oder auch nicht, wenn keine Druckanwendung hinterlegt ist). Unter dem Schlüssel print existiert der Unterschlüssel command. Dort steht im Datenwert Standard die Anwendung zum Drucken.

Gruß

Thomas Feichtner 18. Jul 2013 14:27

AW: Kontextmenüpunkt Drucken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Volker,

dabe ich schon nachgeschaut und werde nicht ganz schlau.
Im Anhang habe ich den Auszug für die Ini-Datei. Unter Persitstenhandler ist nur eine Guid eingetragen. Unter diese finde ich aber keinen Eintrag.
Win8 64Bit verwende ich

DeddyH 18. Jul 2013 14:27

AW: Kontextmenüpunkt Drucken
 
Das stimmt zwar in den meisten Fällen, aber wohl leider nicht immer. Es kann auch sein, dass der Standardwert zu einer Endung eine GUID ist, die man dann auch wieder erst mühsam suchen muss, oder dass der Unterschlüssel nicht print, sondern printto heißt.

mkinzler 18. Jul 2013 14:32

AW: Kontextmenüpunkt Drucken
 
Doch die Klasse solltest du unter CLSID finden. U.U. verweist diese aber auf eine andere GUID

DeddyH 18. Jul 2013 14:43

AW: Kontextmenüpunkt Drucken
 
Da wäre es doch toll gewesen, wenn Microsoft äquivalent zu FindExecutable auch FindPrintable implementiert hätte. Dieses Registry-Gehangel macht ja nur bedingt Spaß.

Volker Z. 18. Jul 2013 14:44

AW: Kontextmenüpunkt Drucken
 
Hallo,

Zitat:

Unter Persitstenhandler ist nur eine Guid eingetragen. Unter diese finde ich aber keinen Eintrag
Es steht auch nicht unter dem Schlüssel Persitstenhandler. Den Schlüssel .ini öffnen und den Datenwert von Standard auslesen (in diesem Fall: inifile). Und dann geht es mit dem Schlüssel inifile weiter.

Zitat:

Das stimmt zwar in den meisten Fällen, aber wohl leider nicht immer. Es kann auch sein, dass der Standardwert zu einer Endung eine GUID ist, die man dann auch wieder erst mühsam suchen muss, oder dass der Unterschlüssel nicht print, sondern printto heißt.
Ja, diese und andere hässliche Fälle gibt es natürlich auch.

Gruß

WM_CLOSE 18. Jul 2013 16:29

AW: Kontextmenüpunkt Drucken
 
ShellExecute kann doch das Verb 'print', oder? Das müsste doch genau dem Kontextmenüeintrag entsprechen.

Volker Z. 18. Jul 2013 22:24

AW: Kontextmenüpunkt Drucken
 
Hallo,

wenn das (Windows Explorer) Kontextmenü den Menüpunkt "Drucken" anbieten, dann sollte Dir folgender Code einen nicht leeren Wert (string) zurückliefern.
Delphi-Quellcode:
function ReadRegistryShellPrintCommand (const Extention : string) : string;
var
  r : TRegistry;
  s : string;
begin
  r := TRegistry.Create;
  try
    r.RootKey := HKEY_CLASSES_ROOT;
    if not r.OpenKeyReadOnly (Extention) then
      Result := ''
    else
      try
        s := r.ReadString ('');
        r.CloseKey;
        if s = '' then
          Result := ''
        else
          begin
            s := IncludeTrailingPathDelimiter (s) + 'shell\';
            if r.OpenKeyReadOnly (s + 'print\command') then
              Result := r.ReadString ('')
            else
              if r.OpenKeyReadOnly (s + 'printto\command') then
                Result := r.ReadString ('')
              else
                Result := ''
          end
      except
        // Deine Fehlerbehandlung
        Result := ''
      end
  finally
    FreeAndNil (r)
  end
end;
Gruß

Thomas Feichtner 19. Jul 2013 06:15

AW: Kontextmenüpunkt Drucken
 
Danke,
werde ich mal testen.

Edit: Ja es funktioniert wunderbar!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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