![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В MDI приложение WindowState := wsMaximized; происходит долго…
Kolan © (2008-04-25 18:32:00)Здравствуйте,
В MDI приложенииWindowState := wsMaximized;у Child окна выполняется очень долго.
Где могут быть грабли?
ЗЫ
Ресайз проверил дело не в нем.
(2008-05-03 11:15:00) [1]Удалено модератором
(2008-05-03 11:15:00) [2]Удалено модератором
Kolan (2008-04-29 11:29:00) [3]> Оставь это на усмотрение пользователя. Займись лучше функциональностью.
Да, так и решили сделать.
> Или с функциональностью все хорошо и у тебя осталась только
> борьба с MDI ?
Функциональность мы не трогаем в этой версии, даже чуть чуть чуть сокрашаем. Мы хотим выпустить стабильную версию.
ЗЫ
http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1209453717
Игорь Шевченко (2008-04-29 09:21:00) [4]Kolan © (28.04.08 19:36) [16]
Оставь это на усмотрение пользователя. Займись лучше функциональностью.
Или с функциональностью все хорошо и у тебя осталась только борьба с MDI ?
Kolan (2008-04-28 19:36:00) [5]> Left, Top, Width, Height
Как сделать неясно.
Непонятно как правильно их задать, и что самое главное неясно как сделать, чтобы дочернее окно ресайзилось вслед за основным.
Непонятно как мкрыть полосы прокрутки, которые появляются у гл. окна.
Ни SetScrollRange ни ShowScrollBar не помогли.
Kolan (2008-04-28 19:36:00) [6]> Left, Top, Width, Height
Как сделать неясно.
Непонятно как правильно их задать, и что самое главное неясно как сделать, чтобы дочернее окно ресайзилось вслед за основным.
Непонятно как мкрыть полосы прокрутки, которые появляются у гл. окна.
Ни SetScrollRange ни ShowScrollBar не помогли.
Knight (2008-04-28 10:32:00) [7]> [14] Игорь Шевченко © (28.04.08 10:08)
Да намудрили там что-то товарищи разработчики вылечим %)
Игорь Шевченко (2008-04-28 10:08:00) [8]Knight © (28.04.08 01:13) [13]
Потому что им вручную не присваивается WindowState ? Я угадал ?
> кстати, мож подскажете, к какому обработчику события привязаны
> эти пункты меню.
Это вообще стандартные пункты меню, которое добавляет Windows.
К обработчику сообщения WM_MDIACTIVATE
Knight (2008-04-28 01:13:00) [9]> [12] Игорь Шевченко © (27.04.08 23:16)
А почему максимизированные формы в демке текстового редактора
\Demos\DelphiWin32\VCLWin32\Doc\TextEdit\
при развёртывании и переключении через меню открытых MDIChild'ов никуда не сворачиваются? А переключаются в развёрнутом виде кстати, мож подскажете, к какому обработчику события привязаны эти пункты меню.
Игорь Шевченко (2008-04-27 23:16:00) [10]Kolan © (27.04.08 20:53) [11]
> но какже тогда его растянуть на весь экран?
Left, Top, Width, Height
Kolan (2008-04-27 20:53:00) [11]
> Мой совет не делай WindowState := wsMaximized у дочерней
> формы.
Да, так дейсвительно нет тормозов, но какже тогда его растянуть на весь экран?
Игорь Шевченко (2008-04-27 15:54:00) [12]Разумеется. Windows ничего не знает про WindowState, зато Windows знает, что в MDI-приложении все деорние окна либо максимизированы, либо немаксимизированы. Вот Delphi и пытается как-то связать свое свойство WindowState с механизмом Windows.
Мой совет - не делай WindowState := wsMaximized у дочерней формы.
Kolan (2008-04-27 12:17:00) [13]> [2] Игорь Шевченко © (25.04.08 19:37)
> В MDI либо все окна максимизированы, либо все немаксимизированы.
> Третьего не дано
Тут вот Knight докопался до «волшебства»:
модуль Forms 5062
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
Лыцарь (02:13:31 27/04/2008)
т.е. когда одно разворачивается остальные сворачиваются.
Как же быть? Как можно преодолеть сабж?
Kolan (2008-04-26 22:19:00) [14]Интересно что при закрытии вызывается код:
procedure TDMCChildForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if GetStopEnabled then
Stop;
MainForm.CloseChild(Self);
Action := caFree;
end;
И новое окно показыввается быстро.
Kolan (2008-04-26 08:19:00) [15]> Окна случаем не сохраняют свое положение в реестре или где-
> то еще, и не восстанавливают при показе ?
Обыскался уже. Искал, нигде не нашел, чтобы 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 лежат, просто в аську мне напишите, я отправлю приглашение.
Игорь Шевченко (2008-04-26 00:45:00) [16]
> Но почему-то, где-то (не могу понять где) максимизация теряется…
Окна случаем не сохраняют свое положение в реестре или где-то еще, и не восстанавливают при показе ?
Kolan (2008-04-25 22:25:00) [17]Может поступить как-то так:
http://delphiworld.narod.ru/base/child_fill_entire_main.html
И вообще убрать максимизацию?
Kolan (2008-04-25 19:46:00) [18]> В MDI либо все окна максимизированы
То есть я хочу чтобы они были все максимизированы. Но почему-то, где-то (не могу понять где) максимизация теряется
Kolan (2008-04-25 19:42:00) [19]Как же быть? В DMCilent'е просто переключение между окнами происходит очень долго, так как каждый раз окно максимизируется. Если окна не максимизировать, то переключается все влет
Игорь Шевченко (2008-04-25 19:37:00) [20]В MDI либо все окна максимизированы, либо все немаксимизированы.
Третьего не дано