Как написать функцию Click () для динамически создаваемой кнопки? - PullRequest
0 голосов
/ 22 января 2010

Попытка написать простую программу VCL для образовательных целей (динамически создаваемые формы, элементы управления и т. Д.). Есть такой пример кода:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TForm* formQuiz = new TForm(this);
    formQuiz->BorderIcons = TBorderIcons() << biSystemMenu >> biMinimize >> biMaximize;
    formQuiz->Position = TPosition::poDesktopCenter;
    formQuiz->Width = 250;
    formQuiz->Height = 250;
    formQuiz->Visible = true;

    TButton* btnDecToBin = new TButton(formQuiz);
    btnDecToBin->Parent = formQuiz;
    btnDecToBin->Left = 88;
    btnDecToBin->Top = 28;
    btnDecToBin->Caption = "Dec to Bin";
    btnDecToBin->Visible = true;
}

Интересно, как я могу написать функцию для динамически создаваемой кнопки, чтобы она вызывалась при нажатии кнопки. В этом примере мне нужно «btnDecToBin-> Click ();» Функ, но я не знаю, где мне его разместить.

Внутри 'void __fastcall TForm1::Button1Click(TObject *Sender){}'?

Я буду признателен за любой ввод, некоторые ключевые слова для Google тоже.

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Вы могли бы сделать две вещи, вы могли бы либо создать действие и связать его с кнопкой, либо вы могли бы создать такую ​​функцию:

void __fastcall TForm1::DynButtonClick(TObject *Sender)
{
    // Find out which button was pressed:
    TButton *btn = dynamic_cast<TButton *>(Sender);

    if (btn)
    {
        // Do action here with button (btn).
    }
}

Вы связываете его с экземпляром кнопки, устанавливая свойство OnClick btnDecToBin->OnClick = DynButtonClick. Обратите внимание, что функция находится внутри формы Form1. Это будет работать из-за природы замыканий (специфичное для компилятора дополнение). Проблема возникает, если вы удалите Form1 до formQuiz без удаления ссылки на событие нажатия. Во многих случаях может быть более чистым решением использовать Action в этом случае.

Редактировать: С другой стороны, если у вас есть стандартный макет для ваших тестов, вы можете создать пользовательский класс TQuizForm, наследующий от TForm. Таким образом, вам не придется связывать событие каждый раз, когда вы создаете форму.

1 голос
/ 21 января 2011

все кнопки имеют нормальные «события», вам просто нужно отнести их к методу, с которым вы будете иметь дело.

пример:

...    
btnDecToBin->OnClick = &Test;

- и добавить дополнительный метод в .cpp

void __fastcall TForm1::Test(TObject *Sender)
{

   TButton *btn = dynamic_cast<TButton *>(Sender);

    if (btn->name == "your_button_name"){         
    // Do action here with button (btn).     
    }

}

и по .ч

void __fastcall TForm1::Test(TObject *Sender);

ссылается на кнопку либо по тегу, либо по имени. Я обычно использую массив кнопок, которые я создаю динамически. ВСЕГДА здравомыслие проверяет своего "отправителя", разыгрывая его. Есть другие способы взломать информацию от объекта, но это путь к душевной боли ... LOL.

...