Добрый день!

Возникла такая проблема: есть сложная форма редактирования, на которой расположен таб, внутри на вкладках таба контролы + на некоторых вкладках - формы (форма с реестром) + на некоторых вкладках сложные формы (внутри формы другие формы).

Есть необходимость кешировать такую форму (сохранять в объекте) после инициализации.
Но довольно часто возникает проблема: при открытии основной формы, которая находится в объекте, вываливает Exception типа pgTest has no parent Window.

Если каждый раз инициализировать форму (не брать из объекта), то все ок.
Никто не сталкивался с таким?

Нравится

5 комментариев

Вот ошибка:

Дата/Время: 27.02.2014 14:21:52
Название компьютера: ххх
Имя пользователя: ххх
Операционная система: Workstation, Build: 7601, 'Service Pack 1'
Системный язык: Русский (Россия)
Процессор: Intel, Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz, MMX
Видеосистема: 1680x1050 pixels, 32 bpp
Время работы системы: 0 day(s) 02:24:13.0578
Время работы программы: 0 day(s) 00:00:44.0273
Исполняемый файл: C:\Program Files (x86)\Terrasoft\Bin\TSClient.exe
Версия: 3.3.2.267
Класс исключения: EOleException
Сообщение об ошибке: Control 'pgDebitors' has no parent window

Стек вызова
Controls.TWinControl.CreateWnd ()
Controls.TWinControl.CreateHandle ()
Comctrls.TPageControl.DeleteTab ()
TSAutomationObject.TBaseAutomationObject.ObjRelease (Line 191, "TSAutomationObject.pas") ()
Comobj.TComObject._Release ()
System.@IntfClear ()
Comobj.TComObject.ObjRelease ()
TSAutomationObject.TBaseAutomationObject.ObjRelease (Line 191, "TSAutomationObject.pas") ()
Comobj.TComObject._Release ()
TSConnectionPoints.TConnectionPointDispatcher.Invoke (Line 592, "TSConnectionPoints.pas") ()
TSConnectionPoints.TConnectionPointDispatcher.Invoke (Line 592, "TSConnectionPoints.pas") ()
Comobj.DispatchInvokeError ()
Comobj.DispatchInvokeError ()

Активные элементы управления:
pcData (TInternalPages)

Небольшое дополнение: исключение выбрасывается когда открываешь карточку, переходишь на вкладку на которой размещена сложная форма и закрываешь карточку.
Выглядит как будто основная карточка уже закрыта, а та, которая в нее вложена вместе с табом еще нет.

Здравствуйте!
С ходу не получится сказать, в чем проблема. Нужно смотреть на код. Возможно, после закрытия основного окна работает еще какая-то логика на вкладке.
В общем, нужны куски кода с реализацией.

Спасибо, Андрей,

Проблему вроде бы закрыл.
Воркараунд приблизительно следующий:

При закрытии основной формы удаляю с нее компонент вложенного сложного окна (контейнера окна) (остается пустой таб) и потом уже закрываю форму.
function wnd_DocumentEditOnClose(Window) {
Window.DisableEvents();
Self.RemoveComponent(wndDocumentDebitors);
Window.EnableEvents();
wnd_BaseDBEditOnClose(Window);
}

При повторном показе, если сервис берется из массива объектов (не перестраивается форма с нуля) то просто проверяю, есть ли у компонента контейнера окна родительский элемент, если нет - добавляю контейнер окна на страницу и вызываю метод Show().
...............
var DetailWindow = wndDocumentDebitors.Window;
if (!ScriptObject.IsDebitorsInitialized) {
SetAttribute(DetailWindow, 'ParentItemFieldName', 'DocumentID');
DetailWindow.Prepare();
ScriptObject.IsDebitorsInitialized = true;
}
if(!Assigned(wndDocumentDebitors.ParentComponent)){
pgDebitors.Add(wndDocumentDebitors);
DetailWindow.Show();
}
..............

Спасибо за информацию!
Рад, что у Вас получилось.

Показать все комментарии