Управление принтером для вывода отчета
Версия 2.54
Ура, в версии 2.5x наконец появилось свойство ShowPrintDialog!
Как можно направить отчет на один из заранее выбранных принтеров, при ShowPrintDialog = False и без установки этого притера "по-умолчанию"? Например, если известен его PrinterIndex, полученный стандартным TPrintDialog?
Ура, в версии 2.5x наконец появилось свойство ShowPrintDialog!
Как можно направить отчет на один из заранее выбранных принтеров, при ShowPrintDialog = False и без установки этого притера "по-умолчанию"? Например, если известен его PrinterIndex, полученный стандартным TPrintDialog?
Комментарии
Наиболее оптимально использовать {fr_class.pas}
procedure SetPrinterTo(PrnName: string);
- но она в private.
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-й день головой об стену!!! Как все-таки правильно переключить принтер НЕ ВЫЗЫВАЯ ДИАЛОГ ВЫБОРА ПРИНТЕРА???
При включенном диалоге (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 очень надеюсь получить тот же вариант без модификации кода, чтобы иметь наследственность версий.
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
Похоже RTFM.
Спотыкач происходил на Pinter.BeginDoc - FR ни при чем.
Выяснилось, что "дурит" один из принтеров - hp 1000. Похоже, что драйвера с его "родного" CD нуждаются в патче
Можешь поискать по форуму топики на эту тему, в Faq'e приведено одно из возможных решений этой проблемы.