Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по СВП.docx
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
96.59 Кб
Скачать

Пример создания многопоточного приложения в Delphi

Этот раздел содержит описание шагов, необходимых для создания простого, но показательного примера многопоточного приложения. Мы будем пытаться вычислить число "пи" с максимальной точностью после запятой. Конечно, встроенная в Delphi константа Pi имеет достаточную точность, правильнее сказать — максимальную, допускаемую самым точным 10-байтным форматом для вещественных чисел Extended. Так что превзойти ее нам не удастся. Но этот пример использования потоков может послужить прологом для решения реальных задач.

Первый пример будет содержать два потока: главный (обрабатывающий ввод пользователя) и вычислительный; мы сможем изменять их свойства и наблюдать за реакцией. Итак, выполните следующую последовательность действий:

1. В среде Delphi откройте меню File и выберите пункт New Application.

2. Расположите на форме пять меток и один переключатель, как показано на рис. 29.2.

Переименуйте главную форму в fmMain.

3. Откройте меню File и выберите пункт Save Project As. Сохраните модуль как uMain, а проект — как Threads 1.

4. Откройте меню File и выберите пункт New. Затем дважды щелкните на объекте типа поток (значок Thread Object). Откроется диалоговое окно New Items, показанное на рис. 29.3.

Рис. 29.3. Диалоговое окно New Items с выбранным объектом типа "поток"

5. Когда появится диалоговое окно для именования объекта поток, введите TPiThread и нажмите клавишу (рис. 29.4). Помимо этого, при желании, вы можете присвоить создаваемому потоку имя, установив флажок Named Thread и задав имя в поле Thread Name. Так как имя потока используется только для удобства обозначения, эту возможность мы использовать не будем.

Delphi создаст новый модуль и поместит в него шаблон для нового потока.

6. Код, вносимый в метод Execute, вычисляет число я, используя сходимость бесконечного ряда Лейбница:

Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 -...

Разумеется, отображать новое значение после каждой итерации — это то же самое, что стрелять из пушки по воробьям. На отображение информации система потратит в десятки раз больше времени, чем на собственно вычисления. Поэтому мы ввели константу updatePeriod, которая регулирует периодичность отображения текущего значения.

Код метода Execute показан ниже:

const

// Лучше использовать нечетное число для того, чтобы избежать эффекта // мерцания UpdatePeriod = 1000001;

procedure TPiThread.Execute; var sign : Integer;

PiValue, PrevValue : Extended; i : Int64;

 begin

{ Place thread code here } PiValue := 4; sign := -1; i := 0; repeat Inc(i);

PrevValue := PiValue;

PiValue := PiValue + sign * 4 / (2*i+l); sign := -sign;

if i mod UpdatePeriod = 0 then 

begin

GlobalPi := PiValue; GlobalCounter := i; Synchronize(fmMain.UpdatePi); 

end;

until Terminated or (Abs(PiValue - PrevValue)<1E-19); end;

7. Откройте меню File и выберите пункт Save As. Сохраните модуль с потоком как uPiThread.pas.

8. Отредактируйте главный файл модуля uMain.pas и добавьте модуль uPiThread к списку используемых модулей в секции интерфейса. Он должен выглядеть так:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls, uPiThread;

9. В секции public формы TfmMain добавьте ссылку на создаваемую нить: PiThread : TPiThread;

10. Добавьте в модуль uMain две глобальные переменные

GlobalPi : Extended; 

GlobalCounter : Int64;

и метод UpdatePi:

procedure TfmMain.UpdatePi;

 begin

if Islconic(Application.Handle) then

  Exit;

LaValue.Caption := FloatToStrF(GlobalPi, ffFixed, 18, 18);

lalterNum.Caption := IntToStr(GlobalCounter) + ' iterations';

  end;

Этот метод, если вы обратили внимание, вызывается из потока посредством процедуры Synchronize. Он отображает текущее значение приближения к числу "пи" и количество итераций.

В случае, если главное окно приложения свернуто, отображение не производится; так что после его развертывания вам, возможно, придется подождать некоторое время для обновления.

11. Выполните двойной щелчок на свободном месте рабочей области формы, при этом создастся шаблон метода FormCreate. Здесь мы отобразим значение системной константы р±:

procedure TfmMain.FormCreate(Sender: TObject);

 begin

laBuiltln.Caption := FloatToStrF(Pi, ffFixed, 18, 18); end;

