Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1250177404
Del
2009-08-13 19:30
2009.10.18
Указатели


6-1208269836
anatolyz
2008-04-15 18:30
2009.10.18
Слушатель IP-пакетов


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


2-1250148554
Alex_Ford
2009-08-13 11:29
2009.10.18
Программно установить cbCustomColor для ColorBox равным True


1-1219671204
dmitry_12_08_73
2008-08-25 17:33
2009.10.18
Как можно рисовать объект типа TPanel в любом месте экрана





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский