Главная страница
    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.044 c
1-1159168787
fynjy1984
2006-09-25 11:19
2006.11.19
WebBrowser и картинки


2-1162620441
Shopot
2006-11-04 09:07
2006.11.19
Функции Delphi.


15-1162143688
oxffff
2006-10-29 20:41
2006.11.19
Касперский ругается на stdvcll40.dll.


1-1160570539
AlexeyT
2006-10-11 16:42
2006.11.19
Проблема с WebBrowser.OnFileDownload


1-1160312498
Sanya_BBB
2006-10-08 17:01
2006.11.19
Передача фокуса и курсора при нажатии на Tab





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