Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

Модальное окно не закрывается при нажатии 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
2-1150962324
Mozgan
2006-06-22 11:45
2006.07.09
как записать компакт средствами windows XP на delphi?


8-1137625606
STK
2006-01-19 02:06
2006.07.09
Перехват Мультимедийных клавиш на клавиатуре


3-1147407297
apl
2006-05-12 08:14
2006.07.09
Записи в таблице и даты создания файлов.


1-1148860928
Gamer
2006-05-29 04:02
2006.07.09
Прорблема с прорисовкой прокрутки ScrollBox a в WinXP


8-1138560030
ZeFiR
2006-01-29 21:40
2006.07.09
Flash