カスタムコンポーネント用のカスタムプロパティエディタを作成します。私は以下のようなコンポーネント宣言を持っている: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;
プロパティエディタが開きます。
SQLプロパティはTStringsのプロパティではなく、文字列プロパティで、GetStrValueのみ文字列プロパティで動作し、複数のコンポーネントが選択されている場合、それが返されますGetComponent(0)の値です。 GetStrValueは仮想プロパティなので、独自に実装することもできますが、SQLプロパティをTStringsプロパティではなく文字列プロパティとして再定義する方が簡単です。 – Dsm
私は2つのコンポーネントを持ち、もう1つは祖先クラスからSQLプロパティを継承し、SQLプロパティのタイプを変更することはできません。 GetComponent(0)をmyclassにキャストしてsqlプロパティに到達するか、rttiなどでSQLプロパティを見つける必要がありますか? –
キャストは機能します。特に、コンポーネント(0)がTEJSONQuery **の場合は**で囲んでください。 RTTIを使う必要はありませんが、SQLプロパティの 'Text'プロパティを使うだけです。 – Dsm