12. Выберите на форме переключатель (его название cbcalcuiate) и назначьте событию Onclick код, создающий и уничтожающий вычислительный поток в зависимости от состояния переключателя:

procedure TfmMain.cbCalculateClick(Sender: TObject);

begin if cbCalculate.Checked then

begin

PiThread := TPiThread.Create(True);

PiThread.FreeOnTerminate := True;

PiThread.Priority := tpLower;

PiThread.Resume; end else begin

if Assigned(PiThread) then PiThread.Terminate; 

end;

end;

Таким образом, многопоточное приложение готово к запуску. Если все пройдет нормально, вы увидите картинку, подобную той, которая приведена на рис. 29.5.

Пока один из авторов писал текст этого раздела, запущенное одновременно приложение Threadsl выполнило пять миллиардов итераций и приблизилось к встроенному значению Pi в десятом разряде. Интересно, насколько хватит терпения у вас?

Этот простой пример — первый шаг в усвоении того, как от базового класса rrhread можно порождать собственные классы. Из-за своей простоты он не лишен недостатков; более того — если бы вычислительных нитей было не одна, а более, кое-какие приемы были бы даже ошибочными. Но — об этом ниже.

Палитра компонентов и окно инспектора объектов

Палитра компонентов - это главное богатство Delphi. Она занимает правую часть главного окна и имеет закладки, обеспечивающие быстрый поиск нужного компонента. Под компонентом понимается некий функциональный элемент, содержащий определенные свойства и размещаемый программистом в окне формы. С помощью компонентов создается каркас программы, во всяком случае - ее видимые на экране внешние проявления: окна, кнопки, списки выбора и т. д.

Как и панель кнопок, палитра компонентов может настраиваться. Для этого используется специальный редактор, окно которого появляется на экране после щелчка правой кнопкой мыши на любой пиктограмме в палитре компонентов и выбора опции properties (Свойства) (рис. 2.5).

Нет смысла удалять какой-то из компонентов, а создавать новые мы с вами пока еще не умеем, поэтому я не рекомендую вам экспериментировать с редактором палитры. Тем не менее один совет все-таки дам. В стандартном наборе страниц палитры компонентов есть страница Samples, содержащая довольно часто используемые компоненты. В то же время ее закладка в палитре закрыта двумя небольшими кнопками “прокрутки” закладок палитры. Имеет смысл поменять ее местами с менее используемой страницей, например, со страницей ADO. Вы можете “перетащить” строку Samples в окне Pages редактора палитры вверх и “положить” ее на строку ADO. После такой перестановки закладка Samples станет доступна в любой момент. Если, к тому же, вы не планируете использовать в своих проектах технологию ADO для доступа к базам данных, перетащите строку ado в самый конец списка.

Создание приложений для работы с базами данных.

 В комплекте с Delphi 7 поставляются сразу несколько библиотек для работы с базами данных (ADO, BDE, dbExpress, InterBase и др.). Для того чтобы создать приложение, работающее с локальной базой данных, то вы обычно используете библиотеку BDE. Эта библиотека создана компанией Borland и уже порядком устарела. Но без определённой подготовки операционной системы эти компоненты работать не будут. Есть альтернатива этим компонентам.       Существует автономный компонент TClientDataSet который использует свой собственный формат данных.      Итак, переходим к практике. Компонент TClientDataSet использует файлы с расширением *.CDS и *.XML мы будем рассматривать формат CDS, так как XML формат занимает вдвое больше места на диске и такой файл легко можно изменить, открыв его через блокнот. Этот компонент при создании проецирует файл в память и модифицирует только память, а при уничтожении данные записываются в файл целиком. Путь к файлу определяет свойство FileName. Файлы формата CDS можно найти в папке program files\Common Files\Borland Shared\Data. Давайте сначала откроем один из них. Скопируем один из них в папку c:\data .      Кидаем на форму 4 компонента      1.  TClientDataSet      2.  TDataSource      3.  TDBGrid      4.  TDBNavigator      В результате :      1.  DataSource1      2.  ClientDataSet1      3.  DBGrid1      4.  DBNavigator1      Настраиваем их свойства так чтобы получилось примерно так:      DBNavigator1.DataSource = DataSource1      DBGrid1.DataSource = DataSource1      DataSource1.DataSet = ClientDataSet1      ClientDataSet1.FileName = 'D:\111\www\customer.cds'      ClientDataSet1.Active = True (самое главное этого не забыть :-))      И всё готово. Вы сразу у меня спросите: "А как создать новую таблицу?".       Всё очень просто даже не нужно НИКАКИХ дополнительных программ, только компонент TClientDataSet и конечно Delphi.      1.  Создаём новый проект (можно даже его не сохранять) и добавляем на форму компонент TClientDataSet.      2.  Сначала определим структуру таблицы. Для этого открываем свойство FieldDefs нашего компонента. Открывается окно "Editing ClientDataSet1.FieldDefs" жмём "добавить новый", и определяем свойства поля (тип, формат, размер и т.д.).      3.  Теперь самое главное. Щёлкаем правой кнопкой мыши на компоненте TClientDataSet и выбираем пункт CreateDataSet. Потом ещё раз открываем контекстное меню и выбираем пункт "Save to binary MyBase file" и сохраняем файл туда, куда нам надо.

