Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi GetStrValue在自定义属性编辑器上返回空字符串_Delphi_Delphi 10.1 Berlin_Propertyeditor_Property Editor - Fatal编程技术网

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+”),属性编辑器将打开被注释为空备注

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。文本将是只读的。足够公平。当然,我们已经猜到了一些提问者试图实现的微妙之处…:-)