Управление принтером для вывода отчета

отредактировано 23:56 Раздел: FastReport 2.xx VCL
Версия 2.54

Ура, в версии 2.5x наконец появилось свойство ShowPrintDialog!

Как можно направить отчет на один из заранее выбранных принтеров, при ShowPrintDialog = False и без установки этого притера "по-умолчанию"? Например, если известен его PrinterIndex, полученный стандартным TPrintDialog?


Комментарии

  • отредактировано 23:56
    У TfrReport есть метод function ChangePrinter(OldIndex, NewIndex: Integer): Boolean;
  • отредактировано March 2005
    И при этом после печати отчета принтер "по-умолчанию" останется тем же, что и был до печати? И зачем тогда нужен OldIndex?
  • отредактировано 23:56
    Попробуйте ;)
  • отредактировано 23:56
    Зачем нужен OldIndex? Зачем лишние вычисления?

    Наиболее оптимально использовать {fr_class.pas}
    procedure SetPrinterTo(PrnName: string);

    - но она в private.
  • отредактировано March 2005
    Вот фрагмент текста:

    FPrinterIndex := 1; //принтер с PrinterIndex=1 существует в системе, но он не default
    with frReport do
    begin
    ShowPrintDialog := False;
    ChangePrinter( Printer.PrinterIndex, FPrinterIndex );
    if PrepareReport then
    ShowPreparedReport;
    end;

    Используется стандартный превью. При попытке послать отчет на печать генерится исключение "Printer selected is not valid"

    Однако если сделать принтер с PrinterIndex принтером по-умолчанию, то ошибки печати не происходит.

    Как разработчик может объяснить сей феномен? Очень прошу помочь, 3-й день головой об стену!!! Как все-таки правильно переключить принтер НЕ ВЫЗЫВАЯ ДИАЛОГ ВЫБОРА ПРИНТЕРА???
  • отредактировано 23:56
    Есть подозрение, что если ты и в окне выбора принтера поменяешь дефолтовый на тот, который тебе нужен, сгенерится то же самое исключение. Проверь.
  • отредактировано 23:56
    Проверил. У меня перед печатью отчета есть фишка - опционально перед печатью отчета включаю или отключаю диалог выбора принтера.
    При включенном диалоге (frReport.ShowPrintDialog := True) выдается собственно сей диалог (предварительно выбранный принтер в этом диалоге уже стоит по-умолчанию), после чего отчет улетает куда надо.
    При выключенном диалоге выдается "Printer selected is not valid" (принтер опять-таки предварительно выбран нужный).

    Есть огромное подозрение, что фастрепорт каким-то чудесным образом перестал перед печатью отчета получать свойства девайса под названием "принтер". Подозрения усилены вот этими фрагментами (выделено курсивом):

    {fr_class.pas}
    procedure TfrReport.PrintPreparedReportDlg;
    begin
    <...>
    if not FShowPrintDialog or (ShowModal = mrOk) then
    begin
    { if Printer.PrinterIndex <> ind then
    if CanRebuild then
    if ChangePrinter(ind, Printer.PrinterIndex) then
    PrepareReport
    else
    begin
    Free;
    Exit;
    end;}

    end;
    <...>
    end;

    С чего бы комментарить рабочую конструкцию?

    {fr_view.pas}
    procedure TfrPreviewForm.PrintBtnClick(Sender: TObject);
    begin
    <...>
    if not TfrReport(Doc).ShowPrintDialog or (ShowModal = mrOk) then
    begin
    if CurReport.RebuildPrinter then
    if Printer.PrinterIndex <> ind then
    if TfrReport(Doc).CanRebuild then
    if TfrReport(Doc).ChangePrinter(ind, Printer.PrinterIndex) then
    begin
    TfrEMFPages(EMFPages).Free;
    EMFPages := nil;
    TfrReport(Doc).PrepareReport;
    Connect(Doc);
    end
    else
    <...>
    end;

    Я имел полную работоспособность своей задумки на версии 2.44, как раз модифицировав в этих местах исходный код очень похожим образом.
    В версии 2.54 очень надеюсь получить тот же вариант без модификации кода, чтобы иметь наследственность версий.
  • отредактировано 23:56
    У тебя RebuildPrinter True?
  • отредактировано 23:56
    object frReport: TfrReport
    Dataset = frDBDataSet
    DefaultCollate = True
    DefaultCopies = 1
    InitialZoom = pzDefault
    MDIPreview = False
    ModalPreview = True
    ModifyPrepared = True
    ////Preview = nil
    PreviewButtons = [pbZoom, pbLoad, pbSave, pbPrint, pbFind, pbHelp, pbExit]
    PrintIfEmpty = True
    RebuildPrinter = True
    ReportType = rtSimple
    ShowPrintDialog = True //Этот параметр опционален
    ShowProgress = True
    StoreInDFM = False //загружается из файла (LoadFromFile)
    Tag = 0
    Title = '' //перед печатью присваивается название отчета
    UseDefaultDatasetName = False;
    end
  • отредактировано 23:56
    Да-с....
    Похоже RTFM.
    Спотыкач происходил на Pinter.BeginDoc - FR ни при чем.
    Выяснилось, что "дурит" один из принтеров - hp 1000. Похоже, что драйвера с его "родного" CD нуждаются в патче
  • отредактировано 23:56
    isumen написал:
    Спотыкач происходил на Pinter.BeginDoc - FR ни при чем.
    Выяснилось, что "дурит" один из принтеров - hp 1000. Похоже, что драйвера с его "родного" CD нуждаются в патче
    Не факт. Это очень известная и распространенная трабла (это даже занесено в FAQ - вопрос №1), причем о многими принтерами, и я бы не сказал, что вины FR тут нет никакой.
    Можешь поискать по форуму топики на эту тему, в Faq'e приведено одно из возможных решений этой проблемы.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.