Класс TCustomADODataSet. Поиск записей. Примеры.

Класс TCustomADODataSet обладает дополнительными возможностями, которые позволяют отслеживать состояние каждой записи.

Для текущей записи набора данных можно определить ее состояние. Для этого предназначено свойство

TRecordStatus = (rsOK, rsNew, rsModified, rsDeleted, rsUnmodified, rslnvalid, rsMultipleChanges, rsPendingChanges, rsCanceled, rsCantRelease, rsConcurrencyViolation, rsIntegrityViolation, rsMaxChangesExceeded, rsObjectOpen, rsOutOfMemory, rsPermissionDenied, rsSchemaViolation, rsDBDeleted); property RecordStatus: TRecordStatusSet;

где rsOK — запись успешно сохранена; rsNew — запись добавлена; rsModified — запись была изменена; rsDeleted — запись удалена; rsUnmodified — запись без изменений; rslnvalid — запись не может быть сохранена из-за неверной закладки; rsMultipleChanges — запись не может быть сохранена из-за множественных изменений; rsPendingChanges — запись не может быть сохранена из-за ссылки на несохраненные изменения; rsCanceled — операция с записью была отменена; rsCantRelease — запись заблокирована; rsConcurrencyViolation — запись не может быть сохранена из-за типа блокировки; rsintegrityvioiation — нарушена ссылочная целостность; rsMaxChangesExceeded — слишком много изменений; rsObjectOpen — конфликт с объектом базы данных; rsoutofMemory — недостаток памяти, rsPermissionDenied — нет доступа; rsSchemaViolation — нарушение структуры данных; rsDBDeleted — запись удалена в БД.

Как видите, благодаря этому свойству состояние отдельной записи может быть определено очень точно.

Кроме этого, метод

type

TUpdateStatus = (usUnmodified, usModifled, uslnserted, usDeleted);

 function UpdateStatus: TUpdateStatus; override;

возвращает информацию о состоянии текущей записи.

Соответственно до и после изменения записи вызываются методы-обработчики

TWillChangeRecordEvent = procedure(DataSet: TCustomADODataSet; const Reason: TEventReason; 

const RecordCount: Integer; 

var EventStatus: TEventStatus) of object;

 property OnWillChangeRecord: TWillChangeRecordEvent;

И

TRecordChangeCompleteEvent = procedure(DataSet: TCustomADODataSet; const Reason: TEventReason;

const RecordCount: Integer; const Error: Error; 

var EventStatus: TEventStatus) of object;

property OnRecordChangeComplete:

TrecordChangeCompleteEvent;

где параметр Reason позволяет узнать, какой метод изменил записи, а параметр RecordCount возвращает число измененных записей

Класс TCustomADODataSet. Фильтрация записей.

Помимо обычной фильтрации , основанной на свойствах Filter, Filtered и методе-обработчике onFilterRecord, класс TCustomADODataSet предоставляет разработчику дополнительные возможности.

Свойство

TFilterGroup = (fgUnassigned, fgNone, fgPendingRecords, fgAffectedRecords, fgFetchedRecords, fgPredicate, fgConflictingRecords); 

property FilterGroup: TFilterGroup;

задает групповой фильтр для записей, основываясь на информации о состоянии каждой записи набора данных, подобно рассмотренному выше свойству RecordStatus.

Фильтрация возможна по следующим параметрам:

 fgUnassigned.— фильтр не задан;

 fgNone — все ограничения, заданные фильтром, снимаются, отображаются все записи набора данных;

 fgPendingRecords — отображаются измененные записи, несохраненные в хранилище данных при вызове метода updateBatch или cancelBatch;

 fgAffectedRecords — показываются записи, обработанные при последнем сохранении в хранилище данных;

 fgFetchedRecords — имеем записи, полученные при последнем обновлении из источника данных;

 fgPredicate — видны только удаленные записи;

 fgConfiictingRecords — отображаются модифицированные записи, при сохранении которых в хранилище данных возникла ошибка.

