Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.016 c
15-1149839269
Holy
2006-06-09 11:47
2006.07.09
Обучение компьютеру


1-1148648699
001
2006-05-26 17:04
2006.07.09
Стрелка в Excel


15-1149840196
Ketmar
2006-06-09 12:03
2006.07.09
LUA 5.1 -- сборка в виде .obj...


1-1148903038
pirate
2006-05-29 15:43
2006.07.09
Волшебный Richedit


15-1149843053
Kolan
2006-06-09 12:50
2006.07.09
Что такое программная оболочка?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский