Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

"Задисейблить" системную кнопку закрытия формы   Найти похожие ветки 

 
Smile   (2009-08-16 14:03) [0]

Уважаемые мастера, в некоторые моменты работы приложения (в частности открытые запросы или датасеты, ну и пр.) запрещаю его закрытие вот таким образом:

SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED);


При компиляции под D5 все нормально, однако под D2009 системная кнопка закрытия не "дисейблится".
Подскажите, возможно ли каким либо другим способом, осуществить это под D2009?


 
KilkennyCat ©   (2009-08-16 14:18) [1]

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


 
Alarm ©   (2009-08-16 14:31) [2]

> KilkennyCat ©   (16.08.09 14:18) [1]
> а почему просто не обработать событие разрешения закрытия?
>

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


 
KilkennyCat ©   (2009-08-16 14:37) [3]

Конечно. Гораздо проще задисэйблить. Начнем с кнопки. Потом задисейблим Альт+Ф4. Потом Ctrl+alt+del. Потом кнопку "Пуск". Потом повербуттон на системнике. успокоимся при попытке задисэйблить резет.


 
KilkennyCat ©   (2009-08-16 14:38) [4]

Причем, условие задисэйбливания, похоже, оказывается проще проверки CanClose. Блеск.


 
Smile   (2009-08-16 14:44) [5]

А вот с CanClose действительно красиво.
Не додумался:(


 
Anatoly Podgoretsky ©   (2009-08-16 15:33) [6]

> KilkennyCat  (16.08.2009 14:37:03)  [3]

Не надо успокаиваться на Reset - уже есть программные, и даже на кабели питания тоже не стоит, поскольку есть встроеные UPS


 
antonn ©   (2009-08-16 16:05) [7]


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

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


 
KilkennyCat ©   (2009-08-16 17:14) [8]


> потому что интерфейс должен показывать то, что он может
> обрабатывать.

это где такой бред написан? или сами придумали?


 
Loginov Dmitry ©   (2009-08-16 18:06) [9]

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


Пользователь хочеть закрыть окно, он не понимает, что в окне
есть какие-то открытые датасеты и запросы и пр., крестик
задисейблен, закрыть окно нельзя. Что делать пользователю?
Как дать ему понять, что нужно сперва закрыть запрос, датасет и пр.?


 
antonn ©   (2009-08-16 18:17) [10]


> это где такой бред написан?

там, где ты его не читал, разумеется.


> Loginov Dmitry ©   (16.08.09 18:06) [9]

если в это время идет запрос и появляется окошко в котором написано "обработка данных" то было бы логично встроить туда функцию "прервать".
Я не говорю за все случаи.


 
TIF ©   (2009-08-16 21:08) [11]

> однако под D2009 системная кнопка закрытия не "дисейблится"

Проверил код под Delphi 2009/2010
Всё отлично работает. ОС Windows Vista

М?


 
Smile   (2009-08-17 09:15) [12]

> Проверил код под Delphi 2009/2010
> Всё отлично работает. ОС Windows Vista

У меня XP
:(


 
Leonid Troyanovsky ©   (2009-08-17 09:26) [13]


> antonn ©   (16.08.09 16:05) [7]

> потому что интерфейс должен показывать то, что он может

Для показывать нужен MF_GRAYED.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-08-17 09:29) [14]


> KilkennyCat ©   (16.08.09 14:37) [3]

> Конечно. Гораздо проще задисэйблить. Начнем с кнопки. Потом
> задисейблим Альт+Ф4.

Затем меню (окна) Application вместе с его Альт+Ф4..

--
Regards, LVT.


 
TIF ©   (2009-08-18 23:05) [15]

> У меня XP

Точно? А почему в шапке темы написано что Windows 2003 Server?

> [D5, 2003]


Сейчас специально проверю в виртуальной XP :) Даже скриншот выложу. Мне почему-то кажется что всё получится и там...


 
TIF ©   (2009-08-18 23:17) [16]

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. Последний шанс - установить его, если это ещё не сделано, и проверить )))


 
KilkennyCat ©   (2009-08-18 23:25) [17]

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


 
Kolan ©   (2009-08-18 23:43) [18]

KilkennyCat, бред про то, что интерфейс должен показывать что с ним можно делать, а что нельзя вы можете прочесть в книгах Интерфейс Джефа Раскина и Дизайн привычных вещей Дональда Нормана.

