Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
C++ 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象上?[C+;+;生成器]_C++_C++builder - Fatal编程技术网

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

C++ 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象上?[C+;+;生成器],c++,c++builder,C++,C++builder,因此,我尝试在运行时创建一些TEdit对象,最终我试图找到的是:我应该如何创建自定义OnClick事件并在运行时将其附加到对象上,例如,事件应该包含两个参数,发送方对象(显然)和TEdit对象的索引。该事件应更改在运行时创建的TEdit对象的某些属性,其索引将作为参数传递,因此文本属性类似于:“在[index]编辑中输入一些值”或类似的内容 Edit=new TEdit*[nr_elem]; for(int i=0;i<nr_elem;i++) { Edit[i]

因此,我尝试在运行时创建一些TEdit对象,最终我试图找到的是:我应该如何创建自定义OnClick事件并在运行时将其附加到对象上,例如,事件应该包含两个参数,发送方对象(显然)和TEdit对象的索引。该事件应更改在运行时创建的TEdit对象的某些属性,其索引将作为参数传递,因此文本属性类似于:“在[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*/
}

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

    Edit[i]->Left=50;
    Edit[i]->Parent=Form1;
    Edit[i]->Tag = i;
    Edit[i]->OnClick = myclick;
那么myclick处理程序可以是:

void __fastcall TForm1::myclick(TObject *Sender)
{
    if (TEdit * ed = dynamic_cast<TEdit *>(Sender))
    {
        ed->Text="Enter some value in the"+AnsiString(ed->Tag)+" box";
    }
}
void\uu fastcall TForm1::myclick(TObject*Sender)
{
如果(TEdit*ed=动态_-cast(发送方))
{
ed->Text=“在“+AnsiString(ed->Tag)+”框中输入一些值”;
}
}

HTH.

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

    Edit[i]->Left=50;
    Edit[i]->Parent=Form1;
    Edit[i]->Tag = i;
    Edit[i]->OnClick = myclick;
那么myclick处理程序可以是:

void __fastcall TForm1::myclick(TObject *Sender)
{
    if (TEdit * ed = dynamic_cast<TEdit *>(Sender))
    {
        ed->Text="Enter some value in the"+AnsiString(ed->Tag)+" box";
    }
}
void\uu fastcall TForm1::myclick(TObject*Sender)
{
如果(TEdit*ed=动态_-cast(发送方))
{
ed->Text=“在“+AnsiString(ed->Tag)+”框中输入一些值”;
}
}

HTH.

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

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
这意味着您根本无法添加额外的参数

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

Edit=new-TEdit*[nr_elem];
对于(int i=0;i宽度=75;
编辑[i]->高度=20;
编辑[i]->Top=100+15*i;
编辑[i]->左=50;
编辑[i]->Parent=this;
编辑[i]->Tag=i;
编辑[i]->OnClick=EditClick;
}
...
void\uu fastcall TForm1::EditClick(TObject*发送方)
{
TEdit*编辑=静态(发送方);
编辑单击(编辑,编辑->标记);
}
void\uu fastcall TForm1::EditNClick(TEdit*发送方,int索引)
{
发件人->文本=_D(“在“+”字符串(索引)+_D(“框”)中输入一些值);
}
如果您不想依赖
标记
(即,如果您将其用于其他用途),或者如果您想将其他自定义数据附加到每个编辑,则可以使用自定义派生类:

class-TMyEdit:public-TEdit
{
公众:
数组索引;
...
__快速调用TMyEdit(TComponent*Owner):TEdit(Owner){}
};
...
编辑=新的TEdit*[nr_elem];
对于(int i=0;i宽度=75;
编辑[i]->高度=20;
编辑[i]->Top=100+15*i;
编辑[i]->左=50;
编辑[i]->Parent=this;
静态_cast(编辑[i])->ArrayIndex=i;
编辑[i]->OnClick=EditClick;
}
...
void\uu fastcall TForm1::EditClick(TObject*发送方)
{
TMyEdit*Edit=static\u cast(发送方);
编辑单击(编辑,编辑->阵列索引);
}
void\uu fastcall TForm1::EditNClick(TEdit*发送方,int索引)
{
发件人->文本=_D(“在“+”字符串(索引)+_D(“框”)中输入一些值);
}

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

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
这意味着您根本无法添加额外的参数

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

Edit=new-TEdit*[nr_elem];
对于(int i=0;i宽度=75;
编辑[i]->高度=20;
编辑[i]->Top=100+15*i;
编辑[i]->左=50;
编辑[i]->Parent=this;
编辑[i]->Tag=i;
编辑[i]->OnClick=EditClick;
}
...
void\uu fastcall TForm1::EditClick(TObject*发送方)
{
TEdit*编辑=静态(发送方);
编辑单击(编辑,编辑->标记);
}
void\uu fastcall TForm1::EditNClick(TEdit*发送方,int索引)
{
发件人->文本=_D(“在“+”字符串(索引)+_D(“框”)中输入一些值);
}
如果您不想依赖
标记
(即,如果您将其用于其他用途),或者如果您想将其他自定义数据附加到每个编辑,则可以使用自定义派生类:

class-TMyEdit:public-TEdit
{
公众:
数组索引;
...
__快速调用TMyEdit(TComponent*Owner):TEdit(Owner){}
};
...
编辑=新的TEdit*[nr_elem];
对于(int i=0;i宽度=75;
编辑[i]->高度=20;
编辑[i]->Top=100+15*i;
编辑[i]->左=50;
编辑[i]->Parent=this;
静态_cast(编辑[i])->ArrayIndex=i;
编辑[i]->OnClick=EditClick;
}
...
void\uu fastcall TForm1::EditClick(TObject*发送方)
{
TMyEdit*Edit=static\u cast(发送方);
编辑单击(编辑,编辑->阵列索引);
}
void\uu fastcall TForm1::EditNClick(TEdit*发送方,int索引)
{
发件人->文本=_D(“在“+”字符串(索引)+_D(“框”)中输入一些值);
}

既然你知道
发送者总是一个
TEdit
,你就应该使用
静态强制转换
,并且完全摆脱
if
语句。既然你知道
发送者总是一个
TEdit
,你就应该使用
静态强制转换
,并且完全去掉
if
语句。