Q&A

  • mdi폼에서 mdichild폼이 mdiform에 나타나는 문제
제가 할려고하는 것은

mdiform에서 mdichild폼을 호출해서 mdichild폼을 나타낼때

mdiform크기에 맞게 mdichild폼이 꽉차게 폼을 표현하고자 합니다..

즉 mdiform에는 메뉴와 상태바가 있는데 mdichild폼이 메뉴와 상태바를 제외한 공간크기안에 꽉맞게 mdichild폼을
나타내고자 합니다..

어떻게 해야하는지...고수님들의 힌트라도 부탁드립니다.  
        


4  COMMENTS
  • Profile
    홍성락 2009.01.14 18:27
    디자인시나 코딩으로 child폼 속성중 WindowState을 wsMaximized으로 하시면 됩니다.
  • Profile
    밴댕이 2009.01.14 18:59
    child폼의 windowstate 상태를 최대화하지 않고 해당 mdi메인폼의 남은 공간(상태바,메뉴등을 제외한 공간)에 꽉 맞게 넣고자 하는것입니다..어떻게 해야 할까요.
  • Profile
    홍성락 2009.01.14 20:37
    windowstate를 건드리지 않고 폼 사이즈를 계산하시려는 거군요
    유사한 소스는 자료실에 예전에 올린 것이 있어요. 이걸 사용하셔도 child폼이 하나이면 화면에 꽉차는 효과가 있습니다
    SUBJECT MDI Form에서 Child폼 정리하기(Tile확장)...
    단, 계산중 예전에는 적당히 5정도를 뺏는데 MainForm.BorderWidth - GetSystemMetrics(SM_CXFRAME) 계산을 추가 했습니다.


    //메인폼의 모든 컴포를 검색해 Visible/Align로 가로 세로 여백을 구해 오는 함수
    function GetMDIWorkArea(MainForm: TForm): TRect;

    function GetTop: Integer;
    var
    i, j: Integer;
    begin
    with MainForm do begin
    j := 0;
    for i := 0 to ControlCount - 1 do
    if Controls[i].Visible and (Controls[i].Align = alTop) and (Controls[i].Top + Controls[i].Height > j) then
    j := Controls[i].Top + Controls[i].Height;
    end;
    Result := j;
    end;

    function GetBottom: Integer;
    var
    i, j: Integer;
    begin
    with MainForm do begin
    j := ClientHeight;
    for i := 0 to ControlCount - 1 do
    if Controls[i].Visible and (Controls[i].Align = alBottom) and (Controls[i].Top < j) then
    j := Controls[i].Top;
    end;
    Result := j;
    end;

    function GetLeft: Integer;
    var
    i, j: Integer;
    begin
    with MainForm do begin
    j := 0;
    for i := 0 to ControlCount - 1 do
    if Controls[i].Visible and (Controls[i].Align = alLeft) and (Controls[i].Left + Controls[i].Width > j) then
    j := Controls[i].Left + Controls[i].Width;
    end;
    Result := j;
    end;

    function GetRight: Integer;
    var
    i, j: Integer;
    begin
    with MainForm do begin
    j := ClientWidth;
    for i := 0 to ControlCount - 1 do
    if Controls[i].Visible and (Controls[i].Align = alRight) and (Controls[i].Left < j) then
    j := Controls[i].Left;
    end;
    Result := j;
    end;
    begin
    if MainForm <> nil then
    Result := Rect(GetLeft, GetTop, GetRight, GetBottom);
    end;



    //Form2가 child폼일때 Create시 계산합니다
    procedure TForm2.FormCreate(Sender: TObject);
    var
    R: TRect;
    W, H: Integer;
    begin
    Form2.WindowState := wsNormal;
    R := GetMDIWorkArea(Form1);
    W := R.Right - R.Left - Form1.BorderWidth - GetSystemMetrics(SM_CXFRAME); //예전 것과 변경부분
    H := R.Bottom - R.Top - Form1.BorderWidth - GetSystemMetrics(SM_CYFRAME); //예전 것과 변경부분
    if W < 0 then W := 0;
    if H < 0 then H := 0;
    Form2.SetBounds(0, 0, W, H);
    end;
  • Profile
    밴댕이 2009.01.14 21:34
    좋은 정보 감솨드립니다.