2009-07-28 16 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

誰かがテキストの大きな部分を選択して上書きする可能性があります。 –

答えて

4

はまあ文字が入力または削除されるたびにトリガテキストボックス内TextChangedイベントがあります。これは、母音をリアルタイムで数えるために使用できます。

編集:

私はtextBox1_keyDownとbtnCount_Clickからあなたのコードを組み合わせて、TextChangedイベントに入れて、それがほぼ完全に働きました。

listBox1.Items.Clear(); 

...リストボックスに項目が追加される直前に1行追加するだけでした。この方法では、リストボックスはカウントを追加する前に空になります。

これが結果です:私はこの仕事をするために他のコードを必要としない

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

@ Meta-Knight:それは、私が文章を入力するたびに母音を認識し、その数を表示することを意味します。あれは正しいですか? – tintincutes

+0

Nonono ... TextChangedイベントに入れるコードは、テキストが変更されるたびに呼び出されます。だから、母音の数を計算して表示するコードを置くと、母音の数はテキストボックスの内容が変わるたびに更新されます。 –

+0

@ Meta-Knight:これを試してみます。テキストボックスをハイライト表示して、TextChangedイベントをダブルクリックする必要がありますか?それからそこから私のコードを含むでしょうか?ありがとうございます – tintincutes

0

キーを押すとキーが押されます。 (わからない) キーが上がった(リリースされた)ときにキーUPが発せられます(キーボードから指を離す)

+0

@Ahmad Farid:定義に感謝します。入力中に手紙を数えるためにどのようなイベントを使用するのか知っていますか?ありがとう – tintincutes

+0

そしてKeyDownがあります。 KeyDownは、キーが最初に押されたときに起動され、その後、(おそらくいくつかの)イベントKeyPressedは、OSのキーボード繰り返しレートに応じて起動されます。 KeyUpキーが離されると起動します。 –

+0

@Ralph Rickenbach:KeyDownはイベントですか?それを私のコードに統合するときに知る必要がある特定のコードはありますか?または私はちょうどイベントKeyDownをクリックして&そこから私のコードを追加できますか?ありがとう – tintincutes

1

見てみましょう。これはこれらのすべてで実行できますが、イベントの中にはその可能性が高いものもあります。

KeyDown:KeyDownでは、キーはまだ通常は整数で表されます。自分で母音をマッピングする必要があります。反復された値は一度しか発動しません。だから母音を緩めるかもしれない。

KeyPressed:ここでは、そのキーが正しく表示されます。母音が押されている場合は1を加えます。しかし、デルまたはバックスペースが押された場合、1を引く必要がありますか?どのキーが削除されたのか分かりません。

KeyUp:ここでも、表現は整数です。反復された値は1つしか発動しません。

TextChanged:これは、テキストが変更されるたびにトリガーされます。ここでは、押された最後のキーが何であったかを正確に知らないので(テキスト内のどこかにある可能性があります)、最初から母音の数を再計算します。

私は多少このようにそれを行うだろう:

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

この方法は計算が毎回テキストの変更を行われ、それに加えて、あまりにもボタンを押して行うことができます。イベント関数を直接呼びたくない場合は、両方の場所から呼び出される関数を作成してください。

そして、たぶんこれは、TextChangedで(時にはほかの回答を参照してください)のみ行うことをお勧めします。

+0

@ Ralph Rickenbach:入力をありがとう。私はKeyDownとTextChangedを試しました。彼らはうまくいかないようです。私はここで何かを逃しているかどうか分からない。母音 "a"を入力するたびに、それは実際に数えられませんでした。自分のコード以外にいくつかのコードを追加する必要がありますか? – tintincutes

+0

あなたのコードは何ですか?コードが実行されているかどうかを確認するには、コードの行にブレークポイントを設定します。次に、実行している場合は、コードが何をしているかを参照してください。 –

2

AJAXテキストボックスのような機能を持つ検索ボックスを作成しました。テキストボックスに「これまで」入力されたものを検索します。テキストを入力して関連するボタンをクリックする必要はありません。入力すると検索されます。私はこのUIパターンの名前があるかどうかわかりませんが、ありがとうございます。

動的検索は、TextChangedイベントにフックされます。しかし、重要なのは、ユーザーが入力していたときに、テキストが活発に変更されている間に検索したくなかったということでした。私は、タイピングが止まったときに変更が完了したときに検索したかったのです。

これはあなたにとっても面白いかもしれません。

私が使用したhueristic:最後のtextchangeイベントの後に600msが経過するとタイピングが停止し、の検索を実行するととなります。しかし、TextChangeイベントの後に600msを実行するコードをどのように取得しますか?イベントハンドラ内ではThread.Sleepにはできません。これはちょうどUI遅延を引き起こします。

私が思いついた解決策はこれでした.Threadpool.QueueUserWorkItemをTextChangeイベントで使用して、MaybeDoSearchというワーカーメソッドをキューに入れます。その作業者では、遅延間隔(600ms)に対してThread.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(); 
     } 
    } 

鉱山のように見えることのWinFormsアプリです。 MaybeDoSearch()はUIスレッドではなくワーカースレッド上で実行されるため、ShowSearchResults()ではUI更新をInvokeRequiredで保護する必要があります。

通常の入力では、600msに2文字または3文字を入力します。その結果、タイピングが活発に発生している間、任意の時点で、2つまたは3つの作業項目がキューに入れられ、実行中(主にスリーピング)、個別のスレッドプールスレッド上に存在します。

誰かが、すべての変更で母音のテキストをすべてスキャンし直す必要があることを以前に提案した人もいました。実行時の冗長な作業です。効率的な目的で、通常は避けたい作業です。しかし、コードはそう簡単です。私は同じ問題を抱えていましたが、を理解しようとしないことにしました。 Textが現在のTextChangeイベントで変更された方法。変更されたので、コードは完全に新しい検索を行います。検索は遅延間隔(600ms)よりも速く完了します。あなたの場合、母音を数えれば、それはさらに速くなります。

+0

@Cheeso:私はまだC#のすべての構文に精通していないので、あなたのコーディングを見たのは初めてですが、難しいようですが、あなたが正しいと思います。 : "System.DateTime _lastChangeInSearchText;"これは、Public Form 1:Formの後に宣言されていますか、それともクラスを作成する必要がありますか?あなたの提案をありがとう。私はこれを試してみたいです – tintincutes

+0

あなたは新しいクラスを必要としません。 _lastChangeInSearchTextは、Formクラスの別のメンバー変数です。 – Cheeso

+0

@Cheeso:それは私のメソッドを追加するクラスと同じクラスに属しますか? – tintincutes

関連する問題