Приложение Delphi SDI - не обрабатывает каскад / плитку по горизонтали и плитку по вертикали?

Мое приложение, похоже, не получает и не обрабатывает те же сообщения Windows для Cascade, Tile Horizontal / Tile Vertical в определенных версиях Windows.

Windows XP x32 - Not working
Windows XP x64 - Not tested
Windows Vista x32 - Not working
Windows Vista x64 - Works fine??
Windows 7 x32 - Not tested
Windows 7 x64 - Not working

Кто-нибудь знает, почему это может быть так? Есть ли что-то особенное в Vista x64, чего нет у других, я бы сам не подумал!

Обновить

В частности, я имею в виду, когда у меня открыт один или несколько экземпляров моего приложения, я удерживаю Ctrl и выбираю их на панели задач, а затем пытаюсь выполнить каскадирование / мозаику.

Старые версии нашего приложения до обновления до Delphi 2009, похоже, работают должным образом. Отличия от этого в том, что теперь мы используем ленточные компоненты DevExpress. Еще более удручающе то, что у нас есть другая версия приложения, которая находится в Delphi 2009 и использует ленты, и она отлично работает!


person James    schedule 08.12.2009    source источник
comment
Как вы ловите эти сообщения? Может, это может помочь   -  person Pmax    schedule 08.12.2009
comment
Я их не ловлю, я думал, это ОС это сделала?   -  person James    schedule 08.12.2009
comment
Я даже не знал, что ты сможешь это сделать! Как бы то ни было, я просто попробовал это с приложением Delphi 2006 под WinXP-32, и вы правы. Не работает.   -  person MikeJ-UK    schedule 09.12.2009
comment
@Mike, да, вы можете перехватить несколько оконных сообщений (на самом деле мы делаем это во многих случаях). Однако мы не улавливаем ничего конкретного в этой области.   -  person James    schedule 09.12.2009
comment
@ Джеймс, я имел в виду, что не знал, что вы можете выбрать несколько приложений на панели задач и расположить их мозаикой. И я думал, что знаю все: -} Просто попробовал запустить Winspector - я вижу правильные сообщения WM_WINDOWPOSCHANGING и WM_WINDOWPOCHANGED, идущие в очереди, но экземпляры приложения не перемещаются.   -  person MikeJ-UK    schedule 09.12.2009
comment
Какое значение имеет Application.MainFormOnTaskbar? Отличается ли версия, которая работает, от той, которая не работает?   -  person mghie    schedule 09.12.2009
comment
@ Майк извиняюсь! Неправильно понял, о чем вы говорите. Есть сообщения WM_MDICASCADE, WM_MDITILE, которые, как мне кажется, публикуются, когда вы выбираете эти параметры, поэтому мне интересно, нужно ли мне просто перехватывать их и выполнять работу вручную. @mghie для MainFormOnTaskbar установлено значение true в обеих версиях, а для ShowMainForm установлено значение false (поскольку у нас есть скрытая основная форма).   -  person James    schedule 09.12.2009


Ответы (2)


Если вы говорите о методах Delphi TForm.Cascade и TForm.Tile, из документации (Delphi 7, как было удобно):

Use Cascade to arrange MDI child forms so they overlap.

Cascade works only if the form is an MDI parent form (that is, if the form’s 
FormStyle property is fsMDIForm).

Как видите, они разработаны только для дочерних форм MDI; они не влияют на дочерние формы без MDI. Это может объяснить, почему они не работают над тремя из четырех ОС, которые вы тестировали. (Я подозреваю, что работа Vista x64 - это какая-то случайность.)

РЕДАКТИРОВАТЬ: на основании комментария проблема не связана с TForm.Cascade / Tile.

Я думаю, что Крейг Янг на правильном пути. Вы пробовали добавить

Application.ShowMainFormOnTaskbar := True;

в файл .DPR? Я думаю, проблема может заключаться в том, что в проектах, запущенных в более ранних версиях Delphi, а затем обновленных до более новых версий, флаг не установлен, а окно приложения - это то, что помещается на панель задач. Вместо этого изменение его на основную форму может решить проблему.

person Ken White    schedule 08.12.2009
comment
Я имею в виду, когда вы щелкаете правой кнопкой мыши приложение, когда оно находится на панели задач, и выбираете эти параметры в меню. Я бы прошел, независимо от типа приложения, это сработало бы. - person James; 09.12.2009
comment
Ах хорошо. Эта фраза мне показалась TForm.Cascade. См. Обновленный ответ. - person Ken White; 09.12.2009
comment
Я уже сказал в комментариях по основному вопросу, что это уже сделано. Я не думаю, что проблема в этом. Я заметил, что мы перехватываем сообщение WM_MOVING, однако оно не вызывается, когда выбраны параметры Cascade / Tile. - person James; 09.12.2009

Простое приложение Delphi имеет два «основных» дескриптора. Один предназначен для основной формы, а другой - для экземпляра TApplication.

Лично я не использую функциональность для мозаичного или каскадного размещения приложений на рабочем столе (я предпочитаю запускать все в максимальном режиме). Следовательно, я никогда не удосужился докопаться до такого поведения. Но я могу дать несколько советов:

  • Скорее всего, метод TApplication.WndProc получает сообщение, но попытка изменить его размер не помогает.
  • I suggest you intercept the relevant messages and simply pass them on to the main form's handle.
    • The TApplication.OnMessage event is the simplest, and should suffice.
    • Если нет, вы можете попробовать использовать TApplication.HookMainWindow ();
person Disillusioned    schedule 09.12.2009