Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 4. Dez 2015, 14:58
Heute endlich eine PDF mit Named Destinations von der Doku-Abeteilung bekommen.
Ich dachte ich bekomme es gar nicht hin, aber jetzt ist der Knoten geplatzt.
Also grundsätzlich gehts!

Der folgende Quellcode ist nicht schön, funktioniert aber soweit und sucht auch selbstständig den aktuell eingestellten PDF-Reader raus.
Getestet mit den neusten FoxIt- und Acrobat Reader.

Delphi-Quellcode:
uses
  System.Win.Registry, Winapi.ShellApi;

const
  NAMED_DESTINATION_PREFIX = '/A "nameddest=';
  REG_SHELL_OPEN_COMMAND = '\Shell\Open\Command';
  COMMAND_OPEN = 'open';

function GetAssociation(const DocFileName: string): string;
var
  FileExtension : string;
  FileClass: string;
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_EXECUTE);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    FileClass := '';
    FileExtension := ExtractFileExt(DocFileName);
    if Reg.OpenKeyReadOnly(FileExtension) then
    begin
      FileClass := Reg.ReadString('');
      Reg.CloseKey;
    end;

    if FileClass <> 'then
    begin
      if Reg.OpenKeyReadOnly(FileClass + REG_SHELL_OPEN_COMMAND) then
      begin
        Result := Reg.ReadString('');
        Reg.CloseKey;
      end;
    end;
  finally
    Reg.Free;
  end;
end;

procedure DoOpenPDF(const PDFReader, FileName, NamedDestination: string);
var
  ExecuteResult: HINST;
  Parameters: string;
begin
  Parameters := NAMED_DESTINATION_PREFIX + NamedDestination + '" "' + FileName + '"';

  ExecuteResult := ShellExecute(
    Application.Handle,
    COMMAND_OPEN,
    PChar(PDFReader),
    PChar(Parameters),
    nil,
    SW_NORMAL
    );

  if ExecuteResult < 32 then
    RaiseLastOSError;
end;

procedure OpenPDF(const FileName: string; const NamedDestination: string = '');
var
  PDFReader: string;
begin
  PDFReader := GetAssociation('.pdf'); // 'FoxitReader.exe'; //'AcroRd32.exe';
  PDFReader := ExtractFileName(PDFReader);
  PDFReader := PDFReader.Replace('" "%1"', '', [rfReplaceAll, rfIgnoreCase]);

  DoOpenPDF(PDFReader, FileName, NamedDestination);
end;
  Mit Zitat antworten Zitat