Поскольку вы хотели, чтобы свойство Caption было выполнено правильно, ответ Мейсона не сработает, потому что он пропустил вещь csSetCaption, и его предложение о значении default не будет работать, так как и Caption, и ваши свойства строковые типы.
Ниже приведены единицы, которые вы хотите.
Поведение выглядит следующим образом:
- изначально значение свойства Caption будет равно «Комментарии»
- пользователи могут переопределить это во время разработки, установив новое значение
(Если вы не хотите 2., тогда вам нужно назначить свойство Caption в переопределенном методе Loaded, как упомянул Кен; однако из вашего вопроса не было ясно, хотите ли вы этого. Если вы этого хотите, то перефразируйте ваш вопрос.)
Вот как работает код.
Для строковых свойств нельзя указывать систему потоковой передачи любого по умолчанию .
Но вы можете установить начальное значение времени разработки в конструкторе: Caption: = DefaultCustomSpeedButtonCaption;
Для свойства Caption необходимо также отключить назначение свойства Caption по умолчанию (в противном случае ваш компонент автоматически получит заголовок, например «CustomSpeedButton1»).
Эта строка делает это за вас: ControlStyle: = ControlStyle - [csSetCaption];
Наконец, хорошей практикой является разделение регистрации вашего компонента на отдельную единицу.
Это позволяет вам иметь пакет времени разработки, который регистрирует ваши компоненты в IDE, и пакет времени выполнения (или вообще никакого пакета) для использования ваших компонентов в ваших приложениях.
Если у вас есть значок компонента, то вы также загружаете его в блок регистрации (поскольку он необходим только во время разработки).
Рэй Конопка написал отличную книгу по написанию компонентов, которая все еще очень актуальна: Разработка пользовательских компонентов Delphi 3
Как и во многих хороших книгах по Delphi, она не печатается, но вы можете заказать копию в формате PDF на его сайте .
Я не уверен, для чего нужны ваши свойства CommentTitle и CommentText, поэтому я сохранил их в приведенном ниже источнике.
Листинг 1: фактический компонент
unit CustomSpeedButtonUnit;
interface
uses
SysUtils, Classes, Controls, Buttons;
const
DefaultCustomSpeedButtonCaption = 'Comments';
type
TCustomCustomSpeedButton = class(TSpeedButton)
strict private
FCommentText: string;
FCommentTitle: string;
strict protected
procedure SetCommentText(const Value: string); virtual;
procedure SetCommentTitle(const Value: string); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property CommentTitle: string read FCommentTitle write SetCommentTitle;
property CommentText: string read FCommentText write SetCommentText;
end;
TCustomSpeedButton = class(TCustomCustomSpeedButton)
published
// note you cannot use 'default' for string types; 'default' is only valid for ordinal ordinal, pointer or small set type
// [DCC Error] CustomSpeedButtonUnit.pas(29): E2146 Default values must be of ordinal, pointer or small set type
// property Caption default DefaultCustomSpeedButtonCaption;
property CommentTitle;
property CommentText;
end;
implementation
constructor TCustomCustomSpeedButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption := DefaultCustomSpeedButtonCaption;
ControlStyle := ControlStyle - [csSetCaption];
end;
destructor TCustomCustomSpeedButton.Destroy;
begin
inherited Destroy;
end;
procedure TCustomCustomSpeedButton.SetCommentText(const Value: string);
begin
FCommentText := Value;
end;
procedure TCustomCustomSpeedButton.SetCommentTitle(const Value: string);
begin
FCommentTitle := Value;
end;
end.
Листинг 2: регистрация компонента
unit CustomSpeedButtonRegistrationUnit;
interface
procedure Register;
implementation
uses
CustomSpeedButtonUnit;
procedure Register;
begin
RegisterComponents('Standard', [TCustomSpeedButton]);
end;
end.