Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

Прошу обратить внимание всем, кто работает с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
1-1124834927
Сергей Никонов
2005-08-24 02:08
2005.09.18
Разресовка FileListBox а


4-1122293419
rigid
2005-07-25 16:10
2005.09.18
проблема Win API?


3-1123486533
Beginner0
2005-08-08 11:35
2005.09.18
Просмотр через HTML?


14-1124614933
Olyanka
2005-08-21 13:02
2005.09.18
Ерунда с буфером обмена


1-1124955133
new_user
2005-08-25 11:32
2005.09.18
ProgressBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский