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

Вниз

Нехарактерная проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.105 c
15-1162213237
GanibalLector
2006-10-30 16:00
2006.11.19
PortMon -> Error : 2


2-1162468892
pathfinder
2006-11-02 15:01
2006.11.19
Создание хелпа..


15-1162403333
Ketmar
2006-11-01 20:48
2006.11.19
как молиться?


2-1162290734
aht
2006-10-31 13:32
2006.11.19
InterBase - права


15-1162105239
Pazitron_Brain
2006-10-29 10:00
2006.11.19
Сколько тратит IP телефония трафика?