Ошибки «Операция не поддерживается» и «Выбран принтер недействителен» при печати - PullRequest
11 голосов
/ 12 января 2009

Надеюсь, кто-нибудь сможет помочь. В моем приложении Delphi 7 небольшой процент пользователей сообщает об ошибках при печати, и я пытаюсь решить эту проблему с помощью последней из них. Я немного ограничен в тестировании (так как пользователь физически удален, и мы разрабатываем его по электронной почте), но я получаю дополнительную информацию от EurekaLog.

В любом случае, первая ошибка, которую он получил, - "Операция не поддерживается на выбранном принтере" , в этой строке кода:

Printer.Orientation := AOrientation;

Итак, я предположил, что его принтер не поддерживает ориентацию (я никогда не слышал об этом, но думаю, что это возможно) и пытался без этой строки кода. Но теперь он получает «Выбран неправильный принтер» в этой строке:

Result := Printer.PageWidth / GetDeviceCaps(Printer.Handle, LOGPIXELSX);

Насколько мне известно, принтер выбран правильно (это Canon Pixma iP1500, но у других пользователей есть другие модели, струйные или лазерные), и он уже пытался обновить драйверы. ОС также варьируется - от XP до Vista SP1).

Я предложил ему попробовать другой принтер, но что бы он ни ответил, я не знаю, где искать дальше. Поиск в Google не дал никаких полезных результатов (для меня, по крайней мере). У кого-нибудь есть идея?

Заранее спасибо!

Ответы [ 10 ]

4 голосов
/ 12 января 2009

Не решение, а совет по уменьшению количества ошибок: установите (или попросите пользователя установить) виртуальный принтер в этой системе и попытайтесь распечатать его. Бесплатный (как в пиве, так и в свободе) виртуальный PDF-принтер поставляется с превосходным PDFCreator . Это определенно поддерживает ориентацию страницы. Это даст вам известную хорошую базовую линию для тестирования.

4 голосов
/ 12 января 2009

Не прямое решение, но оно может помочь решить проблему. Первое, что я делаю с этой проблемой, это получаю точную версию драйвера от клиента, а затем загружаю драйвер и устанавливаю его на мой компьютер, используя LPT1. Затем я могу распечатать его для тестирования и решить любые проблемы с драйвером. Очевидно, я не могу печатать, но обычно это не проблема. Использование виртуальной машины тоже очень помогает.

2 голосов
/ 12 января 2009

Вы говорите, что небольшой процент пользователей сообщают о проблемах. Ты хоть представляешь, в чем разница между этими и другими пользователями?

В мысли о:

  • использованные принтеры
  • драйверы принтера (версия)
  • Используемая ОС, включая исправления и обновления (не забудьте обновления IE)
  • версия вашего программного обеспечения
  • другое установленное программное обеспечение

Есть ли у пользователей проблемы с печатью с другими приложениями?

Было бы очень полезно, если бы вы могли воспроизвести проблему.

1 голос
/ 10 сентября 2014

Ошибка: вы получаете баллы в направлении сбоя SetDefaultPrinter или перечисления принтера. SetDefaultPrinter выглядит немного страшно в Delphi 7. Например, он пытается прочитать принтер по умолчанию из реестра. В новых версиях Delphi стало лучше, но я все еще исправляю Printers.pas в каждой новой версии.

Это мой патч для Delphi 2009. Возможно, вам придется внести некоторые изменения в Delphi 7, но это должно дать вам представление. От первоначальной функции осталось немного.

{$IFDEF UNICODE}
function GetDefaultPrinter(DefaultPrinter: PChar; var I: Integer): BOOL; stdcall;
  external winspl name 'GetDefaultPrinterW';
{$ELSE}
function GetDefaultPrinter(DefaultPrinter: PChar; var I: Integer): BOOL; stdcall;
  external winspl name 'GetDefaultPrinterA';
{$ENDIF}

procedure TPrinter.SetToDefaultPrinter; //@@@ SZ
var
  I: Integer;
  Err: DWORD;
  Device: PChar;
