В настоящее время среди инструментов разработки программного обеспечения Delphi стал всемирно признанным инструментом быстрой разработки благодаря множеству элементов управления, мощным возможностям объектно-ориентированного программирования, высокой скорости выполнения кода, а также простоте и удобству использования в сочетании с визуальной средой разработки и самым быстрым компилятором. Инструменты разработки приложений используются все большим количеством программистов. Вы можете использовать Delphi для написания различных приложений Windows, особенно для разработки систем управления информацией баз данных, что имеет свои уникальные преимущества. В процессе разработки системы управления информацией базы данных нам часто приходится распечатывать множество отчетов. Использование Delphi для разработки сложных отчетов — это не такое простое мероприятие, как Visual FoxPRO. Однако, поскольку элементы управления также используются для разработки отчетов в Delphi, мы можем напрямую установить необходимые элементы управления отчетами во время выполнения программы для создания отчетов в реальном времени, а образец сгенерированного отчета может быть определен программным управлением. Например, когда мы запрашиваем информацию из базы данных, структура результирующей информации обычно не фиксирована. Если мы хотим распечатать результаты запроса, недостаточно разработать только один формат отчета. Мы должны разработать его для всей возможной информации о результатах. Форматирование отчета также не является хорошим решением. Чтобы решить такую проблему, мы можем использовать технологию генерации отчетов в реальном времени. Цель этой статьи — на примере подробно представить, как создавать отчеты в реальном времени.
В этом примере будет создано диалоговое окно печати, которое включает элемент управления TQickRep и некоторые элементы управления стилем отчета. Внешний вид других форм показан ниже:
1. Описание функции управления
QuickRep:TQuickRep Он включает в себя заголовок столбца (HB:TQRBand), подробные сведения (DB:TQRBand), нижний колонтитул (FB:TQRBand), сводные полосы (SB:TQRBand), а подробные сведения, нижний колонтитул и сводку не включают TQRLabel , TQREpr. или элемент управления TDBText, которые в основном создаются при выполнении программы. Зона заголовка столбца включает заголовок (TQRLabel) для заголовка отчета; TQRLabel используется для условий запроса. Свойства Caption этих двух элементов управления могут быть изменены произвольно во время выполнения программы. Чтобы QuickRep не отображался, поместите его за Panel1 (Tpanel) и разверните Panel1 на всю форму;
Запрос: управление операторами SQL TQuery. Программа будет генерировать отчеты на основе результатов, возвращаемых запросом. Поэтому при создании этой формы необходимо указать оператор SQL для свойства Query.SQL;
В приведенной выше форме элементы управления, включенные в столбцы «Бумага» и «Параметры страницы», являются элементами управления для свойства QuickRep.Page. Их изменение при выполнении программы напрямую изменит соответствующее значение свойства элемента управления QuickRep. Это может быть так. выполнено с помощью кода события OnChange или OnExit;
Заголовок в столбце «Настройки содержимого печати» — это заголовок указанного отчета (TT:TEdit). Его значение соответствует значениям QuickRep.ReportTitle и Title.Caption и может быть изменено произвольно; следует ли печатать условия запроса. Установленный этот флажок напрямую определяет, является ли QRSQL.Caption пустым; «Выравнивание столбцов таблицы» состоит из набора кнопок выбора. В основном используется для выравнивания подробного содержимого при создании отчетов. изменить переменную управления RD1 (Байт) значение (0 автоматическое выравнивание, 1 выравнивание по центру, 2 выравнивание по левому краю); «Ширина печати столбца таблицы» состоит из набора дополнительных кнопок, в основном используемых для ширины значений столбца при формировании форматов отчета и ее изменения. переменные управления Значение RD2 (байт) (0 автоматическая ширина, 1 «Одинаковая ширина», 2 «Ограничить максимальную ширину»), когда вы выбираете 1 «Одинаковая ширина», 2 «Ограничить максимальную ширину», вам необходимо ввести ширину в пикселях; «Статистический метод» указывает, включает ли отчет нижний колонтитул (FB: TQRBAND) и сумму ( ШБ: TQRBAND) зона.
2. Описание программы
В программе определены следующие типы:
TQRLabelName=массив TQRLabel;
TQRDBTextName=массив TQRDBText;
TQRShapeName=массив TQRShape;
TQREpName=массив TQREppr;
Вышеупомянутый тип представляет собой тип динамического массива, и каждый элемент данных является классом. При создании элементов управления отчетом в реальном времени количество создаваемых элементов управления является неопределенным, а имена элементов управления невозможно определить. Использование динамических массивов является лучшим решением, то есть вы можете произвольно указывать размеры данных без необходимости управлять памятью. самостоятельное распределение. Эта проблема также облегчает выпуск и обработку элементов управления, содержащихся в отчетах. Программа также объявляет переменные вышеуказанных типов следующим образом:
CHBName:TQRLabelName;
Имя БД:TQRDBTextName;
CHBShape,DBShape,FBShape,SumShape:TQRShapeName;
FBName,SumName:TQREPName;
Эти переменные массива будут выделять память на основе результатов поля, возвращаемых запросом при создании формы. Каждое поле соответствует элементу массива.
Процесс выполнения программы: При создании и отображении формы для этой формы устанавливается операция инициализации. Отобразите соответствующее значение свойства QuickRep.Page в событии OnCreate, выполните операцию Query.Open в событии OnShow и выделите пространство переменных массива элементов управления в соответствии с возвращаемым результатом. После создания формы нажмите кнопку «Создать», чтобы создать отчет (игнорируя поле памятки и поле с фотографией), а затем нажмите «Печать» и «Предварительный просмотр», чтобы распечатать или просмотреть отчет. Если настройки изменяются после формирования отчета, отчет необходимо создать заново. Если запрос возвращает слишком много полей набора результатов, размера бумаги может быть недостаточно для создания всех отчетов при создании отчета. Вы можете настроить размер бумаги отчета, а затем создать отчет. При закрытии формы созданные элементы управления освобождаются.
3. Список исходных программ и комментарии.
модуль PrintDlg;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги,
StdCtrls, кнопки, ExtCtrls, Spin, QuickRpt, QRPrntr, принтеры, Qrctrls,
БД, DBTables, ComCtrls, SysIni;
тип
TQRLabelName=массив TQRLabel;//Динамический массив элементов управления заголовком столбца в полосе заголовка столбца
TQRDBTextName=массив TQRDBText; //Динамический массив элементов управления заголовками столбцов на панели подробностей;
TQRShapeName=массив TQRShape; //Динамический массив частей управления линией
TQREpName=массив TQREpr //Динамический массив класса статистического управления;
TPrintForm = класс (TForm)
ГрупповойБокс1: ТГрупповойБокс;
Метка5: TLabel;
BtnSet: TbitBtn;//Управление кнопкой "Настройки"
BtnCancel: TBitBtn; // Управление кнопкой "Закрыть"
Панель1: ТПанель;
BtnPrint: TBitBtn; // управление кнопкой «Печать»
BtnPrview: TBitBtn; // кнопка «Предварительный просмотр»
QuickRep: TQuickRep // Быстрое управление отчетом;
HB: TQRBand // элемент управления бэндом "Заголовок столбца"
Заголовок: TQRLabel;//Управление заголовком отчета
QRE1: TQRExpr;//Управление «Номер страницы» в полосе заголовка столбца
QRE2: TQREppr;//Управление «Дата» в полосе заголовка столбца
Панель2: ТПанель;
Метка1: TLabel;
R1: TRadioButton;//элемент управления «Печать в книжной ориентации»
R2: TRadioButton;//управление "горизонтальной печатью"
ГрупповойБокс4: ТГрупповойБокс;
TT: TEdit // Элемент управления полем ввода заголовка;
Метка2: TLabel;
SR: TCheckBox; // элемент управления «Печать условий запроса»;
Метка3: TLabel;
Image1: TImage;//Показать изображение вертикальной печати
Image2: TImage;//Показать горизонтальное печатаемое изображение
QRSQL: TQRLabel // Используется для отображения элемента управления «Условие запроса» в полосе заголовка столбца.
ГрупповойБокс2: ТГрупповойБокс;
Метка7: TLabel;
Метка8: TLabel;
Метка9: TLabel;
Метка10: TLabel;
Метка11: TLabel;
Метка12: TLabel;
Метка13: TLabel;
PageSpace: TEdit; // Поле ввода интервала между столбцами;
PageTop: TEdit // Элемент управления полем ввода на полях страницы;
PageBottom: TEdit; //Управление полем ввода под полем страницы
PageLeft: TEdit; // Элемент управления полем ввода слева от поля страницы
PageRight: TEdit; // элемент управления полем ввода справа от поля страницы
PageDlux: TCheckBox // элемент управления «Двусторонняя печать»;
PageCol: TEdit; // Управление полем ввода столбца;
Страницы: TEdit // Управление полем ввода номера печати;
PaperH: TEdit // Поле ввода длины бумаги;
PaperW: TEdit;//Управление полем ввода ширины бумаги
Метка4: TLabel;
Метка6: TLabel;
Ps: TComboBox;//Управление списком моделей бумаги
Запрос: TQuery;//Управление запросами SQL
DB: TQRBand // Управление полосой "Детали";
CrtRep: TBitBtn; // элемент управления кнопкой «Создать».
Метка14: TLabel;
Метка15: TLabel;
Панель3: ТПанель;
Wdauto: TRadioButton // элемент управления «Автоширина»;
Wdall: TRadioButton // элемент управления «Та же ширина»
Wdmax: TRadioButton // элемент управления «Ограничить ширину»
Метка16: TLabel;
ColWd: TEdit; // Поле ввода ширины столбца;
Панель4: ТПанель;
DJAUTO: TRadioButton // элемент управления «Автоматическое выравнивание»;
DJCENTER: TRadioButton // элемент управления «Центр»;
DJLEFT: TRadioButton // элемент управления «Выравнивание по левому краю»;
FB: TQRBand // Управление нижней полосой;
Метка17: TLabel;
Панель5: ТПанель;
TJ1: TCheckBox // Элемент управления «Статистика на странице»;
TJ2: TCheckBox; // элемент управления "Статистическая сумма";
SB: TQRBand // Управление диапазоном суммы;
процедура FormCreate (Отправитель: TObject);
процедура RadioButtonClick (Отправитель: TObject);
процедура PageDluxClick (Отправитель: TObject);
процедура PageColChange (Отправитель: TObject);
процедура PageSpaceExit (Отправитель: TObject);
процедура PagesChange (Отправитель: TObject);
процедура PageTopExit (Отправитель: TObject);
процедура PageBottomExit (Отправитель: TObject);
процедура PageLeftExit (Отправитель: TObject);
процедура PageRightExit (Отправитель: TObject);
процедура TTExit (Отправитель: TObject);
процедура DTClick(Отправитель: TObject);
процедура BtnPrviewClick (Отправитель: TObject);
процедура BtnSetClick (Отправитель: TObject);
процедура PsChange (Отправитель: TObject);
процедура PaperChange (Отправитель: TObject);
процедура FormClose (Отправитель: TObject; вар Действие: TCloseAction);
процедура FormDestroy (Отправитель: TObject);
процедура CreateReport (Отправитель: TObject);
процедура SRClick (Отправитель: TObject);
процедура ClearRep();
процедура FormShow (Отправитель: TObject);
процедура PaperSizeChg (Отправитель: TObject);
процедура DJChage (Отправитель: TObject);
процедура WdChage (Отправитель: TObject);
процедура QuickRepStartPage (Отправитель: TCustomQuickRep);
процедура BtnPrintClick (Отправитель: TObject);
частный
{Частные заявления}
CHBName:TQRLabelName;//Определить имя элемента управления полосой заголовка столбца, имя динамического массива
DBName:TQRDBTextName; //Определите имя динамического массива имени элемента управления полосой детализации
CHBShape,DBShape,FBShape,SumShape:TQRShapeName //Определите имя динамического массива элемента управления линией;
FBName,SumName:TQREpName; //Определите имя динамического массива для нижнего колонтитула (FBNAME) и имен элементов управления полосой сумм (SUMNAME);
DJ:TAlignment;//Выравнивание столбца (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte //Используется для сохранения имен переменных состояния выравнивания столбцов таблицы (RD1) и ширины печати (RD2).
общественный
{Публичные заявления}
CXTJ,BT:String;//CXTJ хранит условия запроса, BT хранит заголовки отчетов
//Указывается формой верхнего уровня
конец;
константа
PaperSize:array[0..26] из TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
LetterSmall, Tabloid, Ledger, Legal, Statement, Executive, Folio,
Кварто, qr10X14, qr11X17, Примечание, Env9, Env10, Env11, Env12,
Env14, CSheet, DSheet, ESheet, Custom);
//Типы бумаги, перечисленные QuickRep
вар
Форма печати: TPrintForm;
выполнение
{$R *.DFM}
процедура TPrintForm.FormCreate(Отправитель: TObject);
//Отображение свойства QuickRep.Page и других значений свойств
вар
Я: Байт;
начинать
PageCol.Text:=IntToStr(QuickRep.Page.Columns);
PageSpace.Text:=FormatFloat('0.00',QuickRep.Page.ColumnSpace);
PageTop.Text:=FormatFloat('0.00',QuickRep.Page.TopMargin);
PageBottom.Text:=FormatFloat('0.00',QuickRep.Page.BottomMargin);
PageLeft.Text:=FormatFloat('0.00',QuickRep.Page.LeftMargin);
PageRight.Text:=FormatFloat('0.00',QuickRep.Page.RightMargin);
PageSpace.Text:=FormatFloat('0.00',QuickRep.page.ColumnSpace);
R1.Проверено:=QuickRep.Page.Orientation=poPortrait;
Изображение1.Видимый:=R1.Проверено;
R2.Проверено:=QuickRep.Page.Orientation=poLandscape;
Изображение2.Видимый:=R2.Проверено;
PageDlux.Checked:=QuickRep.PrinterSettings.Duplex;
Pages.Text:=IntToStr(QuickRep.PrinterSettings.Copies);
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
Для I:=0–26 do //В списке PS отображается тип бумаги
если QuickRep.Page.PaperSize=PaperSize[I], то начнем
PS.ItemIndex:=I;
Перерыв;
конец;
//Определяем, можно ли изменить ширину бумаги. Ее можно изменить, только если тип бумаги настроен (Ps.ItemIndex=26).
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
конец;
процедура TPrintForm.RadioButtonClick(Отправитель: TObject);
//Обработка событий изменения ориентации бумаги
вар
С:Строка;
начинать
Изображение1.Видимый:=R1.Проверено;
Изображение2.Видимый:=R2.Проверено;
если R1.Проверено, то
QuickRep.Page.Orientation:=poPortrait
еще
QuickRep.Page.Orientation:=poLandscape;
//Поменяем местами значения ширины и длины бумаги
S:=PaperH.Text;
PaperH.Text:=PaperW.Text;
PaperW.Text:=S;
если (Ps.ItemIndex=26) или (Ps.ItemIndex=0), то начать
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
конец;
конец;
процедура TPrintForm.PageDluxClick(Отправитель: TObject);
начинать
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
конец;
процедура TPrintForm.PageColChange(Отправитель: TObject);
начинать
если StrToInt(PageCol.Text)<1, то PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
конец;
процедура TPrintForm.PageSpaceExit(Отправитель: TObject);
начинать
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
конец;
процедура TPrintForm.PagesChange(Отправитель: TObject);
начинать
если StrToInt(Pages.Text)<1, то Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
конец;
процедура TPrintForm.PageTopExit(Отправитель: TObject);
начинать
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
конец;
процедура TPrintForm.PageBottomExit(Отправитель: TObject);
начинать
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
конец;
процедура TPrintForm.PageLeftExit(Отправитель: TObject);
начинать
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
конец;
процедура TPrintForm.PageRightExit(Отправитель: TObject);
начинать
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
конец;
процедура TPrintForm.TTExit(Sender: TObject);//Обработка события изменения заголовка
начинать
QuickRep.ReportTitle:=TT.Text;
Title.Caption:=TT.Text;
Бт:=ТТ.Текст;
конец;
процедура TPrintForm.DTClick(Sender: TObject);//Событие флажка условия запроса печати
начинать
QRSQL.Enabled:=SR.Проверено;
конец;
процедура TPrintForm.BtnPrviewClick(Sender: TObject); //событие нажатия кнопки предварительного просмотра;
начинать
QuickRep.Предварительный просмотр;
конец;
процедура TPrintForm.BtnSetClick(Sender: TObject); //Устанавливаем событие нажатия кнопки;
начинать
QuickRep.PrinterSetup;
конец;
процедура TPrintForm.PsChange(Sender: TObject);//Событие изменения типа бумаги
начинать
QuickREp.Page.PaperSize:=PaperSize[Ps.ItemIndex];
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
CrtRep.Enabled:=Истина;
BtnPrint.Enabled:=не CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
конец;
процедура TPrintForm.PaperChange(Sender: TObject);//События изменения ширины и длины бумаги
начинать
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
конец;
процедура TPrintForm.FormClose(Отправитель: TObject; var Action: TCloseAction);
начинать
Действие:=caFree;
конец;
процедура TPrintForm.FormDestroy(Отправитель: TObject);
начинать
ClearRep;
PrintForm: = ноль;
конец;
процедура TPrintForm.CreateReport(Sender: TObject);//Создаем событие нажатия кнопки
Вар
Я, Л: Байт;
CHBtp, CHBlf, Cd, ObWidth: Слово;
начинать
Screen.Cursor:=crHourGlass;
Title.Caption:=Bt;//Установим заголовок
ClearRep(); //Очистить созданный объект;
если Sr.Checked, то QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//Следует ли печатать условия запроса?
CHBtp:=HB.Height-17;//Верхнее положение созданного элемента управления на бэнде
CHBlf:=0; //Созданный элемент управления находится в левой позиции бэнда
ObWidth:=0; //Ширина созданного элемента управления
for I := 0 to Query.FieldCount-1 do //Создаем элемент управления на основе количества полей, возвращаемых запросом
начинать
если (Query.Fields[I].DataType<>ftBlob) и (Query.Fields[I].DataType<>ftMemo), то
начать //игнорировать поле примечания и поле фотографии
L:=Query.Fields[I].DataSize-1;//L=ширина поля (байты)-1
case Rd1 of //Устанавливаем выравнивание элемента управления в соответствии с выбранным выравниванием
0: если L<=10, то Dj:=taCenter else DJ:=taLeftJustify;
//Автоматическое выравнивание: поля меньше или равные 10 выравниваются по центру, в противном случае — по левому краю.
1: Dj:=taCenter;//выравнивание по центру
2: DJ:=taLeftJustify;//Выравнивание по левому краю
конец;
case Rd2 of //Установить ширину столбца отчета в соответствии с выбранной шириной списка
0: начать
//Автоматическая ширина: если L>14, то ширина ObWidth=14+(L-14)/2, если ObWidth;
//Ширина не может отображать заголовки столбцов, тогда ObWidth=ширина заголовка столбца, если тип поля;
//Для типа даты, типа валюты и типа числа с плавающей запятой ObWidth=65
если L>14, то L:=14+(L-14) дел 2;
Обширина:=L*6;
L:=Длина(Query.Fields[I].DisplayName);
если ObWidth<L*6, то ObWidth:=L*6;
Обширина:=Обширина+2;
если (Query.Fields[I].DataType=ftDateTime) или
(Query.Fields[I].DataType=ftFloat) или
(Query.Fields[I].DataType=ftCurrency), затем ObWidth:=65;
конец;
1: если ColWd.Text<>', то ObWidth:=StrToInt(ColWd.Text)
else ObWidth:=100;//Та же ширина:ObWidth=значение входной ширины
2: начало //Ограничить максимальную ширину: сначала вычислите автоматическую ширину, а затем определите, превышает ли ширина максимальное значение.
//Если она превышает входное значение ObWidth=максимальной ширины
если ColWd.Text<>', то Cd:=StrToInt(ColWd.Text)
иначе Кд:=200;
Обширность:=L*6;
если ObWidth>Cd, то ObWidth:=Cd;
Обширность:=Обширина+2;
если (Query.Fields[I].DataType=ftDateTime) или
(Query.Fields[I].DataType=ftFloat) или
(Query.Fields[I].DataType=ftCurrency), затем ObWidth:=65;
конец;
конец;
если CHBlf+ObWidth>=HB.Width, то начинаем //Создать элемент управления>ширина бумаги?
DlgMes:='Ширины бумаги недостаточно, измените размер бумаги. ';
MessageBox(Handle,DlgMes,Cap_Inf,Ico_Inf);
перерыв;
конец
еще начать
CHBShape[I]:=TQRShape.Create(HB);//Создаем элемент управления строкой полосы заголовка столбца
CHBShape[I].Parent:=HB;
CHBShape[I].Top:=CHBtp;
CHBShape[I].Left:=CHBlf;
CHBShape[I].Width:=ObWidth+1;
CHBShape[I].Высота:=17;
CHBNAME[I]:=TQRLabel.Create(HB); //Создаем элемент управления заголовком столбца
CHBNAME[I].Родитель:=HB;
CHBNAME[I].Top:=CHBtp+2;
CHBNAME[I].Left:=CHBlf+1;
CHBNAME[I].AutoSize:=False;
CHBNAME[I].Width:=ObWidth-1;
CHBNAME[I].Alignment:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//Получить поле как имя столбца
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); //Создаем детальный элемент управления полосковой линией
DBShape[I].Parent:=DB;
DBShape[I].Top:=-1;
DBShape[I].Left:=CHBlf;
DBShape[I].Width:=ObWidth+1;
DBShape[I].Высота:=17;
DBNAME[I]:=TQRDBText.Create(DB); //Создаем элемент управления полосой подробностей
DBNAME[I].Parent:=DB;
DBNAME[I].ParentReport:=QuickRep;
ИМЯБД[I].Top:=2;
DBNAME[I].Left:=CHBlf+2;
DBNAME[I].AutoSize:=False;
DBNAME[I].Width:=ObWidth-3;
DBNAME[I].Высота:=13;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=Query;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
если Tj1.Checked, то начать //Хотите создать нижний колонтитул?
FBShape[I]:=TQRShape.Create(FB); //Создаем элемент управления линией нижнего колонтитула
FBShape[I].Parent:=FB;
FBShape[I].Top:=0;
FBShape[I].Left:=CHBlf;
FBShape[I].Width:=ObWidth+1;
FBShape[I].Высота:=17;
если (Query.Fields[I].DataType=ftFloat) или
(Query.Fields[I].DataType=ftCurrency) или (I<2), затем
начать //Если тип поля — числовой, создаем его
FBNAME[I]:=TQREpr.Create(FB); //Создаем элемент управления нижней полосой
FBNAME[I].Parent:=FB;
FBNAME[I].ParentReport:=QuickRep;
FBNAME[I].Top:=3;
FBNAME[I].Left:=CHBlf+2;
FBNAME[I].AutoSize:=False;
FBNAME[I].Width:=ObWidth-3;
FBNAME[I].Высота:=13;
FBNAME[I].Alignment:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
конец;
конец;
если Tj2.Checked, то начать //Должны ли мы установить диапазон сумм?
SumShape[I]:=TQRShape.Create(SB); //Создаем элемент управления линией суммы.
SumShape[I].Parent:=SB;
SumShape[I].Top:=0;
SumShape[I].Left:=CHBlf;
SumShape[I].Width:=ObWidth+1;
SumShape[I].Высота:=17;
если (Query.Fields[I].DataType=ftFloat) или
(Query.Fields[I].DataType=ftCurrency) или (I<2), затем
начать //Если тип поля числовой, создайте его
SumNAME[I]:=TQREpr.Create(SB); //Создаем элемент управления диапазоном сумм.
SumNAME[I].Parent:=SB;
SumNAME[I].ParentReport:=QuickRep;
SumNAME[I].Top:=3;
SumNAME[I].Left:=CHBlf+2;
SumNAME[I].AutoSize:=False;
SumNAME[I].Width:=ObWidth-3;
SumNAME[I].Высота:=13;
SumNAME[I].Alignment:=taCenter;
SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].BringToFront;
конец;
конец;
CHBlf:=CHBlf+ObWidth;//Текущая обработка поля завершена, на одну ширину поля вправо
конец;
конец;
конец;
CrtRep.Enabled:=False;//Отключаем кнопку генерации
BtnPrint.Enabled:=not CrtRep.Enabled;Разрешить печать кнопок аммония
BtnPrview.Enabled:=BtnPrint.Enabled;Разрешить кнопку предварительного просмотра
if Tj1.Checked then start //Если создан нижний колонтитул, измените первые два столбца в нижнем колонтитуле
FBNAME[0].Expression:=''Всего страниц'';
FBNAME[1].Expression:='COUNT+'row'';
конец;
if Tj1.Checked then start //Если диапазон сумм установлен, измените первые два столбца в диапазоне сумм
SumNAME[0].Expression:=''Total'';
SumNAME[1].Expression:='COUNT+'row'';
конец;
//Настраиваем положение печати даты и номера страницы в зоне заголовка столбца
QRE2.Left:=HB.Width-Qre2.Width;
QRSQL.Left:=QRE1.Width+10;
QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //Укажите набор данных для QuickRep, это предложение не должно отсутствовать
Screen.Cursor:=crDefault;
конец;
процедура TPrintForm.ClearRep();//Очищаем элемент управления, созданный при генерации формата отчета
Вар
Я: Байт;
начинать
Для I:=0 до Query.FieldCount-1 начните
если Assigned(CHBShape[I]), то start CHBShape[I].Free;CHBShape[I]:=nil;end;
если Назначено(CHBNAME[I]), то начало CHBNAME[I].Free;CHBNAME[I]:=nil;end;
если назначено(DBShape[I]), то начать DBShape[I].Free;DBShape[I]:=nil;end;
если Assigned(DBNAME[I]), то начать DBNAME[I].Free;DBNAME[I]:=nil;end;
если назначено(FBShape[I]), то начать FBShape[I].Free;FBShape[I]:=nil;end;
если Назначено(FBNAME[I]), то начало FBNAME[I].Free;FBNAME[I]:=nil;end;
если назначено(SumShape[I]), то начать SumShape[I].Free;SumShape[I]:=nil;end;
если Назначено(SumNAME[I]), то начать SumNAME[I].Free;SumNAME[I]:=nil;end;
конец;
конец;
процедура TPrintForm.SRClick(Отправитель: TObject);
начинать
если Sr.Checked, то QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
конец;
процедура TPrintForm.FormShow(Sender: TObject); //Событие отображения формы;
начинать
Query.Active:=True;//Печать SQL
ТТ.Текст:=Бт;
QuickRep.ReportTitle:=Bt;//Установим заголовок
//Массив имен элементов управления выделяет пространство
SetLength(CHBNAME,Query.FieldCount);
SetLength(CHBShape,Query.FieldCount);
SetLength(DBNAME,Query.FieldCount);
SetLength(DBShape,Query.FieldCount);
SetLength(FBNAME,Query.FieldCount);
SetLength(FBShape,Query.FieldCount);
SetLength(SumNAME,Query.FieldCount);
SetLength(SumShape,Query.FieldCount);
конец;
процедура TPrintForm.PaperSizeChg(Отправитель: TObject);
начинать
CrtRep.Enabled:=Истина;
BtnPrint.Enabled:=не CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
конец;
процедура TPrintForm.DJChage(Sender: TObject);//Обработка событий изменения выравнивания
вар
Изм.: Байт;
начинать
если Djauto.Checked, то Chg:=0
иначе, если DjCenter.Checked, то Chg:=1
иначе Изм:=2;
если Chg<>Rd1, то начать PaperSizeChg(nil);Rd1:=Chg;end;
конец;
процедура TPrintForm.WdChage(Sender: TObject);//Обработка события изменения ширины
вар
Изм.: Байт;
начинать
если Wdauto.Checked, то Chg:=0
иначе, если Wdall.Checked, тогда начните
Изм.:=1;
если ColWd.Text=', то ColWd.Text:='100';
конец
еще начать
Изм.:=2;
если ColWd.Text=', то ColWd.Text:='200';
конец;
если Chg<>Rd2, то начать PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
конец;
процедура TPrintForm.QuickRepStartPage(Отправитель: TCustomQuickRep);
//Печать отчета запускает обработку событий новой страницы, и статистические значения в нижнем колонтитуле очищаются.
Вар
Я: Байт;
начинать
если Tj1.Проверено, то
Для I:=0 для Query.FieldCount-1 выполните
если Назначено(FBNAME[I]), то FBNAME[I].Reset;
конец;
процедура TPrintForm.BtnPrintClick(Отправитель: TObject);
начинать
БыстраяПечать;
конец;
конец.
4. Пример вызова диалогового окна:
Сначала включите модуль PrintDlg в оператор USES в вызываемой форме, а затем вызовите его с помощью следующего кода:
если не назначено (PrintForm), то PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//Если вызывающая форма не содержит элемента управления Query, вы можете напрямую установить значение оператора SQL
PrintForm.Bt:=Заголовок отчета;
PrintForm.Caption:=Заголовок формы;
PrintForm.CXTJ:=условия запроса;
PrintForm.ShowModal;
5. Заключение
Ключом к этой программе является процесс событий CreateReport и обработка имен динамических элементов управления. Из-за ограниченного места некоторые содержания не объяснены, и я надеюсь, что читатели смогут понять их самостоятельно. Для создания общего отчета эта программа может соответствовать требованиям.
У меня последняя версия, в которой более сильные функции. Друзья, которым она нужна, могут написать мне по электронной почте, и я обязательно ее отправлю.