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

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

Закрыть приложение [D7]


Solo_Mes ©   (2005-07-29 12:12:00) 

Господа! Подскажите, как сделать так что бы при клике юзера на крестик в основной форме приложение сворачивалось (или игнорировало), а при завершении работы системы (выключение компа), приложение нормально завершало работу. В приложении создаётся объект с помощью CreateOLEObject и существует пока не выключается комп.


ssk   (2005-07-29 13:39:00) [1]

OnCloseQuery попробуй


Solo_Mes   (2005-07-29 13:28:00) [2]

Просто если игнорировать крестик, то всё нормально, а если приложение снять через диспетчер то оно нормально не закрывается.
Вот хотелось бы это тоже решить.


Solo_Mes   (2005-07-29 13:25:00) [3]

Кстати данный способ работает под всеми ОСями? (я имею ввиду семью виндовз)


Solo_Mes   (2005-07-29 13:24:00) [4]

Ну с этим понятно, спасибо. Так а всётаки как определить снимается ли задача через диспетчер задач?


ssk   (2005-07-29 13:17:00) [5]

>>begin...end
>к параметру WParam НУЖНО применять маску $FFF0


что ж, признаю свое поражение в споре. вот выдержка из хелпа:

Remarks

The DefWindowProc function carries out the window menu request for the predefined actions specified in the previous table.
In WM_SYSCOMMAND messages, the four low-order bits of the uCmdType parameter are used internally by Windows. To obtain the correct result when testing the value of uCmdType, an application must combine the value 0xFFF0 with the uCmdTypevalue by using the bitwise AND operator.


begin...end   (2005-07-29 13:11:00) [6]

> ssk ©   (29.07.05 13:00) [12]

Если пользователь хочет закрыть окно ( ЛЮБЫМспособом -- нажатием на крестик, нажатием Alt+F4, выбором пунта системного меню), окну посылается сообщение WM_SYSCOMMAND. И по приходу этого сообщения в ЛЮБОМслучае для определения типа системной команды (свёртывание, развёртывание, закрытие и т.д.) к параметру WParam НУЖНОприменять маску $FFF0. Понимаете?

И, конечно, только по WM_SYSCOMMAND нельзя определить, КАК пользователь дал команду на закрытие окна.


ssk   (2005-07-29 13:00:00) [7]

>>Да, я именно о $FFF0. И это совсем не другая история.

смотря каким образом пользователь решит получить крестик. если он начнет вызывать контекстные меню в заголовке окна или на панели задач и выбирать "закрыть", то он естественно не получит крестик! а если он кликнет именно по крестику на окне - он его получит.


Solo_Mes   (2005-07-29 12:59:00) [8]

Спасибо большое всем. Вот такой вопросик ещё возник а можно ли как-то узнать о том что человек выбрал "Снять задачу" в диспетчере задач


begin...end   (2005-07-29 12:49:00) [9]

> ssk ©   (29.07.05 12:43) [9]

> человек хотел получить крестик - он его получил.
> а если вы о $FFF0 - так это уже другая история.

Да, я именно о $FFF0. И это совсем не другая история.

Я не вижу гарантий, что "человек получит крестик" при использовании кода [7]. И если он его "получит" сейчас, то в один прекрасный момент он может его и не "получить".  результате пренебрежения документацией.


ssk   (2005-07-29 12:43:00) [10]

>>begin...end
Справку следует читать внимательно


человек хотел получить крестик - он его получил.
а если вы о $FFF0 - так это уже другая история.


begin...end   (2005-07-29 12:39:00) [11]

> ssk ©   (29.07.05 12:32) [7]
> if Msg.WParam = SC_CLOSE then

Справку следует читать внимательно.


ssk   (2005-07-29 12:32:00) [12]

вот, может поможет:

type
 TForm1 = class(TForm)

{ ...  }

protected
   procedure WMGETSYSCOMMAND(var Msg: TMessage); message WM_SYSCOMMAND;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMGETSYSCOMMAND(var Msg: TMessage);
begin
 if Msg.WParam = SC_CLOSE then
   Application.Minimize
 else
   inherited;
end;


Чапаев   (2005-07-29 12:20:00) [13]

procedure WmQueryEndSession(var Msg:TWmQueryEndSession);message WM_QUERYENDSESSION;


Solo_Mes   (2005-07-29 12:18:00) [14]

т.е. по WM_QUERYENDSESSION закрывать форму и освобождать память ?
спсб будем пробовать


Solo_Mes   (2005-07-29 12:16:00) [15]

Я так понимаю в OnClose игнорировать закрытие, а как использовать WM_QUERYENDSESSION??


Чапаев   (2005-07-29 12:16:00) [16]

Во, точно. Именно WM_QUERYENDSESSION. ;-)


Чапаев   (2005-07-29 12:16:00) [17]

> при клике юзера на крестик в основной форме приложение сворачивалось (или игнорировало)
RTFM OnCloseQuery

> при завершении работы системы
Ищи по ФАКам фразу "какие сообщения ... при выключении".


TUser   (2005-07-29 12:15:00) [18]

Form1.OnClose

+ ловить WM_QUERYENDSESSION


Наверх

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