Добрый день!
Возникла такая проблема: есть сложная форма редактирования, на которой расположен таб, внутри на вкладках таба контролы + на некоторых вкладках - формы (форма с реестром) + на некоторых вкладках сложные формы (внутри формы другие формы).
Есть необходимость кешировать такую форму (сохранять в объекте) после инициализации.
Но довольно часто возникает проблема: при открытии основной формы, которая находится в объекте, вываливает Exception типа pgTest has no parent Window.
Если каждый раз инициализировать форму (не брать из объекта), то все ок.
Никто не сталкивался с таким?
Нравится
Вот ошибка:
Дата/Время: 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();
}
..............