2009-12-08 2 views
0

Мое приложение, похоже, не принимает или не обрабатывает одни и те же сообщения Windows для Cascade, Tile Horizontal/Tile Vertical в определенных версиях Windows.Приложение Delphi SDI. Не обрабатывается каскад/плитка горизонтально и плитка по вертикали?

Windows XP x32 - Не работает
Windows XP x64 - Не тестировался
Windows Vista x32 - не работает
Windows Vista x64 - отлично работает ??
Windows 7 x32 - Не тестировался
Windows 7 x64 - Не работает

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

Update

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

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

+0

Как вы «ловуете» тезисы сообщений? Может быть, это может помочь – Pmax

+0

Я не заманиваю их в ловушку, я думал, что это была ОС, которая справилась с этим? – James

+0

Я даже не знал, что вы можете это сделать! Для чего это стоит, я просто попробовал его с помощью приложения Delphi 2006 под WinXP-32, и вы правы. Это не работает. –

ответ

1

Если вы говорите о методах TForm.Cascade и TForm.Tile Delphi, от документации (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 - это случайная случайность.)

EDIT: Исходя из комментария, проблема не связана с TForm.Cascade/Tile.

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

Application.ShowMainFormOnTaskbar := True; 

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

+0

Я имею в виду, когда вы нажимаете правой кнопкой мыши приложение, когда оно находится на панели задач, и выбирая эти параметры из меню. Я бы прошел независимо от того, какой тип приложения он будет работать. – James

+0

Ах, хорошо. Фраза читала мне как TForm.Cascade. См. Обновленный ответ. –

+0

Я упомянул в комментариях по основному вопросу, который уже сделан. Я не думаю, что в этом проблема. Я заметил, что мы задерживаем сообщение WM_MOVING, однако оно, похоже, не вызвано, когда выбраны параметры Cascade/Tile. – James

0

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

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

  • Скорее всего, метод TApplication.WndProc получает сообщение, но это не помогает изменить его размер.
  • Предлагаю вам перехватить соответствующие сообщения и просто передать их на ручку основной формы.
    • Событие TApplication.OnMessage является самым простым и должно быть достаточным.
    • Если нет, вы можете попробовать использовать TApplication.HookMainWindow();