2013-05-20 5 views
2

내 모든 MDIChildren을 최소화하는 문제를 가지고 MDIChild to minimize not activated properly델파이

모든 아이들을 최소화하기 위해 내 코드를 통해 온 모든 MDI 자식을 최소화하는 것입니다 :

procedure TMainWindow.MinimizeAll1Click(Sender: TObject); 
var 
    i: Integer; 
begin 
    for i := 0 to MDIChildCount - 1 do begin 
    MDIChildren[i].WindowState := wsMinimized; 
    //ShowWindow(MDIChildren[i].Handle, SW_MINIMIZE) 
    end; 
end; 

나는 두 가지 방법 (SW_MINIMIZE 및 wsMinimized)을 시도했지만 어떤 이유로 마지막 MDI 자식 폼은 최소화되지 않습니다. 그러나 당신이 모든 아이들을 다시 최소화하려고한다면 그것은 효과적입니다. MDIAPP 예제에서 Delphi XE의 모든 작업을 최소화하십시오. 1 루틴에서 모든 MDI 하위를 올바르게 최소화하려면 어떻게합니까?

+2

루프를 뒤집어 완료했습니다. – OnTheFly

+1

@ user539484 나는 그것이 또한 작동한다고 생각합니다. 하지만 구현 세부 사항에 크게 의존합니다. 그것이 효과가 있다는 것을 증명할 수 있습니까? 따라서 귀하의 제안서를 사용하지 말 것을 강력히 권합니다. 돌연변이가없는 아동 목록을 먼저 취한 다음 그 돌연변이가 아닌 목록을 걷는 경우 구현 세부 사항을 생각할 필요가 없습니다. –

+0

역 루프는 실제로 전혀 나쁘지 않습니다. 나는 그런 생각을하지 않았다. –

답변

3

MDI 자식 창을 최소화하면 양식이 나타나는 순서가 MDIChildren[]으로 변경됩니다. 이 인덱싱 된 속성은 항상 MDIChildren[0]에 활성 MDI 자식을 반환합니다. 그래서, 당신이 원하는 것을하는 가장 깨끗한 방법은 모든 양식의 복사본을 먼저 가져온 다음 최소화를 시작하는 것입니다.

var 
    i: Integer; 
    Forms: array of TForm; 
.... 
SetLength(Forms, MDIChildCount); 
for i := 0 to high(Forms) do 
    Forms[i] := MDIChildren[i]; 
for i := 0 to high(Forms) do 
    Forms[i].WindowState := wsMinimized; 
+0

이 기능은 작동하지만 MDIChild가 더 이상 존재하지 않는 경우 어떻게 만드나요? –

+2

원래 루프에 대해 같은 질문을합니까? 이 응답에서 코드를 실행하는 동안 자식 폼이 죽을 수 있다고 생각되면 질문에서 코드를 실행하는 동안 자식 폼이 죽을 수 있습니다. 그러나 실제로 위의 코드에서 MDI 자식이 닫히는 것은 불가능합니다. 그 일을 가능하게하려면'ProcessMessages'에 대한 호출을 추가해야합니다. 그러면 여러분은 그렇게하지 않을 것입니다! –

+0

네, 맞습니다.나는'ShowWindow (Handle, SW_RESTORE);와 똑같은 것을 테스트했고, 역 루프가 제대로 작동하지 않았다. 요컨대 이것은 더 좋고 더 안전합니다. 고마워요. –