2012-10-09 4 views
4

분명히 버그이지만, 왜 그런 일이 발생했는지 추적 할 수는 없습니다. 다음은 재현 할 최소한의 코드입니다. 그냥 폼에 콤보 상자와 버튼을 삭제하고 다음 이벤트 핸들러 작성 : 처음 버튼을 클릭하면왜 글꼴 변경시 콤보 상자의 텍스트가 항목 텍스트로 변경됩니까?

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ComboBox1.Items.Add('A Item'); 
    ComboBox1.Items.Add('B Item'); 
    ComboBox1.Items.Add('C Item'); 
    ComboBox1.Style := csDropDown; 
    ComboBox1.AutoComplete := False; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ComboBox1.Text := 'B'; 
    ComboBox1.Font.Color := clRed; 
    ShowMessage(IntToStr(ComboBox1.ItemIndex)); 
end; 

, 당신은 완전히 두 번째 항목의 텍스트를 선택 콤보 편집에 볼을하지만, 메시지 상자에 항목 색인이 -1로 표시됩니다. 드롭 다운하면 두 번째 항목이 선택됩니다. 두 번째 클릭은 적절한 텍스트를 설정하지만 나머지는 첫 번째 클릭과 동일합니다. 따라서이 경우 콤보 상자는 이상한 자동 완성 기능이 활성화 된 것처럼 동작합니다.

글꼴 변경 후 WM_SETTEXT 메시지의 두 번째 항목이 포함 된 메시지가 수신되었지만 두 번째 항목의 텍스트가있는 이유와 그 이유가 무엇인지 알 수없는 EditWndProc까지 추적했습니다.

제 질문은 매우 구체적입니다. 어떤 방법 (어떤 방법)이 글꼴 변경시 WM_SETTEXT을 전송하고 자동 완성이 비활성화 된 경우 두 번째 항목 텍스트가 일치하는지 어떻게 알 수 있습니까?

지금까지 Delphi 2009와 Delphi XE3에서 Windows 7 Home Premium 64-bit의 최신 업데이트를 설치하여 이것을 재현 할 수있었습니다.

+0

델파이 2007에서 확인 된 것과 동일한 동작으로 인해 Windows API 버전이 문제가 될 수 있다고 생각합니까? – MikeT

+0

질문에 Windows 7에 포함시킬 것입니다. – TLama

+1

에 이미 태그가 추가되었습니다. – whosrdaddy

답변

2

VCL 문제라고 생각하지 않습니다. 호출 스택을 보면 메시지가 comctl32.dll을 통해 처리 된 것처럼 보입니다. 당신은 텍스트를 설정하기 전에 글꼴 색상을 설정하여 문제를 해결할 수 있습니다 :

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ComboBox1.Font.Color := clRed; 
    ComboBox1.Text := 'B'; 
    ShowMessage(IntToStr(ComboBox1.ItemIndex)); 
end; 
+0

나는 또한 조용히 Windows를 의심하고있다. Windows 7 만 사용할 수 있으므로이 버전을 다른 버전에서 확인할 수는 없습니다. 어디에서이 버전을 사용해 보았습니까? – TLama

+0

Delphi XE/W7. 당신이 원한다면 내일 XP에서 이걸 시험해 볼 수 있습니다. – whosrdaddy

+0

정말 고마워요! – TLama

4

당신은 자신을 간단하게 디버그 DCUs을 가능하게하고 Font.Color 속성 setter에 스테핑으로 몇 초에이 아래로 추적 할 수 있었다.

어떤 이유로 든 Font이 변경되면 TFont.OnChange 이벤트가 트리거됩니다. TControl에는 심지어 이벤트 핸들러가 할당되어 있으므로 자손 클래스가 변경에 응답 할 수 있도록 CM_FONTCHANGED 메시지를 자체적으로 보낼 수 있습니다. TWinControl은 해당 메시지를 받으면 WM_SETFONT 메시지를 자신에게 보낸 다음 ComCtl32가 표시되는 WM_SETTEXT 메시지를 보내도록 트리거합니다.

+0

이 너무 두 번째 클릭에서 올바르게 작동하는 이유는 이미 빨간색임을 알 수 있습니다. – MikeT

+1

분명히 debug dcus를 사용했습니다. 나는 이것을'EditWndProc' 메쏘드와 변화를 일으키는 메시지로 추적 할 수 없을 것이다. 더 많이 나는이 보낸 사람이 일치하는 항목에 대해 어떻게 알았는지에 관심이 있었지만 응답조차도이 메시지를 보내는 comctl32라는 것을 의미합니다. – TLama

+3

이 텍스트가 항목 텍스트로 바뀌는 이유는 무엇입니까? –

0

Delphi XE8을 사용한 실험에서 TComboBox를 처음 사용하기 시작하자마자 글꼴 변경 요청을 강제로 수행하는 것으로 충분하다는 것을 보여줍니다 (색상을 clBlack으로 설정하는 것만으로도 이미 있음). 먼저 텍스트를 텍스트에 씁니다. 잘못된 텍스트를 선택하는 WM_SETTEXT는 글꼴 색 (또는 다른 글꼴 특성)이 쓰여지는 첫 번째 시간에만 발생합니다. 그 후에 모든 것이 제대로 작동합니다. Windows 또는 Delphi의 버그이든,이 트릭이 나를 위해 문제를 해결 했으므로 알아 내기가 힘들었습니다. :) 그러나 나는 그것이 "초기화 전의 액션"의 또 다른 사례라고 생각합니다. 왜냐하면 코더는 사후 구축이 많은 사용자를 제공 할 때 상황이 항상 편리한 순서로 호출되지 않는다는 사실을 설명하지 못했습니다 구성 속성 (예 : 사용되지 않는 TComboBox의 글꼴 및 텍스트 변경). 이것이 "완고한 것"으로 판명되면 아마도 우리는 델파이 팀을 TCombobox (또는 조상) 생성자에 넣으라고 설득해야합니다. 덧붙여 말하자면,이 같은 "버그"로 인해 SelLength가 0에서 변경됩니다. 초점이 맞았을 때 파란색으로 텍스트 상자에 색칠을하기 때문에 매우 귀찮습니다! 따라서 양식에 파란색이 표시되고 집중력이 있다고 주장하는 많은 콤보 박스가있는 경우이 두통의 원인이됩니다!

덧붙여서 나는 Embarcadero에서이 문제를 제기하고 위의 트릭을 기본 생성자에 포함시키는 방법을 제안했습니다. 그들은 코드 작성자에게 전달했지만 델파이의 새로운 버전에 필요한 수정 사항이 포함되는지 여부는 여전히 확인해야합니다.

관련 문제