Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.05.2022, 16:33
Alik7107 Alik7107 вне форума
Прохожий
 
Регистрация: 29.01.2006
Сообщения: 5
Репутация: 10
По умолчанию Проблема с печатью HTML файла через ShellExecute

Здравствуйте!
У меня стоит Дельфи7 и Виндоус 10.
Хочу отправить на печать файл типа HTML с помощью API-функции ShellExecute, но выходит ошибка

SE_ERR_NOASSOC: S := 'There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.';

Вручную связываю такие файлы через Проводник и ставлю опцию открывать с помощью имеющегося браузера Google.

Но проблема не уходит, файл не печатается.
Предполагаю, что что то изменилось в Виндоус и API функция устарела. Есть ли альтернативные способы вывода HTML на печать ?

Код:
function PrintHTML(Handle: THandle; FileName: String): integer;
var
  ErrorCode: Integer;
  S: string;
begin
  ErrorCode := Integer(ShellAPI.ShellExecute(Handle, 'Print', PChar(FileName), nil, nil, SW_SHOWMAXIMIZED));

  S := '';
  if ErrorCode <= HINSTANCE_ERROR { = 32 } then
  begin
    case ErrorCode of
      0: S := 'The operating system is out of memory or resources.';
      ERROR_FILE_NOT_FOUND: S := 'The specified file was not found.';
      ERROR_PATH_NOT_FOUND: S := 'The specified path was not found.';
      ERROR_BAD_FORMAT: S := 'The .exe file is invalid (non-Win32 .exe or error in .exe image).';
      SE_ERR_ACCESSDENIED: S := 'The operating system denied access to the specified file.';
      SE_ERR_ASSOCINCOMPLETE: S := 'The file name association is incomplete or invalid.';
      SE_ERR_DDEBUSY: S := 'The DDE transaction could not be completed because other DDE transactions were being processed.';
      SE_ERR_DDEFAIL: S := 'The DDE transaction failed.';
      SE_ERR_DDETIMEOUT: S := 'The DDE transaction could not be completed because the request timed out.';
      SE_ERR_DLLNOTFOUND: S := 'The specified DLL was not found.';
//      SE_ERR_FNF: Application.MessageBox(PChar('The specified file was not found.';
      SE_ERR_NOASSOC: S := 'There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.';
      SE_ERR_OOM: S := 'There was not enough memory to complete the operation.';
//      SE_ERR_PNF: Application.MessageBox(PChar('The specified path was not found.';
      SE_ERR_SHARE: S := 'A sharing violation occurred.';
    else
      S := 'Unknown Error %d';
    end;

    if S = '' then exit;

    S := 'PrintHTML func. ' + S;
    Application.MessageBox(PChar(Format(S, [ErrorCode])), 'Error', MB_OK or MB_ICONERROR);

    Exit;
  end;
end;
Админ: Пользуемся тегами при оформлении кода!

Последний раз редактировалось Admin, 16.05.2022 в 16:46.
Ответить с цитированием
  #2  
Старый 16.05.2022, 17:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,785
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ты связываешь, видимо, открытие файла. А для печати должна быть отдельная связь. Т.е. если ты всесто команды 'Print' укажешь 'Open', то файл твоим кодом должен открыться в том браузере, который ты указал.

Соответственно, есть 2 решения твоей проблемы.
1. Сделать привязку для команды 'Print'.
2. Сделать свой код для печати, т.е. открыть файл в браузере (например, встроенном в твою программу) и напечатать отттуда, используя соотв команды встроенного браузера.

ЗЫ. Если тебе надо распечатать именно код HTML-файла, то это обычный текстовый файл, так что его можно просто загрузить в TMemo и распечатать оттуда.
Ответить с цитированием
  #3  
Старый 16.05.2022, 17:31
Alik7107 Alik7107 вне форума
Прохожий
 
Регистрация: 29.01.2006
Сообщения: 5
Репутация: 10
По умолчанию

Действительно при вызове открытия файла 'Open' он открывается нормально.

ErrorCode := Integer(ShellAPI.ShellExecute(Handle, 'Open'{'Print'}, PChar(FileName), nil, nil, SW_SHOWMAXIMIZED));

А как связать печать HTML файла с командой 'Print' ?
Ответить с цитированием
  #4  
Старый 16.05.2022, 17:31
Alik7107 Alik7107 вне форума
Прохожий
 
Регистрация: 29.01.2006
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ты связываешь, видимо, открытие файла. А для печати должна быть отдельная связь. Т.е. если ты всесто команды 'Print' укажешь 'Open', то файл твоим кодом должен открыться в том браузере, который ты указал.

Соответственно, есть 2 решения твоей проблемы.
1. Сделать привязку для команды 'Print'.
2. Сделать свой код для печати, т.е. открыть файл в браузере (например, встроенном в твою программу) и напечатать отттуда, используя соотв команды встроенного браузера.

ЗЫ. Если тебе надо распечатать именно код HTML-файла, то это обычный текстовый файл, так что его можно просто загрузить в TMemo и распечатать оттуда.


Действительно при вызове открытия файла 'Open' он открывается нормально.

ErrorCode := Integer(ShellAPI.ShellExecute(Handle, 'Open'{'Print'}, PChar(FileName), nil, nil, SW_SHOWMAXIMIZED));

А как связать печать HTML файла с командой 'Print' ?
Ответить с цитированием
  #5  
Старый 16.05.2022, 18:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,785
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А ты знаешь приложение для печати HTML?
У хрома я нашел только ключ для печати в PDF: --print-to-pdf (не проверял).

Вообще, не уверен, что в интерфейсе винды есть готовый метод для связи файла и коменды печати. Все делается в реестре.
Вот тут пример для Open, соответсвенно, надо поменять команду на Print.
https://stackoverflow.com/questions/...plication-in-c

PS. Странно, что там используется HKEY_CURRENT_USER, хотя это может быть для текущего юзера, глобально это делается, если не ошибаюсь, в HKEY_CLASSES_ROOT.

Опять же, возвращаясь к вопросу выше, данная связь просто указывает программу, которую Винда должна использовать для печати, сама Винда ничего не знает о том, как печатать тот или иной файл. Т.е. тебе нужна программа, которая при передаче ей имени файла (ссылки) откроет страницу и выведет ее на печать. Собственно, приходим к выводу, что проще просто использовать встроенный в свою программу браузер и напечатать из него (в D7 есть TWebBrowser, основанный на IE, кстати, по умолчанию, довольно старой версии, это сделано для совместимости. Вроде, в D7 можно поставить Chromium - это тоже встроенный браузер, но уже на основе Хрома).
Вот тут есть какие-то примеры для печати из TWebBrowser:
https://stackoverflow.com/questions/...om-twebbrowser
http://delphi-kb.blogspot.com/2007/0...ebbrowser.html

Последний раз редактировалось lmikle, 16.05.2022 в 19:02.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Alik7107 (16.05.2022)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram