我正在编写一个组件,这是具有最重要代码段的主类:

uses
  Equation;

type
 TEquationSolver = class(TComponent)
   private
     FSolver: TSolverType;
   published
     property RootFindAlgorithm: TSolverType read FSolver write FSolver;
 end;


在uses子句中,我添加了Equation,因为在Equation.pas中我声明了这种枚举:

type
 TSolverType = (TNewtonRaphson = 0, TSecant, TBisection, TBrent);


这样,我可以在IDE中的“对象检查器”中使用带下拉菜单的选项。



我已经安装了该组件,并且在测试时发现了以下问题:

procedure TForm1.Button1Click(Sender: TObject);
begin
   EquationSolver1.RootFindAlgorithm := TSolverType.Secant;
end;


错误如下:


[dcc32错误] Unit1.pas(29):E2003未声明的标识符:
'TSolverType'


我的问题很简单:为什么?

在运行测试的单元(简单的VCL表单)中,包含该组件的用途,因此我可以“看到” TEquationSolver。如您所见,在TEquationSolver单元内部的顶部,我包括了Equation,后者具有TSolverType。

情况如下:

delphi - 无法在组件的已发布属性中设置枚举类型-LMLPHP

我是否必须在uses下添加一些内容?我不想在Unit1的uses中添加内容。

最佳答案

如果要使TSolverType对某个单元(例如,窗体)可见,则必须告诉该单元定义了TSolverType的位置。这就是Delphi工作方式的一部分。

因此,您必须:


在要向我们提供定义的单位的Equation子句中包含uses(例如,表单的单位)
在组件的单​​位中包含TSolverType
隐藏属性(例如通过将其设置为privateprotected)。


Delphi不以您希望的方式支持隐式定义。

关于delphi - 无法在组件的已发布属性中设置枚举类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48709056/

10-10 10:45