2013-11-24 2 views
1

여기 설정의 변경시 커서 (캐럿) 위치를 변경하기 위해 두 번의 클릭이 필요합니다 (I 델파이 7 사용하고 있습니다를, 확실하지 않은이 나중에 일어날 경우/이전 버전) :RichEdit의 활성 형태 (델파이)

두 가지 형식으로 새 프로젝트를 만듭니다. 첫 번째 양식에 TMemo, TRichEditTButton을 입력하십시오. 및 TRichEditLines 속성을 123456으로 설정하십시오. TButtonOnClick 이벤트 핸들러에서 는 응용 프로그램을 실행 버튼 및 빈 Form2 보여 초점을 얻을 것이다를 클릭

Form2.Show;을 넣어. Form1TMemo의 텍스트 "123456"을 클릭하면 포커스가 Form1으로 다시 변경되고 커서 (캐럿)가 예상 한대로 클릭 한 텍스트 "123456"의 중간에 나타납니다. 다시 초점을 맞추려면 Form2을 다시 클릭하십시오. Form1에있는 TRichEdit의 텍스트 "123456"을 클릭하면 포커스가 Form1으로 다시 변경되지만 커서 (캐럿)는 클릭 한 텍스트 "123456"의 중간에 있지 않지만 RichEdit의 두 번째 빈 줄 (또는 이전에 있었던 곳)에. TRichEdit의 텍스트 "123456"중간에 두 번째 클릭하면 커서 (캐럿)가 예상대로 이동합니다.

따라서 TRichEdit 컨트롤은 포커스를 얻지 만 커서 (캐럿)는 예상대로 이동하지 않습니다.

참고 : 이것은 한 형식에서 다른 형식으로 포커스를 변경할 때만 발생합니다. 하나의 컨트롤에서 동일한 양식의 TRichEdit 컨트롤로 포커스를 변경하면이 문제가있는 동작이 발생하지 않습니다.

내 질문 : TRichEdit 내부의 두 번째 클릭이 필요 없으며 컨트롤이 TMemo처럼 동작해야합니다.

미리 감사드립니다.

+1

이 가장 가능성이 아무것도 Delphi와 관련이 있으며 이러한 Windows 컨트롤의 표준 동작 일뿐입니다. –

+0

다른 응용 프로그램에서 포커스를 전환 할 때도 마찬가지입니다. –

+1

@DavidHeffernan 그렇습니다. RichEdit 컨트롤은 Delphi 컨트롤이 아닌 Windows 컨트롤이므로 생각했습니다. 아직 이해할 수없고 해결책이 필요한 문제가되는 혼란스러운 행동입니다. – jedivader

답변

3

새 컨트롤을 파생 시키거나 원하는 방식으로 리치 헷트를 서브 클래 싱하여 활성화 메커니즘에 개입 할 수 있습니다. 컨트롤이 아직없는 경우 샘플 인터 포저 클래스가 마우스의 왼쪽 버튼으로 활성화하려고 할 때 게시 된 마우스를 아래로 메시지 전에 컨트롤에 포커스를 설정 아래의 집중 :

type 
    TRichEdit = class(comctrls.TRichEdit) 
    protected 
    procedure WMMouseActivate(var Message: TWMMouseActivate); 
     message WM_MOUSEACTIVATE; 
    end; 

procedure TRichEdit.WMMouseActivate(var Message: TWMMouseActivate); 
begin 
    if (GetFocus <> Handle) and (Message.MouseMsg = WM_LBUTTONDOWN) then 
    SetFocus; 
    inherited; 
end; 
+0

Brilliant! 이 솔루션은 완벽하게 작동하며 내가 찾고있는 솔루션입니다. 고맙습니다! – jedivader

+0

@jedi - 오신 것을 환영합니다! –