2016-09-14 3 views
-1

Следующий код используется как общий обработчик событий для 16-значных кнопок в шестнадцатеричном калькуляторе (0-9, A-F).Как я могу правильно настроить приложение StringBuilder?

Следующих инструкции определяют, что мне нужно выполнение:

Если калькулятор находится в режиме отображения при нажатии цифры, что цифра будет заменить текущее содержимое экрана и поместить калькулятор в режиме ввода. Если калькулятор находится в режиме ввода, есть три случая:

  • Если содержимое дисплея «0», цифра на нажатой кнопке заменит содержимое дисплея.
  • В противном случае, если содержимое дисплея содержит менее восьми символов (поскольку мы имеем дело с 32-разрядными словами), цифра на нажатой кнопке будет добавлена ​​к содержимому дисплея.
  • В противном случае нажатие кнопки игнорируется.

Нажатие одной кнопки на мой калькулятор будет корректно обновлять дисплей. Однако, если я нажму другую кнопку, вместо добавления StringBuilder с новым символом, вместо этого будет отображаться двойной символ для последней нажатой кнопки. Например. Нажатие кнопки «C» отображает «C». Нажатие кнопки «C», а затем «8» отобразит «88». Где моя проблема?

public void ProcessClick(object sender, EventArgs e) 
    { 
     StringBuilder _button = new StringBuilder(); 
     _button.Append(((Button)sender).Text); 

     if (mode) 
     { 
      uxDisplay.Text = _button.ToString(); 
      mode = false; 
     } 
     else 
     { 
      if (uxDisplay.Text == "0") 
      { 
       uxDisplay.Text = _button.ToString(); 
      } 
      else if (uxDisplay.Text.Length < 8) 
      { 
       uxDisplay.Text = _button.Append(((Button)sender).Text).ToString(); 
      } 
      else 
      { 
       return; 
      } 
     } 
    } 

ответ

2

Вы, кажется, дважды добавляете значение sender.Text.

Здесь:

_button.Append(((Button)sender).Text); 

и здесь:

uxDisplay.Text = _button.Append(((Button)sender).Text).ToString(); 

Вы также создание нового StringBuilder на каждом вызове к процессу, так что вы не сохраняющиеся последнее значение (за исключением в uxDisplay контроль)

Как о чем-то простым, как:

... 
else if (uxDisplay.Text.Length < 8) 
{ 
    uxDisplay.Text += ((Button)sender).Text; 
} 

Вы только добавляете небольшое количество строк, чтобы вы не получали большую производительность от использования StringBuilder (особенно если вы создаете новый для каждого вызова! : P)

0

Вы добавляете текст нажатой кнопки к объекту StringBuilder непосредственно после его создания, поэтому вы получаете дважды символ.

Вы можете пойти с чем-то простым, как это:

public void ProcessClick(object sender, EventArgs e) 
{ 
    if (mode) 
    { 
     uxDisplay.Text = _button.ToString(); 
     mode = false; 
    } 
    else 
    { 
     if (uxDisplay.Text == "0") 
     { 
      uxDisplay.Text = _button.ToString(); 
     } 
     else if (uxDisplay.Text.Length < 8) 
     { 
      uxDisplay.Text += ((Button)sender).Text; 
     } 
     else 
     { 
      return; 
     } 
    } 
}