Есть ли какой-нибудь возможный способ добавить событие (пользовательское) к объекту, созданному во время выполнения? [C ++ Builder] - PullRequest
0 голосов
/ 22 мая 2019

Итак, я попытался создать некоторые объекты TEdit во время выполнения, в конечном итоге я пытаюсь выяснить это: Как мне создать пользовательское событие OnClick и добавить его к объекту при запуске -time , например, событие должно принимать 2 параметра: объект Sender (очевидно) и индекс объекта TEdit. Событие должно изменить некоторые свойства объекта TEdit, созданного во время выполнения, индекс которого будет передан в качестве параметра, поэтому свойство Text будет выглядеть так: «Введите некоторые значения в [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";
}

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вы не можете назначить обработчик, который не соответствует подписи, которую ожидает 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 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 голос
/ 22 мая 2019

Один из способов - вставить индекс в поле TEdit Tag, а затем присвоить им все тот же обработчик 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";
    }
}

НТН.

...