С момента изучения Delphi в 1999 году я был очарован его быстрым развитием. В то время я только познакомился с программированием и особенно интересовался визуальной разработкой. Причина в том, что его можно реализовать быстрее, чем C. За последние несколько лет, от Delphi C/S до трехуровневого B/S, я также написал некоторое программное обеспечение, большое и маленькое. Я думаю, что этот Delphi имеет только эти функции. Недавно я получил книгу «Теория сущности Com» и изучил исходный код VCL, только чтобы обнаружить, что он действительно мощный (я не знаю, какие слова использовать, чтобы описать его). В последнее время здесь есть некоторые прорывы. Пожалуйста, сообщите мне, если есть какие-либо ошибки.
Грубо говоря, компоненты включают в себя только два типа членов: свойства и методы (методы, о которых я говорю, включают события).
Он разделен на четыре части:
Частный
защищенный
общественный
опубликовано
Значение вышеупомянутых четырех частей будет описано в общих книгах по визуальной разработке. Здесь представлен лишь краткий обзор Delphi.
Частный: все частные члены размещаются здесь, и к ним можно получить доступ только собственными методами класса, а не подклассами, и они прозрачны для подклассов. Также можно сказать, что доступ к нему возможен только методами самого модуля.
защищенный: за исключением того, что он может наследоваться подклассами, в остальном то же самое, что и частный. Доступ посторонних невозможен.
public: Public, свойства и методы, объявленные здесь, могут вызываться пользователями.
опубликовано: отображается на панели свойств среды разработки Delphi.
Для начала давайте сделаем простейший элемент управления. Менее чем за пять минут вы поймете, как устроены компоненты на панели компонентов Delphi.
Создать->Новый->Компонент и нажмите Enter.
Затем выберите родительский класс, от которого вы хотите наследовать, в типе предка: Здесь мы выбираем TComponent. Это означает наследование всех свойств и методов TComponent.
Имя класса: введите имя класса изготавливаемого компонента. (Вводим TShowText)
Страница палитры: на какой панели в Delphi будет установлен компонент. (Выбираем Образцы, также можно ввести новое имя)
Мне не нужно говорить следующее.
Нажмите кнопку «ОК», и Delphi автоматически сгенерирует базовый элемент управления, унаследованный от TComponent. Также можно понять, что мы разработали такой же мощный элемент управления, как TComponent, но это не то, что нам нужно.
Ниже объясняются методы чтения и записи частных переменных самого компонента:
Например, мы написали следующий короткий абзац:
частный
Фтекст: строка;
....
/*Приватные переменные не могут использоваться внешним миром, так как же мы можем работать с этой строковой переменной FText? */
Нам также нужно добавить этот абзац после «Опубликовано»:
свойство Text: чтение строки FText запись FText;
Здесь это означает, что это свойство Text появится на панели свойств delphiSDK. Пользователи, изменяющие текст на панели свойств, фактически изменяют строковую переменную FText. read означает, что пользователь читает свойство Text и фактически читает FText. Write, конечно, означает, что пользователь присваивает значение Text и сохраняет его в строковой переменной FText.
Если вы сохраните его сейчас и установите в Delphi, то наш самый основной компонент будет готов. (Метод установки компонентов представлен в конце)
Хаха, не правда ли, это очень просто? Просто никакого конкретного применения наш компонент не имеет.
Мы только что представили здесь атрибуты, теперь мы продолжим добавлять функции для ознакомления с использованием методов.
Мы добавляем следующее после Public:
процедура ПоказатьТекст();
Затем нажмите Ctrl+Alt+C, система автоматически добавит для вас код реализации некоторых методов.
Далее пишем:
процедура TShowText.ShowText();
начинать
ПоказатьСообщение(ФТекст);
конец;
Как видите, показанное выше сообщение ShowMessage отображает значение частной переменной класса. Теперь вы должны понимать, что доступ к частным переменным возможен только в методе самого класса. Здесь необходимо добавить модуль «Диалоги» после использования, поскольку ShowMessage включен в модуль «Диалоги», иначе он не пройдет.
Конечно, вышеуказанные события можно использовать только в элементе управления и не могут появляться на панели событий в поле свойств. Почему? Потому что объявленный здесь метод является только Public, чистым методом и не объявлен как событие.
Благодаря приведенному выше исследованию вы уже знаете, как писать и настраивать свойства и методы элементов управления?
Однако настоящий контроль неотделим от событий, и вызов событий должен управляться сообщениями, о которых будет рассказано в моей следующей статье.
Свойства и методы мощного контроля не так просты. Это требует больше практики и большего количества применений.
Ниже прикреплен написанный мною элемент управления DBGridToExcel, функция которого заключается в экспорте данных из DBGrid в Excel. Вы можете извлечь из него уроки и использовать их в качестве справочного материала. Этот контроль включает в себя использование свойств, методов и «событий», о которых мы поговорим в следующей статье.
Приложение 1: Как установить самодельные элементы управления:
(1) В меню «Компонент» выберите «Установить компонент...».
(2). Нажмите «...» после имени файла модуля, выберите файл модуля элемента управления «*.pas» и нажмите «ОК». В появившемся окне нажмите «Установить», и установка завершена.
Недавно установленный элемент управления появится на вашей панели.
Приложение 2: Скопируйте весь исходный код элемента управления TDBGridToExcel в Блокнот и сохраните его как файл .pas.
модуль DBGridToExcel;
{************************************************ ***** ************************}
{* *}
{* Экспорт сетки в элемент управления Word VCL для D5 и D6 *}
{* Copyright(C) xiangding 2003.10.1. Все права защищены *}
{* Отчет об ошибке: [email protected] *}
{* Автор: Медвежонок*}
{* *}
{************************************************ ***** ************************}
{* *}
{* Это простая версия *}
{* *}
{************************************************ ***** ************************}
{* *}
{* Установить: *}
{* Сохраните файл GridToExcel.pas, затем откройте его *}
{* Нажмите пункт меню [Компонент] --> [Установить компонент] *}
{* Нажмите кнопку [Установить] в диалоговом окне «Установка компонента» *}
{* после установки вы можете найти элемент управления в компоненте *}
{* страница [пример] *}
{* *}
{************************************************ ***** ************************}
{* *}
{* Установить: *}
{* Сохраните вложение, а затем откройте файл GridToExcel.Pas с помощью Delphi, *}
{* Выберите меню Delphi --> Компонент --> Установить компонент, *}
{* Затем выберите Установить. После установки на странице «Образцы» панели управления *}
{* После того, как вы с ним ознакомитесь, вы можете попробовать установить некоторые сложные атрибуты и изучить остальные самостоятельно, *}
{************************************************ ***** ************************}
интерфейс
использует
Windows, StdCtrls, ComCtrls, Сообщения, DBGrids, Графика, ExtCtrls,
Формы, БД, ComObj, элементы управления, SysUtils, классы;
РесурсСтрока
SPromptExport = 'Пожалуйста, подождите, данные экспортируются...';
SConnectExcel = 'Excel запускается, подождите...';
SConnectExcelError= 'Не удалось подключиться к Excel. Возможно, Excel не установлен и не может быть экспортирован.';
SCancel = '&Отмена';
SError = 'ошибка';
SConfirm = 'Вы действительно хотите прекратить экспорт данных? ';
SCaption = 'Подтвердить';
SGridError = 'Набор данных не указан, укажите элемент управления набором данных! ';
тип
TDBGridToExcel = класс (TComponent)
частный
Форма Прогресса: TForm;
ФШовПрогресс: логическое значение;
ExcelApp: вариант;
FTitle: Строка;
Выход: логическое значение;
FOnProgress: TNotifyEvent;
FGrid: TDBGrid {Исходная сетка}
ПрогрессБар: ТПрогрессБар;
Подсказка: TLabel;
FAutoExit: логическое значение;
FAutoSize: логическое значение;
ФДБГрид: ТДБГрид;
процедура SetShowProgress (const Value: Boolean);
процедура CreateProgressForm;
процедура ButtonClick (Отправитель: TObject);
Функция ConnectToExcel: логическое значение;
процедура ExportDBGrid;
{Частные заявления}
защищенный
{ Защищенные объявления }
общественный
Конструктор Create (AOwner: TComponent override);
Переопределение деструктора Destroy();
Процедура ExportToExcel {Экспорт сетки в Excel};
{Публичные заявления}
опубликовано
{ Опубликованные декларации }
свойство DBGrid: TDBGrid чтение FDBGrid запись FDBGrid;
Название свойства: Строка read FTitle write FTitle;
свойство ShowProgress: логическое чтение FShowProgress запись SetShowProgress;
свойство OnProgress: TNotifyEvent чтение FOnProgress запись FOnProgress;
конец;
процедура Регистр;
выполнение
процедура Регистр;
начинать
RegisterComponents('Samples', [TDBGridToExcel]);
конец;
{TDBGridToExcel}
процедура TDBGridToExcel.ButtonClick(Отправитель: TObject);
начинать
Выход: = MessageBox(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption),
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
конец;
функция TDBGridToExcel.ConnectToExcel: логическое значение;
начинать
Результат: = правда;
Пытаться
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.Visible := Ложь;
если Title<>'', то ExcelApp.Caption := Title;
ExcelApp.WorkBooks.Add;
кроме
MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
результат: = ложь;
конец;
конец;
конструктор TDBGridToExcel.Create(AOwner: TComponent);
начинать
унаследованный;
FShowProgress := True; {Значение по умолчанию — «Показать прогресс»}.
FAutoExit := Ложь;
FAutoSize := Истина;
конец;
процедура TDBGridToExcel.CreateProgressForm;
вар
Панель: ТПанель;
Кнопка: ТКнопка;
начинать
если назначено(ProgressForm), то выходим {Уже создано?};
ProgressForm := TForm.Create(Владелец);
С помощью ProgressForm сделайте
начинать
Font.Name := '宋体';
Шрифт.Размер:= 10;
BorderStyle: = bsNone;
Ширина:= 280;
Высота:= 120;
BorderWidth: = 1;
Цвет := clBackground;
Позиция: = poOwnerFormCenter;
конец;
Панель: = TPanel.Create(ProgressForm);
с помощью панели do { Создать панель }
начинать
Родитель: = ProgressForm;
Выровнять: = alClient;
BevelInner := bvNone;
BevelOuter := bvRaising;
Заголовок := '';
конец;
Подсказка: = TLabel.Create(Panel);
с подсказкой do {Create Label}
начинать
Родитель := Панель;
Слева:= 20;
Верх:= 25;
Заголовок: = SConnectExcel;
конец;
ProgressBar:= TProgressBar.Create(панель);
с ProgressBar do { Create ProgressBar }
начинать
Шаг := 1;
Родитель := Панель;
Гладкий := верно;
Слева:= 20;
Верх:= 50;
Высота:= 18;
Ширина:= 260;
конец;
Кнопка: = TButton.Create(Панель);
с кнопкой do {Создать кнопку отмены}
начинать
Родитель := Панель;
Слева:= 115;
Верх:= 80;
Заголовок := SCancel;
OnClick := ButtonClick;
конец;
ПрогрессФорма.Показать;
ПрогрессФорма.Обновление;
конец;
деструктор TDBGridToExcel.Destroy;
начинать
унаследованный;
конец;
процедура TDBGridToExcel.ExportDBGrid;
вар
Данные: Тдатасет;
АДБГрид: ТДБгрид;
я, j: целое число;
CurrentPoint: Указатель;
OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
начинать
Screen.Cursor := crHourGlass;
пытаться
пытаться
TForm(Владелец).Включено:= Ложь;
ExcelApp.DisplayAlerts:= false;
ExcelApp.ScreenUpdating: = false;
Выйти := ложь;
если ShowProgress, то Prompt.Caption := SPromptExport;
ADBGrid := DBGrid;
Данные: = ADBGrid.DataSource.DataSet;
с ADBGrid do {Вставить заголовок таблицы}
для i := 1 до Columns.Count do
если Столбцы[i - 1].Видимый, то
ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;
CurrentPoint := Data.GetBookmark {Сохранить текущую позицию}
OldBeforeScroll := Data.BeforeScroll { Сохранить старый дескриптор события перед прокруткой }
OldAfterScroll := Data.AfterScroll { Сохранить старый дескриптор события AfterScroll };
Data.DisableControls {Отключить управление}
Data.BeforeScroll := ноль;
Data.AfterScroll := ноль;
если ShowProgress, то ProgressBar.Max := Data.RecordCount;
я := 2;
Данные.Первый;
пока не Data.Eof do {Обработать все записи}
начинать
с помощью ADBGrid do {Обработать одну запись}
для j := 1 до Columns.Count do
если Столбцы[j - 1].Видимо, то
ExcelApp.Cells[i,j].Value := Columns[j - 1].Field.DisplayText;
Инк(я);
Данные.Далее;
если назначено(FOnProgress), то FOnProgress(Self);
если ShowProgress, то {Обновить пользовательский интерфейс прогресса}
начинать
ПрогрессБар.СтепИт;
Приложение.ПроцессСообщения;
если выйти, то выйти;
конец;
конец;
кроме
MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
конец;
ExcelApp.Visible := Ложь;
TForm(Владелец).Включено:= Истина;
Screen.Cursor := crDefault;
если ShowProgress, то FreeAndNil(ProgressForm {Форма свободного прогресса});
ExcelApp.DisplayAlerts := True;
ExcelApp.ScreenUpdating := True;
окончательно
Data.BeforeScroll := OldBeforeScroll { Восстановить старый дескриптор события };
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark(CurrentPoint);
Data.FreeBookmark(CurrentPoint);
Данные.EnableControls;
Screen.Cursor := crDefault;
конец;
конец;
процедура TDBGridToExcel.ExportToExcel;
начинать
если DBGrid= nil, тогда вызовите Exception.Create(SGridError {Нет источника данных, затем Ошибка});
если ShowProgress then CreateProgressForm {Показывать или нет ProgressForm};
если не ConnectToExcel, то {Выход при возникновении ошибки}
начинать
если ShowProgress, то FreeAndNil(ProgressForm); {форма выпуска};
Выход;
конец;
ExportDBGrid {начало экспорта данных}
конец;
процедура TDBGridToExcel.SetShowProgress(const Value: Boolean);
начинать
ФШовПрогресс := Значение;
конец;
конец.