Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[401] [정보] [참고] HTT프로그램짜는거.
sspum [ ] 2504 읽음    1997-12-23 02:56

타자연습프로그램짜는 거는 어렵지 않아요.

물어보신것은 파일에서 연습할 글들을 읽어와서
화면에 뿌려주는 것을 말하는거 같은데...
모...데이타베이스파일을 써도 되겠지요...
아니면 그냥 텍스트파일을 써서 예문들을 적어놓아도 되겠고..

텍스트파일을 사용한다면 그냥 readln으로 한줄씩 읽어서
그 줄을 뿌려주는 거예요...
edit1을 예문을 뿌려주는 것으로 하고...
edit2를 예문을 따라치는 것으로 하고... 그렇다면..

var
str:string;
begin
readln(fh,str);
edit1.text:=str;

저렇게 하다가..
파일의 끝에 다다르면 다시 파일핸들을 닫아주고..
다시 파일 열어서 반복해주고..그렇게 하면..
한개의 텍스트파일에 있는 예문들을 게속 반복해서 읽어올수 있읍니다.

그리고 타수계산하는 것은 분당몇타를 치느냐를 계산하는 것이기 때문에...
edit2의 onKeyDown 이벤트에서 키보드친 갯수를 하나씩 증가시켜 주면서 ..
전체 친 갯수를 계산하고 그 갯수를 치는 동안 몇초가 걸렸나를
1/1000초 단위로 계산해서 그걸 1분으로 환산하면 됩니다.

그리고 틀린 문자를 입력했을때 스피커로 삑삑소리 나게 하면서..
틀리게 입력한 글자위에 화살표표시같은거 해줄려면.
label을 여러개 놓고 각각의 레이블을 배열처럼 사용해서
틀린문자의 배열순서에 맞춰서 표시해주면 됩니다.

레이블에는 특수문자를 써주던가 그러면 되겠죠...
아니면 폼의 캔버스에 직접 쪼끄만 원을 그려서 그 원을 빨갛게 칠해서
그 위치를 표시해 준다던가...
onkeyup 이벤트에서 ..

procedure TForm1.Edit2Keyup(sender :TObject);
var
st1,st2:string;
i,j:integer;
x,y:integer; //캔버스에 그려줄 작은 원들을 위한 좌표...
begin
st1:=edit1.text; //예문에 쓰여진 연습글들...
st2:=edit2.text; //사용자가 타자연습하며 입력한 글들...

st2_length:=length(st2); //사용자가 입력한 글들의 크기...
//사용자가 방금 입력한 글이 예문과 다른지를 판단하기 위해...

if st1[st2_length] <> st2[st2_length] then //잘못입력했다!!
  begin
   with canvas do
    pen.color:=clred;
    brush.color:=clred;
    y:=edit1.top-7; //예문 바로 위에 틀린부분을 표시하기 위한 원의
    // y 좌표... 이것은 변동이 없음.
    x:=edit1.left+10*st2_length+5; //틀린부분을 표시하기위한 원의 x좌표
    //10*st2_length... 에서 10은 edit1의 글자폰트의 크기가 10일때...
    //14사이즈일때는 10대신 14를 넣는다.
    ellipse(x-2,y,x+1,y+5);
  end;
end;

end;

저렇게 해주면 간단하게 틀린부분이 표시가 되고...
좀더 복잡하게 해줄려면 delete키가 눌렸을때를 처리해 줘야 겠죠...
그리고 한글일때는 2바이트를 기다렸다가...
1바이트가 아닌 2바이트가 증가될때 틀렸나 맞았나를 체크해주면 됩니다.
영어라면 저위에 것이 그대로 적용되지만.
한글은 2바이트 이상 edit2의 내용이 변한후에 체크해야 합니다.

if isEDBSLeadByte(Byte(st2[st2_length]))=true then //한글이 입력되었다.
st2_length:=st_length-2;

위의 두 줄을 위의 프로시져의 st2_length:=length(edit2.text);
바로 다음줄에 추가해주면 될겁니다.
그리고 나머지는 좀더 생각하면 쉽게 될것 같군요...
그런데 캔버스에 그려준 원을 지울때는 brush와 pen의 칼라를 clbtnface로 지정한후
똑같은 원을 그려주면 될듯.

그럼.이만.


+ -

관련 글 리스트
401 [정보] [참고] HTT프로그램짜는거. sspum 2504 1997/12/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.