Delphi 7: дизайнер доступа из исходного кода компонента
Пример компонента:
unit LDBCheckBox;
interface
uses
Classes,DbCtrls,Db;
type
TLDBCheckBox=class(TDBCheckBox)
private
FImmediateUpdate : boolean;
function GetDataField: string;
procedure SetDataField(const Value: string);
protected
procedure Click; override;
public
constructor Create(AOwner: TCOmponent);override;
published
property ImmediateUpdate : boolean
read FImmediateUpdate write FImmediateUpdate
stored true default true;
property DataField: string
read GetDataField write SetDataField;
end;
procedure Register;
implementation
uses
LDbUtils, DesignIntf;
procedure Register;
begin
RegisterComponents('LDb',[TLDBCheckBox]);
end;
constructor TLDBCheckBox.Create(AOwner: TCOmponent);
begin
inherited Create(AOwner);
FImmediateUpdate := true;
ValueChecked := '1';
ValueUnchecked := '0';
end;
procedure TLDBCheckBox.Click;
begin
if ImmediateUpdate then
if CanModifyField(self.Field,self.DataSource) then
if DoAutoEdit(self.DataSource) then
begin
if self.Checked
then SetFieldValue(Field,self.ValueChecked)
else SetFieldValue(Field,self.ValueUnChecked)
end;
inherited Click;
end;
function TLDBCheckBox.GetDataField: string;
begin
Result := inherited DataField;
end;
procedure TLDBCheckBox.SetDataField(const Value: string);
begin
inherited DataField := Value;
if Assigned(Field) then
if Field.DisplayLabel <> '' then
begin
self.Caption := Field.DisplayLabel;
if csDesigning in ComponentState then
GetDesigner.Modified;
end;
end;
end.
(Пожалуйста, игнорируйте функции CanModifyField, DoAutoEdit и SetFieldValue - вы можете представить, что они делают.)
Мне не хватает части "GetDesigner.Modified". Там я должен иметь доступ к текущему конструктору компонентов и вызывать его метод Modified. Это необходимо для того, чтобы среда IDE обновила значение свойства Caption. Но как мне получить экземпляр IDesigner для свойства? Есть ли способ для этого?
КСТАТИ. Я знаю, как создать собственное свойство или редактор компонентов, а затем вызвать IDesigner.Modified оттуда. Однако это не то, что я хочу в этом случае. Потому что все компоненты, работающие с базой данных, используют простые выпадающие списки для имен полей. Я не хочу это менять, поэтому я не хочу регистрировать новый редактор свойств или редактор компонентов. Все, что я хочу, это вызвать модифицированный метод дизайнера. Но как?
1 ответ
Я знаю, как создать собственное свойство или редактор компонентов, а затем вызвать IDesigner.Modified оттуда. Однако это не то, что я хочу в этом случае. Потому что все компоненты, работающие с базой данных, используют простые выпадающие списки для имен полей. Я не хочу это менять, поэтому я не хочу регистрировать новый редактор свойств или редактор компонентов. Все, что я хочу, это вызвать модифицированный метод дизайнера. Но как?
Боюсь, что вам нужно будет поместить любой код, который ссылается на дизайнера IDE, в отдельный пакет времени разработки. Правила таковы, что временный код разработки ToolsAPI
не должно существовать в пакете времени выполнения. Он должен быть разделен на пакет времени проектирования.
Я думаю, что редактор свойств - лучший способ решить вашу проблему.