Принесите форму поверх других при нажатии на кнопку панели задач в Delphi - PullRequest
0 голосов
/ 20 июля 2009

Базовый вопрос: TStatusBar мигает при вызове процедуры обновления. Способы безболезненного исправления этого

Выполненный код находится в первой части вопросов первого сообщения (вы можете видеть светло-серую разделительную линию) ...

Но - проблема в том, что при выполнении этого кода форма не активируется автоматически и фокусируется на вершине всех других приложений.

Я прочитал эти статьи:

http://www.installationexcellence.com/articles/VistaWithDelphi/Original/Index.html
http://delphi.about.com/od/formsdialogs/l/aa073101b.htm

но, по их мнению, это должно работать, несмотря ни на что Я попробовал все события TApplicationEvents и TForm с Show; Видимый: перекрасить; Refresh; На передний план; ... ничего не работает.

Итак - я думаю, у меня есть два варианта - многопоточность или перехват сообщения WM_SYSCOMMAND, а в событии SC_ACTIVE просто перекрасить форму. Может ли этот сценарий стать успешным?

1 Ответ

4 голосов
/ 20 июля 2009

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

В вашем коде вы называете StatusBar1.Update, поэтому, по крайней мере, текст строки состояния перерисовывается, но помимо выхода на первый план ваше приложение, вероятно, также игнорирует запросы на перемещение или изменение размера.

Вам необходимо своевременно обрабатывать сообщения Windows, поэтому любой путь выполнения, который занимает более 200 или 300 миллисекунд, должен обеспечивать обработку сообщений, в противном случае приложение будет зависать или зависать.

У вас есть три основных варианта:

  • Сохраните долго работающий код и вставьте вызовы на Application.ProcessMessages - это позволит обрабатывать сообщения Windows. Убедитесь, что вы не допустите повторного ввода кода, например, отключив все элементы управления, которые используются для запуска операции.

  • Переработайте ваш код так, чтобы он отображался в виде последовательности шагов, каждый из которых занимает не более 10 миллисекунд. Поместите вызовы кода в обработчик событий таймера или вызовите его из обработчика Application.OnIdle.

  • Вызовите свой код в рабочем потоке и опубликуйте сообщения в основном потоке графического интерфейса для обновления вашего пользовательского интерфейса.

У всех этих опций есть свои плюсы и минусы, и для многопоточности, особенно здесь, на SO есть много вопросов и ответов. Это самый сложный, но лучший вариант, когда вы работаете над чем-то большим, чем просто игрушечная программа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...