2009-07-28 5 views
0

Мне интересно, какие события/события используются/используются при подсчете гласных во время ввода предложения в текстовое поле.События в подсчете гласных

Я не совсем уверен, что это как-то связано с "KeyPress" или "KeyUp".

Примите во внимание вашу помощь.

=====

Это теперь, когда я stucked:

private void btnCount_Click(object sender, EventArgs e) 
    { 
     string yourSentence; 
     yourSentence = textBox1.Text.ToLower().Trim(); 

     char ch1 = 'a'; 
     char ch2 = 'e'; 
     char ch3 = 'i'; 
     char ch4 = 'o'; 
     char ch5 = 'u'; 

     int counta = 0; 
     int counte = 0; 
     int counti = 0; 
     int counto = 0; 
     int countu = 0; 

     int j = counta + counte + counti + counto + countu; 



    foreach (char v in yourSentence) 
    { 
     if (v == ch1) { counta++; j++; } 

     else if (v == ch2) { counte++; j++; } 

     else if (v == ch3) { counti++; j++; } 

     else if (v == ch4) { counto++; j++; } 

     else if (v == ch5) { countu++; j++; } 
    } 



     listBox1.Items.Add("There are " + counta.ToString().Trim() + " a's in the sentence"); 
     listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence"); 
     listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence"); 
     listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence"); 
     listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's in the sentence"); 
     listBox1.Items.Add("All in all there are " + j.ToString().Trim() + " vowels in the sentence"); 


    private void textBox1_KeyDown(object sender, EventArgs e) 
    { 
      string yourSentence; 
      yourSentence = textBox1.Text.ToLower().Trim(); 

     //I think I have to add the codings here. But what will happened to the 
     //btnCount_Click? 

    } 
+0

Вы пытаетесь сделать это самостоятельно ИЛИ вы говорите о конкретном приложении, которое это делает? – Aamir

+0

Я пытаюсь сделать это сам. Я написал код, используя оператор switch, который подсчитывает гласные и отображает количество гласных в списке. Теперь я хотел бы попробовать что-то новое, например, если я напишу предложение, он распознает гласные и покажет, сколько гласных присутствует во время письмо. – tintincutes

+0

Lookout причина, по которой кто-то может выбрать большую часть текста и перезаписать его. –

ответ

4

Ну есть TextChanged событие в TextBox, который вызывает всякий раз, когда персонаж набирается или удален. Это можно использовать для подсчета гласных в реальном времени.

Edit:

я объединил свой код из textBox1_keyDown и btnCount_Click и положить его в случае TextChanged, и она работала почти идеально. Мне нужно было добавить только одну строку:

listBox1.Items.Clear(); 

... только до того, как элементы будут добавлены в список. Таким образом, список добавляется до добавления счетчиков.

Это результат:

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     string yourSentence; 
     yourSentence = textBox1.Text.ToLower().Trim(); 

     char ch1 = 'a'; 
     char ch2 = 'e'; 
     char ch3 = 'i'; 
     char ch4 = 'o'; 
     char ch5 = 'u'; 

     int counta = 0; 
     int counte = 0; 
     int counti = 0; 
     int counto = 0; 
     int countu = 0; 

     int j = counta + counte + counti + counto + countu; 



     foreach (char v in yourSentence) 
     { 
      if (v == ch1) { counta++; j++; } 

      else if (v == ch2) { counte++; j++; } 

      else if (v == ch3) { counti++; j++; } 

      else if (v == ch4) { counto++; j++; } 

      else if (v == ch5) { countu++; j++; } 
     } 


     listBox1.Items.Clear(); 
     listBox1.Items.Add("There are " + counta.ToString().Trim() + " a's in the sentence"); 
     listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence"); 
     listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence"); 
     listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence"); 
     listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's in the sentence"); 
     listBox1.Items.Add("All in all there are " + j.ToString().Trim() + " vowels in the sentence"); 

    } 

мне не нужен какой-либо другой код, чтобы сделать эту работу.

+0

@ Мета-рыцарь: я вижу, это означает, что когда я набираю предложение, он распознает гласные на нем и отображает счет. Это верно? – tintincutes

+0

Nonono ... это означает, что любой код, который вы помещаете в событие TextChanged, будет вызываться каждый раз, когда текст изменяется.Поэтому, если вы поместите код, который вычисляет подсчет гласных и отображает его, подсчет гласных будет обновляться каждый раз при изменении содержимого текстового поля. –

+0

@ Мета-рыцарь: я попробую это. Должен ли я выделить свой текстовый блок и дважды щелкнуть по событию TextChanged? Тогда оттуда я включу свой код? Правильно? Спасибо – tintincutes

0

Нажатие клавиши при нажатии клавиши. (не уверен в этом) клавиша UP активируется, когда ключ поднимается вверх (освобождается) (удаляет ур пальцем с клавиатуры)

+0

@Ahmad Farid: спасибо за определение. Знаете, какое событие использовать для подсчета буквы при наборе? Спасибо – tintincutes

+0

И есть KeyDown. KeyDown запускается при первом нажатии клавиши, а затем (возможно, несколько) события KeyPressed запускаются в зависимости от частоты повторения клавиатуры ОС. KeyUp срабатывает при отпускании клавиши. –

+0

@ Ralph Rickenbach: Итак, KeyDown - это событие? Есть ли определенный код, который мне нужно знать, когда я его интегрирую в свой код? или я могу просто дважды щелкнуть по событию KeyDown & from there add my code? Спасибо – tintincutes

