Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизНехарактерная проблема с MDI на некоторых ПК Найти похожие ветки
← →
Николай_Москва (2006-09-18 15:18) [0]Привет!
Столкнулся с интересной проблемой, думал, что ошибка в другом, однако, упростив программу до минимума, все равно от ошибки не избавился. Вот краткое содержание (проблема локализована всего в нескольких строках):
Есть приложение с MDI архитектурой на D7, как всегда есть главное окно MDIForm и несколько MDIChild.
По нажатию кнопки на главной форме вызывается (точнее, создается дочернее окно):
Application.CreateForm(TNavpoints_Form, Navpoints_Form);
в параметрах - корректное название и класс.
при закрытии этого дочернего окна (onClose) установлено
action:=cafree . По нажатию кнопки на дочернем окне срабатывает Close, который вызывает onClose и указанный action освобождает память и т.д.
Плюс главное окно имеет защиту от запуска нескольких одинаковых дочерних окон - кнопки вызова блокируются, пока пользователь не закроет соответствующее окно.
Вот такая конструкция (до которой мне пришлось упростить программу) представляет собой практически Дельфийский пример по MDI. Но что интересно:
Десяток программ, написанных в таком ключе работают (интенсивно) в течении нескольких лет. Сейчас написали еще одну. На ПК, где она создавалась, проведено уже более 1000 тестовых запусков в разных условиях - все нормально. Однако, на 2х ПК, где дополнительно проводились испытания картина следующая:
Несколько вызовов дочернего окна проходят нормально, а потом при нажатии на кнопку, создающую дочернее окно, компьютер "задумывается" на 2-3 секунды, дочернее окно не открывает, а закрывает все приложение.
Никакие действия пользователя не выполнялись, просто нажатие на кнопку открытия окна, затем закрыть дочернее окно, открыть его и т.д. После нескольких таких манипуляций программа закрывается. Что Вы можете посоветовать - как вообще попытаться найти ошибку? Если есть вариант, как надежнее переписать строки закрытия/создания окна, то может поможет. Под отладчиком ошибка упорно не проявляется, память с каждым открытием/закрытием не забивается (вроде освобождается все корректно), на ПК одинаковые ОС (с одного диска) и т.д.
Что можно предпринять - ошибка в нескольких строках, хотя абсолютно идентичный механизм отлично работает в интенсивном режиме в течении нескольких лет...
← →
ЮЮ © (2006-09-19 03:21) [1]
> Под отладчиком ошибка упорно не проявляется,
Именно на том компе пробовал под отладчиком? У меня, например, на домашнем компе арифметическая операция с Unsigned операндом приводит к ошибке, котя тот же проект на компах на работе работает без ошибок, приводя его (Unsigned) к нулю.
Собственно по subj.
Application.CreateForm(TNavpoints_Form, Navpoints_Form);
Правило №1 для динамически создаваемых форм, тем более MDIChild: никаких глобальных переменных типа формы - первый источник ошибок.
Убей Navpoints_Form в модуле формы, достаточно объявить ее локальной в методе её создающем. Если где-то после это вылезут вызовы Navpoints_Form.XXX - это и есть места потенциальных ошибок
← →
MsGuns © (2006-09-19 13:24) [2]>Application.CreateForm(TNavpoints_Form, Navpoints_Form);
Это строка из инита главной формы ?
Дочки должны создаваться мамкой, а не приложением.
"Политически" корректный код:
procedure TMainForm.Button1Click(Sender:TObject);
begin
with TChildForm1.Create(Self) do ...
end;
Обращаться из главной формы к активным "дочкам" через указатели, сохраненные в переменных главной формы или через ActiveMDIChild
У MDI индерфейса достаточно детально и продуктивно разработанный механизм "внутреннего" общения и изобретать ничего не нужно.
← →
Николай_Москва (2006-09-20 19:03) [3]Все советы попробовал - не помогло :-(
← →
Плохиш © (2006-09-20 19:29) [4]
> Несколько вызовов дочернего окна проходят нормально, а потом
> при нажатии на кнопку, создающую дочернее окно, компьютер
> "задумывается" на 2-3 секунды, дочернее окно не открывает,
> а закрывает все приложение.
> Никакие действия пользователя не выполнялись, просто нажатие
> на кнопку открытия окна, затем закрыть дочернее окно, открыть
> его и т.д. После нескольких таких манипуляций программа
> закрывается.
Ну давай, для начала, код в студию. Код создания дочернего окна и того, что делается в конструкторе и в OnCreate.
← →
Николай_Москва (2006-10-11 12:25) [5]получилось
Проблема была в одном из компонентов библиотеки ehlib
← →
Экспериментатор © (2006-10-11 13:34) [6]И что было не так?
← →
atruhin © (2006-10-11 14:37) [7]> Проблема была в одном из компонентов библиотеки ehlib
Постоянно использую версии от 3 до 4.2 beta нет такого эффекта. Delphi 7.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c