Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Задисейблить" системную кнопку закрытия формы [D5, 2003]


Страницы:   1 2 3 4

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]

а почему просто не обработать событие разрешения закрытия?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо