首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C++生成器]

是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C++生成器]
EN

Stack Overflow用户
提问于 2019-05-23 02:26:02
回答 2查看 63关注 0票数 0

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

代码语言:javascript
复制
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*/
}

该事件应如下所示:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 07:14:23

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

代码语言:javascript
复制
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

这意味着你根本不能添加额外的参数。

但是,您可以将单个OnClick处理程序分配给所有TEdit控件,然后利用Sender参数知道正在单击哪个TEdit,例如:

代码语言:javascript
复制
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 (即,如果您将其用于其他用途),或者如果您想将额外的自定义数据附加到每个编辑,则可以使用自定义派生类来代替:

代码语言:javascript
复制
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");
}
票数 1
EN

Stack Overflow用户

发布于 2019-05-23 03:39:20

一种方法是将索引嵌入到TEdit标记字段中,然后为它们提供相同的OnClick处理程序:

代码语言:javascript
复制
    Edit[i]->Left=50;
    Edit[i]->Parent=Form1;
    Edit[i]->Tag = i;
    Edit[i]->OnClick = myclick;

那么myclick处理程序可以是:

代码语言:javascript
复制
void __fastcall TForm1::myclick(TObject *Sender)
{
    if (TEdit * ed = dynamic_cast<TEdit *>(Sender))
    {
        ed->Text="Enter some value in the"+AnsiString(ed->Tag)+" box";
    }
}

HTH。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56262878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档