Delphi 7:从组件源代码访问设计器

时间:2014-06-04 10:58:29

标签: delphi ide 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 个答案:

答案 0 :(得分:2)

  

我知道如何创建自定义属性或组件编辑器,然后从那里调用IDesigner.Modified。但是,在这种情况下,这不是我想要的。因为所有数据库感知组件都使用字段名称的简单下拉列表。我不想改变它,所以我不想注册新的属性编辑器或组件编辑器。我想要的只是调用设计师的修改方法。但是如何?

我担心您需要将任何引用IDE设计器的代码放入单独的设计时包中。规则是使用ToolsAPI的设计时代码不得存在于运行时包中。它必须分成设计时间包。

我认为,属性编辑器是解决问题的最佳方法。