begin
  I := 0;
  if not GetDefaultPrinter(nil, I) then       //  (this should return false because the buffer is too small)
  begin
    Err := GetLastError;
    if (Err = ERROR_FILE_NOT_FOUND) or (I = 0) then
       RaiseError(SNoDefaultPrinter)
    else if Err = ERROR_INSUFFICIENT_BUFFER then
    begin
      Device := StrAlloc(I);
      try
        if GetDefaultPrinter(Device, I) then
        with Printers do
          for I := 0 to Count-1 do
          begin
            if AnsiSameText(TPrinterDevice(Objects[I]).Device, Device) then
            begin
              with TPrinterDevice(Objects[I]) do
                SetPrinter(PChar(Device), PChar(Driver), PChar(Port), 0);
              Exit;
            end;
          end
        else
          RaiseLastOSError;
      finally
        StrDispose(Device);
      end;
    end
    else
      RaiseLastOSError;
  end;
  RaiseError(SNoDefaultPrinter);
end;

Если это не работает, то следующим шагом будет проверка, почему происходит сбой перечисления принтера. Взгляните на «Устройство», «Драйвер», «Порт» в списке TPrinterDevice.

1 голос
/ 23 ноября 2011

Это сработало для меня. Я использую его, прежде чем пытаться получить ручку принтера.

procedure InvalidatePrinter;
var
  dev,
  driv,
  port: array[0..80] of Char;
  deviceMode: THandle;
begin
  Printer.GetPrinter(dev, driv, port, deviceMode);
  Printer.SetPrinter(dev, driv, port, 0)
end;
1 голос
/ 08 сентября 2011

У меня были пользователи, сообщавшие об этой же ошибке, но только в Windows Vista. Windows XP и 7, похоже, не имеют одинаковую проблему. Я обнаружил, что на компьютерах под управлением Windows Vista отключение UAC устранит эту проблему.

1 голос
/ 13 января 2009

У меня есть клиент с такой же (или, по крайней мере, похожей) проблемой. Строка кода, в которой мы получаем сообщение «Выбран неправильный принтер», немного отличается (в библиотеке быстрых отчетов), но это также вызов GetDeviceCaps.

Хотя нам еще предстоит найти реальное решение, мы нашли обходной путь. Если пользователь заходит в диалоговое окно «Настройка принтера» до , пытаясь распечатать отчет, ошибка не появляется.

Вы смотрели на эти сайты, которые я нашел с помощью Google:

http://www.delphipages.com/threads/thread.cfm?ID=19871&G=19828

http://www.contactplus.com/cfaq/index.php?qid=381&catid=4

0 голосов
/ 12 сентября 2014

Это чисто анекдотично, но может быть просто актуально.

Я только что искал сообщение об ошибке «Выбран принтер недействителен» в приложении Delphi 5.

Программное обеспечение создавало виртуальный принтер для генерации PDF-файлов. Я обнаружил, что «старый» принтер хранился по индексу, который был ненадежным средством возврата к нему после завершения операции pdf.

Изменяя логику так, чтобы старый принтер был восстановлен по имени, я считаю, что смог решить мою проблему. (Пройдем тест через несколько дней)


Кстати - QuickReports участвовал.

0 голосов
/ 12 сентября 2014

http://zpay.com/vbulletin/showthread.php?2310-Printer-selected-is-not-valid, http://support.quickbooks.intuit.com/support/articles/SLN40193 и Служба Delphi Win32 «Ошибка выбранного принтера недействительна» на 64-разрядном стандартном сервере 2008 года список возможных причин.

Вкратце, это все проблемы конфигурации, т. Е. Ваша программа не может получить доступ к принтеру по какой-либо причине.

Я полагаю, что Delphi пытается открыть принтер по требованию, когда вы обращаетесь к соответствующему свойству, и, поскольку фреймворки позорны для этого, скрывает настоящую ошибку.

Я бы посоветовал вам попытаться открыть принтер настолько явно, насколько это возможно (например, с помощью OpenPrinter, затем попробуйте что-то вроде GetPrinterDataEx), чтобы вы получили сообщение об ошибке это дало бы как можно более конкретный намек на то, что именно идет не так.

0 голосов
/ 13 января 2009

Возможно, вам потребуется настроить принтер Delphi для принтера. В реализации принтера есть несколько ошибок, по крайней мере, в старых версиях Delphi, например. если имя UNC сетевого принтера слишком длинное, может произойти сбой delphi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...