Delphi GetStrValue在自定义属性编辑器上返回空字符串
我想为我的自定义组件编写一个自定义属性编辑器。我有如下组件声明:Delphi GetStrValue在自定义属性编辑器上返回空字符串,delphi,delphi-10.1-berlin,propertyeditor,property-editor,Delphi,Delphi 10.1 Berlin,Propertyeditor,Property Editor,我想为我的自定义组件编写一个自定义属性编辑器。我有如下组件声明: type TEJsonQuery = class(TComponent) private FSql: TStrings; procedure SetSQL(const Value: TStrings); { Private declarations } protected { Protected declarations } public con
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;
如果
Assert(False,“'+GetStrValue+”),属性编辑器将打开因为GetStrValue返回空字符串,所以代码>被注释为空备注 SQL属性是TStrings属性,而不是string属性,GetStrValue仅对string属性有效,如果选择了多个组件,则返回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;
SQL属性是TStrings属性,而不是string属性,GetStrValue仅对string属性有效,如果选择了多个组件,则返回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;
SQL属性是TStrings属性,而不是string属性,GetStrValue仅对string属性有效,如果选择了多个组件,则返回GetComponent(0)的值。GetStrValue是一个虚拟属性,因此您可以实现自己的属性,但更简单的方法可能是将SQL属性重新定义为字符串属性,而不是TStrings属性。我有两个组件,另一个从祖先类继承SQL属性,因此无法更改SQL属性的类型。我应该将GetComponent(0)强制转换为myclass并访问sql属性,还是应该使用rtti或类似的方法查找sql属性?强制转换将起作用,尤其是当if组件(0)周围是TEJSONQuery时。不过,不需要使用RTTI,只需使用SQL属性的“Text”属性即可。SQL属性是TStrings属性,而不是string属性,GetStrValue仅适用于string属性,如果选择了多个组件,它将返回GetComponent(0)的值。GetStrValue是一个虚拟属性,因此您可以实现自己的属性,但更简单的方法可能是将SQL属性重新定义为字符串属性,而不是TStrings属性。我有两个组件,另一个从祖先类继承SQL属性,因此无法更改SQL属性的类型。我应该将GetComponent(0)强制转换为myclass并访问sql属性,还是应该使用rtti或类似的方法查找sql属性?强制转换将起作用,尤其是当if组件(0)周围是TEJSONQuery时。不过,不需要使用RTTI,只需使用SQL属性的“Text”属性。这次它在对象检查器中显示SQL.Text值,而不是“(TStrings)”,这样就可以对对象检查器隐藏SQL.Text内容。我只想在我的自定义屏幕上点击3个点来显示内容。不要重写GETXXXValm方法来解决这个问题:相反,我写了一个新的方法,并用它命名为GETXXXValuy以外的其他方法考虑了这个可能性,但我认为在编辑器中查看SQL会很有用。我不喜欢,但如果有人希望看到SQL而无法编辑,可以使用Result:=[paDialog,paReadOnly]大于SQL。文本将是只读的。足够公平。当然,我们已经猜到了一些提问者试图实现的微妙之处…:-)这一次,它在对象检查器中显示sql.text值,而不是“(TStrings)”,这样就可以对对象检查器隐藏sql.text内容。我只想在我的自定义屏幕上点击3个点来显示内容。不要重写GETXXXValm方法来解决这个问题:相反,我写了一个新的方法,并用它命名为GETXXXValuy以外的其他方法考虑了这个可能性,但我认为在编辑器中查看SQL会很有用。我不喜欢,但如果有人希望看到SQL而无法编辑,可以使用Result:=[paDialog,paReadOnly]大于SQL。文本将是只读的。足够公平。当然,我们已经猜到了一些提问者试图实现的微妙之处…:-)