Самостоятельное задание
Самостоятельно доработайте документ, чтобы его внешний вид был подобен виду, приведенному на рисунке ниже, причем название документа должно передаваться программной строкой.
Заключительный вид документа |
1. Для компонента Button1 заменим у свойству Captionнадпись Button1 на Отчет.
2. Для компонента QuickRep1 установим в активное состояние полосу Titleпосредством свойства Bends.HasTitle:=true.
3. Поместим в полосу TitleкомпонентQRLabel1 и свойствуAlignmentзададим значениеtaCenter(размещение по центру).
4. В обработчике события кнопки Button1 допишем следующие строки программы:
procedure TForm1.Button1Click(Sender: TObject);
begin
QRLabel1.Caption:= 'Список факультетов и специальностей';
ClientDataSet1.IndexFieldNames :='F_Name'; //сортировка в Master отношений
ClientDataSet2.IndexFieldNames :='CF_Code; GR_Name'; //сортировка в Detail отношений
ClientDataSet1.Open; //активизация компонента (доступ к данным)
ClientDataSet2.Open; //активизация компонента (доступ к данным)
QuickRep1.Preview; //вывод документа
end;
5. Выставим размер и жирный для компонент QRLabel1, свойствуFont->Size14,Style->fsBoldиfsItalicзначениеTrue.
6. Выставим жирный и подчеркнутый для компонент QRDBText1, свойству Font ->Style-> fsBold := True (жирный) и Frame ->DrawBottom := True (подчеркнутый) .
7. Коночный вариант работы представлен ниже с соответствующим программным кодом:
Форма готового проекта
Программный код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, QuickRpt, QRCtrls, DB, DBClient, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; QuickRep1: TQuickRep; Button1: TButton; ClientDataSet1: TClientDataSet; ClientDataSet2: TClientDataSet; DataSource1: TDataSource; DetailBand1: TQRBand; QRDBText1: TQRDBText; QRSubDetail1: TQRSubDetail; QRDBText2: TQRDBText; TitleBand1: TQRBand; QRLabel1: TQRLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin QRLabel1.Caption := 'Список факультетов и специальностей'; ClientDataSet1.IndexFieldNames :='F_Name'; //сортировка в Master отношений ClientDataSet2.IndexFieldNames :='CF_Code; GR_Name'; //сортировка в Detail отношений ClientDataSet1.Open; //активизация компонента (доступ к данным) ClientDataSet2.Open; //активизация компонента (доступ к данным) QuickRep1.Preview; //вывод документа end;
end.
|
Отчет выводимый при нажатии на кнопку «Отчет».
Домашнее задание 2 Объектная модель документа, реализованная на tClientDataSet
Создаем стандартное приложение Delphiи сохраняем проект.
Установим в форму компонент ClientDataSet1.
Выберем свойство FieldDefsкомпонентаClientDataSet1(рис. 2).
Рис. 2 Выбор свойства FieldDefs |
Вызоваем редактор определителя полей (рис. 3), выполнив щелчок мышкой по кнопке, расположенной справа от свойства FieldDefs(рис. 1).
Рис. 3 Вид редактора полей свойства FieldDefs |
Добавляем первое поле главного представления таблицы, выполнив команду Add New (Ins)в редакторе определителя полей.
Измените в инспекторе объектов имя поля DataSet1Field1наFacultet , в свойствеData Typeвыбераем значениеftStringи в свойствеSizeукажите размер =25 (рис. 4 а, б).
Рис 4 а, б Изменение значений свойств в инспекторе объектов |
Добавляем второе поле главного представления таблицы, выполнив команду Add New (Ins)в редакторе полей. Данное поле будет являться полем связи с подчиненным представлением таблицы (Nestedполем), поэтому в инспекторе объектов переименуйте его вLinkи выберите значениеfkDataSetв свойствеData Type (рис. 5).
Рис 5 Установка значений свойств поля Link |
Для поля Linkвызовим редактор вложенных полей, выполняем щелчок мышкой по кнопке свойстваChildDefsв инспекторе объектов (рис. 6).
Рис. 6 Вид редактора полей свойства FieldDefs и ChildDefs |
В редакторе дочерних полей добавляем первое поле вложенного представления таблицы, выполнив команду Add New(Ins) (рис. 7).
Рис. 7 Вид редактора полей свойства FieldDefs и ChildDefs после создания поля |
Изменим в инспекторе объектов имя поля LinkField1наGroup , в свойствеData Typeвыберем значениеftStringи в свойствеSizeукажите размер =12 (рис. 8 а, б).
Рис 8 а, б Изменение значений свойств в инспекторе объектов |
После описания структуры документа создаем DataSet для компонентаClientDataSet. Напомним, что для созданияDataSetнеобходимо выбрать в форме компонентClientDataSet1и затем выполнить командуCreate Data Setконтекстного меню.
Для передачи данных другим DataSetнеобходимо в редактор полей добавим поля все поля главного представления. Для этого достаточно выполнить двойной щелчок мышкой по компонентуClientDataSet1и затем выполнить командуAddAll Fieldsконтекстного меню.
После создания DataSetсохраните созданную структуру вXMLпакетном файле с именемDocument, выполнив команду контекстного менюSave To Base XML table.
Для того, что бы компонент ClientDataSet1был связан с файлом документа необходимо подключить к нему созданный файл посредством свойстваFileName.
Для отображения вложенных свойств созданного объекта необходимо установить в форму второй компонент ClientDataSet2, который необходимо связать с компонентомClientDataSet1выбрав в свойствеDataSetFieldкомпонентаClientDataSet2значениеClientDataSet1Link.
После выполнения выше указанного действия необходимо добавить вложенные поля документа в ClientDataSet2, выполнив действия аналогичные описанным в пункте 12.
Представление данных в элементах управления выполняется аналогично представлению данных в базах данных. Для представления данных достаточно установить в форму компоненты связи DataSource1иDataSource2, которые соответственно связать с компонентамиClientDataSet1иClientDataSet2посредством свойстваDataSet. Далее установить в форму компонентыDBGrid1иDBGrid2, которые соответственно связать сDataSource1иDataSource2посредством свойстваDataSet.Для выполнения команд “Записать”, “Удалить”, “Переместить” и других достаточно установить в форму компоненты – навигаторы (DBNavigator1иDBNavigator2) которые связать соответственно с компонентамиDataSource1иDataSource2.
Особенностью модификации данных вложенных полей является необходимость выполнения модификации данных в главном представлении, т.е. выполнение команды редактирования данных главного свойства (поля) даже в случае отсутствия необходимости модификации иначе запись в файл не произойдет. В связи с этим фактом необходимо разработать собственный метод, напимер RD:
procedure TForm1.RD; var temp : string; begin temp := ClientDataSet1Facultet.Value; ClientDataSet1.Edit; ClientDataSet1Facultet.Value := '***'; ClientDataSet1.Post; ClientDataSet1.Edit; ClientDataSet1Facultet.Value := temp; ClientDataSet1.Post; end; |
который продекларировать в одном из разделов объявлений:
private { Private declarations } procedure RD; |
Для обеспечения корректной работы приложения управления документом вышеуказанный метод необходимо вызывать в обработчиках событий AfterDelete иAfterPostкомпонентаClientDataSet2.
procedureTForm1.ClientDataSet2AfterDelete(DataSet: TDataSet); begin RD; end; |
procedureTForm1.ClientDataSet2AfterPost(DataSet: TDataSet); begin RD; end; |
Рис. 9 Конечный вид разрабатываемого приложения