Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Прошу обратить внимание всем, кто работает с ActionMainMenuBar   Найти похожие ветки 

 
Aleksandr.   (2005-08-25 02:33) [0]

В Делфи 2005 сначала с радостью убедился, что Борланды исправили наконец баг с необновлением кнопочек Minimize/Restore/Close на ActionMainMenuBar при закрытии максимизированного дочернего окна. А потом вдруг заметил странную вещь - как только максимизируешь в программе дочернее окно, прога начинает выедать все ресурсы процессора. Долго грешил на свой код, день убил на проверку всех OnUpdate для экшнов, WndProc и repaint, пока не обратил внимание именно на связь занятости процессора с наличием этих кнопочек.
А корень оказался в вот этом коде в модуле ActnMenus:

procedure TCustomActionMainMenuBar.MDIChildMaximized(ChildForm: TCustomForm);

 function SetupMDIButton(Style: TMDIButtonStyle): TCustomMDIMenuButton;
 begin
   Result := TCustomMDIMenuButton.Create(Self);
   with Result do
   begin
     Visible := False;
     Parent := Self;
     Top := Self.VertMargin + 1;
     Width := GetSystemMetrics(SM_CXMENUSIZE);
     Height := GetSystemMetrics(SM_CYMENUSIZE);
     ButtonStyle := Style;
     Action := TInternalMDIAction.Create(Self);
     case Orientation of
       boLeftToRight:
         begin
           Anchors := [akTop, akRight];
           case ButtonStyle of
             mbMinimize: Left := Self.Width - Width * 3 - VertMargin - 1;
             mbRestore: Left := Self.Width - Width * 2 - VertMargin - 1;
             mbClose: Left := Self.Width - Width - VertMargin - 1;
           end;
         end;
       boRightToLeft:
           case ButtonStyle of
             mbMinimize: Left := Width * 2 + VertMargin + 1;
             mbRestore: Left := Width + VertMargin + 1;
             mbClose: Left := 0 + VertMargin + 1;
           end;
     end;
     with Action as TInternalMDIAction do
       case ButtonStyle of
         mbMinimize: MDIAction := maMinimize;
         mbRestore: MDIAction := maRestore;
         mbClose: MDIAction := maClose;
       end;
   end;
   Visible := True;    
 end;

begin
 if csDestroying in ChildForm.ComponentState then exit;
 if not Assigned(FRestoreBtn) then
 begin
   FMinimizeBtn := SetupMDIButton(mbMinimize);
   FRestoreBtn := SetupMDIButton(mbRestore);
   FCloseBtn := SetupMDIButton(mbClose);
 end;
 TInternalMDIAction(FMinimizeBtn.Action).Form := ChildForm;
 TInternalMDIAction(FRestoreBtn.Action).Form := ChildForm;
 TInternalMDIAction(FCloseBtn.Action).Form := ChildForm;
 Invalidate;
end;
,
точнее, в последней строчке Invalidate, которая там, по крайней мере, вне условия, ИМХО нафиг не нужна. Да и три предыдущие тоже. По крайней мере, у меня все стало работать без загрузки процессора и появления багов как в варианте, когда все четыре строчки были убраны внутрь операторных скобок условия, так и в варианте, когда Invalidate было закомментировано.
Проверьте у себя, кому не лень?

ЗЫ. Кстати, борландам как-то об этом глюке сообщить можно?


 
Aleksandr.   (2005-08-26 16:59) [1]

В дополнение - проверка показала, что строчки

TInternalMDIAction(FMinimizeBtn.Action).Form := ChildForm;
TInternalMDIAction(FRestoreBtn.Action).Form := ChildForm;
TInternalMDIAction(FCloseBtn.Action).Form := ChildForm;

стоит оставить вне операторных скобок - иначе конкретно в винде 2003 любое нажатие на кнопки приведет к AV.


 
REA   (2005-08-26 17:02) [2]

Эти куски вообще криво сделаны и многое в D7 лечилось неофициальным обновлением. Попало ли оно в D2005 или это другая ветвь эволюции неизвестно...


 
Aleksandr.   (2005-08-26 17:07) [3]

На новый код не похоже - я в Д7 тоже уже копался во всем этом, стиль довольно похож - те же впечатления, что писал студент-практикант...


 
гвест   (2005-08-26 17:52) [4]

Неофициальное обновление исправляло одни и добавляло другие баги. Вывод такой, что этот бар лучше вообще не использовать, а скажем юзать toolbar2000 или бар от DevExpress.



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.084 c
3-1122707436
xroot
2005-07-30 11:10
2005.09.18
EHGrid колонка


4-1122537737
chili
2005-07-28 12:02
2005.09.18
Изменение частоты обновления экрана ?


11-1106730749
<Falcon>
2005-01-26 12:12
2005.09.18
Использование KOLPrinters


6-1117100431
КиТаЯц
2005-05-26 13:40
2005.09.18
Команда "дисконект"


1-1124960267
kyn66
2005-08-25 12:57
2005.09.18
Как привязаться к координатам картинки ?