Вниз
Скачать: CL | DM;

Не могу сформулировать название вопроса...   Найти похожие ветки 

← →
olookin ©   (2004-02-21 15:20) [0]

Итак, моя проблема в следующем.
Есть компонент, который при закрытии приложения (т.е. именно главной формы) должен проверить сохраненку данных и в случае несохраненности должен вызвать диалог типа "Хотим сохранить?". При этом никаких диалогов не должно быть при закрытии формы на которой размещен этот компонент. Если я привязываю OnDestroy формы-владельца компонента (т.е. не обязательно главной, однако такое меня устраивает) к OnMyDestroy - то как таковое OnMyDestroy происходит, но при этом диалоги появляются лишь на мгновение. Ясно что при этом никакого сохранения (либо чего то другого) не происходит... Если я пытаюсь привязать OnDestroy главной формы (через Application.MainForm.OnDestroy) к моему дестрою, то возникает AV так как при создании комопннета MainForm=nil. Я попытался обойти проблему так. Привязал OnShow формы-владельца компонента к моему OnMyShow, где я уже могу привязать Application.Mainform.Ondestroy:=OnMyDestroy поскольку тут уже MainForm<>nil. Но при этом теряются команды, которые исходно были записаны в OnShow формы-владельца....

Вот такая замудка... Пишите обязательно если что не понятно...


← →
easy ©   (2004-02-21 15:27) [1]

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not datasaved then
if MessageDlg("Желаете сохранить?",mtConfirmation, [mbYes, mbNo], 0) = mrYes then
SaveData;
end;

?


← →
Юрий Зотов ©   (2004-02-21 15:35) [2]

Почему именно OnDestroy? Это может быть уже поздно. Используйте OnClose главной формы. А если еще использовать диалог типа YesNoCancel и параметр CanClose, то юзер сможет не только сохранять или не сохранять данные, но и вообще отменить завершение программы.


← →
olookin ©   (2004-02-21 15:39) [3]

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

В любом случае всем спасибо - задача уже решена.


← →
Игорь Шевченко ©   (2004-02-21 19:23) [4]

olookin © (21.02.04 15:39)

Как еще один вариант - попробуй привязаться в компоненте к Application.OnMessage и реагировать на сообщение WM_SYSCOMMAND с параметром SC_CLOSE и Hwnd = Application.MainForm.Handle;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.hwnd = Application.MainForm.Handle) and
(Msg.message = WM_SYSCOMMAND) and (Msg.wParam = SC_CLOSE) then
Handled := MessageBox(0, "Вы уверены ?", "Я закрываюсь",
MB_ICONQUESTION or MB_YESNOCANCEL) <> IDYES;
end;



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.013 c
14-6232
Ega23
2004-02-11 09:04
2004.03.03
USB-шные цифровые камеры


14-6247
Verg
2004-02-10 11:29
2004.03.03
А что у нас с www.borland.com ?


1-6069
Гиричев Руслан
2004-02-21 18:09
2004.03.03
Как вернуться в прошлое?


1-6114
roadstar
2004-02-20 18:00
2004.03.03
Про компиляцию...


1-6144
Di
2004-02-19 14:45
2004.03.03
Как организовать инсталяцию?




   Наверх