0

カスタムコンポーネント用のカスタムプロパティエディタを作成します。私は以下のようなコンポーネント宣言を持っている:GetStrValueはカスタムプロパティエディタで空の文字列を返します

type 
    TEJsonQuery = class(TComponent) 
    private 
     FSql: TStrings; 

     procedure SetSQL(const Value: TStrings); 
     { Private declarations } 
    protected 
     { Protected declarations } 
    public 
     constructor Create(AOwner: TComponent); override; 
     destructor Destroy; override; 
     { Public declarations } 
    published 
     property SQL: TStrings read FSql write SetSQL; 
     { Published declarations } 
    end; 

constructor TEJsonQuery.Create; 
begin 
    inherited Create(AOwner); 
    FSql := TStringList.Create; 
end; 

procedure TEJsonQuery.SetSQL(const Value: TStrings); 
begin 
    if SQL.Text <> Value.Text then 
    begin 
     //Close; 
     SQL.BeginUpdate; 
     try 
     SQL.Assign(Value); 
     finally 
     SQL.EndUpdate; 
     end; 
    end; 
end; 

destructor TEJsonQuery.Destroy; 
begin 
    inherited Destroy; 
    FSql.Free; 
end; 

、以下のようなプロパティエディタの宣言:GetStrValueが空の文字列を返すためAssert(False, '"' + GetStrValue + '"');が空のメモとコメントしている場合

type 
    TQuerySQLProperty = class(TStringProperty) 
    public 
     function GetAttributes: TPropertyAttributes; override; 
     procedure Edit; override; 
    end; 

    Tfrm_JsonQuerySQL = class(TForm) 
     btn_JsonQuerySQL: TButton; 
     mem_SQL: TMemo; 
    btn_OK: TButton; 
    btn_Cancel: TButton; 
    private 
     { Private declarations } 
    public 
     { Public declarations } 
    end; 

var 
    frm_JsonQuerySQL: Tfrm_JsonQuerySQL; 

procedure Register; 

implementation 

{$R *.dfm} 

procedure Register; 
begin 
    RegisterComponents('MyComponents', [TEJsonQuery]); 
    RegisterPropertyEditor(TypeInfo(TStrings), TEJsonQuery, 'SQL', TQuerySQLProperty); 
end; 

procedure TQuerySqlProperty.Edit; 
begin 
    frm_Ekol_JsonQuerySQL := Tfrm_Ekol_JsonQuerySQL.Create(Application); 
    try 
     Assert(False, '"' + GetStrValue + '"'); 
     frm_Ekol_JsonQuerySQL.mem_SQL.Lines.Text := GetStrValue; 
     // show the dialog box 
     if frm_Ekol_JsonQuerySQL.ShowModal = mrOK then 
     begin 
     SetStrValue(frm_Ekol_JsonQuerySQL.mem_SQL.Lines.Text); 
     end; 
    finally 
     frm_Ekol_JsonQuerySQL.Free; 
    end; 
end; 

function TQuerySQLProperty.GetAttributes: TPropertyAttributes; 
begin 
    // editor, sorted list, multiple selection 
    // Result := [paDialog, paMultiSelect, paValueList, paSortList]; 
    Result := [paDialog]; 
end; 

プロパティエディタが開きます。

+2

SQLプロパティはTStringsのプロパティではなく、文字列プロパティで、GetStrValueのみ文字列プロパティで動作し、複数のコンポーネントが選択されている場合、それが返されますGetComponent(0)の値です。 GetStrValueは仮想プロパティなので、独自に実装することもできますが、SQLプロパティをTStringsプロパティではなく文字列プロパティとして再定義する方が簡単です。 – Dsm

+0

私は2つのコンポーネントを持ち、もう1つは祖先クラスからSQLプロパティを継承し、SQLプロパティのタイプを変更することはできません。 GetComponent(0)をmyclassにキャストしてsqlプロパティに到達するか、rttiなどでSQLプロパティを見つける必要がありますか? –

+0

キャストは機能します。特に、コンポーネント(0)がTEJSONQuery **の場合は**で囲んでください。 RTTIを使う必要はありませんが、SQLプロパティの 'Text'プロパティを使うだけです。 – Dsm

答えて

3

SQLプロパティは文字列プロパティではなくTStringsプロパティであり、GetStrValueは文字列プロパティに対してのみ機能し、複数のコンポーネントが選択されている場合はGetComponent(0)の値を返します。 GetStrValueは仮想プロパティなので、独自に実装することができます。ここで

は、私が考えているものです。

type 
    TQuerySqlProperty = ... 
    public 
    function GetStrValue : string; override; 
    ... 
    end; 
    ... 

function TQuerySqlProperty.GetStrValue : string; 
begin 
    if GetComponent(0) is TEJsonQuery then 
    begin 
    Result := (GetComponent(0) as TEJsonQuery).SQL.Text; 
    end 
    else 
    begin 
    Result := inherited; 
    end; 
end; 
+0

今回は "(TStrings)"ではなくオブジェクトインスペクタでsql.textの値を表示しますが、オブジェクトインスペクタからsql.textコンテンツを隠すことは可能です。私はカスタム画面で3ドットをクリックしたときにのみコンテンツを表示したい。 –

+0

GetXxxValueメソッドをオーバーライドしないで問題を解決しました:)代わりに新しいメソッドを書いてGetXxxValue以外の名前を付けました。 –

+0

私はその可能性を考慮しましたが、エディタでSQLが役に立つと思っていました。 – Dsm

関連する問題