begin
if (IsVisible or (csDesigning in ComponentState) and
not (csNoDesignVisible in ControlStyle)) and (Parent <> nil) and
Parent.HandleAllocated then
begin
Rect := BoundsRect;
InvalidateRect(Parent.Handle, @Rect, not (IsOpaque or
(csOpaque in Parent.ControlStyle) or BackgroundClipped)); //Parent에서 자신이 있는 영역을 무효화 하는 메세지를 보냅니다.
end;
end;
<!--CodeE-->
저기 InvalidateRect 함수에 문제가 있는것이죠
InvalidateRect에서 Parent.Handle 이 아니라 Form.ClientHandle 로 해야하구 Rect도 mdi에 맞춰서 조정해줘야 하구요
결론적으로 다음과 같이하면 문제가 해결될것입니다.
<!--CodeS-->
procedure TForm1.Timer1Timer(Sender: TObject);
var
rc: TRect;
begin
Label1.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss',Now); //Label1.Caption을 수정하고
rc:=Self.ClientRect;
InvalidateRect(self.ClientHandle, @rc, true); //InvalidateRect 를 Form의 ClientHandle을 넣어서 호출해줍니다.
end;
<!--CodeE-->
그런데 위함수에도 문제가 하나 있는데...
InvalidateRect 호출할때 Rect가 홈 Client전체 라는것입니다.
MDI의 경우 Label의 Rect(Lebel.left , Lebel.top ...) 으로 하니까 안되더군요
Label의 Left , Label.top은 Form의 ClientRect를 기준으로 하지만
MDI의 Client의 Rect가 Form의 ClientRect 와 같지가 않더군요
아래는 MDI폼의 왼쪽에 Panel이 Align=alLeft 로 놓여있는경우에 처리입니다.
<!--CodeS-->
procedure TForm1.Timer1Timer(Sender: TObject);
var
rc: TRect;
begin
procedure TMainForm.tmr1Timer(Sender: TObject);
begin
Label1.Caption := TimeToStr(Now);
MainForm.Perform(WM_SIZE, 0, 0);
end;
<!--CodeE-->
편법입니다만 음 이 방법이 있긴 하겠네요. 결국 클라이언트 영역을 다시 뿌리게 하는 게 핵심인데
이상하게 먹는게 별로 없네요. ㅡ_ㅡ;;