Delphi-向组件添加按钮属性
我正在制作一个DelphiDB感知组件,我需要添加一个“buttons”属性,该属性应显示为。。。按钮,然后单击。。。按钮应该显示一个列表来查看已定义的按钮,添加、删除按钮定义,我只知道组件设计的基本知识,我对如何实现这一点感到困惑 当然,按钮定义必须保存在dfm文件中。 我一直在读这篇文章中的问题: 但是构造函数中的'fItems:=TCollection.Create'语句将无法编译(错误E2029'('expected but')'found') 有人看到我做错了什么吗?有人能提供一个如何在组件中创建按钮动态列表的示例吗Delphi-向组件添加按钮属性,delphi,button,components,Delphi,Button,Components,我正在制作一个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,是的,我已经有了一个关于其他问题的新线索,并且已经得到了回答…现在只有一件事需要弄清楚…在网上寻找解决方案,但是如果我找不到,我会为它制作另一个线索。