Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 3. Nov 2015, 16:41
Oh, so etwas habe ich für die nächsten Tage auch auf der Agenda. Mein Plan war einfach die Bedienungsanleitung als PDF abzulegen und im passenden Kapitel aufzuschlagen.

Ich hänge dir mal eine Liste der Adobe Aufrufparameter an, keine Ahnung mehr wo ich das herhatte.

Ansonsten hier einmal was ich irgendwann einmal angefangen hatte. Das geht allerdings fest auf den Adobe-Reader da wir nur fertige Systeme ausliefern und den vorinstalllieren. Mit einem beliebigen PDF-Viewer kann man das natürlich nicht verwenden.

Delphi-Quellcode:
unit PdfViewer experimental;

interface

type

   TParams = record
      public type
         TPageMode = (none, bookmarks, thumbs);
      public var
         forceNewInstance:   Boolean;
         filePath:         String;

         startPage:         Word;
         pageMode:         TPageMode;

         /// <remarks>
         /// Scheint in Acrobat Reader DC keine Auswirkung zu haben sondern
            /// sich die Einstellung für jedes Dokument einzeln zu merken
            /// </remarks>
         showToolbar:      Boolean;
         showStatusBar:      Boolean;
         showNavPanes:      Boolean;
      public
         procedure reset();
    end;

    {TODO -oJM -cCleanup : Umbenennen in TAcroLauncher oder sowas}
   TPdfViewer = class(TObject)
      protected
         class function getCmdLineArguments(const forParams: TParams): PChar; virtual;
      public const
         executableName   =   'AcroRd32';
      public
         class procedure ShowAsync(const params: TParams); virtual;
   end;

implementation uses
   System.SysUtils, System.Types,
   WinApi.ShellApi, WinApi.Windows,
   Spring.Utils
;


type
   /// <summary>
   /// Schreibt Booleans als '0' oder '1'
   /// </summary>
   TStringBuilderHelper = class helper for System.SysUtils.TStringBuilder
      function Append(const Value: Boolean): TStringBuilder; overload;
   end;


{ TPdfViewer }

class procedure TPdfViewer.ShowAsync(const params: TParams);
var
   info: SHELLEXECUTEINFO;
begin
   info := Default(SHELLEXECUTEINFO);
   info.cbSize := SizeOf(SHELLEXECUTEINFO);

   info.fMask := SEE_MASK_DEFAULT;
   info.lpVerb := 'open';
   info.lpFile := executableName;
   info.nShow := SW_SHOWNORMAL;

   info.lpParameters := getCmdLineArguments(params);
   Win32Check( ShellExecuteEx( Addr(info)) );
end;

class function TPdfViewer.getCmdLineArguments(const forParams: TParams): PChar;
var
   stringBuilder: TStringBuilder;
begin
   stringBuilder := TStringBuilder.Create();
   try
      if forParams.forceNewInstance then stringBuilder.Append('/n ');
        stringBuilder.Append('/A ');

      stringBuilder
         .Append('"')
         .Append('page=')      .Append(forParams.startPage)
         .Append('&toolbar=')   .Append(forParams.showToolbar)
         .Append('&statusbar=')   .Append(forParams.showStatusBar)
         .Append('&navpanes=')   .Append(forParams.showNavPanes)
         .Append('&pageMode')   .Append( TEnum.GetName(forParams.pageMode) )
         .Append('"').Append(Space);

      stringBuilder.Append('"').Append(forParams.filePath).Append('"');

      Result := PChar( stringBuilder.ToString() );
   finally
      stringBuilder.Destroy();
    end;
end;

{ TParams }

procedure TParams.reset();
begin
   filePath := EmptyStr;
   startPage := 1;
   showToolbar := False;
   showStatusBar := False;
   showNavPanes := False;
   forceNewInstance := True;
   pageMode := TPageMode.none;
end;

{ TStringBuilderHelper }

function TStringBuilderHelper.Append(const Value: Boolean): TStringBuilder;
begin
   Result := Append( Value.ToString(TUseBoolStrs.False) );
end;

end.
Angehängte Dateien
Dateityp: pdf pdf_open_parameters (1).pdf (106,2 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat