Конференция: fido7.ru.delphi.reports
FAQ для конференции fido.ru.delphi.reports, основано на FAQ от QUSoft AS
Временный управляющий данного FAQ Анатолий Подгорецкий (anatoly@podgoretsky.com), разыскивается постоянный управляющий, который в состоянии вести это FAQ делать периодический постинг в конференцию и обновлять по мере необходимости.
Copyright 2000 Qusoft AS
Copyright (C) Anatoly Podgoretsky, 2001
Пожалуйста, воздержитесь от задавания вопросов, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации.
Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом.
Не указание же заголовка вообще может вызвать законный вопрос "ТЫ МЕНЯ УВАЖАЕШЬ", так здесь явное неуважение к читателям конференции, не хватило даже сил на написание заголовка, то какое право на получение ответа, лень написать заголовок, так остальным будет лень отвечать.
* обсуждение вопросов, не относящихся к отчетам, для этого специально существует другие конференции. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.REPORTS, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации.
* обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций.
* обсуждение тем, не связанных с собственно отчетами - алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc.
* общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему.
Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.REPORTS. Вы можете поучаствовать в составлении документа, прислав по адресу anatoly@podgoretsky.com сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер.
Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации?
Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт?
Свежая версия этого документа находится на домашней странице автора http://posgoresky.com (доступны исходные тексты движка, движок FaqMaker.exe и последними версиями баз).
Альтернативное хранилище расположено по http://fido7faq.delphiplus.org, более быстрый хостинг, но информация может быть менее актуальной.
Остерегайтесь подделок.
Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию.
Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном FAQ. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого FAQ. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора.
Инфорамация на домашних странихах производителей конкретного генератора отчетов. Для Quick Repopt - http://www.qusoft.com
Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi.
Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне.
Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области.
Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания.
Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на http://www.sysinternals.com. Hа http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса.
Если же вы из Интернета, то поисковые машины, такие как http://www.altavista.com, http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп http://www.dejanews.com, станут вашими лучшими помощниками.
FAQ по Fast Report можно взять по следующему адресу http://www.fastreport.ru/ru/faq.php
1. QuickReport 3 Tutorial in Adobe Acrobat format. (21.09.2001)
http://www.qusoft.com/getfile.asp?level=0&Filename=QR3TUT.PDF
2. QuickReport 3 Tutorial in Word 97 format.
http://www.qusoft.com/getfile.asp?level=0&Filename=QR3TUTORIAL.ZIP
3. Quick Report 2.0 на русском
http://www.podgoretsky.com/ftp/Docs/Delphi/DX//qr2rus.zip
4. Создание отчетов с помощью QuickReport 3
http://www.podgoretsky.com/ftp/Docs/Delphi/DX/qr3rus.zip
5. П.В.Шумаков. Delphi3 и разработка приложений баз данных.," олидж",М.,1998.
Гл.14 (12 параграфов) "Введение в построение отчётов".
6. Елманова. Создание отчётов., "Компьютерпресс"., 9'1997.
7. Генератор отчетов FastReport v2.4 Руководство разработчика
fr24rus.chm (790 кб)
http://www.fastreport.ru/rus/ (русская версия),
http://www.fast-report.com (английская версия).
Новые книги можно искать и заказывать через Интернет на сайте http://books.ru
Там же как правило есть аннотация.
Вы можете создать секцию вызвав конструктор и назначив свойства
with TQRGroup.Create(Self) do
begin
Parent := QuickRep1;
Master := Parent;
Expression := 'CustNo';
end;
with TQRDBText.Create(Self) do
begin
Parent := QRGroup1;
Dataset := QuickRep1.Dataset;
DataField := 'CustNo';
end
При попытке вызова AddPrintable в обработчике beforeprint конкретной секции приводит к возникновению ошибки GPF (или Access Violation).
Вы можете вызывать AddPrintable к секции только до запуска отчета. QuickReport нужно знать все обо всех printable конмонентах до запуска отчета.
Ширина всех полей расчитывается на основе буквы 'X' умноженной на количество из свойство DisplayWidth. Растояние между полями устанавливается в значение 10. Если вы измените значение свойства DisplayWidth, то это отразится в отчете.
Пример:
QRCreateList(aReport, Self, tbCountry, 'Test Listing', SomeFields);
// Now reduce the spacing between each field by 5 (nIdx declared as integer)
for nIdx := 0 to aReport.Bands.ColumnHeaderBand.ControlCount -1 do
if aReport.Bands.ColumnHeaderBand.Controls[nIdx] is TQRPrintable then
with TQRPrintable(aReport.Bands.ColumnHeaderBand.Controls[nIdx]) do
Left := Left - (5 * nIdx);
for nIdx := 0 to aReport.Bands.DetailBand.ControlCount -1 do
if aReport.Bands.DetailBand.Controls[nIdx] is TQRPrintable then
with TQRPrintable(aReport.Bands.DetailBand.Controls[nIdx]) do
Left := Left - (5 * nIdx);
Секции с установленным свойством AlignToBottom должны быть фиксированной длины, вы не можете изменять их размер. QuickReport должен знать высоту секции, чтобы он мог напечатать внизу страницы
Я использую многоколоночный отчет с Column Header band. Column Header band не печатается для первой колонки.
QRStringsBand не может быть использован с другими секциями, поэтому он не работает так как вы желаете. ColumnHeaderBand был разработан для работы с Detail секциями и печать не корректно синхронизируется с QRStringsBand.
Единственным решением является использование обработчика OnNeedData вместо QRStringsBand.
Позиция печати текущей секции определяется свойством CurrentY. Это свойство типа integer и единица измерения 1/10 mm, (254 = составляет 1 дюйм)
При генерации отчета данное свойство обновляется автоматически, но вы можете переопределить его значение в обработчике BeforePrint.
Вы можете иметь только одну секцию типа TitleBand на весь отчет, но вы можете добавить несколько секций типа ChildBand и уже управлять ими.
Вопрос: На секции Detail располодены три компоненты QRLabels с установленным свойством AutoStretch каждая, когда секция переходит на другой лист, то я имею QRLabel 1 на первом листе, а остальные на следующем листе. Есть ли возможность печатать все три метки на одном листе?
Нет, это ограничение QuickReport. Когда секция печатается, то она начинается с размера по умолчанию и печатет каждый компонент друг за другом. Если компонент может расширяться, то он расширяется до тех пор пока не будет отпечатан весь текст. Если при этом произойдет переход на другой лист, то будет произведена печать того, что уже есть на нем в данный момент. При трех компонентах мы не можем печатать все из них в одно и то же время.
Вы имеете несколько возможностей обойти это. Вы может печатать текст строка за строкой, вы можете использовать три секции типа subdetail с тремя отдельными компонентами. Вы можете использовать обработчик OnNeedData в цикле лоя печати каждой строки. Если секция меньше по высоте, чем размер листа, то вы можете запустить печать в два прохода и запоминать расчитанную высоту на первом проходе, затем использовать ее на втором проходе для установки вручную размера на втором проходе. Имеется пример на нашем сайте, котрый демонстрирует код для подобной печати, имя QR3LSD4.ZIP
Другая возможность - это разместить данные на отдельном компоненте RichEdit и разделять данные с помощью табуляции.
Порядок секций определяется типом секции. свойством master и порядком создания секций. Если свойство master пустое, то секция помещается в конец отчета. Если секция subdetail принадлежит секции detail, то свойство master должно быть назначено отчету. Если секция принадлежит какой нибудь другой секции, то следует установить свойство master данной секции.
Вопрос: Я добавляю новую чекцию типа subdetail в отчет где уже есть такие секции, как я могу разместить эту секцию над одной из уже существующих?
Если вы пытаетесь добавить секцию перед другой, которая уже имеет установленное свойство master, то безопасный путь это прсмотр форму как текст и вырезания и вставки новой секцие в место перед нужной. Порядок секций определяется типом секции. свойством master и порядком создания секций
Когда обрабатываеся событие BeforePrint секции GroupHeader (или Detail) отчет еще находится на предыдущей странице, в данный момент проверяется может ли секция поместиться на текущем листе или нет, Если не может то создается новая страница и генерируется событие BeforePrint секции PageHeader
Наиболее простой путь это добавить секцию childband к секции detailband. В обработчика события BeforePrint секции ChildBand устанавливать переменную PrintBand после печати каждых пяти строк отчета.
Пример:
procedure TfrmBands.ChildBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
PrintBand := (TQuickRep(Sender.Parent).RecordNumber mod 5) = 0;
end;
Вы должны иметь хотя бы одну строку в detail
Печать секций фиксирована и вы не можете печатать Title выше секции PageHeader.
Можно это обойти следующим образом, создайте секцию ChildBand с заголовком страницы а информацию Title разместите на подлинной секции PageHeader, затем в обработчике события OnPrint секции PageHeader установите свойство PrintBand в false когда PageNumber > 1
Секция ColumnBands всегда печатается сразу за секциями Title и PageHeader. Есть несколько путей получить желаемое. Например вы можете разместить заголовки в секции GroupBand или ChildBand присоединенной к GroupBand.
Вместо использования секции FooterBand используйте секцию SummaryBand и установите свойство AlignToBottom property.
Как я могу обеспечить печать не расширяемого текста на первой странице, если моя секцция разделяется на две страницы?
Если вы имеете в одной секции расширяемы и не расширяемый текст, то позпотьтесь о том, что бы не расширяемый текст печатался первым. (правый щелчок мышкой и выбрать пункт 'send to back')
Установите PrintBand в false в обработчике BeforePrint. Это запретит печать, но расчет будет произведен.
(QR3) Примечание:
Данное поведение изменено в QuickReport 3. Для эмуляции поведения Quick Report 2, вместо установки PrintBand в false, установите высоту секции в 0
Установить свойство HasChild в true. Следующий пример создает секцию ChildBand и добавляет компонент секцию ChildBand на ней.
QRGroup1.HasChild := true;
with TQRLabel(QRGRoup1.ChildBand.AddPrintable(TQRLabel)) do
begin
Left := 0;
Top := 0;
Caption := 'Hello there';
end;
Все секции наследники от TCustomPanel и вы можете использовать свойство ControlCount в цикле для прохода по всем компонентам.
Пример:
with PageHeaderBand1 do
for nIdx := 0 to ControlCount -1 do
if Controls[nIdx] is TQRLabel then
TQRLabel(Controls[nIdx]).Caption := IntToStr(nIdx);
Это доступно только в версии 3.0
Вы не можете иметь несколько секций типа PageHeader в отчете, но есть несколько путей обойти это. Наиболее простой простой путь это добавить секцию ChildBand к секции PageHeader и разместить на ней необходимые компоненты. Затем использовать обработчик события BeforePrint и решать в run time какую из секций печатать.
Мы не поставляем barcode компонент с нашим генераторомl, но на нащей странице загрузки есть ссылки не компаниии, которые производят barcode компоненты для QuickReport.
Есть много компаний, которые делают barcode шрифты, вот некоторые из них:
CIA (Bar Codes), Wythenshawe, Manchester, UK - http://ourworld.compuserve.com/homepages/CIA_UK
Rivers Edge, Cedar Park, TX, USA - http://www.riversedge.com
Azalea, Seattle, WA, USA - http://www.azalea.com
Такие Previews могут быть сделаны в версии QuickReport 3.
На нашей странице загрузки есть QR3 MDI демо-пример.
Фильтры экспорта не поддержины для композитных отччетов. Единственная возможноть это генерировать каждый отчет отдельно.
Что бы печать каждый отчет в композитном отчете с новой страницы вы должны иметь
TitleBand и в обработчике секции события BeforePrint вызвать метод NewPage
В одном из моих композитном отчете есть одновременно отчет с ориентацией Landscape и другой Portrait. Оба отчета печатаются в ориентацие Portrait
Вы не можете смешивать два отчета с разной ориентацией в одном композитном отчете.
Установите свойство Enhanced компоненты TQRWMFFilter в true и вместо WMF будет создан EMF файл.
Для WMF фильтра поддержан только экспорт простых текстовых полей
Вы должны предварительно создать отчет. Затем с помощью методда qrprinter.save можно сохранить его в файл.
Пример:
quickrep1.Prepare;
quickrep1.qrprinter.Save('c:\report.qrp');
quickrep1.qrprinter.Free;
quickrep1.qrprinter := nil;
Результатом умножение числа с плавающей запятой на целочисленное является целое. Но если сменить 15 на 15.0 то результат будет с плавающей запятой.
Вы должны установить свойство ResetAfterPrint в true для соответствующего компонента TQRExpr, который используется в GroupFooter.
Это оболочка вокруг функии FormatFloat.
Свойство "Value" компоненты TQRExpr является типом TQREvResult, который определен в модуле qrprntr.pas. Вы можете проверить "Value.Kind" для определения типа результата.
Следующая таблица показывает как определить тип результата на основании значения "Value.Kind"
If Value.Kind = resInt значение = Value.IntResult
If Value.Kind = resDouble значение = Value.DblResult
If Value.Kind = resString значение = Value.StrResult (string[255])
If Value.Kind = resBool значение = Value.BooResult
If Value.Kind = resError значение = error
Разрешенные типы следующие:
longint, double, string[255] и boolean.
Поля Currency как double.
Поля Date и time как строка.
Отчет создается в TMetafile перед прсмотром. В зависимости от значения коэффициента маштабирования (zoom), TMetafile может не показать некоторые линии. Если увеличить коеффициент то строки появятся.
Добавьте TQRBand, установите его тип в groupfooter и свяжите с rbGroupFooter. Затем вы должны связать его с TQRGroup секций с помощью свойства footerband. Новая секция будет печататься по окончанию группы.
Надо проверить следующие вещи.
Проверьте, что свойство subdetail's dataset указывает на правильный dataset.
Проверьте, что dataset секции subdetail связан с отчетом (master).
Для TTables, это делается через свойства MasterSource и MasterFields. Для TQuery с помощью свойства Params.
Также проверьте свойство DisableControls master dataset.
QuickReport использует порядок сохдания секций для печати в runtime. Вы можете сменить этот порядок с помощью методов SendToFront и SendToBack.
Проверьте, что свойство Master компоненты QRExpr установлено на SubDetail.
Объект report имеет функции TextWidth и TextHeight, котрые вы модете вызвать в событии OnNeedData event.
Мы нашли, что портирования отчета из версии в версию Дельфи более проблематично если отчет не используется на форме. Кроме того расположение отчета на форме имеет также и другие преимущества, вы можете использовать событие формы Create/Destroy для выполнения дополнительной работы.
Если вы не используете runtime пакеты (такие как qrpt40.bpl), то никаких.
Это известная проблема и мы работаем над ней. Для борьбы можно использовать вызов Application.ProcessMessages между каждым Preview. Это позволяет корректно завершаться перед каждым стартом.
Вы не должны закрывать или освобождать dataset отчета в этом обработчике. Вы можете делать это только по окончанию вызова Preview.
Данная возможность не существует в QuickReport 3, но это планируется включить в QuickReport 5.
QuickReport не имеет возможности создавать crosstab (aka pivot table) отчеты, но мы имеем примеры на нашей странице загрузки, которые демонстрируютдва метода создания crosstab отчетов. Файл crosstab.zip содержит пример создания отчета с помощью массивов. Файл CUBE_RPT.ZIP содержит пример создания отчета с помощью Decision Cube.
Не указывайте DataSet в свойстве отчета и установите свойство PrintIfEmpty в True.
Свойство Stretch неприменимо к иконкам. Это документировано в справке Delphi's для свойства stretch компоненты TImage (наследуется QRImage)
Правым щелчком мышки по QRShape и выбрать пункт print to back что бы это печаталось первым
Известная проблема изменение толщины компонент Shape между preview и принтером. Решение сделать свойство Shape.Pen.Width переменным и менять значение в зависимости печать или просмотр. В обработчие отчета BeforePrint, вы можете проверять занчение свойства QRPrinter.Destination. Если оно установлено в qrdMetafile, то это просмотр, а если qrdPrinter, то это печать.
Я потерял много времени пытаясь перенести приложение разработанное для Delphi 3 (QuickReport Pro 3) в Delphi 5. Проблем в том, что многие QR модули выдают ошибку что модуль был 'compiled with a different version of . . .'. Как исправить?
Мы имеем версию 3.0.5, специально откомпилированную для Delphi 5, вы не можете использовать набор файлов из Delphi 3. Вы также жолжны проверить, что файлы проекта не размещены в некоторых каталогах Delphi 3.
Есть небольшая freeware программа для инсталляции хелп файлов Delphi, называется 'HelpLinker'. HelpLinker был разработан компанией Scoutship Software. Вы можете загрузить ее с http://www.scoutship.com/helplinker.htm
Во время инсталляции создается файл install.log в каталоге delphi.
Мы не используем патч файлы. Каждая версия это полностью законченый набор QuickReport Pro. Поэтому нет необходимости применять патчи при инсталляции или апгрейде. Для Delphi 4, требуется предварительно установленый Update Pack 2 (или новееr). Для инствлляции QuickReport 3 Pro, вы должны закрыть Delphi и любые приложения, которые используют Delphi runtime пакеты. Если вы используете некоторые пакеты третьих сторон, которые используют QuickReport, вы должны удалить их до инсталляцииQuickReport 3 Pro. После инсталляции QuickReport 3 Pro, вы можете перестроить эти пакеты, что бы они могли использовать обновленные файлы QuickReport (Ознакомьтесь с процедурами инсталляции этих пакетов по сопутствующей документации). После закрытия Delphi, просто запустите инсталляцию. Будет выдано предупреждение насчет удаления TeeChart и Decision Cube и затем будет выполнена инсталляция QuickReport 3 Pro package.
Удалите файл qrpt30.dpl из папки delphi 3.0\bin directory.
Если щелкнуть правой кнопкой мышки по QuickReport компоненте, то первая строка Popup меню показывает номер версии.
Ширина колонок определяется шириной листа деленое на количеством колонок, затем вычитается значение свойства report.page.columnwidth value. Так что вы не можете устанавливать ширину напрямую.
Вы можете устанавливать свойство QRPrinter.Progress в обработчике OnNeedData. Значение должно быть в диапазоне от 1 до 100.
Пример
QuickRep1.QRPrinter.Progress := (Longint(CurrentIndex) * 100) div MyTotalCount;
После определения данного обработчика, он будет вызываться для определения необходимости печатать новую секцию Detail. Если устанавливать свойство MoreData в TRUE то секция будет печататься. И при установке этого свойства в FALSE то печать отчета будет закончена.
На нашем сайте есть пример QR3DEMO, который демонстрирует это.
QuickReport был разработан для работы с BDE источниками данных, но вы можете использовать для печати с данными от других источников, через OnNeedData союытие.
На нашем сайте есть пример QR3DEMO, который демонстрирует это.
Если Quickreport.Page.TopMargin меньше чем Top у Quickreport, то отчет не печатается. Пользователю выдается сообщение, что Quickreport is out of printable range
Данная ошибка будет исправлена в будущих версиях
Следующий пример показывает как определить размер бумаги по умолчанию для выбранного принтера.
with TQRPrinter.Create do
begin
PrinterIndex := QuickRep1.PrinterSettings.PrinterIndex;
{ for the default printer use the following line }
PrinterIndex := -1;
QuickRep1.Page.PaperSize := Papersize;
free;
end;
Лучший метод это создать свою собственную форму просмотра. На нашем сайте есть пример.
У некоторых драйверов принтера есть проблемы с печатью полных страниц. Есть несколько установок, которые вы можете попробовать сменить для решения данной проблемы.
Перейдите в диалог настроек драйвера принтера, который вы используете для печати. Затем перейдите на страницу "details page" и выберите "spool settings". Прверьте "Spool Data Format". если вы имеете выбор между "EMF" и "RAW", попробуйте поменять. "EMF" требует меньше памяти, чем "RAW".
Изменение режима графики в "HPGL/2" или "Vector" на "Raster" также может помочь, если драйвер имеет такие установки.
Если драйвер имеет свойство "page protect", то это также может помочь.
Часто помогает смена разрешения на меньшее.
Можно также поппробовать "Disable bi-directional support for this printer". Если свойство "Enable bi-directional support for this printer" установлено или ваш кабельне расчитан для подобного режима, то вы можете иметь проблемы при печати.
Другая вещь, на которую надо обратить внимание - это настройки LPT порта в BIOS. Если порт установлен в ECP, то попробовать его в режиме EPP или даже standard.
Другая возможноть может состоять в том, что ваш принтер не полностью совместим со стандартом IEEE и вам требуется его замена.
Следующий совет был взят из сайта HP страница поддержки, так что используйте его на свой риск.
Windows NT 4.0 имеет возможность управлять доступом к десткому диску с помощью NTFS. Данная возможность не доступна, если в качестве файловой системы используется FAT. Когда стандартные разрешения изменябтся для блокировки системы, пользователь может иметь сложности с доступом к принтеру. Обычно системный администратор может печатать на принтер без проблем. но когда пользователь входит в систему и пытается печатать, то появляется сообщение об ошибке. Это происходит потому что пользователь не имеет достаточных прав для доступа к файлам для выполнения операция печати. Системный администратор жолжет изменить права пользователя.
Ниже описываются необходимые шаги по смене системных установок
1. Выбрать Start, Settings, затем Printers.
2. В папке Printers, правый щелчок по соответствующей иконке принтера
3. Проверить, что свойство Default printer отмечено и выбрать пункт Properties.
4. Выбрать закладку Securities, и затем Permissions в окне Permissions.
5. Установить следующие права.
a. Administrators--Full Control
b. CREATOR OWNER--Manage Documents
c. Everyone--Manage Documents
d. Power Users--Manage Documents
Если при установке верхнего отступа в 4mm, происходит печать только первой страницы, то можно попробовать сменить драйвер на HP6, это происходит потому, что родной драйвер не в состоянии обрабатывать такой отступ.
Это ошибка не QuickReport, а ошибка вVCL. Если вы посмотрите исходные тексты, то увидите, что мы определяем ReportTitle как string. Затем это передается в свойство TQRPrinter.Title, которое также определено как . Свойство TPrinter.Title затем используется в TPrinter.BeginDoc где оно присваивается CTitle, которое является массивом в 32 байта.
Вопрос: Мы пробуем печатать отчет в текстовом режиме (TEXT mode) на матричный принтер. При использовании дравера "Generic/Text Only printer" это работает, но печатает только первые 80 символов каждой строки. Как можно печатать все символы?
Это нормальное поведение для "Generic/Text Only printer driver". он обрезает символы по ширине строки. Можно попробовать указать использование бумаги более широкого размера, например Ledger, возможно тогда удастся напечатать все символы строки.
Так как используется печать через драйвер печати Windows (TPrinter иd TQRPrinter), то отсутствует возможность запретить выброс бумаги по окнчанию печати листа или задания. Данное поведение было сделано MS, по вполне хорошим причинам. Система должна обеспечивать печать паралельных заданий и поэтому каждое задание начинает печать на новой странице.
А вы назначили свойство ReportTitle отчета? Это свойство используется для передачи заголовка в задание на печать.
Ghjdthm cdjqcndj Font.Pitch. Если вы выбрали шрифт Arial, а свойство установлено в fpFixed, то Windows пытается подставить наиболее подходящий шрифт.
Проверьте свойства PrinterSettings.FirstPage и PrinterSettings.LastPage, убедитесь, что они установлены в 0. При печати дмапазона страниц из просмотра во время design time эти два поля могут быть установлены в те значения которые вы выбрали в диалоге установок принтера.
От А.П. - препаршивейшая ошибка, как то пришлось потратить много времени на ее поиск, а все дело оказалось в том что диалог печати меняет эти свойства в отчете, попробуй догадайся. :-)
Вы должны установить свойство PrinterSettings.Copies в нужное значение. Следует заметить, что не все принтеры поддерживают данное свойство.
Другим методом получения нескольких копий отчета является использование метода prepare.
Вместо:
with TfrmQR.Create(Application) do
begin
QuickRep1.Print;
free;
end;
Делайте так:
with TfrmQR.Create(Application) do
begin
QuickRep1.Prepare;
QuickRep1.QRPrinter.Print; { print first copy }
QuickRep1.QRPrinter.Print; { print second copy }
QuickRep1.QRPrinter.Free;
QuickRep1.QRPrinter := nil;
free;
end;
Данный метод генерирует отчет во внутренний metafile и затем дважды посылает его на принтер.
Эта ощибка возникает если в принтере установлено недостаточное количество памяти. Можно попытаться уменьшить разрешение.
Эта ощибка возникает если в принтере установлено недостаточное количество памяти. Можно попытаться уменьшить разрешение.
Это специальная секция, которая ен подсоединена ни к какому набору данных и которая печатаеся столько раз, сколько указанов свойстве PrintCount.
Какая у вас версия comctl32.dll? Preview использует TToolbar и если он не показывает рисунки из imagelist, то это означает, что у вас старая верси. TToolbar был откомпилирован для версии 4.72. У вас есть несколько возможностей. Вы можете обновить comctl32.dll, иои Вы можете перекомпилировать QR со старой версией comctl32.dll (не рекомендуется), модифицируйте стандартный диалог для просмотра, что бы он не использовал TToolbar, или используйте свой собственный диалог для просмотра, который также должен не использовать TToolbarl. Мы имеем пример построения собственного диалога для просмотра, который вы можете загрузить с нашего спйта, в QR3 Вы можете сменить просмотр на глобальной основе. На нашей странице загрузки также есть пример MDI демо, котрый показывает как это сделать.
Delphi 4 требется (и инсталируется версия 4.72) Вы можете загрузить ее напрямую с микрософтовского сайта, URL следующий http://msdn.microsoft.com/developer/downloads/files/40comupd.htm. Если Вы получите при этом сообщение что ссылка недействительна, то Вы можете загрузить ее с ftp://ftp.microsoft.com/softlib/mslfiles/40comupd.exe
Если Вы используете NT 4, проверьте, что Вы уже установили SP 4 или старше, прежде чем инсталлировать.
Класс TQRDetailLink это объект из QuickReport. QuickReport 2 имел частичную поддержку данного контрола и это интрепритировалось как синоним TQRSubDetail. QuickReport 3 больше не имеет такой поддержки. Вы можете сменить TQRDetailLink на TQRSubDetail, и ваш отчет ьудет вести себя подобно отчету в QR2. Компонент TQRDBCalc из QR1 также будет иметь подобную ошибку, его можно заменить компонентом TQRExpr.
Мы переместили классы Expression в новый модуль - qrexpr. Вы должны добавить этот модуль в Uses и перекомпилировать отчет.
Добавьте qrexpr в uses.
Не компилируется ReportForm.ExportToFilter(TQRHTMLExportFilter.Create(AttachmentFile));
Мы сменили имя. Следующий код должен работать
ReportForm.ExportToFilter(TQRHTMLDocumentFilter.Create('c:\report.htm'));
Это наследник TCustomQuickRep базовый класс, который не использует TDataset. Если ваше приложение не использует базы данных, то это позволит уменьшить назмер кода.
Это базовый класс от которого наследуются остальные. Данное изменение сделано для того сто бы упростить использование различных компонентQuickReport.
Данная возможность еще не закончена и поэтому запрещена до момента исправления.
Эта секция имеет свойство items для состроения списка строк. Ее имя появляется в построителе выражений и может быть назначено компонете TQRExpr. При печати секция печатается столько раз, сколько есть строк в свойстве items.
Просто киньте их на форму в вашем проекте и Вы увидите их в диалоге просмотра.
Это свойство позволяет связать две секции, что бы они не разрывались при переносе на другой лист. Следующая секция так же может привязать к себе третью и так далее. Это позволяет иметь серию секций на одном листе без переноса на другой. На нашем сайте на странице зан=грузки есть демонстрационный проект QR3LSD4.ZIP, котрый показывает как связать несколько секций.
Qr3 имеет несколько функций для облегчения данной задачи.
#1 Создайте отчет с использованием TQuickAbstractRep вместо TQuickRep. Компонет TQuickAbstractRep не использует не использует компонент доступа к базам данных и позволяет уменьшить размер исполняемого файла.
#2 Добавьте компонент TQRStringsBand в отчет. Это секция имеет свойство items для построения списка строк.
#3 Добавьте компонент TQRExpr на секцию. Установите следующие свойства:
Autosize - False
AutoStretch - True
Expression - с именем секции (например 'QRStringsBand1')
Width - ширина секции (модно установить в runtime)
#4 Перед вызовом Print или Preview, загрузите текстовый файл в свойство items компоненты TQRStringsBand например так:
QRStringsBand1.Items.LoadFromFile(SomeFileName)
#5 Вызовите метод preview или print.
Q. How can I copy the text from a TRichEdit component to the QuickReport RichText component?
A. You would use the lines property to copy the data. Example: QRRichText1.Lines := frm.RichEdit1.Lines;
------------------
Эта проблема появляется когда TQuery's не имеет persistent полей. Добавление постоянных полей устраняет ошибку. Если Вы не можете делать это, то вставьте в TQRDBRichText.Print метод в qrctrls.pas:
procedure TQRDBRichText.Print(OfsX, OfsY : integer);
begin
Field := FDataSet.FindField(FDataField); { Add this line }
if assigned(Field) then
if (Field is TMemoField) or
(Field is TBlobField) then
Lines.Assign(Field);
inherited Print(OfsX,OfsY);
end;
У Микрософта имеется много ошибок в реализации RichTextl. Насколько возможно мы постарались их обойти. В данный момент мы еще работает над данной проблемой.
Это известная проблема с MS RichText. Имеются два метода для преодоления. Первый это добавить одну пустую строку. Второй - это в событии OnGenerateToPrint установить qrprinter в nil. Это заставит отчет перерисоваться повторно.
Пример:
procedure Tfrmqr.QuickRep1BeforePrint(Sender: TQuickRep; var PrintReport: boolean);
begin
QuickRep1.qrprinter.OnGenerateToPrinter := nil;
end;
Если в дизайн тайм высота QRDBRichText больше чем высота других полей, то возможно неверное расширение. Если вы установите высоту в малое щначение, например в 10 и разрешите autostretch, то возможно это поможет.
TRichEdit и TDBRichEdit не поддерживают встроеные объекты и поскольку наши RTF компоненты основаны на Borland RTF компонентах, то тоже ограничение распространяются и на нас.
Мы имеем несколько компонент для QuickReport 3, которые основаны на RichEdit 2 копнонентах третьих сторон. Смотрите примечание об QR 3 на нашем сайте, http://www.qusoft.com/relnotesqr3.htm
Сохранение в текстовый файл возможно с помощью фильтров экспорта и работает только для отчетов. При использовании объекта QRPrinter напрямую, единственная возможность это сохранение только в .QRP файл.
При сохранении используется подмножество формата metafile, который пригоден только для QuickReport.
Установите свойство отчета Font.Charset в ту кодировку которую вы желаете использовать и свойство ParentFont всех компонент в TRUE всех секций, до помещения на них компонент.
Вопрос: Измение размера шрифта отражается на высоту компонента только в сторону увеличения. При изменении в меньшую сторону высота не корректируется. Почему и как получить нужное поведение?
Мы ловим сообщение CM_FONTCHANGED для TQRCustomLabel компонент. Когда Вы изменяете размер шрифта, то вызывается процедура CMFontChanged. Эта процедура сообщает компоненту переформатировать текст и изменить размер если необходимо. Когда Вы изменяете размер в меньшую сторону высота компонента не изменяется. Для принуждения компонента к изменениб высоты Вы должны установить высоту компонента в 0 до смены размра шрифта.
Это ограничение компоненты TQRDBText. В место TQRDBText используйте компонент TQRExpr и в обработчике OnPrint проверяйте поле с помощью свойства IsNull.
Проверьте, что вы установили autosize в FALSE и AutoStretch и WordWrap в TRUE.
Не является ли свойство caption пустым? Код проверяет свойство caption и если оно ничего не содержит, то событие OnPrint не генерируется. Если вам обязательно нужно данное событие, то Вы обязаны присвоить какое либо значение свойству Caption.
QuickReport's RichText использует Delphs RichEdit компонент, котрый обернут вокруг Microsoft RichEdit. И возможно, что данный орган не в состоянии обработать ваш файл. Почти все проблемы в RTF связаны с ошибками в Микрософтовском RichEdit.
Свойство Mask применимо только к цифровым полям и игнорируется для текстовых полей. Используйте обработчик события OnPrint и форматируйте поле нужным образом.
Пример:
procedure TfrmReport.QRDBTextPhonePrint(sender: TObject; var Value: string);
begin
Value := '(' + copy(Value,1,3) + ') ' + copy(Value,4,3) + '-' + copy(Value,7,4);
end;
Используйте QRExpr компонент, который позволяет иметь пустые поля и в выражении используйте функцию IF() для включения пробелов в нулевые поля, как показано в следующем примере.
IF(tbSample.Extra<>'', tbSample.Extra, ' ')
Проверьте, что Вы используете именно цифровые поля, свойство mask игнорируется для текстовых полей.
Мы не имеем поддежки висячих строк (Window/orphan(, но Вы можете сделать это с минимумом кода.
Имеется функция, называемая AvailableSpace, которая возвращает количество оставшего на странице места. Вы можете сравнивать его со значением Size.Length секции и вызывать метод NewPage если места недостаточно для размещения текста. AvailableSpace расположена в защищенной секции (protected) так, что Вы не можете вызвать функцию напрямую. Если используете хак, то Вы сможете добраться до функции с помощью приведения. Во первых добавьте следующее объявление в декларацию формы.
TMyQuickRep = class(TQuickRep)
end;
Для использования напишите следующий текст.
procedure Tfrm.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
if TMyQuickRep(QuickRep1).AvailableSpace >= round(Sender.Size.Length) then
Sender.ParentReport.NewColumn;
end;
Это не является частью QuickReport. В будущих версиях мы сделаем процедуру FormatLines виртуальной, что позволит сделать это с помощью других компонент.
Мы не поддерживем это. В будущих версиях не исключена такая возможность, но это пока не входит в наш список неотложных задач.
Для форматирования editmask используется компонент TMaskedEdit. Компонент QRExpr использует для форматирования FormatFloat() и FormatDateTime функции. Пожалуйста проверь документацию по этим функциям. Для форматирования номеров по американскому стандарту маска должна быть следующей '(000) 000-000'
Более одного расширяемого компонента на секции не поддерживается, это ограничение снято в версии 3.0.
Символы табуляции не поддержаны в TQRMemo, TQRLabel, TQRExpr, TQRDBtext конмпонентах. Единственный компонент, который может корректно их отражать, это RichText.
Q. Is it possible to change the Autosize property of the QRImage and the Autostretch property of the QRRichtext at runtime ?
A. Yes, you can change most of the properties at runtime in the BeforePrint and AfterPrint events of the report and of the band that the controls are on.
------------------
uses
printers;
with TPrinter.Create do
begin
Memo1.Lines.AddStrings(Printers);
Free;
end;
uses
Printers;
{ declare the "PASSTHROUGH" structure }
type TPrnBuffRec = record
BuffLength : word;
Buffer : array [0..255] of char;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Buff : TPrnBuffRec;
TestInt : integer;
s : string;
begin
{ Test to see if the "PASSTHROUGH" escape is supported }
TestInt := PASSTHROUGH;
if Escape(Printer.Handle,
QUERYESCSUPPORT,
sizeof(TestInt),
@TestInt,
nil) > 0 then begin
{ Start the printout }
Printer.BeginDoc;
{ Make a string to passthrough }
s := #13#10' A Test String ';
{ Copy the string to the buffer }
StrPCopy(Buff.Buffer, s);
{ Set the buffer length }
Buff.BuffLength := StrLen(Buff.Buffer);
{ Make the escape}
Escape(Printer.Canvas.Handle,
PASSTHROUGH,
0,
@Buff,
nil);
{ End the printout }
Printer.EndDoc;
end;
end;
FAQ создан с помощью FAQ Maker ver. 1.1
от Анатолия Подгорецкого
Доступен на http:/www.podgoretsky.com или http://podgoretsky.pri.ee
Альтернативный источник FAQ центр