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 не должно существовать в пакете времени выполнения. Он должен быть разделен на пакет времени проектирования.

Я думаю, что редактор свойств - лучший способ решить вашу проблему.

Другие вопросы по тегам