Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Application Messages [D7, WinXP]


dmk ©   (2004-09-04 17:59:00) 

Имеется MDIForm. В ней постепенно открываются Child'ы и
нужно сделать обработку нажатий клавиш по всему приложению.
В общем все работает, за исключением моментов, когда
некоторые процессы в Child'ах занимают длительное процессорное время. В этом случае обработка сообщения WM_KEYUP
не производится.
Подскажите как решить эту проблему.
Возможно я не вижу ошибки.

procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);

begin
 Handled := False;

 case Msg.message of
   WM_KEYUP: begin
               
               If not FCanPressOverKeys then
                 begin
                     case Msg.wParam of
                      VK_ESCAPE: Handled := True;
                         VK_TAB: Handled := True;
                       Ord('F'): Handled := True;
                       Ord('W'): Handled := True;
                       Ord('S'): Handled := True;
                     end;//case
                 end;//If not FCanPressOverKeys

               If Handled and (not FCanPressOverKeys) then
                 begin
                   FCanPressOverKeys := True;
                   PreviewForm.SetCaption('Can press key!');
                 end;
             end;//WM_KEYUP

   WM_KEYDOWN: begin
                 If FCanPressOverKeys then
                   begin
                   
                     case Msg.wParam of
                      VK_ESCAPE: begin
                                   EscPressed;
                                   Handled := True;
                                 end;
                         VK_TAB: begin
                                   SwitchPanels;
                                   Handled := True;
                                 end;
                       Ord('F'): begin
                                   If FFullScreenState then
                                     RemoveFullScreen else SetFullScreen;
                                   Handled := True;
                                 end;
                       Ord('W'): begin
                                   if CtrlKeyDown then Perform(WM_CLOSECHILD, 0, 0);
                                   Handled := True;
                                 end;
                       Ord('S'): begin
                                   if CtrlKeyDown then SaveButtonClick(Self);
                                   Handled := True;
                                 end;
                     end;//case

                     If Handled then
                       begin
                         FCanPressOverKeys := False;
                         PreviewForm.SetCaption('Other key''s not work!');
                       end;

                   end;//If FCanPressOverKey
               end;//WM_KEYDOWN
 end;//case.Msg
end;


dmk   (2004-09-04 18:38:00) [1]

В данных процессах идет постоянный вызов Application.ProcessMessages;
Вряд ли они мешают. Кроме того я выносил в отдельный поток.
Все тоже самое.


Defunct   (2004-09-04 18:10:00) [2]

> некоторые процессыв Child'ах занимают длительное процессорное время.

эти "некоторые процессы" желательно вынести в отдельные потоки, чтобы они не мешали циклу выборки сообщений.


Наверх

Титульная страница Поиск, карта сайта Написать письмо