2010-01-22 2 views
0

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

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();» func, но я не знаю, где его разместить.

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

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

+0

Поместите его в класс TForm1. Не предполагайте, что возможно динамическое создание метода. –

+0

Но как я могу обратиться к кнопке, которая динамически создается на 'formQuiz', которая также динамически создается? – qlf00n

ответ

3

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

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, не удаляя ссылку на событие click. Во многих отношениях это может быть более чистое решение использовать действие в этом случае.

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

+0

// Определите, какая кнопка была нажата: TButton * btn = dynamic_cast (Sender); Это не скажет вам, какая кнопка была нажата, это будет просто NULL, если Sender - это что-то другое, кроме/TButton * –

+0

Ну в этом случае кнопка не была нажата вправо? :) Кроме того, если вы добавите эту функцию в качестве события OnClick для объектов, которые не являются кнопками, я думаю, вы справитесь с этим в коде. Линия, о которой я говорил, действительно говорит вам, какой объект вызвал событие, а в случае кнопок он скажет вам, какая кнопка сделала это. Ответ - насколько я могу сказать правильно. –

0

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

пример:

...  
btnDecToBin->Click() = &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).  
    } 

} 

и на .h

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

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

Смежные вопросы