Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

30.3. Пример использования запросов в Delphi

Сформируем форму так, как это показано на рис.30.1, и напишем обработчики событий создания формы и нажатия кнопки «Выполнить» следующим образом:

Procedure TForm1.FormCreate(Sender:TObject); Begin // Связь в БД определяется в файле DB1.udl

ADOConnection1.ConnectionString:=’File Name=DB1.udl’; ADOConnection1.Open; // Открываем соединение с БД

// Связываем компоненты доступа и управления БД

ADOQuery1.Connection:=ADOConnection1;

DataSource1.DataSet:=ADOQuery1;

DBGrid1.DataSource:=DataSource1;

End;

Procedure TForm1.Button1Click(Sender:TObject); Begin

// Закрываем активный запрос

If ADOQuery1.Active then ADOQuery1.Close; ADOQuery1.SQL.Clear; // Очищаем текст запроса ADOQuery1.SQL.Add(’Select * From TSpis;’); // Записываем запрос

// Выполняем запрос и выводим результат запроса в DBGrid1.

ADOQuery1.Open;

End;

ADOConnection1

ADOQuery1

DataSource1

DBGrid1

Button1

Рис.30.1. Форма с компонентами для работы с запросами

31.СОЗДАНИЕ СОБСТВЕННЫХ КОМПОНЕНТОВ

Всостав Delphi входит более 450 стандартных компонентов. Но иногда возникает необходимость усовершенствовать некоторые компоненты или создать свои новые компоненты. Все компоненты должны являться наследниками класса TComponent.

ВDelphi можно создать заготовку для нового компонента, пройдя путь:

153

File New Component или Component NewComponent

После этого на экране появляется окно, в котором нужно определить:

наследуемый класс (Ancestor Type);

имя нового класса (Class Name);

имя странички палитры компонентов (Paletter Page);

место расположения файла с модулем нового компонента.

Врезультате получаем заготовку модуля Unit c процедурой регистрации компонента. Остается только дополнить этот модуль новыми возможностями и установить его, пройдя путь:

Component Install Component

В итоге в палитре компонентов Delphi появится новый компонент.

Для нового компонента можно создать свой значек, войдя в графический редактор: Tools Image Editor. В нем нужно создать компонентный ресурсный файл: File New Component Resource File, в котором задать растровое изображение значка размером 24 х 24 пикселя с палитрой из 16 цветов: Resource New BitMap. Далее нужно назвать новый ресурс именем класса компонента, причем используя только прописные буквы, затем сохранить ресурсный файл с именем модуля, описывающего компонент, и расширением «.dcr». При регистрации нового компонента ему будет автоматически присвоен новый значок.

Рассмотрим пример создания нового компонента – наследника класса TListBox, который будет поддерживать табуляцию строк. Табуляция строк нужна для разбивки содержимого строк на колонки, начинающиеся с определенной позиции в строке. Например, мы хотим вывести в виде таблицы фамилии и должности сотрудников. Фамилии, допустим, будут начинаться с 5–й позиции в строке, а должности – с 40–й. Стандартный компонент TListBox не поддерживает табуляцию, и так как фамилии имеют разное количество символов, в таблице названия должностей будут начинаться с разных позиций, что затрудняет ее восприятие.

Вновом компоненте предлагается в строки, помещаемые в новый LisBox, записывать между словами символы табуляции (код #09) и в класс компонента ввести новое свойство STabStop типа TStrings, в которое будем записывать в каждой ее строке номера позиций табуляции.

Врезультате получим компонент, который из таблицы

Иванов Инженер

Сидоренко Техник

Там Технолог позволит получить более воспринимаемую таблицу:

Иванов Инженер

Сидоренко Техник

Там Технолог

154

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

Реализация такого компонента приведена ниже: unit Ulistmy;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TListmy = class(TListBox) // Имя нового класса – TListMy private

FfTabStop:TStrings; // Поле для хранения позиций табуляции // Метод задания позиций табуляции

Procedure SetTabStop(value:Tstrings); protected

public

Atabstop:Array[1..20] of integer; // Массив значений позиций табуляции

//Новый метод создания окна компонента

Procedure CreateWnd; override;

//Новый метод определения параметров окна компонента

Procedure CreateParams(var Params:TcreateParams);override;

//Новый конструктор компонента с выделением дополнительной памяти constructor create(Aowner:TComponent);override;

//Новый деструктор по освобождению памяти

Destructor Destroy;override;

// Метод задания компоненту массива значений позиций табуляции

Procedure tabset; Published

// Определяем новое свойство STabStop, доступное на этапе проектирования property STabStop:Tstrings read FfTabstop write SetTabStop;

end;

procedure Register; // Метод регистрации компонента implementation

procedure Register; begin

//Регестрируем новый компонент ListMy на страничке Samples

RegisterComponents('Samples', [TListmy]); end;

//Метод записи значений в свойство STabStop

Procedure Tlistmy.SetTabStop(value:TStrings); Begin

ffTabStop.Assign(value); // Запись значений в поле FFTabStop tabset; // Устанавливаем в компоненте новую табуляцию Invalidate; // Перерисовываем компонент

end;

155

Procedure TListmy.CreateParams(var Params:TCreateParams);

Begin

//Вызываем наследуемый метод задания параметров компонента inherited CreateParams(Params);

with Params do Begin

//Изменяем стиль окна нового компонента, разрешаем табуляцию

Style:=Style or $80{Lbs_Usetabstops};

end;

end;

Procedure Tlistmy.CreateWnd; var i,j,err:integer;s:String; Begin

//Вызываем наследуемый метод создания окна

Inherited CreateWnd;

tabset; // Устанавливаем табуляцию для нашего окна

end;

Procedure Tlistmy.Tabset; var i,j,err:integer;s:string; Begin

//Проверяем наличие строк, задающих позиции табуляции в FFTabStop if fFTabStop.count>0 then Begin

//Открываем цикл переписи позиций табуляции из FFTabStop в ATabStop for i:=1 to fFtabstop.count do Begin

s:=Fftabstop.strings[i-1];

val(s,j,err); // Переводим строку s в число j

if err<>0 then Atabstop[i]:=0 else

//Записываем позиции табуляции в ATabStop с учетом того, что ширина одного

//символа равна четырем базовым единицам Windows

Atabstop[i]:=j*4;

end;

end else Begin Atabstop[1]:=0; end;

// Посылаем сообщение окну нового компонента, устанавливающее табуляцию

SendMessage(Handle,LB_SetTabStops,

Fftabstop.count,Longint(@Atabstop));

end;

Constructor Tlistmy.Create(Aowner:Tcomponent); Begin

inherited Create(Aowner); // Вызываем наследуемый конструктор Create

//Выделяем память под список позиций табуляции

Fftabstop:=Tstringlist.create;

end;

Destructor Tlistmy.Destroy; Begin

156