Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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-向组件添加按钮属性_Delphi_Button_Components - Fatal编程技术网

Delphi-向组件添加按钮属性

Delphi-向组件添加按钮属性,delphi,button,components,Delphi,Button,Components,我正在制作一个DelphiDB感知组件,我需要添加一个“buttons”属性,该属性应显示为。。。按钮,然后单击。。。按钮应该显示一个列表来查看已定义的按钮,添加、删除按钮定义,我只知道组件设计的基本知识,我对如何实现这一点感到困惑 当然,按钮定义必须保存在dfm文件中。 我一直在读这篇文章中的问题: 但是构造函数中的'fItems:=TCollection.Create'语句将无法编译(错误E2029'('expected but')'found') 有人看到我做错了什么吗?有人能提供一个如何

我正在制作一个DelphiDB感知组件,我需要添加一个“buttons”属性,该属性应显示为。。。按钮,然后单击。。。按钮应该显示一个列表来查看已定义的按钮,添加、删除按钮定义,我只知道组件设计的基本知识,我对如何实现这一点感到困惑

当然,按钮定义必须保存在dfm文件中。 我一直在读这篇文章中的问题: 但是构造函数中的'fItems:=TCollection.Create'语句将无法编译(错误E2029'('expected but')'found')

有人看到我做错了什么吗?有人能提供一个如何在组件中创建按钮动态列表的示例吗

type
TAlignment = (Horizontal, Vertical);

TButtonsItem = class (TCollectionItem)
private
    FButton: TcxButton;
published
    property Button: TcxButton read FButton write FButton;
end;

TButtonsItemClass = class of TButtonsItem;

TFlexButtonGroupBox = class(TcxGroupBox)
private
    FDataLink: TFieldDataLink;
    FAbout: string;
    fAlignment: TAlignment;
    fEnabled: Boolean;
    fButtons: TCollection;
    procedure SetAlignment(const Value: TAlignment);
    function GetDataField: string;
    function GetDataSource: TdataSource;
    procedure SetDataField(const Value: string);
    procedure SetDataSource(const Value: TdataSource);
    procedure DataChange(Sender: TObject);
    procedure SetEnabled(const Value: Boolean);
protected
public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
published
    property DataField: string read GetDataField write SetDataField;
    property DataSource: TdataSource read GetDataSource write SetDataSource;
    property Enabled: Boolean read fEnabled write SetEnabled;
    property About: string read FAbout write FAbout;
    property Buttons: TCollection read fButtons write fButtons;
    property Alignment: TAlignment read fAlignment write SetAlignment;
end;
在构造函数中:

fButtons := TCollection.Create(TButtonsItemClass); <- error

fButtons:=TCollection.Create(TButtonsItemClass) 弗兰基,对不起,还没有人解释这个问题。我同意编译器的错误

[dcc32 Error] Unit2.pas(26): E2029 '(' expected but ')' found
不足以理解问题。实际上,您在create语句中使用了不兼容的类型。编译器需要TButtonsItemClass的(变量),但您在那里使用的是类型。要解决编译器错误,应使用

var
  LItemClass: TButtonsItemClass;
...
  LItemClass := TButtonsItem;
  fButtons := TCollection.Create(LItemClass);
或者简言之

fButtons := TCollection.Create(TButtonsItem);

另外,我还应该指出,您的代码可能还有另一个潜在问题(TButtonsItem类的button属性)。我假设它是对另一个组件的引用,我希望您将使用FreeNotification

弗兰基,对不起,还没有人解释这个问题。我同意编译器的错误

[dcc32 Error] Unit2.pas(26): E2029 '(' expected but ')' found
不足以理解问题。实际上,您在create语句中使用了不兼容的类型。编译器需要TButtonsItemClass的(变量),但您在那里使用的是类型。要解决编译器错误,应使用

var
  LItemClass: TButtonsItemClass;
...
  LItemClass := TButtonsItem;
  fButtons := TCollection.Create(LItemClass);
或者简言之

fButtons := TCollection.Create(TButtonsItem);

另外,我还应该指出,您的代码可能还有另一个潜在问题(TButtonsItem类的button属性)。我假设它是对另一个组件的引用,我希望您将使用FreeNotification

你看过TDBNavigator的源代码了吗?我会看一看,它不是我想要的,因为TDBNavigator有一个静态数量的创建按钮,没有真实的按钮发布属性,用户可以动态添加/删除/编辑按钮。我想一定还有另一个vcl组件可以实现这一点。好吧,TDBGrid的Columns属性是TCollectionItem的后代。您是否尝试读取了,尤其是底部的两个注释条目,尤其是其中的第二个注释?还有一些VCL组件的列表,这些组件使用集合作为它们的项目,可以为您提供任何数量的示例来帮助您。我正在查看组件和学习,感谢您提供的提示。您是否查看了TDBNavigator的源代码?我将看一看,这并不完全是我想要的,因为TDBNavigator有一个静态数量的创建按钮,没有真正的按钮发布属性,用户可以动态添加/删除/编辑按钮。我想一定还有另一个vcl组件可以实现这一点。好吧,TDBGrid的Columns属性是TCollectionItem的后代。您是否尝试读取了,尤其是底部的两个注释条目,尤其是其中的第二个注释?还有几个VCL组件的列表,这些组件使用集合作为它们的项目,可以为您提供任何数量的示例来帮助您。我正在查看组件和学习,感谢您提供的提示。感谢Max,我已经通过阅读以下url解决了这一问题:(我假设它来自Danny Thorpe的书)。我现在面临另外两个我不知道的问题,我是为这些问题创建新问题,还是在stackoverflow上自定义在同一线程中添加其他问题?我认为创建新线程更好,但您可以始终引用问题中所有连接的线程,以便每个人都能快速理解上下文谢谢Max,是的,我已经有了一个关于其他问题的新帖子,并且已经得到了回答…现在只有一件事需要解决…在网上寻找解决方案,但如果我找不到,我会为此制作另一个帖子。谢谢Max,我已经通过阅读以下url解决了这个问题:(我想这是Danny Thorpe的书)。我现在面临另外两个我不知道的问题,我是为这些问题创建新问题,还是在stackoverflow上自定义在同一线程中添加其他问题?我认为创建新线程更好,但您可以始终引用问题中所有连接的线程,以便每个人都能快速理解上下文谢谢Max,是的,我已经有了一个关于其他问题的新线索,并且已经得到了回答…现在只有一件事需要弄清楚…在网上寻找解决方案,但是如果我找不到,我会为它制作另一个线索。