是否有任何可能的方法将事件(定制的)附加到在 运行 时间创建的对象?[C++ Builder]
Is there any possible way to append an event (custom made) to an object created in run-time ?[C++ Builder]
所以,我尝试在 运行 时间内创建一些 TEdit 对象,最终我想找出的是:我应该如何创建自定义 OnClick 事件并将其附加到 运行-time 中的对象,例如,该事件应采用 2 个参数,Sender 对象(显然)和 TEdit 对象的索引。该事件应更改在 运行 时间创建的 TEdit 对象的某些属性,其索引将作为参数传递,因此文本 属性 将类似于:"Enter some values in the [index] edit",或这种方式。
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";
}
一种方法是将索引嵌入 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";
}
}
HTH.
您不能分配与 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
(即,如果您将其用于其他用途),或者如果您想要为每个编辑附加额外的自定义数据,您可以使用自定义派生 class 而不是:
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 对象,最终我想找出的是:我应该如何创建自定义 OnClick 事件并将其附加到 运行-time 中的对象,例如,该事件应采用 2 个参数,Sender 对象(显然)和 TEdit 对象的索引。该事件应更改在 运行 时间创建的 TEdit 对象的某些属性,其索引将作为参数传递,因此文本 属性 将类似于:"Enter some values in the [index] edit",或这种方式。
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";
}
一种方法是将索引嵌入 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";
}
}
HTH.
您不能分配与 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
(即,如果您将其用于其他用途),或者如果您想要为每个编辑附加额外的自定义数据,您可以使用自定义派生 class 而不是:
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");
}