Форум: "Прочее";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизМодальное окно не закрывается при нажатии Ctrl+F4 Найти похожие ветки
← →
Александр Иванов © (2006-06-12 08:23) [0]В приложении с MDI модальное окно открывается из дочернего. При нажатии Ctrl+F4 закрывается не модальное окно, а дочернее. Ну и как результат - ошибка доступа к памяти при закрытии модального окна.
Как правильно решить эту задачу?
← →
Yanis © (2006-06-12 10:07) [1]
> Как правильно решить эту задачу?
Поймать Ctrl+F4 и самому закрыть нужное окно.
← →
Юрий Зотов © (2006-06-12 10:09) [2]> Александр Иванов © (12.06.06 08:23)
> При нажатии Ctrl+F4 закрывается не модальное окно, а дочернее.
Проверил. Докладываю результат - если ничего не делать и не мешать VCL, то само по себе все работает так, как и положено: главное и модальные окна закрываются по Alt+F4 (и НЕ закрываются по Ctrl+F4), дочерние окна закрываются по Ctrl+F4 (и НЕ закрываются по Alt+F4).
Вывод - где-то Вы неверно назначили (или неверно обрабатываете) горячие клавиши (или просто клавиши). В итоге нарушили работу VCL.
← →
Юрий Зотов © (2006-06-12 10:14) [3]А это - чтобы не было сомнений (TForm1 - главная, TForm2 - дочерняя, TForm3 - модальная):
procedure TForm1.FormDblClick(Sender: TObject);
begin
TForm2.Create(Self)
end;
procedure TForm2.FormDblClick(Sender: TObject);
begin
TForm3.Create(Self).ShowModal
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree
end;
← →
Александр Иванов © (2006-06-12 10:35) [4]Юрий Зотов © (12.06.06 10:14) [3]
в вызывающем и модальном окне стоит обработка onKeyPress и больше ничего.var style : TCommonColumnStyle; index : integer;
begin
case Byte(Key) of
18 :
begin
index := self.SpecificFieldList.IndexOf(dgBook.Columns[dgBook.Col-1].FieldName);
if (index > -1) then
begin
style := TCommonColumnStyle(SpecificFieldList.Objects[index]);
if style is TMemoStyle then
self.ShowMemo(dgBook.Columns[dgBook.Col-1])
else
if style is TBookStyle then
self.ShowModalBook(dgBook.Columns[dgBook.Col-1]);
end;
end;
13 :
begin
if dgBook.ReadOnly then
begin
ModalResult := mrOk;
if FormStyle = fsMDIchild then
Close;
end;
end;
end;
end;
← →
Юрий Зотов © (2006-06-12 10:46) [5]> Александр Иванов © (12.06.06 10:35) [4]
В обработчике OnClose дочерней формы поставьте BreakPoint, запустите программу и воспроизведите ситуацию. Когда придете на этот BreakPoint, посмотрите стек вызовов - и все сразу станет ясно.
← →
Александр Иванов © (2006-06-12 10:56) [6]К сожалению ясно не стало:
1. Обработчик нажатия кнопки в гриде
2. Процедура показывающая модальное окно
3. FormClose
Ничего лишнего и криминального.
← →
Юрий Зотов © (2006-06-12 11:05) [7]> Александр Иванов © (12.06.06 10:56) [6]
И что неясно? С какой строки 2-й процедуры Вы попадаете в 3-ю? В этой строке и есть криминал. Даже можно предположить, какой именно - Free написано не для модального окна, а для Self.
← →
Александр Иванов © (2006-06-12 11:37) [8]Юрий Зотов © (12.06.06 11:05) [7]
Перескакиваю при нажатии Ctrl+F4. Код:Book := TfrmBook.Create(self);
try
Book.ShowModal;
if Book.ModalResult = mrOK then
begin
...
end
finally
Book.Free;
end;
← →
Александр Иванов © (2006-06-12 11:58) [9]Кстати сейчас создал новое MDI приложение по шаблону. Добавил новую форму и в дочерней форме добавил кнопку с обработчиком нажатия:
procedure TMDIChild.Button1Click(Sender: TObject);
begin
Form1 := TForm1.Create(self);
try
Form1.ShowModal;
finally
Form1.Free;
end;
end;
Если нажать Ctrl+F4 при открытой модальной форме то наблюдается странная картина
← →
Юрий Зотов © (2006-06-12 11:59) [10]> Александр Иванов © (12.06.06 11:37) [8]
> Перескакиваю при нажатии Ctrl+F4
Это понятно. С КАКОЙ СТРОКИ?
Просто так ничего никуда не перескакивает, все перескоки - это ВЫЗОВЫ. Вот и надо найти СТРОКУ, из которой запускается закрытие дочерней формы. Разве отладчик не показывает ТОЧНО цепочку, по которой Вы попадаете в FormClose?
← →
Александр Иванов © (2006-06-12 12:10) [11]Book := TfrmBook.Create(self);
try
Book.ShowModal;
if Book.ModalResult = mrOK then
begin
...
end
finally
Book.Free;
end;
← →
Александр Иванов © (2006-06-12 12:12) [12]
Book := TfrmBook.Create(self);
try
Book.ShowModal;
if Book.ModalResult = mrOK then
begin
...
end
finally
Book.Free;
end;
В FormClose попадаем из Book.ShowModal; Проблема в том что при открытом модальном окне сообщение о нажатии Ctrl+F4 получает дочернее окно, открывшее модальное.
← →
Юрий Зотов © (2006-06-12 12:45) [13]> Александр Иванов © (12.06.06 12:12) [12]
> В FormClose попадаем из Book.ShowModal;
Что, прям вот так напрямую? Что-то не верится. Должна быть промежуточная цепочка.
Третий раз - ищите СТРОКУ, откуда попадаем в FormClose. КОНКРЕТНУЮ СТРОКУ, а не МЕТОД. Причина обнаружится в ней, в этой СТРОКЕ и отладчик все это показывает. Если надо, включите Use debug DCUs.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c