Конкретно, если интересно, можно полагать, что человек выполняет различные задачи за семь шагов:

1. Формирование цели.
2. Формирование намерения.
3. Определение необходимых действий.
4. Исполнение действий.
5. Восприятия состояния окружающего пространства.
6. Интерпретация окружающего пространства.
7. Оценка результатов действия.
Подробнее про это есть в моем блоге (http://ksoftware.ya.ru/replies.xml?item_no=1877).

В данном случае представим, что цель человека — закрыть окно. Так как кнопка закрытия активна, то вполне вероятно, что человек сформирует намерение нажать её. Определит нужные действия (передвижение мыши, клик и т. д.) и выполнит их. Однако ожидаемого результата не получит и ему придется придумывать новые намерения или пересматривать цель.

Таким образом целая туча ментальных и других усилий пропадут за зря, а это не может не раздражать.

Поэтому предложение Антона, в общем, верное, если на кнопку нельзя нажимать, то она и должна выглядеть не нажимаемой.

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

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

Автор, озвучьте задачу пожалуйста.


 
KilkennyCat ©   (2009-08-19 00:09) [19]


> Kolan © (18.08.09 23:43) [18]

Многа буков.

Интерфейс не должен ввергать пользователя в ступор. Он должен быть логичен и удобен. Этот крестик всегда был для закрытия. Независимо ни от чего. И если закрыть нельзя, потому что что-то там не так, то об этом сообщается.
Умные слова, типа
> 5. Восприятия состояния окружающего пространства.

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


 
TIF ©   (2009-08-19 00:09) [20]

Кстати, окошечко с обратным отсчётом "завершение работы системы" (shutdown) как раз с disable-крестиком )


 
KilkennyCat ©   (2009-08-19 00:20) [21]


> TIF © (19.08.09 00:09) [20]

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


 
Kolan ©   (2009-08-19 00:23) [22]

Жаль, что вы столько лет потратили зря, ведь дело не в «юзверях», как вы их называете, это интерфейсы тех программ, что «юзвери», а на самом деле обычные люди, плохие и не понятные.

Но так как вам на все пофиг и вы ничего не читаете, то и спорить с вами не буду.
Не буду рассказывать про то, что модальные окна — это введение режима, а режимы приводят к ошибкам. Не буду еще раз повторять, что в данном случае дисэблить кнопку действительно не нужно, а лучше сделать программу по другому. Не буду, потому что это бесполезно. На вашей стороне опыт, да... Спор я проиграю априори... И букаф многа будет — зачем?


 
KilkennyCat ©   (2009-08-19 01:02) [23]


> Kolan © (19.08.09 00:23) [22]

что такое "априори"?


 
brother ©   (2009-08-19 05:57) [24]

> что такое "априори"?

http://ru.wikipedia.org/wiki/%D0%90%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8
Априо?ри (лат. a priori — буквально «от предшествующего») — знание, полученное до опыта и независимо от него (знание априори, априорное знание). Этот философский термин получил важное значение в теории познания и логике благодаря Канту. Идея знания априори связана с представлением о внутреннем источнике активности мышления. Учение, признающее знание априори, называется априоризмом. Противоположностью априори является апостериори (лат. a posteriori — от последующего) — знание, полученное из опыта (опытное знание). В современной философии априори (как и апостериори) считается видом дескриптивного знания.


 
brother ©   (2009-08-19 06:00) [25]

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


 
Kolan ©   (2009-08-19 09:26) [26]

Априори = к гадалке не ходи. То есть получится: Спор я проиграю, к гадалке не ходи...

:)


 
KilkennyCat ©   (2009-08-19 10:54) [27]


> Kolan © (19.08.09 09:26) [26]

ну так, так бы и сказал. нафига усложнять?


 
Kolan ©   (2009-08-19 11:10) [28]

Не думал, что это слово может вызвать затруднения.


 
Andy BitOff ©   (2009-08-19 11:32) [29]


> Kolan ©   (18.08.09 23:43) [18]
> Не понятно как и где объяснять почему она не работает и что делать, если
> хочется закрыть окно.

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


 
Kolan ©   (2009-08-19 11:44) [30]

Хинт — хорошее решение, наверняка он окажется в локусе внимания.

