Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];
Вниз"Задисейблить" системную кнопку закрытия формы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.006 c