2017-11-06 12 views
-1

모스 코드로 텍스트를 변환하거나 그 반대로 텍스트를 변환하는 응용 프로그램을 개발하려고합니다. 방금 첫 단계를 완전히 끝냈습니다. 문자를 입력하면 해당 문자의 인코딩 된 유형이 표시됩니다. 그러나 두 번째 단계에서 나는 어떤 문제가 발생했습니다 : 여기에 내 코드입니다 : (힌트 : sw = 첫 번째 스톱워치, 두 번째 스톱워치, datas = dataset, dbc = databaseconverter, listofcode = '.'및 '-'문자열) 내 C# 모스 변환기에 대한 타이머가 필요합니다

private void txtletters_KeyDown(object sender, KeyEventArgs e) 
{ 
    txtletters.BackColor = Color.Yellow; 
    sw.Start(); 
    if (flagsw.ElapsedMilliseconds > 400) 
    { 
     datas = dbc.srchfortext(listofcode); 
     lbltext.DataBindings.Clear(); 
     lbltext.DataBindings.Add("text", datas, "t.letter"); 
     txtletters.Text += lbltext.Text; 
     listofcode = ""; 
    } 
    flagsw.Reset(); 
} 

private void txtletters_KeyUp(object sender, KeyEventArgs e) 
{ 
    txtletters.BackColor = Color.White; 
    sw.Stop(); 
    if (sw.ElapsedMilliseconds < 250) 
     listofcode += "."; 
    else 
     listofcode += "-"; 
    sw.Reset(); 
    flagsw.Start(); 
} 

난 그냥 어떻게 든 일을 관리하지만, 코드로 표시 : 를 누를 때 아무 키나 첫번째 타이머가 시작되며이 경우 첫 번째 타이머가 결정합니다. 또는 - 두 번째 타이머가 시작되면 타이머가 시작됩니다. '.', '-'문자열을 닫아야하며 지정한 문자를 반환하기 위해 데이터베이스에 보내야합니다 ... 여기에있는 문제는 다음과 같습니다. 응용 프로그램이 타이머를 종료하지 않고 다시 keydown을 실행하지 않으면 char를 반환합니다. 즉, 다른 키를 누르지 않으면 입력 한 char이 표시되지 않습니다. (두 번째 타이머 필자는 다른 선택의 여지가 없었기 때문에 그 일을해야만했다.하지만 적어도 아이디어는 알고 있지만 그것을 구현하는 방법을 모르겠다 ... 나는 그것을 구현하는 데 도움을 줄 누군가가 필요하다. ..) keydown이 발생했을 때 백그라운드에서 두 번째 타이머가 작동해야합니다. 재설정 될 것이고 키를 눌렀을 때 (키가 해제되었음을 의미) 두 번째 타이머 (flagsw.ElapsedMilliseconds> 400)가 그 시간보다 커질 때마다 다시 시작됩니다. 작업을 수행하고 다음 사용을 위해 문자열을 삭제합니다.

+0

당신은 타이머를 조사 할 수 있습니다) 등 (예 : https : //로 MSDN .microsoft.com/en-us/library/ystem.timers.timer (v = vs.110) .aspx). 그들은 당신이 한 것일 수있는 것처럼 들리던 일정한 시간이 지나면 약간의 코드를 실행합니다. 따라서 2 초 타이머를 설정하고 도트 또는 대시가 생길 때마다 타이머를 재설정하고 재설정되지 않은 2 초 후에 타이머가 완료되었다고 가정하고 점 및 대시가 무엇으로 변환되는지 확인할 필요가있는 코드를 실행하십시오 . – Chris

+0

키가 올라간 시간을 측정 할 때만 모스를 올바르게 해독 할 수 있습니다. 그리고 그 시간에 기호를 끝내기에 충분할 때를 감지하면 dah-dits를 문자로 변환 할 수 있습니다. 열쇠를 맨 처음 그리고 마지막으로 누르면 코너 케이스가 있습니다. 첫 번째 keydown은 일시 중지 시간을 제공하지 않으며 * bool *로 처리합니다. 마지막 키 업은 일시 중지 시간 측정을 끝내기위한 이벤트를 제공하지 않으며 도구 상자에서 타이머로 처리합니다. –

+0

@Chris, 많이 감사합니다. Chris ... 당신의 아이디어로 저는 이전 타이머보다 더 나은 것을 구현할 수있었습니다 ... 이제 제 코드는 글로벌 타이머를 사용합니다 ... 한 가지 더 ... 타이머가 2 초하지만 약간의 문제가 있습니다. 0 초에 입력하면 올바르게 작동하지만 1.5 초일 경우 별도로 내 대시가 디코딩됩니다. –

답변

-1

처음에 나는 Chris에게 감사해야합니다 ... 당신의 대답으로 아이디어를 얻었고 길을 찾았습니다 ... 이제 완전히 구현되었고 다른 누군가가 사용하고 싶다면 내 코드가 작동합니다 ... (그냥 모스 프로젝트의 디코더 부분) 나 이렇게 도움이 온몸에

namespace Morse_Code 
{ 
    public partial class frmdecdotmode : Form 
    { 
     Boolean flag_isdown = false; 
     Stopwatch sw = new Stopwatch(); 
     Timer morse_timer = new Timer(); 
     string listofcode; 
     DataSet datas = new DataSet(); 
     DataBaseController dbc = new DataBaseController(); 
     public frmdecdotmode() 
     { 
      InitializeComponent(); 
     } 

     private void frmdecdotmode_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      MainMenu mm = new MainMenu(); 
      mm.Show(); 
      this.Hide(); 
     } 

     private void txtletters_KeyDown(object sender, KeyEventArgs e) 
     { 
      flag_isdown = true; 
      txtletters.BackColor = Color.Yellow; 
      sw.Start(); 
      morse_timer.Stop(); 
     } 

     private void txtletters_KeyUp(object sender, KeyEventArgs e) 
     { 
      flag_isdown = false; 
      txtletters.BackColor = Color.White; 
      sw.Stop(); 
      if (sw.ElapsedMilliseconds < 250) 
       listofcode += "."; 
      else 
       listofcode += "-"; 
      sw.Reset(); 
      morse_timer.Start(); 
     } 

     private void frmdecdotmode_Load(object sender, EventArgs e) 
     { 
      morse_timer.Interval = 1000; 
      morse_timer.Enabled = true; 
      morse_timer.Tick += morse_timer_Tick; 
     } 
     private void morse_timer_Tick(object sender, EventArgs e) 
     { 
      if (flag_isdown == false && listofcode != null) 
      { 
       datas = dbc.srchfortext(listofcode); 
       lbltext.DataBindings.Clear(); 
       lbltext.DataBindings.Add("text", datas, "t.letter"); 
       txtletters.Text += lbltext.Text; 
       listofcode = ""; 
      } 
     } 
    } 
} 

감사합니다 ... 야 알리 (