代码之家  ›  专栏  ›  技术社区  ›  XBasic3000

我需要关于如何实现可以在对象检查器中显示的类的帮助

  •  0
  • XBasic3000  · 技术社区  · 15 年前

    我有

    ...
      TDispPitch = class
      private
        iLineSize: Integer;
        iLineColor: TColor;
        bDisplayAccent: Boolean;
        bVisible: Boolean;
      published
        property LineSize : Integer read iLineSize write iLineSize;
        ...etc
      end;
    ...
    

    我想让这个功能显示在Object Insector中来编辑设置。

    我尝试添加

    property DispPitch: TDispPitch read FDispPitch write FDispPitch. like 
    

    DispPitch可以显示,但我看不到它的属性。如线条大小、线条颜色等。

    2 回复  |  直到 11 年前
        1
  •  6
  •   Remy Lebeau    11 年前

    TPersistent

    TDispPitch = class(TPersistent)
    private
      ...
    published
      property ...
      ...
    end;
    

        2
  •  3
  •   Remy Lebeau    15 年前

    TPersistent OnChange

    type
      TDispPitch = class(TPersistent)
      private 
        iLineSize: Integer; 
        iLineColor: TColor; 
        bDisplayAccent: Boolean; 
        bVisible: Boolean; 
        FOnChange: TNotifyEvent;
        procedure Changed;
        procedure SetLineSize(Value : Integer); 
        procedure SetLineColor(Value: TColor); 
        procedure SetDisplayAccent(Value: Boolean); 
        procedure SetVisible(Value: Boolean); 
      public
        procedure Assign(Source: TPersistent); override;
        property OnChange: TNotifyEvent read FOnChange write FOnChange;
      published 
        property LineSize : Integer read iLineSize write SetLineSize; 
        property LineColor: TColor read iLineColor write SetLineColor; 
        property DisplayAccent: Boolean read bDisplayAccent write SetDisplayAccent; 
        property Visible: Boolean read bVisible write SetVisible; 
      end; 
    
    procedure TDispPitch.Assign(Source: TPersistent);
    var
      LSource: TDispPitch;
    begin
      if Source is TDispPitch then
      begin
        LSource := TDispPitch(Source);
        iLineSize := LSource.LineSize;
        iLineColor := LSource.LineColor; 
        bDisplayAccent := LSource.DisplayAccent; 
        bVisible := LSource.Visible; 
        Changed;
      end else
        inherited;
    end;
    
    procedure TDispPitch.Changed;
    begin
      if FOnChange <> nil then FOnChange(Self);
    end;
    
    procedure TDispPitch.SetLineSize(Value : Integer);
    begin
      if iLineSize <> Value then
      begin
        iLineSize := Value;
        Changed;
      end;
    end;
    
    procedure TDispPitch.SetLineColor(Value: TColor); 
    begin
      if iLineColor <> Value then
      begin
        iLineColor := Value;
        Changed;
      end;
    end;
    
    procedure TDispPitch.SetDisplayAccent(Value: Boolean); 
    begin
      if bDisplayAccent <> Value then
      begin
        bDisplayAccent := Value;
        Changed;
      end;
    end;
    
    procedure TDispPitch.SetVisible(Value: Boolean); 
    begin
      if bVisible <> Value then
      begin
        bVisible := Value;
        Changed;
      end;
    end;
    

    type
      TSomeOtherClass = class(...)
      private
        FDispPitch: TDispPitch;
        procedure DispPitchChanged(Sender: TObject);
        procedure SetDispPitch(Value: TDispPitch);
      public
        constructor Create; override;
        destructor Destroy; override;
      published
        property DispPitch: TDispPitch read FDispPitch write SetDispPitch;
      end;
    
    constructor TSomeOtherClass.Create;
    begin
      inherited;
      FDispPitch := TDispPitch.Create;
    end;
    
    destructor TSomeOtherClass.Destroy;
    begin
      FDispPitch.Free;
      inherited;
    end;
    
    procedure TSomeOtherClass.DispPitchChanged(Sender: TObject);
    begin
      ... use new FDispPitch values as needed...
    end;
    
    procedure TSomeOtherClass.SetDispPitch(Value: TDispPitch);
    begin
      FDispPitch.Assign(Value);
    end;
    
    推荐文章