Редактор компонентов и свойств Delphi
(1) Предисловие
В этой статье будет использован пример для описания разработки компонентов и редактора свойств.
Пример (TdsWaitDialogEx) представляет собой визуальный компонент, который отображает диалоговое окно после вызова его метода show.
Он содержит TAnimate, два подсказки (т.е. TLabel) и индикатор выполнения (TGauge).
Свойства перечисления: DialogStyle, AViposition.
Свойства записи: Параметры
Объект коллекции свойств наследуется от TPersistent. В этом примере коллекция свойств AVISource содержит TAnimate.
Свойства анимации CommonAVI, FileName
Редактор свойств применяется со свойством FileName AVISource, то есть при редактировании появляется строковое имя файла.
TOpenDialog, его фильтрующий фильтр — *.avi.
(2) Пакет компонентов dsDlgPack.dpk
Чтобы облегчить публикацию, установку и т. д., необходимо использовать пакет компонента .dpk.
В версиях после Delphi6 (насчет версий до D5 я не знаю) есть несколько файлов, которые Delphi не выпустила, например PROxies.
Если эти файлы используются при установке компонента, вы можете обойти эти файлы и использовать пакет, который их содержит.
В этом примере редактор свойств использует файл DesignEditors, а файл Proxies требуется в DesignEditors, поэтому этот компонент публикуется.
Пакет (.dpk) содержит designide, который решает проблему отсутствия прокси, поэтому установка компонента пройдет успешно.
пакет dsDlgPack;
...
требует
ртл,
ВКЛ,
ВклСмп,
дизайн;
содержит
dsDlgWaitEx в 'dsDlgWaitEx.pas' {DlgWaitEx},
dsDlgWaitExReg в «dsDlgWaitExReg.pas»;
конец.
(3) Файл регистрации компонента dsDlgWaitExReg.pas.
Вопрос: Почему нам нужно чаще использовать такой файл? Потому что:
Если код в dsDlgWaitExReg.pas объединен с dsDlgWaitEx.pas, хотя designide включен в dsDlgPack.dpk
Решена проблема отсутствия прокси-серверов при установке компонента, но проблема отсутствия прокси-серверов по-прежнему возникает, когда приложение вызывает этот компонент.
Поскольку файлы прокси необходимы в DesignEditors, следующий код формируется в отдельный файл, и приложение вызывает эту группу;
Файлу не требуется использовать dsDlgWaitExReg.pas, и он может без проблем обходить прокси.
модуль dsDlgWaitExReg;
интерфейс
использует классы, диалоги, формы, dsDlgWaitEx, DesignIntf, DesignEditors;
тип
TdsAVIFileNameProperty = class(TStringProperty) //Редактор свойств использует файл DesignEditors
общественный
функция GetAttributes: TPropertyAttributes;override //Переопределение метода;
процедура Edit;override; //переопределение метода
конец;
процедура Регистр;
выполнение
процедура Регистр;
начинать
//Зарегистрируйте этот компонент на странице компонента Delisoft
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
//Зарегистрируйте этот редактор свойств
RegisterPropertyEditor (TypeInfo (строка), TdsAVISource, 'FileName', TdsAVIFileNameProperty);
конец;
{TdsAVIFileNameProperty}
функция TdsAVIFileNameProperty.GetAttributes: TPropertyAttributes;
начинать
результат:=[paDialog];
конец;
процедура TdsAVIFileNameProperty.Edit;
начинать
с помощью TOpenDialog.Create(приложение) сделайте
пытаться
Фильтр:='Файлы AVI(*.avi)|*.avi|Все файлы(*.*)|*.*';
если «Выполнить», то SetStrValue(FileName);
окончательно
бесплатно;
конец;
конец;
конец.
(4) Файл компонента dsDlgWaitEx.pas
модуль dsDlgWaitEx;
{Определите все свойства и методы этого компонента; свойство BorderStyle формы TDlgWaitEx — bsDialog. В этом примере компонент TdsDlgWaitEx использует форму TDlgWaitEx; объект свойства AVISource использует TdsAVISource, который непосредственно унаследован от TPersistent, и свойств перечисления. используются (DialogStyle, AVIPosition) и свойства записи (Options) и т. д.
}
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, StdCtrls, Датчики, ComCtrls;
тип
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = набор (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText);
TDlgWaitEx = класс (TForm)
Анимация1: ТАнимэйт;
Датчик1: TGauge;
Метка1: TLabel;
Метка2: TLabel;
процедура FormClose (Отправитель: TObject; вар Действие: TCloseAction);
частный
FCloseAfter: DWord;
FUserFormClose: TCloseEvent;
общественный
свойство UserFormClose: TCloseEvent чтение FUserFormClose запись FUserFormClose;
свойство CloseAfter: DWORD чтение FCloseAfter запись FCloseAfter;
конец;
TdsAVISource = класс (TPersistent)
частный
ФCommonAVI: TCommonAVI;
FFileName: строка;
процедура SetCommonAVI (константное значение: TCommonAVI);
процедура SetFileName (константное значение: строка);
защищенный
общественный
опубликовано
свойство CommonAVI: TCommonAVI чтение FCommonAVI запись SetCommonAVI по умолчанию aviNone;
свойство FileName: чтение строки FfileName запись SetFileName;
конец;
TdsWaitDialogEx=класс(TComponent)
частный
//Форма
FDlgForm:TDlgWaitEx;
FMessage1: строка;
FMessage2: строка;
FMessage1Font:TFont;
FMessage2Font:TFont;
FCaption: строка;
FDislogStyle:TDialogStyle;
FwordWrap:логическое значение;
FOptions:TDlgOptions;
FShowMessage1, FShowMessage2: логическое значение;
//АВИ
ФавиПозиция: ТАВИПозиция;
FAviActive:логическое значение;
FshowAVI:логическое значение;
ФАВИСурце: ТдсАВИСурце;
//прогресс
FProgressMax: целое число;
FProgressMin: целое число;
FProgressPos: целое число;
FProgressStep: целое число;
ФШовПрогресс: логическое значение;
Фшоупрогресстекст: логическое значение;
//Событие
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
процедура SetProgressMax(const Value: целое число);
процедура SetProgressMin(const Value: целое число);
процедура SetProgressPos (const Value: целое число);
процедура SetProgressStep (const Value: целое число);
процедура DrawForm;
функция setLableHeight(sCaption:string):integer;
процедура setOptions (константное значение: TDlgOptions);
процедура setMessage1 (константное значение: строка);
процедура setMessage2 (константное значение: строка);
процедура setCaption (константное значение: строка);
процедура SetMessage1Font (константное значение: TFont);
процедура SetMessage2Font (константное значение: TFont);
функция IsMessage1FontStored: Boolean;
функция IsMessage2FontStored: Boolean;
процедура setAVIPosition(const Value: TAVIPosition);
процедура SetAVISource (const Value: TdsAVISource);
процедура SetOnFormHide (const Value: TCloseEvent);
защищенный
процедура DoPosChange виртуальная;
процедура DoShow виртуальная;
общественный
конструктор Create (AOwner: TComponent override);
деструктор Уничтожить;
процедура FormShow;
процедура FormHide;
процедура FormUpdate;
процедура ProgressStepIt;
опубликовано
//Форма
свойство Message1: чтение строки FMessage1 запись setMessage1;
свойство Message2: чтение строки FMessage2 запись setMessage2;
свойство Message1Font: TFont читает FMessage1Font запись SetMessage1Font сохраняется IsMessage1FontStored;
свойство Message2Font: TFont читает FMessage2Font запись SetMessage2Font сохраняется IsMessage2FontStored;
свойство Caption: чтение строки FCaption запись setCaption;
свойство DislogStyle:TDialogStyle чтение FDislogStyle запись FDislogStyle;
свойство wordWrap :boolean чтение FwordWrap запись FwordWrap;
Параметры свойства:TDlgOptions чтение FOptions запись setOptions;
//АВИ
свойство AviActive: логическое чтение FAviActive запись FAviActive;
свойство AviPosition: TAVIPosition чтение FaviPosition запись setAVIPosition;
свойство AviSource: TdsAVISource чтение FAVISource запись SetAVISource;
//Прогресс
свойство ProgressMax: чтение целого числа FProgressMax, запись SetProgressMax;
свойство ProgressMin: чтение целого числа FProgressMin запись SetProgressMin;
свойство ProgressPos: чтение целого числа FProgressPos запись SetProgressPos;
свойство ProgressStep: чтение целого числа FProgressStep запись SetProgressStep;
//Событие
свойство OnPosChange: TNotifyEvent чтение FOnPosChange запись FOnPosChange;
свойство OnShow: TNotifyEvent чтение FOnShow запись FOnShow;
свойство OnHide: TCloseEvent чтение FOnFormHide запись SetOnFormHide;
конец;
выполнение
{$R *.DFM}
{TdsAVISource}
процедура TdsAVISource.SetCommonAVI (константное значение: TCommonAVI);
начинать
если Value = FCommonAVI, то выходим;
FCommonAVI := Значение;
FfileName:='';
конец;
процедура TdsAVISource.SetFileName(const Value: string);
начинать
если Значение = FfileName, то выходим;
FfileName:=значение;
FCommonAVI:=aviNone;
конец;
{TdsWaitDialogEx}
процедура TdsWaitDialogEx.DoShow;
начинать
если назначено(FOnShow), то FOnShow(Self);
конец;
процедура TdsWaitDialogEx.DoPosChange;
начинать
если Назначено(FOnPosChange), то FOnPosChange(Self);
конец;
процедура TdsWaitDialogEx.SetAVISource(const Value: TdsAVISource);
начинать
если FAVISource=значение, то выйти;
FAVISource.Assign(значение);
если (FAVISource.FFileName='') и (FAVISource.FCommonAVI=aviNone), то FshowAVI:=false;
если назначено (FDlgForm), то
начинать
FDlgForm.Animate1.Active:=false;
FDlgForm.Animate1.FileName := '';
FDlgForm.Animate1.CommonAVI := aviNone;
если FshowAVI, то
начинать
если FAVISource.FfileName='', то
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
еще
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
конец;
DrawForm; //Animate1->После изменения AVI размер Animate1 может измениться ==> DrawForm;
ФДлгФорм.Обновление;
конец;
конец;
функция TdsWaitDialogEx.IsMessage1FontStored: Boolean;
начинать
с FMessage1Font сделать
Результат :=
(Имя <> 'MS Sans Serif') или
(Стиль <> []) или
(Размер <> 8) или
(Цвет <> clWindowText) или
(Кодировка <> DEFAULT_CHARSET) или
(Питч <> fpDefault);
конец;
функция TdsWaitDialogEx.IsMessage2FontStored: Boolean;
начинать
с FMessage2Font сделать
Результат :=
(Имя <> 'MS Sans Serif') или
(Стиль <> []) или
(Размер <> 8) или
(Цвет <> clWindowText) или
(Кодировка <> DEFAULT_CHARSET) или
(Питч <> fpDefault);
конец;
процедура TdsWaitDialogEx.SetMessage1Font(const Value: TFont);
начинать
FMessage1Font.Assign(значение);
если назначено (FDlgForm), то
начинать
FDlgForm.Label1.Font.Assign(значение);
ФДлгФорм.Обновление;
конец;
конец;
процедура TdsWaitDialogEx.SetMessage2Font(const Value: TFont);
начинать
FMessage2Font.Assign(значение);
если назначено (FDlgForm), то
начинать
FDlgForm.Label2.Font.Assign(значение);
ФДлгФорм.Обновление;
конец;
конец;
процедура TdsWaitDialogEx.setCaption (константное значение: строка);
начинать
если значение=FCaption, то выходим;
FCaption:=значение;
если нет (showCaption в FOptions), то
начинать
FCaption:='';
Выход;
конец;
если назначено (FDlgForm), то
начинать
FDlgForm.Caption := значение;
FDlgForm.обновление;
конец;
конец;
процедура TdsWaitDialogEx.setMessage1 (константное значение: строка);
вар я: целое число;
начинать
если значение = FMessage1, то выходим;
FMessage1:=значение;
если назначено (FDlgForm), то
начинать
если нет (showMessage1 в FOptions), то выходим;
FDlgForm.Label1.Caption := значение;
я:=setLableHeight(FMessage1)+13;
если i<>FDlgForm.Label1.Height, то DrawForm;
FDlgForm.обновление;
конец;
конец;
процедура TdsWaitDialogEx.setMessage2 (константное значение: строка);
вар я: целое число;
начинать
если значение=FMessage2, то выходим;
FMessage2:=значение;
если назначено (FDlgForm), то
начинать
если нет (showMessage2 в FOptions), то выходим;
FDlgForm.Label2.Caption := значение;
я:=setLableHeight(FMessage2)+13;
если i<>FDlgForm.Label2.Height, то DrawForm;
FDlgForm.обновление;
конец;
конец;