1

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

KeyDown: В KeyDown ключ по-прежнему представлен как целое число. Вам нужно будет отобразить гласные сами. Повторные значения срабатывают только один раз. Таким образом, вы можете потерять некоторые гласные.

KeyPressed: здесь вы получаете ключ в его правильном представлении. Добавьте один, если нажата гласная. Но нужно ли вычесть его, если del или backspace нажат? Вы не знаете, какой ключ был удален.

KeyUp: Опять же, представление представляет собой целое число. Повторяющиеся значения только срабатывают.

TextChanged: Это срабатывает при каждом изменении текста. Здесь вы точно не знаете, что нажал последний нажатый (это могло быть где-то в тексте), поэтому вам нужно пересчитать количество гласных с начала.

Я хотел бы сделать что-то вроде этого:

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
     btnCount_Click(sender, e); 
} 

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

И, возможно, вы хотите делать это только время от времени (см. Другие ответы) в TextChanged.

+0

@Ralph Rickenbach: Спасибо за вход. Я попробовал KeyDown и TextChanged. Кажется, они не работают. Я не уверен, что здесь что-то не хватает. Каждый раз, когда я печатаю гласную «а», это не считалось на самом деле. Мне нужно добавить код из моего кода? – tintincutes

+0

Каков твой код? Чтобы проверить, выполняется ли код, просто сделайте точку останова на строке вашего кода. Затем, если он выполняется, посмотрите, что делает ваш код. –

2

Я построил окно поиска, которое действует как текстовое поле AJAX - это поиск, основанный на том, что было напечатано «до сих пор» в текстовом поле. Нет необходимости вводить текст, а затем нажать соответствующую кнопку. Он выполняет поиск по типу. Я не знаю, есть ли название для этого шаблона пользовательского интерфейса, должно быть.

Динамический поиск подключен к событию TextChanged. Но ключ был, я не хотел его искать, пока текст активно менялся, когда пользователь печатал. Я хотел найти, когда изменения были завершены, когда печать остановилась.

Это может быть интересно для вас.

hueristic Я использовал: если 600 мс истекает после последнего события обмена текстовыми сообщениями, то запись прекратилась, и это, когда поиск должен выполняться. Но как вы получаете код для запуска 600 мс после события TextChange. В обработчике событий невозможно Thread.Sleep. Это просто вызывает задержку пользовательского интерфейса.

Решение, которое я придумал, было следующим: используйте Threadpool.QueueUserWorkItem в событии TextChange, чтобы поставить в очередь рабочий метод, который называется MaybeDoSearch. В этом работнике сделайте Thread.Sleep для интервала задержки (600 мс). Когда Sleep завершается, проверьте прошедшее время со времени предыдущего события TextChanged. Если это время превышает 600 мс, тогда на самом деле выполните поиск.

Похоже, что этот

System.DateTime _lastChangeInSearchText; 
    private const int DELAY_IN_MILLISECONDS = 600; 

    private void tbSearch_TextChanged(object sender, EventArgs e) 
    { 
     _lastChangeInSearchText = System.DateTime.Now; 
     string textToFind = tbSearch.Text; 
     if ((textToFind != null) && (textToFind != "")) 
      System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(MaybeDoSearch), textToFind); 
     else 
     { 
      // clear the ListView that contains the search results 
      this.ListView2.Items.Clear(); 
     } 
    } 

    private void MaybeDoSearch(object o) 
    { 
     System.Threading.Thread.Sleep(DELAY_IN_MILLISECONDS); 
     System.DateTime now = System.DateTime.Now; 
     var _delta = now - _lastChangeInSearchText; 
     if (_delta >= new System.TimeSpan(0,0,0,0,DELAY_IN_MILLISECONDS)) 
     { 
      // actually do the search 
      ShowSearchResults(); 
     } 
    } 

Mine это приложение WinForms. Поскольку функция MaybeDoSearch() работает в рабочем потоке, а не в потоке пользовательского интерфейса, то в ShowSearchResults() обновление пользовательского интерфейса должно быть защищено InvokeRequired.

Во время обычного ввода человек будет набирать 2 или 3 символа в 600 мс. Результатом этого является то, что в каждый момент времени в процессе ввода типично набирается 2 или 3 рабочих места в очереди и работает (в основном спящий).

Кто-то предложил ранее, что вам придется повторно сканировать весь текст для гласных с каждым изменением. Это избыточная работа во время выполнения, что в целях эффективности вы обычно хотите избежать. Но код намного проще. У меня была такая же проблема, и я решил не пытаться выяснить только , как текст был изменен с текущим событием TextChange. Он изменился, поэтому код выполняет полный поиск. Поиск завершается быстрее, чем интервал задержки (600 мс). В вашем случае, считая гласные, это будет еще быстрее.

+0

@ Чисо: поскольку я еще не совсем знаком со всем синтаксисом в C#, первый раз, когда я увидел вашу кодировку, это выглядит сложно, но я думаю, что вы правы. С помощью: «System.DateTime _lastChangeInSearchText;» Является ли оно объявлено после публичной формы 1: Форма или мне нужно создать класс для этого? Спасибо за ваше предложение. Мне бы очень хотелось попробовать этот – tintincutes

+0

вам не нужен новый класс. _lastChangeInSearchText - это еще одна переменная-член в вашем классе Form. – Cheeso

+0

@Cheeso: так что будет принадлежать тому же классу, где я добавляю свои методы? – tintincutes

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