Конференция "WinAPI" » Метод Print компонента TAcroPdf
 
  • Tokisoda (04.07.16 15:34) [0]
    Использую компонент TAcroPdf.
    Необходимо организовать печать нескольких pdf-файлов в цикле.
    Создаю форму, отображаю документ в ActiveX компоненте и вызываю метод Print.
    Прикол в том, что у этого метода нет результата. Т.е. не ясно, что нажал пользователь - Ок или Отмема. А как раз после печати мне необходимо закрыть форму с компонентом. Но я не знаю, как отследить событие закрытия формы печати. Это вообще возможно?

    procedure PDFForm.Print;
    begin
    acroPDF.Print; // Вызываем диалоговое окно печати
    ...
    // и вот тут по идее нужно вызывать закрытие основной формы с компонентом, но окно печати появляется не в момент вызова acroPDF.Print, а уже при выходе из PDFForm.Print.
    end;

  • Leonid Troyanovsky © (04.07.16 16:57) [1]

    > Tokisoda   (04.07.16 15:34)

    > необходимо закрыть форму с компонентом. Но я не знаю, как
    > отследить событие закрытия формы печати. Это вообще возможно?

    Можно попытаться послать в конце procedure PDFForm.Print, скажем,
    PostMessage(Handle, WM_CLOSE, 0, 0).

    Ну, или хукнуть диалог печати, например, в духе
    https://groups.google.com/d/msg/fido7.ru.delphi/j0TvFfA66Jg/EMIipVG0dOUJ

    (библиотека в данном случае не нужна, т.к. приложение свое.
    Следить за WM_CLOSE или WM_DESTROY окна, хендл которого
    получен при WM_INITDIALOG).

    --
    Regards, LVT.
  • Leonid Troyanovsky © (04.07.16 17:05) [2]

    > Leonid Troyanovsky ©   (04.07.16 16:57) [1]

    > WM_CLOSE или WM_DESTROY

    Ну, или WM_COMMAND, поlсмотреть можно WinSpy or WS32.exe

    --
    Regards, LVT.
  • Tokisoda (04.07.16 17:27) [3]
    > Leonid Troyanovsky ©   (04.07.16 16:57) [1]

    Можно попытаться послать в конце procedure PDFForm.Print, скажем,
    PostMessage(Handle, WM_CLOSE, 0, 0).


    У меня PDFForm.Print выполняется мгновенно, из документации: "This method returns immediately, even if the printing has not completed." Откуда вы предлагаете посылать сообщение? После вызова acroPDF.Print?
    Handle окна, вызываемого через acroPDF.Print неизвестен до выхода из procedure PDFForm.Print.
  • Leonid Troyanovsky © (05.07.16 08:56) [4]

    > Tokisoda   (04.07.16 17:27) [3]


    var
     hhk: HHook;
     hdlg: HWND;

    function GetMsgProc(code: Longint; awparam: WParam; alparam: Lparam):LResult;
     stdcall;
    var
     msg: PCWPRETSTRUCT;
    begin
     Result := 0;
     msg := PCWPRETSTRUCT(alparam);
     case msg.message of
       WM_INITDIALOG:
         hdlg := msg.hwnd;
       WM_COMMAND:
         begin
           if msg.hwnd = hdlg then
             begin
               // вот здесь можно закрыть форму
               UnhookWindowsHookEx(hhk);
               Exit;
             end;
         end;
     end;
     if hhk <> 0 then
       Result := CallNextHookEx(hhk, code, awparam, alparam);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     hhk := SetWindowsHookEx(WH_CALLWNDPROCRET, GetMsgProc, Hinstance, GetCurrentThreadId);
     MessageBox(Handle, nil, 'Dialog', 0);
    end;

    --
    Regards, LVT.
 
Конференция "WinAPI" » Метод Print компонента TAcroPdf
Есть новые Нет новых   [134427   +34][b:0][p:0.001]