Конференция "Основная" » В MDI приложение WindowState := wsMaximized; происходит долго…
 
  • Kolan © (25.04.08 18:32) [0]
    Здравствуйте,
     В MDI приложении
    WindowState := wsMaximized;

    у Child окна выполняется очень долго.
    Где могут быть грабли?
    ЗЫ
     Ресайз проверил — дело не в нем.
  • Kolan © (25.04.08 19:17) [1]
    Скорее вопрос вот в чем.

    Допусти было у меня два эмдиай окна. Одному окну я сделал WS = wsMaximized.
    А второму BringToFront. И при этом первое дочернее окно стало wsNormal.
    Как это так? Почему так? Как сделать, чтобы сотояние сохранялось?
  • Игорь Шевченко © (25.04.08 19:37) [2]
    В MDI либо все окна максимизированы, либо все немаксимизированы.
    Третьего не дано
  • Kolan © (25.04.08 19:42) [3]
    Как же быть? В DMCilent'е просто переключение между окнами происходит очень долго, так как каждый раз окно максимизируется. Если окна не максимизировать, то переключается все влет…
  • Kolan © (25.04.08 19:46) [4]
    > В MDI либо все окна максимизированы

    То есть я хочу чтобы они были все максимизированы. Но почему-то, где-то (не могу понять где) максимизация теряется…
  • Kolan © (25.04.08 22:25) [5]
    Может поступить как-то так:
    http://delphiworld.narod.ru/base/child_fill_entire_main.html

    И вообще убрать максимизацию?
  • Игорь Шевченко © (26.04.08 00:45) [6]

    > Но почему-то, где-то (не могу понять где) максимизация теряется…


    Окна случаем не сохраняют свое положение в реестре или где-то еще, и не восстанавливают при показе ?
  • Kolan © (26.04.08 08:19) [7]
    > Окна случаем не сохраняют свое положение в реестре или где-
    > то еще, и не восстанавливают при показе ?

    Обыскался уже. Искал, нигде не нашел, чтобы wsNormal востанавливалось.

    Даже переопределил это свойство, поставил в сеттер точку.
    Окна создаются максимизированными.

    И все равно при DoBringToFront; окно уже нормальное, причем точка в сеттере не срабатывает.
    Мое имхо тут какое-то волшебство.

    Искал и сообщение WinAPI тоже не нашел…

    procedure TDMCChildForm.DoBringToFront;
    begin
     LockWindowUpdate(MainForm.ClientHandle);
     gAllowSizing := False;
     try
       BorderIcons := [biMaximize];
       WindowState := wsMaximized;
       BorderIcons := [];
       BringToFront;
       DoResize;
     finally
       gAllowSizing := True;
       LockWindowUpdate(0);
     end;
    end;



    ЗЫ
     Если захотите глянуть исходники, то они в свн на assembla.com лежат, просто в аську мне напишите, я отправлю приглашение.
  • Kolan © (26.04.08 22:19) [8]
    Интересно что при закрытии вызывается код:

    procedure TDMCChildForm.FormClose(Sender: TObject;
     var Action: TCloseAction);
    begin
     if GetStopEnabled then
       Stop;
     MainForm.CloseChild(Self);
     Action := caFree;
    end;



    И новое окно показыввается быстро.
  • Kolan © (27.04.08 12:17) [9]
    > [2] Игорь Шевченко ©   (25.04.08 19:37)
    > В MDI либо все окна максимизированы, либо все немаксимизированы.
    > Третьего не дано


    Тут вот Knight докопался до «волшебства»:

    модуль — Forms — 5062
    &#133
          if FormStyle = fsMDIChild then
           begin
             { Fake a size message to get MDI to behave }
             if FWindowState = wsMaximized then
             begin
    ->        SendMessage(Application.MainForm.ClientHandle, WM_MDIRESTORE, Handle, 0);
               ShowWindow(Handle, SW_SHOWMAXIMIZED);
             end
    &#133

    Лыцарь (02:13:31 27/04/2008)
    т.е. когда одно разворачивается&#133 остальные сворачиваются.



    Как же быть? Как можно преодолеть сабж?
  • Игорь Шевченко © (27.04.08 15:54) [10]
    Разумеется. Windows ничего не знает про WindowState, зато Windows знает, что в MDI-приложении все деорние окна либо максимизированы, либо немаксимизированы. Вот Delphi и пытается как-то связать свое свойство WindowState с механизмом Windows.
    Мой совет - не делай WindowState := wsMaximized у дочерней формы.
  • Kolan © (27.04.08 20:53) [11]

    > Мой совет — не делай WindowState := wsMaximized у дочерней
    > формы.

    Да, так дейсвительно нет тормозов, но какже тогда его растянуть на весь экран?
  • Игорь Шевченко © (27.04.08 23:16) [12]
    Kolan ©   (27.04.08 20:53) [11]


    > но какже тогда его растянуть на весь экран?


    Left, Top, Width, Height
  • Knight © (28.04.08 01:13) [13]
    > [12] Игорь Шевченко ©   (27.04.08 23:16)

    А почему максимизированные формы в демке текстового редактора
    \Demos\DelphiWin32\VCLWin32\Doc\TextEdit\


    при развёртывании и переключении через меню открытых MDIChild'ов никуда не сворачиваются? А переключаются в развёрнутом виде… кстати, мож подскажете, к какому обработчику события привязаны эти пункты меню.
  • Игорь Шевченко © (28.04.08 10:08) [14]
    Knight ©   (28.04.08 01:13) [13]

    Потому что им вручную не присваивается WindowState ? Я угадал ?


    > кстати, мож подскажете, к какому обработчику события привязаны
    > эти пункты меню.


    Это вообще стандартные пункты меню, которое добавляет Windows.
    К обработчику сообщения WM_MDIACTIVATE
  • Knight © (28.04.08 10:32) [15]
    > [14] Игорь Шевченко ©   (28.04.08 10:08)

    Да… намудрили там что-то товарищи разработчики… вылечим %)
  • Kolan © (28.04.08 19:36) [16]
    > Left, Top, Width, Height

    Как сделать неясно.

    Непонятно как правильно их задать, и что самое главное — неясно как сделать, чтобы дочернее окно ресайзилось вслед за основным.

    Непонятно как мкрыть полосы прокрутки, которые появляются у гл. окна.
    Ни SetScrollRange ни ShowScrollBar не помогли.
  • Kolan © (28.04.08 19:36) [17]
    > Left, Top, Width, Height

    Как сделать неясно.

    Непонятно как правильно их задать, и что самое главное — неясно как сделать, чтобы дочернее окно ресайзилось вслед за основным.

    Непонятно как мкрыть полосы прокрутки, которые появляются у гл. окна.
    Ни SetScrollRange ни ShowScrollBar не помогли.
  • Игорь Шевченко © (29.04.08 09:21) [18]
    Kolan ©   (28.04.08 19:36) [16]

    Оставь это на усмотрение пользователя. Займись лучше функциональностью.
    Или с функциональностью все хорошо и у тебя осталась только борьба с MDI ?
  • Kolan © (29.04.08 11:29) [19]
    > Оставь это на усмотрение пользователя. Займись лучше функциональностью.

    Да, так и решили сделать.


    > Или с функциональностью все хорошо и у тебя осталась только
    > борьба с MDI ?

    Функциональность мы не трогаем в этой версии, даже чуть чуть чуть сокрашаем. Мы хотим выпустить стабильную версию.

    ЗЫ
    http://pda.delphimaster.net/?n=3&id=1209453717
 
Конференция "Основная" » В MDI приложение WindowState := wsMaximized; происходит долго…
Есть новые Нет новых   [134487   +1][b:0][p:0.001]