• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Пример Компас API IPrintJob

Автор stboris, 30.01.13, 16:07:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

stboris

Народ! Поделитесь кто может примером использования метода Execute в интерфейсе IPrintJob. Пытаюсь автоматизировать печать из компаса но этот метод не срабатывает,как ни крутил возвращает ложь, соответственно не отправляет на печать. Заранее благодарю !

baton4ik

Этот IPrintJob вообще через колено работает. Пытался его использовать. Так ничего толком не вышло.
Помню, что если окно предварительного просмотра открыто, то IPrintJob::Execut не срабатывает. Если не открывать окно предварительного просмотра, то настройки принтера не применяются. Те не открывая предварительный просмотр, вызвав IPrintJob::Execut - документ отправляется на печать.
+ Благодарностей: 1

stboris

В целом получилось разобраться как работать с  IPrintJob, спасибо техподдержке Аскон
если кому интересно:
procedure AutoPrint;
var
  print    : IPrintJob;
  printSettings : IPrintJob_PrinterSettings;
  sheets: OleVariant;
  deviceName, filename, conf:WideString;
begin
  GetNewKompasAPI;
  if appl7 <> nil then
  begin
    // Получаем интерфейс задания на печать
    print := appl7.PrintJob;
    if print <> nil then
    begin
      doc2 := GetCurrentDocument2;
      if ( doc2 <> nil ) then
        begin
          filename:=doc2.name;
          VarAsType( sheets, varEmpty );
          showmessage(filename);
          deviceName:='';
          if print.AddSheets(filename, sheets, ksAllSheets)=false then showmessage('невозможно добавить листы в задание');
          if print.SpecialExecute(deviceName)=false then showmessage('невозможно выполнить задание на печать');
          showmessage('отправлено');
        end;
    end;
  end;
end;
+ Благодарностей: 1

IgorRUtver

Не могу добраться до параметра Sheets - массив VT_ARRAY | VT_DISPATCH листов документа
Чето никак не найду какой интерфейс возвращает массив листов документа. Подскажите пожалуйста.

Его заполняет IPrintJob.AddSheets, с вариантами:
- ksAllSheets - 0 - Все страницы
- ksUnevenSheets - 1 - Нечетные страницы
- ksEvenSheets - 2 - Четные страницы
Если нужен другой диапазон, то удаляете лишнее функцией IPrintJob.RemoveSheets.

IgorRUtver

Я думал, чт мне надо передать функции уже заполненный массив.

Подскажите, что не так делаю
var
Sheets : variant;
pPrintJob : IPrintJob;
begin
      pPrintJob :=  newKompasAPI.PrintJob;
      pPrintJob.AddSheets('',Sheets,ksAllSheets);//В качестве параметра передаю '' пустую строку, т.к. работаю с текущим  документом
        If VarType(Sheets)=(VT_ARRAY or VT_DISPATCH) then
end;

Условие проверки возвращает false;

29.12.13, 09:54:26 #6 Последнее редактирование: 29.12.13, 10:23:34 от Sabahs
У Вас готовый рабочий пример выше дан, уберите лишнее.
Sheets : variant; - http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1358&mode=print
PS.  If VarType(Sheets)=(VT_ARRAY or VT_DISPATCH) then вернёт False, если у вас документ состоит из одного листа.

IgorRUtver

Заработало. только при IPrintJob.SpecialExecute выдает "Ошибка во время вывода на внешнее устройство" а с IPrintJob.Execute печатает нормально. Спасибо за ссылку, изучаю, хотябы начал проясняеться таинственный VARIANT. Вот только доступ к окну компаса и окну библиотеки после отправки на печать становится недоступным. К окну компаса я вернулся
var
ks : KompasObject;

begin
      ....
      ks := KompasObject(CreateKompasObject);
      //Application.Handle := ks.ksGetHWindow;
      ks.ksEnableTaskAccess(1);
      ...
end;

А вот вернуть доступ к окну библиотеки не получается.


Значит библиотека висит, без отладчика, что то определённое сказать тяжело.
Проверьте, какой принтер у Вас по умолчанию и как происходит печать через визуальный интерфейс Компаса.

IgorRUtver

Сам лист печатает успешно.
pPrintJob.Execute(deviceName) - документ распетался
дальнейший код выполняется успешно до самого конца, но после отправки на печать оно просто не доступно пользователю.

29.12.13, 14:57:21 #10 Последнее редактирование: 29.12.13, 15:20:23 от Sabahs
Можно попробовать восстановить окно библиотеки ShowWindow(Handle,SW_RESTORE);, где Handle - дескриптор окна библиотеки.
SW_HIDE - Скрывает окно приложения и активирует другое окно.
SW_MAXIMIZE - Разворачивает указанное окно на весь экран.
SW_MINIMIZE - Сворачивает указанное окно и активирует следующее по порядку окно.
SW_RESTORE - Активирует и показывает окно. Если окно было свернуто или развернуто на весь экран, Windows восстанавливает окно до енго нормальных размеров и позиции. Приложение должно указывать этот флаг когда восстанавливает свернутое окно.
SW_SHOW - Активирует окно и отображает его в текущем размере и позиции.
SW_SHOWDEFAULT - Устанавливает режим показа основываясь на SW_флаге указанном в структуре STATUPINFO, передаваеммой для функции CreateProcess программой, которая запускает приложение. Приложение должно вызвать ShowWindow с этим флагом для установки начального режима отображения своего окна.
SW_SHOWMAXIMIZED - Активирует окно и отображает его в развернутом виде.
SW_SHOWMINIMIZED - Активирует окно и отображает его в свернутом виде.
SW_SHOWMINNOACTIVE - Отображает окно в свернутом виде. Активное окно остается активным.
SW_SHOWNA - Отображает окно в его текущем состоянии. Активное окно остается активным.
SW_SHOWNOACTIVATE - Отображает окно в его самом последнем размере и позиции. Активное окно остается активным.
SW_SHOWNORMAL - Активирует и отображает окно. Если окно было свернуто или развернуто на весь экран, Windows восстанавливает его начальные размеры и позицию. Приложение должно указывать этот флаг когда впервые отображает свое окно.