c++ - 是否有任何可能的方法将事件(定制的)附加到在运行时创建的对象?[C++ Builder]

标签 c++ c++builder

因此,我尝试在运行时创建一些 TEdit 对象,最终我想找出的是:我应该如何创建自定义 OnClick 事件并将其附加到运行中的对象-time,例如,事件应该有 2 个参数,Sender 对象(显然)和 TEdit 对象的索引。该事件应更改在运行时创建的 TEdit 对象的某些属性,其索引将作为参数传递,因此 Text 属性将类似于:“在 [index] 编辑中输入一些值”,或以这种方式进行的操作.

Edit=new TEdit*[nr_elem];

    for(int i=0;i<nr_elem;i++)
    {
    Edit[i]=new TEdit(this);

    Edit[i]->Width=75;
    Edit[i]->Height=20;
    Edit[i]->Top=100+15*i;
    Edit[i]->Left=50;
    Edit[i]->Parent=Form1;
   /** Now I should append the event to the Edit[i] object*/
}

事件应该是这样的:

 void __fastcall TForm1::EditNClick(TObject *Sender,int index)
{
    Edit[index]->Text="Enter some value in the"+AnsiString(index)+" box";
}

最佳答案

您不能分配与 OnClick 期望的签名不匹配的处理程序:

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

这意味着您根本无法添加额外的参数。

但是,您可以将单个 OnClick 处理程序分配给所有 TEdit 控件,然后利用 Sender 参数来了解哪个 TEdit 被点击,例如:

Edit = new TEdit*[nr_elem];

for(int i = 0; i < nr_elem; ++i)
{
    Edit[i] = new TEdit(this);

    Edit[i]->Width = 75;
    Edit[i]->Height = 20;
    Edit[i]->Top = 100+15*i;
    Edit[i]->Left = 50;
    Edit[i]->Parent = this;
    Edit[i]->Tag = i;
    Edit[i]->OnClick = EditClick;
}

...

void __fastcall TForm1::EditClick(TObject *Sender)
{
    TEdit *Edit = static_cast<TEdit*>(Sender);
    EditNClick(Edit, Edit->Tag);
}

void __fastcall TForm1::EditNClick(TEdit *Sender, int index)
{
    Sender->Text = _D("Enter some value in the ") + String(index) + _D(" box");
}

如果您不想依赖 Tag(即,如果您将它用于其他用途),或者如果您想要为每个 Edit 附加额外的自定义数据,您可以使用改为自定义派生类:

class TMyEdit : public TEdit
{
public:
    int ArrayIndex;
    ...
    __fastcall TMyEdit(TComponent *Owner) : TEdit(Owner) {}
};

...

Edit = new TEdit*[nr_elem];

for(int i = 0; i < nr_elem; ++i)
{
    Edit[i] = new TMyEdit(this);

    Edit[i]->Width = 75;
    Edit[i]->Height = 20;
    Edit[i]->Top = 100+15*i;
    Edit[i]->Left = 50;
    Edit[i]->Parent = this;
    static_cast<TMyEdit*>(Edit[i])->ArrayIndex = i;
    Edit[i]->OnClick = EditClick;
}

...

void __fastcall TForm1::EditClick(TObject *Sender)
{
    TMyEdit *Edit = static_cast<TMyEdit*>(Sender);
    EditNClick(Edit, Edit->ArrayIndex);
}

void __fastcall TForm1::EditNClick(TEdit *Sender, int index)
{
    Sender->Text = _D("Enter some value in the ") + String(index) + _D(" box");
}

关于c++ - 是否有任何可能的方法将事件(定制的)附加到在运行时创建的对象?[C++ Builder],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262878/

上一篇:c++ - 素数实现

下一篇:C++ 线程从线程

相关文章:

c++ - 如何从 C++ 调用 Delphi DLL WideString 参数(包括 var 参数)

c++ - C++中通过函数调用创建对象

c++ - 如何在 STL 中使用 libclang?

c++ - 每个 VCL 表单都应该有自己的消息循环/线程泵吗?

delphi - TStringGrid - 有没有一种简单的方法来获取 "current/selected"行?

delphi - 从 Delphi 或 C++ Builder 中的 OpenSubtitles 下载字幕?

c++ - _di_IXMLNode 中不需要的 xmlns =""

c++ - C++中的文件命名

c++ - C++ 中的 Kruskal 算法

c++ - 对静态成员变量的 undefined reference