Для того чтобы групповая фильтрация заработала, необходимы два дополнительных условия. Во-первых, фильтрация должна быть включена — свойство Filtered должно иметь Значение True. 

Во- вторых , свойство LockType должно иметь значение ItBatchOptimistic.

with ADODataSet do begin

Close;

LockType := ItbatchOptimistic;

Filtered := True;

FilterGroup := fgFetchedRecords;

Open;

  end;

Метод

procedure FilterOnBookmarks(Bookmarks: array of const);

включает фильтрацию по существующим закладкам. Для этого предварительно необходимо при помощи метода GetBookmark установить закладки на интересующих записях. При вызове метода FilterOnBookmarks автоматически очищается свойство Filter, а свойству FilterGroup присваивается значение gUnassigned.

Файлы, создаваемые в Delphi и компьютером, их назначение.

BPG - Borland Project Group: это разновидность файла сборки. .BPL - Borland Package Library: этот файл есть ничто иное как обыкновенная (или нет?) DLL, которая включает в себя компоненты VCL. Что такое компоненты, я думаю, объяснять не стоит. .CFG - Файл конфигурации: содержит параметры проекта, аналог файлов .DOF .DCP - Delphi Component Package: грубо говоря, это исходники компонента. Скомпилированные компоненты содержатся в .BPL. .DCU - Delphi Compiled Unit: наверное самый часто встречающийся тип файлов. Он содержит откомпилированный код юнита, с помощью него ускоряется компиляция. .DDP - Delphi Diagram Portfolio: вы заглядывали на вкладку Diagramm в окне редактирования кода? Вот эти файлы содержат как раз эти схемы, которые можно создавать в том окне. .DFM - Delphi Form File: здесь в двоичном виде хранится описание формы и компонентов, которая эта форма содержит .~DF - Резервная копия файла формы: в большинстве случаев она бесполезна, зря засоряет винчестеры. Так что гнать в шею! (точнее отключить в настройках :) .DOF - Delphi Options File: содержит (в текстовом виде) текущие параметры проекта. .DPK - Delphi PacKage: исходник проекта пакета. .DPR - Delphi PRoject: исходник проекта проекта, точнее файл с исходным текстом проекта вашей программы .~DP - Резервная копия DPR: см. .~DF .DSK - DeSKtop: файл с настройками рабочей среды Дельфи. .DSM - Delphi Symbol Module: имеет сомнительную полезность... .DCI - Delphi Code Templates: шаблоны кода дельфи. Помоему в комментариях не нуждается. .DRO - Delphi Object Repository: репозитарий обьектов (Tools - Repositary). .DMT - Delphi Menu Templates: шаблоны менюшек дельфи. .DCT - Delphi component Temlates: шаблоны компонентов дельфи. .OBJ - OBJect: обьектный файл, который применяется в C/C++. Он используется в том случае, если вы хотите скомпилировать программу с скомпилированным кодом (из OBJ файла) из C/C++ .PAS - PAScal: исходник модуля (юнита) .~PA - Резервная копия PAScal: см. .~DF .RES .RC - ResourCe: двоичный файл ресурсов программы, таких как картинки, иконки, формы и прочее. .TODO - TODO: файл списка To-Do (сделать) списка. Обычно полезен в том случае, если программа разрабатывается коллективом программистов

Окно кода программы на языке ObjectPascal

 Окно кода предназначено для создания и редактирования текста программы. Этот текст составляется по специальным правилам и описывает алгоритм работы программы. В системе Delphi используется язык программирования Object Pascal, который представляет собой расширенную и усовершенствованную версию широко распространенного языка Паскаль, впервые предложенного швейцарским ученым Н. Виртом еще в 1970 г. и усовершенствованного сотрудниками корпорации Borland. Несмотря на то, что визуальная среда Delphi берет на себя многие рутинные аспекты программирования, знание языка Object Pascal является непременным условием для любого программиста, работающего в этой среде.

    Первоначально окно кода содержит минимальный исходный текст, обеспечивающий нормальное функционирование пустой формы в качестве полноценного Windows-окна. В ходе работы над проектом программист вносит в него необходимые дополнения, чтобы придать программе нужную функциональность. Поскольку для создания даже простых программ вам понадобится создавать и изменять (редактировать) код программы, ниже описываются основные приемы работы с окном кода.

    Сразу после открытия нового проекта в нем будут такие строки:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs;

