是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
Is there any possible way to append an event (custom made) to an object created in run-time ?[C++ Builder]
所以,我尝试在运行时创建一些TEDIT对象,最终我试图发现的是:我应该如何创建一个自定义的OnClick事件并将其附加到运行时中的对象上,例如,事件应采用2个参数,发件人对象(显然(和TEDIT对象的索引。该事件应更改在运行时创建的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=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);
这意味着您根本无法添加额外的参数。
但是,您可以为所有TEdit
控件分配一个OnClick
处理程序,然后利用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
(即,如果您将其用于其他内容(,或者如果要将其他自定义数据附加到每个编辑中,则可以使用自定义派生类:
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");
}
一种方法是将索引嵌入到teDit标签字段中,然后给他们所有相同的单击处理程序:
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";
}
}
hth。
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针