示例组件:
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。但是,在这种情况下,这不是我想要的。因为所有数据库感知组件都使用字段名称的简单下拉列表。我不想改变它,所以我不想注册新的属性编辑器或组件编辑器。我想要的只是调用设计者的修改方法。但是如何?
答案 0 :(得分:2)
我知道如何创建自定义属性或组件编辑器,然后从那里调用IDesigner.Modified。但是,在这种情况下,这不是我想要的。因为所有数据库感知组件都使用字段名称的简单下拉列表。我不想改变它,所以我不想注册新的属性编辑器或组件编辑器。我想要的只是调用设计师的修改方法。但是如何?
我担心您需要将任何引用IDE设计器的代码放入单独的设计时包中。规则是使用ToolsAPI
的设计时代码不得存在于运行时包中。它必须分成设计时间包。
我认为,属性编辑器是解决问题的最佳方法。