I need help on how to implement class that can be shown in object Inspector

后端 未结 2 612
孤城傲影
孤城傲影 2020-12-20 09:12

i have

...
  TDispPitch = class
  private
    iLineSize: Integer;
    iLineColor: TColor;
    bDisplayAccent: Boolean;
    bVisible: Boolean;
  published
            


        
相关标签:
2条回答
  • 2020-12-20 09:46

    You must derive your class from TPersistent, or a descendant, in order to make it available in the Object Inspector:

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

    From Delphi Documentation:

    TPersistent is the ancestor for all objects that have assignment and streaming capabilities.

    0 讨论(0)
  • 2020-12-20 09:54

    The class needs to derive from TPersistent, and should implement the Assign() (or AssignTo()) method, as well as expose an OnChange event so the containing class can react to changes, eg:

    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;
    

    Then you use it like this:

    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;
    
    0 讨论(0)
提交回复
热议问题