type

TForm1 = class(TForm)

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

end.

    Эти строки Delphi автоматически вставляет в окно кода для новой формы. Как уже говорилось, окно кода определяет поведенческую сторону окна программы (т. е. окна, появляющегося после начала работы программы), а окно формы - его внешние проявления. Оба окна тесно связаны друг с другом, причем Delphi "хозяйничает" в его верхней части, вставляя необходимые строки между:

unit Unit1;

и

implementation

    Пока не стоит изменять эту часть текста. В дальнейшем мы будем вставлять в окно текст программы между строками:

{$R *.dfm}

и

end.

в нижней части окна.

    Чтобы вставить в окно новую строку (строки), нужно сначала, с помощью клавиш курсора или щелкнув по окну мышью, поставить текстовый указатель (мигающую вертикальную черту) на нужное место, а затем с помощью клавиатуры ввести текст. Обычно текст кода программы располагается в нескольких строках. Для перехода на новую строку используйте клавишу Enter. Если понадобится удалить сразу всю строку текста, поставьте в любое место строки мигающий указатель, нажмите клавиши Ctrl+Y. Чтобы отменить последнее изменение текста, нажмите Ctrl+Zили выберите пункт меню Edit | Undo. Более полное руководство по работе с текстовым редактором окна кода приводится в приложении 1.

    Замечание. Текстовый редактор версий Delphi 4, 5 и 6 имеет расширенные "интеллектуальные" возможностиCode Insight cвязaнные с контролем текста по мере его ввода программистом. К сожалению, этот контроль отнимает у компьютера определенные ресурсы. Чтобы избавиться от раздражающих пауз в момент набора кода, особенно заметных на ПК с памятью менее 32 Мб, оснащенных процессорами с низкой тактовой частотой (100МГц и менее), раскройте список опции Tools главного меню, щелкните по опции Editor Options (для вёрсии 4 - на опции Environment options) и на странице, связанной с закладкой Code insight, уберите флажки в переключателях Code Completion, Code Parameters и Tooltip Symbol Insight. (Переключатель Tooltip Expression Evaluation разрешает/запрещает вычисление и показ значения переменной в режиме отладки когда на переменной останавливается указатель мыши. Убирать флажок в этом переключателе не имеет смысла, т. к. на этапе ввода текста программы этот сервис среды заблокирован и активизируется лишь после перехода к режиму отладки.)

    Вместе с окном кода обычно активизируется окно браузера Code Explorer, облегчающее поиск нужных элементов в случае, когда в окне набрано много строк кода (рис.1):

    Двойной щелчок мышью на элементе в окне браузера приводит к позиционированию текстового указателя в окне кода на описание соответствующего объекта или его первое упоминание. При разработке несложных учебных программ можно закрыть окно браузера маленькой кнопкой  в его верхнем правом углу. Восстановить закрытое окно можно после щелчка правой кнопкой мыши по окну кода и выбора опции View | Explorer. Отметим, что окно браузера располагается на вспомогательной панели и имеет управляющую полосу в верхней части рамки. "Схватив" ее мышью, вы можете перетащить окно на любое свободное место экрана или "причалить" его к окну Инспектора объектов.

    В версии 6 на нижней кромке окна кода располагаются две закладки - Сode и Diagram. Щелчок по последней активизирует страницу диаграмм     Первоначально эта страница пуста. Чтобы наполнить ее, нужно "перетащить" мышью два и более компонента из окна Инспектора компонентных связей. На рисунке 2 это окно пристыковано к верхней части окна браузера. Чтобы перетащить компоненты в поле диаграмм, нужно нажать и удерживать клавишу Shift, после чего щелкнуть по компонентам и, продолжая удерживать Shift, переместить указатель мыши в поле диаграмм и щелкнуть по нему левой кнопкой

Структура проекта на Delphi. Основные свойства проекта.

Главный файл проекта, изначально называется PROJECT1.DPR. Если необходимо переименовать название проекта, нужно перезаписать этот файл, выбрав в меню File команду Save Project As: При задании имени следует придерживаться правил задания имен в Object Pascal. Имя не должно содержать пробелов (используйте в таком случае знак подчеркивания), должно начинаться с буквы (цифры допустимы, но со второй позиции), не должно содержать других символов, кроме букв и цифр. Под каким именем вы сохраняете проект, под таким именем и будет создаваться исполняемый EXE файл, который вы всегда сможете самостоятельно переименовать.

