• Юрий Зотов © (14.03.18 10:43) [0]
    Форме MDIChild надо проставить определенные стартовые размеры и позицию внутри главной формы. Прописал их в OnCreate, но они успешно игнорируются. Насколько помню, это обычное поведение - стартовые размеры и позицию окон MDIChild система устанавливает сама.

    Тем не менее, есть ли способ задать свои стартовые размеры и позицию форме MDIChild?
  • Leonid Troyanovsky © (14.03.18 11:34) [1]

    > Юрий Зотов ©   (14.03.18 10:43) 

    Попробуй позицию устанавливать в OnCreate (или в конструкторе) MDIChild.
    Т.е.

    procedure TForm2.FormCreate(Sender: TObject);
    var
     crect: TRect;
    begin
     Windows.GetClientrect( application.mainform.clienthandle, crect );
     SetBounds(
                (crect.right - width ) div 2,
                (crect.bottom - height ) div 2,
                width, height );
    end;

    --
    Regards, LVT.
  • Юрий Зотов © (14.03.18 11:57) [2]
    Да, Леонид, спасибо. До этого я уже сам додумался (есть еще порох в пороховницах). Но возникла другая проблема - форма MDIChild стартует в максимизированном состоянии, хотя ее никто об этом не просил (WindowState = wsNormal). Что не есть гуд.

    Перехват WM_SYSCOMMAND гиганта мысли не спас.
  • Игорь Шевченко © (14.03.18 12:57) [3]
  • Игорь Шевченко © (14.03.18 13:05) [4]
    unit Child;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TfChild = class(TForm)
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
       procedure FormShow(Sender: TObject);
     private
       FInstanceCount: Integer;
     public
       constructor Create (AOwner: TComponent; AInstanceCount: Integer); reintroduce;
     end;

    implementation

    {$R *.dfm}

    { TfChild }

    constructor TfChild.Create(AOwner: TComponent; AInstanceCount: Integer);
    begin
     FInstanceCount := AInstanceCount;
     inherited Create (AOwner);
    end;

    procedure TfChild.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Action := caFree;
    end;

    procedure TfChild.FormShow(Sender: TObject);
    begin
     if (FInstanceCount mod 2) = 0 then
     begin
       Left := 5;
       Top := 5;
       Width := 200;
       Height := 200;
     end;
    end;

    end.



    Вызов

    procedure TForm1.New1Click(Sender: TObject);
    begin
     with TfChild.Create(Self, MDIChildCount) do
       Show;
    end;



    Работает
  • Leonid Troyanovsky © (14.03.18 13:11) [5]

    > Юрий Зотов ©   (14.03.18 11:57) [2]

    > Перехват WM_SYSCOMMAND гиганта мысли не спас.

    WM_MDIRESTORE ?

    --
    Regards, LVT.
  • Тимохов Дима © (17.03.18 18:55) [6]
    Я это делаю так
    (форма - создана, ничего кроме FormStyle := fsMDIChild не менял).


    unit Unit2;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;

    type
     TForm2 = class(TForm)
       procedure FormCreate(Sender: TObject);
       protected procedure CreateParams(var Params: TCreateParams); override; final;
     end;

    implementation

    {$R *.dfm}

    procedure TForm2.CreateParams;
    begin
      inherited;

      Params.X := Left;
      Params.Y := Top;
      Params.Width := Width;
      Params.Height := Height;
    end;

    procedure TForm2.FormCreate(Sender: TObject);
    begin
      Left := 10;
      Top := 100;
      Width := 400;
      Height := 200;
    end;

    end.

Есть новые Нет новых   [134427   +34][b:0][p:0.002]