버그 (?)가있는 것으로 확인되어 코드에 버그가 발생했습니다.Delphi : TreeView 요소 대 폼 위치 변경
델파이 XE3, Win32. 나는 캡션 0 요소를 얻을이 후
procedure TForm1.FormCreate(Sender: TObject);
var
i, j: integer;
mn: TTreeNode;
begin
for i := 1 to 10 do
begin
mn := TreeView1.Items.Add(nil, 'M' + IntToStr(i));
for j := 1 to 10 do
begin
TreeView1.Items.AddChild(mn, 'C' + IntToStr(j));
end;
end;
Position := poDesigned;
beep;
Caption := IntToStr(TreeView1.Items.Count);
end;
:
procedure TForm4.Button1Click(Sender: TObject);
begin
with TForm1.Create(Application) do
begin
ShowModal;
Release;
end;
end;
하는 Form1에이 일을한다 : 두 가지 형태, 주요 버튼이있다.
하지만
그럼 내가 좋은 번호 (110 요소)를 볼 수 있습니다procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(TreeView1.Items.Count);
end;
...이 코드와 그 형태의 버튼을 ...있을 때.
위치 변경 후 TreeView1.Handleneeded를 쓰면 그 수 또한 좋습니다.
이 문제는 DestroyHandles를 호출하는 RecreateWnd를 기반으로합니다. 그러나 그들은 Show에서만 수리 될 것입니다 (Activate 이벤트에서 나는 좋은 결과를 볼 수 있습니다).
TreeView는 특수 컨트롤입니다. 트리 요소는 하위이며 실제 하위 개체 목록이 있는지 여부에 관계없이 개수가 계산되므로 특수 컨트롤입니다.
ReCreateWnd가 다른 메서드에서 자주 호출하는 주된 문제는 다른 섹션에서도 문제를 일으킬 수 있으므로 모든 .Count 계산 전에 HandleNeeded를 넣을 수는 없습니다.
(우리는 poScreenCenter가 Positionable 인 경우 위치를 나중에 정정 할 수있는 특별한 기본 형식을 가지고 있습니다. 이것은 FormCreate 호출 이후 내부 메소드에서 발생합니다. 이러한 유형의 양식에서만 문제가 발견되었지만 나중에 우리는 간단한 코드로 그것을 재현 할 수있다.)
그래서이 질문에 대한 전세계적인 해결책은 무엇인가?
은 (너무 XE5이를 경험하셨습니까?) 모든 도움, 정보, 문서 주셔서 감사합니다.
'RecreateWnd'가 호출되는 다른 시나리오는 무엇입니까? –
내 가슴. 그는 이러한 발견했다 : CMCtlD3Changed CMSysColorChange 의 BorderStyle SetAxBorderStyle SetBorderIcons 독 setPosition를 SetPopupMode set_PopupParent RecreateAsPopup ShowModal'RecreateWnd'이 프로그램의 결과로 호출되는 다른 시나리오가 무엇인지 SetMainFormOnTaskBar 내 말은 – durumdara
호 작동 안함. 일반적으로 사용자 이벤트에 응답하여 코드를 작성할 때 할당되지 않은 핸들에 문제가 없어야합니다. –