Модуль программы, который автоматически появляется в начале работы Unit1. Файл называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем, вроде MAIN.PAS. Это делается аналогично переименованию названия проекта. Необходимо выбрать в меню File команду Save As: Сохраняется активный модуль в редакторе кода. Файл главной формы, который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде формы (окна разрабатываемого приложения). При переименовании названия модуля автоматически меняет свое название. Файл PROJECT1.RES изначально содержит иконку для проекта. Создается автоматически. Имеет одноименное название с названием проекта. Файл PROJECT1.DSK содержит информацию о состоянии рабочего пространства. Состояние окон во время разработки приложения. Исполняемый EXE файл, который создается в процессе компиляции проекта. Разумеется, если сохранить проект под другим именем, то изменят название и файлы с расширением RES и DSK. После компиляции программы получаются файлы с расширениями:DCU - скомпилированные модули PAS для последующей быстрой компиляции некоторые файлы не перезаписываются

EXE - исполняемый файл

~PA, ~DP - backup файлы редактора. Автоматически создаются и содержат информацию, перед последним сохранением.

И так, любая программа всегда состоит из уже знакомого нам файла проекта(такой файл имеет расширение .dpr) и одного или нескольких модулей(файлы с расширением .pas) Файл проекта не предназначен для редактирования пользователем и создаётся автоматически самой системой программирования Delphi. Для того, чтобы увидеть содержимое файла проекта, необходимо выполнить команду Project|View Source.Содержимое файла проекта может быть,например,следующим:

program Project1;

uses

Forms, unit in 'Unit1.pas' {Form};

{$R *.RES}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Файл проекта(главный модуль) начинается словом program,за которым следует имя программы,совпадающее с именем проекта. Далее за словом uses следуют имена используемых модулей:стандартного модуля Forms и модуля формы Unit1. Похожая на комментарий директива {$R *.RES} указывает компилятору,что нужно использовать файл ресурсов,который содержит описание ресурсов приложения,например,пиктограммы.Звездочка указывает,что имя файла ресурсов такое же,как и у файла проекта,но с раширением .res. Исполняемая часть главного модуля находится между операторными скобками begin:end.Операторы исполняемой части обеспечивают инициализацию приложения и вывод на экран стартового окна.Помимо главного модуля каждая программа включает как минимум один модуль формы,который содержит описание стартовой формы приложения и поддерживающи* * *аботу процедур.В Delphi каждой форме соответствует свой модуль.Для переключения между формой и окном редактора кода,содержащего соответствующий модуль,следует нажать на клавишу F12.Модули-это программные единицы,служащие для размещения фрагментов программ.При помощи содержащихся в них текстов программ и реализуется решаемая пользователем задача.

Методы

Методами называются инкапсулированные в классе процедуры и функции. Например:

type

TChildClass = classFone: Integer;

Ftwo: string;

Fthree: Tobject;

function FirstFuns(x: real): real;

procedure SecondProc;

end

Для того чтобы обратиться к методам,как и для полей,необходимо использовать составные имена:

var

MyObject: TChildClass;

y: real;

begin

MyObject.SecondProc;

y := MyObject.FirstFunc(3.14);

end;

Методы,определенные в классе,могут быть статическими,виртуальными,динамическими или абстрактными.Тип метода определяется механизмом перекрытия его в потомках. Для статических методов перекрытие осуществляется компилятором. Например,пусть у нас имеется описание родительского класса Tbase и его потомка Tdescedant, содержащих одноименный метод

MyJoy:

type

Tbase = class

procedure MyJoy;

end;

Tdescedant = class(Tbase)

procedure MyJoy;

end;

var

FirstObject: Tbase;

SecondObject: Tdescedant;

begin

FirstObject.MyJoy;

SecondObject.MyJoy;

end;

В соответствии с принципом полиморфизма в операторе FirstObject.MyJoy; вызывается метод, описанный в классе Tbase,а в операторе SecondObject.MyJoy; Вызывается метод,описанный в классе Tdescedant.По умолчанию все методы,описанные в классе,являются статическими.Динамические и виртуальные методы отличаются от статических тем,что замещение родительских методов методами потомков происходит на этапе выполнения прогрммы.Для обьявления виртуального метода в родительском классе необходимо использовать зарезервированное слово virtual,а для обьявления динамического метода-зарезервированное слово dynamic.В классе-потомке в загаловке замещающего метода должно быть указано зарезервированное слово override. Например:

type

