При разработке программ на Delphi часто возникает необходимость взаимодействия с внешними приложениями, в том числе и с программами для чтения PDF-файлов. Вопрос, поднятый пользователем, касается открытия PDF-файлов с параметрами, не указывая путь к конкретному приложению для чтения, чтобы обеспечить совместимость с различными установленными приложениями на компьютере пользователя.
Проблема
Пользователь столкнулся с проблемой при попытке открыть PDF-файл с параметрами из программы на Delphi. Функция ShellExecute требует указания пути к приложению для чтения PDF, что затрудняет совместимость с различными программами, которые могут быть установлены на компьютере пользователя.
Решение
Для решения этой проблемы можно использовать функцию FindExecutable, которая позволяет определить, какое приложение должно быть использовано для открытия файла на основе его расширения. Пример кода на Object Pascal (Delphi):
procedure TForm3.Button2Click(Sender: TObject);
var
s, result: string;
path: array[0..250] of char;
begin
s := '/A nameddest=somePlaceInPDF "pathToMyFile.pdf"';
FindExecutable('pathToMyFile.pdf', nil, path);
result := Trim(StrPas(path));
ShellExecute(handle, nil, PChar(result), PChar(s), nil, SW_SHOW);
end;
Этот код позволяет автоматически определить приложение для чтения PDF, установленное на компьютере пользователя, и открыть файл с параметрами, не указывая конкретный путь к приложению.
Альтернативное решение
Другой способ - использование реестра Windows для определения пути к приложению для чтения PDF. Пример кода:
procedure TfrmFsYtd.btnPdfHelpTestClick(Sender: TObject);
var
strAcro, strParam: string;
Registry: TRegistry;
begin
// Получение пути к установленному Adobe Reader из реестра
Registry := TRegistry.Create;
Registry.RootKey := HKEY_CLASSES_ROOT;
Registry.OpenKey('Software\Adobe\Acrobat\Exe', False);
strAcro := Registry.ReadString('');
Registry.Free;
// Использование найденного Adobe Reader для открытия PDF-файла с параметрами
strParam := ' /A page=4 "' + ProgPath + 'FsYtd_Manual.pdf"';
ShellExecute(Handle, 'open', PChar(strAcro), PChar(strParam), nil, SW_SHOWNORMAL);
end;
Подтвержденное решение
Пользователь нашел подтвержденное решение, которое объединяет подходы, используя FindExecutable для определения пути к приложению и ShellExecute для открытия файла:
procedure TForm3.Button2Click(Sender: TObject);
var
s, result: string;
path: array[0..250] of char;
begin
s := '/A nameddest=somePlaceInPDF "' + pathToMyFile.pdf + '"';
FindExecutable('pathToMyFile.pdf', nil, path);
result := Trim(StrPas(path));
ShellExecute(handle, nil, PChar(result), PChar(s), nil, SW_SHOW);
end;
Заключение
Для автоматического открытия PDF-файлов с параметрами в Delphi, следует использовать функции FindExecutable или обращение к реестру для определения пути к приложению, установленному на компьютере пользователя. Это позволяет обеспечить совместимость с различными программами для чтения PDF, не требуя от пользователя указывать конкретный путь к приложению.
Пользователь сталкивается с задачей автоматического открытия PDF-файлов в Delphi, используя установленные на компьютере приложения для чтения PDF, без необходимости указания конкретного пути к этим приложениям.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS