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

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

Нехарактерная проблема с MDI на некоторых ПК [D7, WinXP]


Николай_Москва ©   (2006-09-18 15:18:00) 

Привет!
Столкнулся с интересной проблемой, думал, что ошибка в другом, однако, упростив программу до минимума, все равно от ошибки не избавился. Вот краткое содержание (проблема локализована всего в нескольких строках):
Есть приложение с MDI архитектурой на D7, как всегда есть главное окно MDIForm и несколько MDIChild.
По нажатию кнопки на главной форме вызывается (точнее, создается дочернее окно):
Application.CreateForm(TNavpoints_Form, Navpoints_Form);
в параметрах - корректное название и класс.
при закрытии этого дочернего окна (onClose) установлено
action:=cafree . По нажатию кнопки на дочернем окне срабатывает Close, который вызывает onClose и указанный action освобождает память и т.д.
Плюс главное окно имеет защиту от запуска нескольких одинаковых дочерних окон - кнопки вызова блокируются, пока пользователь не закроет соответствующее окно.

Вот такая конструкция (до которой мне пришлось упростить программу) представляет собой практически Дельфийский пример по MDI. Но что интересно:
Десяток программ, написанных в таком ключе работают (интенсивно) в течении нескольких лет. Сейчас написали еще одну. На ПК, где она создавалась, проведено уже более 1000 тестовых запусков в разных условиях - все нормально. Однако, на 2х ПК, где дополнительно проводились испытания картина следующая:
Несколько вызовов дочернего окна проходят нормально, а потом при нажатии на кнопку, создающую дочернее окно, компьютер "задумывается" на 2-3 секунды, дочернее окно не открывает, а закрывает все приложение.
Никакие действия пользователя не выполнялись, просто нажатие на кнопку открытия окна, затем закрыть дочернее окно, открыть его и т.д. После нескольких таких манипуляций программа закрывается. Что Вы можете посоветовать - как вообще попытаться найти ошибку? Если есть вариант, как надежнее переписать строки закрытия/создания окна, то может поможет. Под отладчиком ошибка упорно не проявляется, память с каждым открытием/закрытием не забивается (вроде освобождается все корректно), на ПК одинаковые ОС (с одного диска) и т.д.
Что можно предпринять - ошибка в нескольких строках, хотя абсолютно идентичный механизм отлично работает в интенсивном режиме в течении нескольких лет...


atruhin   (2006-10-11 14:37:00) [1]

> Проблема была в одном из компонентов библиотеки ehlib

Постоянно использую версии от 3 до 4.2 beta нет такого эффекта. Delphi 7.


Экспериментатор   (2006-10-11 13:34:00) [2]

И что было не так?


Николай_Москва   (2006-10-11 12:25:00) [3]

получилось
Проблема была в одном из компонентов библиотеки ehlib


Плохиш   (2006-09-20 19:29:00) [4]


> Несколько вызовов дочернего окна проходят нормально, а потом
> при нажатии на кнопку, создающую дочернее окно, компьютер
> "задумывается" на 2-3 секунды, дочернее окно не открывает,
>  а закрывает все приложение.
> Никакие действия пользователя не выполнялись, просто нажатие
> на кнопку открытия окна, затем закрыть дочернее окно, открыть
> его и т.д. После нескольких таких манипуляций программа
> закрывается.

Ну давай, для начала, код в студию. Код создания дочернего окна и того, что делается в конструкторе и в OnCreate.


Николай_Москва   (2006-09-20 19:03:00) [5]

Все советы попробовал - не помогло :-(


MsGuns   (2006-09-19 13:24:00) [6]

>Application.CreateForm(TNavpoints_Form, Navpoints_Form);

Это строка из инита главной формы ?
Дочки должны создаваться мамкой, а не приложением.

"Политически" корректный код:

procedure TMainForm.Button1Click(Sender:TObject);
begin
 with TChildForm1.Create(Self) do ...
end;

Обращаться из главной формы к активным "дочкам" через указатели, сохраненные в переменных главной формы или через ActiveMDIChild

У MDI индерфейса достаточно детально и продуктивно разработанный механизм "внутреннего" общения и изобретать ничего не нужно.


ЮЮ   (2006-09-19 03:21:00) [7]


> Под отладчиком ошибка упорно не проявляется,

Именно на том компе пробовал под отладчиком? У меня, например, на домашнем компе арифметическая операция с Unsigned операндом приводит к ошибке, котя тот же проект на компах на работе работает без ошибок, приводя  его (Unsigned) к нулю.

Собственно по subj.

Application.CreateForm(TNavpoints_Form, Navpoints_Form);
Правило №1 для динамически создаваемых форм, тем более MDIChild: никаких глобальных переменных типа формы - первый источник ошибок.

Убей Navpoints_Form в модуле формы, достаточно объявить ее локальной в методе её создающем. Если где-то после это вылезут вызовы Navpoints_Form.XXX - это и есть места потенциальных ошибок


Наверх

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