TBase = class

Procedure MyJoy; virtual;

end;

Tdescedant = class(TBase)

procedure MyJoy; override;

end;

var

FirstObject: Tbase;

SecondObject: Tdescedant;

begin

FirstObject.MyJoy;

SecondObject.MyJoy;

end;

Если бы мы захотели,чтобы метод MyJoy в классе Tbase был динамическим, слово virtual в заголовке процедуры следует заменить словом dynamic.Различие между виртуальными и динамическими методами невилико и связано с особенностями реализации их вызовов.Можно сказать,что виртуальные методы более эффективны с точки зрения затрат времени,а динамические методы позволяют более рационально использовать оперативную память.Абстрактными называются виртуальный или динамические методы,которые определены в классе,но не содержат никаких действий,никогда не вызываются и обязательно должны быть переопределены в классах-потомках.Обьявляется абстрактный метод при помощи зарезервированного слова abstract,расположенного после слов virtual или dynamic,например:procedure MyMetod; virtual; abstrat; Основное предназначение абстрактных методов-быть родоначальником иерархий конкретных методов в классах-потомках. В любом классе содержатся два специальных метода-конструктор и деструктор. Эти методы содержатся в классе-родоначальнике всех остальных классов-Tobject и,следовательно,наследуются потомками. Как и другие методы,они могут быть изменины в классах-потомках,т.е.перекрыты. В классе Tobject и в большинстве его потомков конструктор и деструктор называются Create и Destroy соответственно. Конструкторы предназначены для создания и инициализации обьекта. Дело в том,что обьект в языке Object Pascal является динамической структурой и переменная-обьект содержит не сами данныые, а ссылку на них. Конструктор распределяет обьект в динамической памяти и присваивает полям обьекта начальные значения. При этом поля порядковых типов в качестве начального значения получают 0, строкового-пустую строку, поля-указатели-значения nil,поля-варианты-Unassigned. Кроме того,конструктор помещает ссылку на созданный обьект в переменную Self,которая автоматически обьявляется в классе. Из сказанного следует,что обращение к полям, свойствам и методам обьекта должно осуществляться только после вызова конструктора. Деструктор освобождает динамическю память и разрушает обьект. Для обьявления конструктора и деструктора используются зарезервированные слова constructor и destructor соответственно. Например:

type

Tsample = classText: string;

constructor Create;

destructor Destroy;

end;

Для того,чтобы создать обьект,необходимо применить метод-конструктор к классу обьекта: varMyObject : TSample;

begin

MyObject := TSample.Create;

end;

Если создается класс-потомок и при его создании планируется осуществить некоторые дополнительные действия,отсутствующие у класса-родителя, то в конструкторе класса-потомка следует сначала вызвать конструктор своего родителя, а уже потом осуществлять дополнительные действия. Вызвать любой перекрытый метод родительского класса можно при помощи зарезервированного слова inherited(унаследованный). Например, если в классе TDescedant имеется свой собственный конструктор typeTDescedant = class(TBase)FMark : Boolean;

constructor Create(Mark: Boolean);

end;

то его реализация могла бы быть такой: constructor TDescedant.Create(Mark:Boolean);

begin

inherited Create;

Emark := Mark;

end;

где вызов родительского конструктора осуществляется оператором inherited Create; а оператор Emark := Mark; Осуществляет дополнительные действия. Кроме деструктора Destroy,в базовом классе Tobject определен метод Free, который прежде проверяет, был ли обьект на самом деле реализован и только потом вызывает метод Destroy. Если обьект не был создан конструктором, то обращение к деструктору,приведет к генерации исключительной ситуации. Следовательно,для уничтожения ненужного обьекта удобнее использовать метод Free, например: MyObject.Free; В классе могут быть определены методы, которые могут вызываться без создания и инициализации обьекта. Эти методы называются методами класса,и для их обьявления используется зарезервированное слово class. Например:

type

TChildClass = class(Tobject)

class function ChildClassInfo: string;

end;

vary: string;

begin

y := ChildClassInfo;

end;

Как правило, методы класса предназначены для справочной информации о классе-имени класса, предке класса, размере класса и т.д.

Применение dbExpress при разработке приложений БД в Delphi

DbExpress разработан как эффективное средство доступа  к данным, несущее  ми нимальные непроизводительные затраты. Для этого  dbExpress использует односторон ние наборы данных (unidirectional dataset).

Односторонние наборы данных

Суть односторонних наборов данных  заключается в том,  что  они  не буферизируют данные при  навигации или  модификации. В отличие от используемых в BDE двухсто ронних наборов данных с буферизацией в оперативной памяти, односторонние наборы отличаются большей эффективностью, но обладают и некоторыми ограничениями:

•   Односторонние наборы данных  обладают  всего  лишь  двумя навигационными методами:  First() и  Next().  Попытка  вызова   иных   методов,  например Last() или Prior(), приведет к исключению.

•   Данные односторонних наборов нельзя  редактировать, поскольку  для них  не выделяется буфер,  пригодный для редактирования. Обратите внимание: если данные  необходимо редактировать, то применяются другие компоненты (TClientDataset и TSQLClientDataset), рассматриваемые далее.

•    Односторонние наборы данных не поддерживают фильтрацию, поскольку от

сутствие буфера не позволяет создавать набор  для нескольких записей.

•   Односторонние наборы данных не поддерживают подстановочные поля.

DbExpress против Borland Database Engine (BDE)

По сравнению с BDE, dbExpress обладает некоторыми преимуществами. Рассмот

рим их кратко.

В отличие от BDE, средства dbExpress не расходуют  ресурсы  сервера на хранение метаданных внешних запросов.Кроме того,  при работе с dbExpress расходуется меньше  ресурсов  клиента, так как при  использовании односторонних курсоров отсутствует  кэширование данных.  При этом  метаданные на стороне клиента также  не кэшируются, поскольку  доступ к ним осуществляется через процедуры интерфейса DLL.

В отличие от BDE, в dbExpress не создаются внутренние запросы для таких  задач, как навигация и обращение к данным  типа BLOB. Благодаря этой  особенности средст ва dbExpress во время  выполнения приложений работают намного эффективнее, по скольку на сервере обрабатываются лишь пользовательские запросы. Другими  слова ми, dbExpress намного проще BDE.

Основные компоненты технологии dbExpress.

Использование dbExpress при разработке межплатформенных приложений

Главным преимуществом dbExpress является возможность переноса приложений с платформы Windows  (Delphi 6) на платформу  Linux  (Kylix). Разработанное в Delphi приложение, в котором используются компоненты CLX, может  быть откомпилирова но в Kylix и работать в среде Linux.  Фактически средства dbExpress взаимодействуют с серверами, не зависящими от типа платформы (например MySQL или InterBase).

НА ЗАМЕТКУ

На момент написания этой книги в dbExpress была реализована поддержка MySQL версии 3.22. Тем не менее, после обновления соответствующей библиотеки DLL в Delphi 6 можно работать и с более поздней версией 3.23 На данный момент вBorland ведутся работы по обновлению этой библиотеки.

Компоненты dbExpress

Все  компоненты  dbExpress  расположены  во  вкладке  dbExpress  палитры  компо

нентов.

Компонент TSQLConnection

Тому,  кто  раньше разрабатывал приложения с использованием BDE,  компонент класса TSQLConnection покажется очень  похожим на компонент класса TDatabase. И  в самом  деле —  оба  эти  компонента инкапсулируют методы  подключения к базам данных.  Именно через компонент TSQLConnection наборы данных  dbExpress осуще ствляют доступ к серверу.

Объекты  класса   TSQLConnection используют   два   конфигурационных  файла: dbxdrivers.ini и dbxconnections.ini. При  установке эти файлы размещаются в каталоге \Program Files\Common Files\Borland Shared\DbExpress. Файл  dbx- drivers.ini содержит перечень всех  драйверов, поддерживаемых dbExpress, и их специфические параметры. Файл  dbxconnections.ini содержит перечень так  на зываемых именованных соединений (named connections), которые по сути аналогичны псевдонимам(alias)  BDE. В этом  же файле хранятся и параметры, специфические для каждого  именованного соединения. Во время  выполнения приложения установлен ный  по  умолчанию  файл  dbxconnections.ini можно  не  использовать. Для  этогосвойству  TSQLConnection.LoadParamsOnConnect необходимо присвоить значение

True. Соответствующий пример будет рассмотрен немного позднее.

Для подключения к базе данных компонент TSQLConnection использует соответ 

ствующий драйвер dbExpress, указанный в файле dbxdrivers.ini.

Методы и свойства класса TSQLConnection достаточно полно описаны в интерак 

тивной  справочной  системе.  Как  обычно,  за  более  подробной  информацией  реко

мендуем обратиться к интерактивной справочной системе, а в этой книге  рассмотрим только  процесс подключения к базе данных и создание нового соединения.