Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.054 c
2-1162313990
Ezorcist
2006-10-31 19:59
2006.11.19
Проблемы с формой в dll :(


15-1162183263
Slider007
2006-10-30 07:41
2006.11.19
С днем рождения ! 29 октября


1-1160032506
DVM
2006-10-05 11:15
2006.11.19
OnShow у TFrame как сделать?


4-1150256660
xex32
2006-06-14 07:44
2006.11.19
Как принять штрих код со сканера в TEdit


2-1162631827
КлЯкСа
2006-11-04 12:17
2006.11.19
Можно ли редактировать INI файл проекта, находясь в этом проекте?





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