![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кнопки на панели задач [D7, WinXP]
Kukolev © (2010-06-18 09:08:00)Здравствуйте, уважаемые. Срочно нужна Ваша помощь по следующей проблеме: в моей программе, написанной на Delphi 7 проявляется глюк - в ходе выполнения долгой операции на панели задач внезапно появляется новая кнопка моего приложения! При этом число таких ни чем не ограничено - пользователи выявляли до пяти штук! Если необходимо, то могу выложить скрины. Прошу помощи, т.к. отчаялся избавиться от данной ошибки.
~AQUARIUS~ (2010-06-23 16:03:00) [1]
> Подскажите, что делать
Менять Windows
Kukolev (2010-06-23 16:01:00) [2]Зметил еще одну ошибку - еще интереснее - аналогичная ситуация возникла у самой IDE Delphi! После нескольких часов работы над проектом появилась вторая кнопка Delphi, левый клик по которой ничего не дает, но если кликнуть правой кнопкой и в меню выбрать "Закрыть", то тут-же закрывается и Delphi и обе кнопки. Подскажите, что делать и куда копать?
~AQUARIUS~ (2010-06-22 13:12:00) [3]Считайте опечатка :D Но вообще он еще и пишет, это в данном случае перевод
Омлет (2010-06-22 12:07:00) [4]> Gunsmoker пишет
Gunsmoker переводит )
~AQUARIUS~ (2010-06-22 10:28:00) [5]Очевидно по ссылке вы не были. Кнопки делает не программа, кнопки делает Панель задач. Если ваше окно становится "пододящим" для кнопки - она сделает кнопку; когда оно становится "неподходящим" - убирает. Если ваше окно было "подходящим" но в силу каких-то обстоятельств оно стало "неподходящим" неправильно, кнопка так и останется "висеть". Gunsmoker пишет, в каких случаях окно становится "кнопочным"; вам нужно почитать и разобраться - самому - потому что без кода вам никто ничего не сможет сказать
Kukolev (2010-06-22 08:34:00) [6]Появилась новая особенность - одна из лишних кнопок задач соответствует главной форме приложения - имеет такой-же Caption. Как программа может создавать новую кнопку для главной формы? Ведь эта кнопка изначально генерится при старте программы?
DVM (2010-06-18 20:47:00) [7]Вообще, странно, что MS не проверяет периодически соответствие кнопок живым окнам. Все разговоры про то, что это сделано из экономии ресурсов имхо может и имели смысл во времена 386 компьютеров и 4 мб оперативной памяти, но сейчас...Хотя сейчас может и уже проверяет.
У гансмокера неправильно кстати сказано:
> Фильтрация окон, которые являются "таскбаро-непригодными",
> происходит внутри USER32, которая уведомляет панель задач
> (или любого, кто установил хук WH_SHELL) с помощью уведомлений
> HSHELL_* только об окнах, которые изменили своё состояние
> и являются "пригодными для панели задач". Таким образом,
> код панели задач может быть выгружен в файл подкачки, если
> для него нет никакой работы.
Это не совсем так, не все окна для которых пришло уведомление появляются в панели задач.
~AQUARIUS~ (2010-06-18 20:14:00) [8]Посмотрите здесь: http://www.transl-gunsmoker.ru/2008/12/blog-post_08.html
Может, скорее найдете ответ на свой вопрос сами, чем все будут здесь угадывать
Kukolev (2010-06-18 17:27:00) [9]Обычно косяк проявляется таким образом:
1. Создается форма MyForm := TMyForm.Create(Self)
2. MyForm.Show
3. Начало выполнения длительного SQL запроса или другой длительной операции
4. Появление лишней кнопки (!!!)
5. Окончание длительной операции
6. MyForm.Close;
7. Кнопка остается на панели задач.
Самое страшное, что кнопка появляется не всегда - характер появления случаен.
Игорь Шевченко (2010-06-18 13:16:00) [10]причина одна - где-то меняется Application или Application.Handle или форма создается от неведомого Owner|Parent
KilkennyCat (2010-06-18 13:05:00) [11]
> Интересует механизм создания кнопок на панели задач
Application.MainFormOnTaskbar := True;
0x00FF00 (2010-06-18 13:05:00) [12]
> по ней
по "клиентской" части окна, имеется в виду.
0x00FF00 (2010-06-18 13:04:00) [13]> в ходе выполнения долгой операции
Попробуем протелепатировать.
Наверняка есть какая-то "неучтённая" форма, которая на экране не отображается, но имеет нужные атрибуты для появления на панели задач.
Локализовать проблему, имхо, можно модулем того потока, из которого Вы выполняете эту "долгую операцию", и исходящими зависимостями из него.
Вообще говоря, причин могут быть тысячи, причём самые экстравагантные.
Мне как-то встречался гениальный код, где главное окно во время операции на массиве при любом щелчке по ней внезапно исчезала с экрана. Трассировка дизассемблером показала, что длина массива была рассчитана неверно, и в итоге последний элемент оказывался записанным в переменные X и Y, по которым рассчитывалась позиция окна, а мышеклик инициировал ресайз.
Kukolev (2010-06-18 12:30:00) [14]Про скрины я от отчаяния. По поводу screen saver - нет его. По поводу исходников - все выложить не могу, т.к. приложение насчитывает ~300000 строк кода, 200 форм.
Интересует механизм создания кнопок на панели задач и советы тех, кто с этим сталкивался. Буду рад любой полезной информации
Anatoly Podgoretsky (2010-06-18 10:17:00) [15]Отключи screen saver
KilkennyCat (2010-06-18 09:39:00) [16]да, давай скрины. Тут куча экстрасенсов, по фотке исходники угадывают.