А интересно, почему программу бывает нельзя закрыть?


 
Anatoly Podgoretsky ©   (2009-08-19 11:58) [31]

> Kolan  (19.08.2009 11:44:30)  [30]

Ну допустим идет форматирование винчестера или подготовка чего то, чего недопустимо прерывать.
У меня на одном из серверов даже кнопка RESET блокируется в подобных случаях.


 
Inovet ©   (2009-08-19 13:21) [32]

> [31] Anatoly Podgoretsky ©   (19.08.09 11:58)
> У меня на одном из серверов даже кнопка RESET блокируется
> в подобных случаях.

Ничего се, это уже и не ресет получается.


 
Kolan ©   (2009-08-19 13:29) [33]

Не убедительный пример. Форматирование диска можно прервать даже в Виндоусе. Более того это процесс можно даже на паузу поставить.

Блокирование кнопки Ресета мне кажется таким же бессмысленны как и запрещение закрытия программы. А вдруг свет выключат и что тогда?
— А надо бесперебойник иметь!
— А свет вырубили 7 часов назад...

То есть я считаю, что такой подход по сути плох. Лучше сделать так, чтобы при закрытии работа сохранялась сама, а потом её можно было бы продолжить.

Пример того, «чего недопустимо прерывать» еще жду.


 
Andy BitOff ©   (2009-08-19 13:43) [34]

У меня есть процесс, который длится очень долго, в зависимости от входных значений может длится до получаса (еще и от мощностей зависит), так вот я не даю закрыть программу юзеру, пока он не нажмет кнопку "Остановит процесс", о чем честно ему и сообщаю. Если он решил закончить, то пусть сознательно остановит процесс и потом не жалуется. А то есть юзеры (коих много на моей памяти), которые не пользуются кнопкой свернуть, а пользуются кнопкой закрыть. Но у нас не КПК, где приложения уходят в фон.


 
Kolan ©   (2009-08-19 13:57) [35]

А если я нажму питание, программа не даст Виндоусу выключится?


 
Anatoly Podgoretsky ©   (2009-08-19 13:58) [36]

> Kolan  (19.08.2009 13:29:33)  [33]

Я вспомнил более точно, это был серверный раид и не все операции допустимо прерывать, например перепрошивка БИОС


 
Anatoly Podgoretsky ©   (2009-08-19 14:07) [37]

Кнопка питания уже давно программная, а кнопку Reset я встретил уже на двух машинах, на серверах Интел и на ноутбуках НР определенных моделей. И при некоторых операциях блокируются обе. А питание можно выключить или клавишей на блоке питания или выдергиванием шнура питания. Для некоторых операциях с BMC/FRU недостаточно выключения питания кнопкой или сброса, а требуется физическое отключение.

В свое время тоже смеялись над клавишей Power и программным выключением питания, ой как смеялись. Дошла очередь и до Reset и никаких проблем с Reset нет, точно также можно подержать 4 секунды, и произойдет сброс, даже при полностью зависшим компьютером.


 
Andy BitOff ©   (2009-08-19 14:07) [38]


> Kolan ©   (19.08.09 13:57) [35]

Даст. Ну ты же программист, что не знаешь как разобраться в сообщениях или в цепочке событий?


 
Kolan ©   (2009-08-19 14:15) [39]

Andy BitOff, так а что в этом случае будет с длительным процессом? Он прервется? Если да, то выходит случайная ошибка все равно возможна и необратима.


 
Andy BitOff ©   (2009-08-19 14:18) [40]

Тогда он прервется по "Остановить процесс" и программа завершится. Но это уже не моя проблема. Необратимого в данном случае ничего нет, просто придется начинать с начала.



Страницы: 1 2 вся ветка

Текущий архив: 2009.10.18;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.011 c
11-1175699064
!Pharaon!
2007-04-04 19:04
2009.10.18
Пару вопросов по KOL


2-1250152468
JohnKorsh
2009-08-13 12:34
2009.10.18
Как программно управлять светодиодами клавиатуры?


15-1249378793
федот
2009-08-04 13:39
2009.10.18
абрвал


2-1250083110
Спрашующий =)
2009-08-12 17:18
2009.10.18
Вопрос


15-1250183499
matt
2009-08-13 21:11
2009.10.18
Skype