![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Задисейблить" системную кнопку закрытия формы [D5, 2003]
Smile © (2009-08-16 14:03:00)Уважаемые мастера, в некоторые моменты работы приложения (в частности открытые запросы или датасеты, ну и пр.) запрещаю его закрытие вот таким образом:
SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED);
При компиляции под D5 все нормально, однако под D2009 системная кнопка закрытия не "дисейблится".
Подскажите, возможно ли каким либо другим способом, осуществить это под D2009?
TIF (2009-08-18 23:17:00) [61]http://pinpic.ru/img/1483/02bbc0593bd7f1afbf7c1c0d1308535d.jpg.html
Более того - под XP этот код сразу и отключает "крестик" (под Vista - только затемняет и делает некликабельным)
Скомпилировал два exe-шника: под Delphi 2009 и под Delphi 2010. Нормлаьно работают оба...
Вот код кнопки, которая нажималась:
var SysMenu: Cardinal;
begin
SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED);
end;
Уж не знаю, где ошибка, то среда разработки и компилятор тут точно не замешаны. Хотя стоп. У меня стоит Update 3 для D2009. Последний шанс - установить его, если это ещё не сделано, и проверить )))
TIF (2009-08-18 23:05:00) [62]> У меня XP
Точно? А почему в шапке темы написано что Windows 2003 Server?
> [D5, 2003]
Сейчас специально проверю в виртуальной XP :) Даже скриншот выложу. Мне почему-то кажется что всё получится и там...
Leonid Troyanovsky (2009-08-17 09:29:00) [63]
> KilkennyCat © (16.08.09 14:37) [3]
> Конечно. Гораздо проще задисэйблить. Начнем с кнопки. Потом
> задисейблим Альт+Ф4.
Затем меню (окна) Application вместе с его Альт+Ф4..
--
Regards, LVT.
Leonid Troyanovsky (2009-08-17 09:26:00) [64]
> antonn © (16.08.09 16:05) [7]
> потому что интерфейс должен показывать то, что он может
Для показывать нужен MF_GRAYED.
--
Regards, LVT.
Smile (2009-08-17 09:15:00) [65]> Проверил код под Delphi 2009/2010
> Всё отлично работает. ОС Windows Vista
У меня XP
:(
TIF (2009-08-16 21:08:00) [66]> однако под D2009 системная кнопка закрытия не "дисейблится"
Проверил код под Delphi 2009/2010
Всё отлично работает. ОС Windows Vista
М?
antonn (2009-08-16 18:17:00) [67]
> это где такой бред написан?
там, где ты его не читал, разумеется.
> Loginov Dmitry © (16.08.09 18:06) [9]
если в это время идет запрос и появляется окошко в котором написано "обработка данных" то было бы логично встроить туда функцию "прервать".
Я не говорю за все случаи.
Loginov Dmitry (2009-08-16 18:06:00) [68]> потому что интерфейс должен показывать то, что он может
> обрабатывать. В данном случае кнопка закрытия не должна
> срабатывать, и надо дать понять пользователю, а не строить
> отвратные конструкции которые мессаджбоксом (перехватив
> фокус) расскажут юзеру, что в данный момент нельзя нажимать
> эту кнопку. Но убирать ее совсем - не красиво.
Пользователь хочеть закрыть окно, он не понимает, что в окне
есть какие-то открытые датасеты и запросы и пр., крестик
задисейблен, закрыть окно нельзя. Что делать пользователю?
Как дать ему понять, что нужно сперва закрыть запрос, датасет и пр.?
KilkennyCat (2009-08-16 17:14:00) [69]
> потому что интерфейс должен показывать то, что он может
> обрабатывать.
это где такой бред написан? или сами придумали?
antonn (2009-08-16 16:05:00) [70]
> а почему просто не обработать событие разрешения закрытия?
потому что интерфейс должен показывать то, что он может обрабатывать. В данном случае кнопка закрытия не должна срабатывать, и надо дать понять пользователю, а не строить отвратные конструкции которые мессаджбоксом (перехватив фокус) расскажут юзеру, что в данный момент нельзя нажимать эту кнопку. Но убирать ее совсем - не красиво.
Anatoly Podgoretsky (2009-08-16 15:33:00) [71]> KilkennyCat (16.08.2009 14:37:03) [3]
Не надо успокаиваться на Reset - уже есть программные, и даже на кабели питания тоже не стоит, поскольку есть встроеные UPS
Smile (2009-08-16 14:44:00) [72]А вот с
CanCloseдействительно красиво.
Не додумался:(
KilkennyCat (2009-08-16 14:38:00) [73]Причем, условие задисэйбливания, похоже, оказывается проще проверки CanClose. Блеск.
KilkennyCat (2009-08-16 14:37:00) [74]Конечно. Гораздо проще задисэйблить. Начнем с кнопки. Потом задисейблим Альт+Ф4. Потом Ctrl+alt+del. Потом кнопку "Пуск". Потом повербуттон на системнике. успокоимся при попытке задисэйблить резет.
Alarm (2009-08-16 14:31:00) [75]> KilkennyCat © (16.08.09 14:18) [1]
> а почему просто не обработать событие разрешения закрытия?
>
На мой взгляд это будет сложнее. То есть необходимо будет проверять достаточно большое количество условий. Мне кажется, что совершая какую либо "операцию" (запрещая при этом закрытие приложения) и давая разрешение при завершении этой "операции" выглядит более логичным.
Хотя ...
KilkennyCat (2009-08-16 14:18:00) [76]а почему просто не обработать событие разрешения закрытия?