2015-06-24 2 views
2

Добрый день.Как сделать разные вещи в одной процедуре, зависит от события

У нас есть 3 кнопки, 3 правки и 3 флажка. При нажатии кнопки, текст соответствующего редактирования должен стать «10», «20» или «30» и флажок должен стать Проверила:

enter image description here

Как это сделать, создав одну процедуру, а не три ? C# или/и Delphi (думаю, подход должен быть одинаковым). Проблема выглядит просто, но я не могу понять.

+0

На каком языке вы на самом деле программируете? Показать код – Drew

+0

Нет кода, я только что поставил элементы управления на форму! Я начал в Delphi, затем я попытался на C#, но там тоже не мог прийти. На самом деле для меня это не важно. Я могу создать 3 процедуры (по одной для каждой кнопки), но мне нужно только одно, как я уже сказал. – Feofilakt

+0

Создайте кнопку groupid с индексом – Drew

ответ

4

Написать один обработчик событий и найти какой компонент выстрелил событие. В Delphi:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
    if Sender = Button1 then 
    // react to Button1 being pressed 
    else if Sender = Button2 then 
    // react to Button2 being pressed 
    // etc. 
end; 

В C#, как для WinForms и WPF, отправитель также передается в обработчик события. Например:

// WPF example 
private void button_Click(object sender, RoutedEventArgs e) 
{ 
    if (sender == button1) 
     // and so on just as above 
} 

И

// WinForms 
private void button_Click(object sender, EventArgs e) 
{ 
    if (sender == button1) 
     // and so on just as above 
} 

Конечно все это, если заявления получить довольно неуклюжим. Таким образом, вы можете объявить структуру, содержащую связанные элементы управления редактированием. In Delphi

type 
    TControlGroup = record 
    Button: TButton; 
    Edit: TEdit; 
    CheckBox: TCheckBox; 
    DefaultEditText: string; 
    end; 

Определите массив из этих или, возможно, словаря. Заполните контейнер, когда форма построена. Затем добавьте метод для поиска структуры из экземпляра кнопки. Это позволяет вам параметризовать ваш код GUI, чтобы избежать дублирования.

Ваш обработчик мог бы выглядеть следующим образом:

InitialiseGroup(FindGroup(Sender as TButton)); 
.... 
procedure TForm1.InitialiseGroup(const Group: TControlGroup); 
begin 
    Group.Edit.Text := Group.DefaultEditText; 
    Group.CheckBox.Checked := True; 
end; 

Очевидно, что вам нужно заполнить в реализации FindGroup в соответствии с каким контейнером вы решили использовать.

+0

О, спасибо! Этот пример и описание достаточны, я могу написать код останова – Feofilakt

+0

Я немного сфокусировал его. Надеюсь, что все остальное понятно. –

3

Используйте один общий обработчик событий, чтобы узнать, какая кнопка была нажата и установить свойства соответственно:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
    if (Sender = Button1) then 
    begin 
    Edit1.Text := '10'; 
    Check1.Checked := True; 
    end 
    else 
    if (Sender = Button2) then 
    begin 
    Edit2.Text := '20'; 
    Check2.Checked := True; 
    end 
    else 
    if (Sender = Button3) then 
    begin 
    Edit3.Text := '30'; 
    Check3.Checked := True; 
    end; 
end; 
+0

Отключены ли текстовые поля? – AsConfused

+0

По умолчанию компоненты «Редактировать» включены. –

1

Вы можете получить вызывающего абонента в своем обработчике событий. Объект отправителя будет удерживать элемент управления, который вызвал ваш обработчик событий. В этом случае это нажатая кнопка. Просто просмотрите контент (или определенное имя) вызывающего абонента и действуйте на правильные элементы управления. Это пример в C# WPF.

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Button clickedButton = sender as Button; 

     switch(clickedButton.Content.ToString()) 
     { 
      case "Button1": 
       textbox1.Text = "10"; 
       checkbox1.IsChecked = true;           
       break; 
      case "Button2": 
       textbox2.Text = "20"; 
       checkbox2.IsChecked = true; 
       break; 
      case "Button3": 
       textbox3.Text = "30"; 
       checkbox3.IsChecked = true;      
       break; 
      default: 
       break; 
     } 
    } 
+0

Создавать новые элементы управления каждый раз, когда нажимается кнопка? –

+0

Просто отредактируйте соответствующее текстовое поле и установите флажок. – agulen

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