2010-04-07 12 views
1

코딩을 발생 때 onKeyPress가 :델파이 - TStringGrid에 때 onKeyPress 이벤트 핸들러를 연결, 새로운 캐릭터와 TStringGrid 업데이트 세포 전에 델파이

사용자가에 입력 된 그리드 셀 전에 때 onKeyPress 이벤트가 발생 실제로 그 값을 업데이트했습니다 누를 수있는 키가 있습니다. 이것은 분명히 문제가됩니다. 사용자가 수정함에 따라 현재이 셀의 내용이 인 것처럼 알고 싶습니다.

"해킹 된"솔루션은 모든 세부 사항을 고려하지 않은 경우 간단합니다. 셀에서 값을 가져온 다음 OnKeyPress 이벤트가 매개 변수와 함께 나오므로 해당 값을 끝점에 추가하십시오. 이제 셀의 현재 값을 얻었습니다!

거짓입니다. 사용자가 셀의 모든 텍스트 (예 : "foo")를 선택하고 현재 'b'를 입력하면 어떻게 될까요? 그들은 텍스트를 선택했기 때문에 지워지고 문자 'b'로 바뀝니다. 그러나 셀 값은 여전히 ​​OnKeyPress에서 "foo"로 표시되고 Key 값이이면 'b'가됩니다. 따라서 위의 논리에 따라 응용 프로그램에서 셀에 "foob"이 포함되어 있다고 결론을 내릴 수 있습니다. 우리는 사실이 아님을 압니다.

So. 아무도이 문제를 해결하는 방법을 알고 있습니까? OnKeyPress가 그리드의 내용이 업데이트 된 후 또는 처리기의 시작 부분에 업데이트를 강제하는 방식으로 반응하는 방법이 있습니까? 필자는 OnKeyUp 이벤트의 사용을 필사적으로 피하고 있습니다. 따라서 다른 제안은 제외하고 크게 감사하겠습니다.

+4

"왜 OnKeyUp 이벤트 사용을 필사적으로 피하고 있습니까?" –

+3

컨트롤이 키를 처리하고 그에 따라 내용을 업데이트하기 전에 OnKeyPress가 시작됩니다. 원하는 경우 앱의 코드가 키를 미리 거부 할 수 있습니다. –

+0

@Remy : 예, Deltics에서 이미 설명해 주었고 답변도 함께 제공했습니다. @Mason : OnKeyUp은 ASCII뿐만 아니라 모든 키를 감시합니다. 원하지 않는 것들을 걸러 낼 많은 노력이 필요합니다. OnKeyUp을 사용하여 문제가 발생했습니다 (예 : KeyDown이 다른 구성 요소에있을 때 KeyUp 잡기 - 바람직하지 않음). OnKeyPress를 사용하여 리팩토링 한 이유는 다시 돌아가서 사용하기가 무의미합니다 * . ** OnSetEditText **가 나를 위해 완벽하게 작동해야합니다. – JMTyler

답변

5

당신은 왜 당신이 OnSetEditText 이벤트를 사용하지 않는 세포 의 변화에 ​​대응하려면?

키보드 이벤트는 키보드 입력에 대한 응답이며 해당 입력에 대한 응답을 제어하지 않습니다. 컨트롤은 일반적으로 하나 이상의 추가 이벤트를 제공하여 응용 프로그램이 일부 입력에 대한 컨트롤 응답에 응답 할 수있게합니다.이 경우 키보드 입력에 따라 셀 선택이 변경되는 대신 셀 값이 수정됩니다. 예를 들어 . 여담으로

, 효과적으로 할 수 있도록 "필터"등의 이벤트가 전에 컨트롤에 도달 , 예를 들어, 이러한 이벤트는, 그리드가 그 이벤트에 대한 응답을 제어 이전에 발생하는해야한다는 아주 자연 ~ 은 특정 키보드 입력이 셀 값에 영향을 미치지 않도록합니다.

+0

기술적으로 ** OnSetEditText **는 값이 실제로 변경되었는지 여부에 관계없이 셀이 포커스를 잃을 때마다 발생합니다. 그럼에도 불구하고, 내가 값을 비교하여 그것이 실제로 바뀌 었는지 알게되면, 이것은 나를 위해 훌륭하게 수행해야합니다. 고마워. – JMTyler