Sergii Posted December 18, 2020 Share Posted December 18, 2020 Доброго времени суток В проекте создаю динамически форму на основе TFrame. case signType of 1:begin DeleteLastForm; if formProject=nil then formProject:=TProject.Create(Self); formProject.Parent:=UniContainerLoad; formProject.Visible:=true; ActiveForm:=ldProject; end; 2: begin DeleteLastForm; if formResolution=nil then formResolution:=TformResolution.Create(Self); formResolution.Parent:=UniContainerLoad; formResolution.Visible:=true; ActiveForm:=ldResolution; end; 3:begin DeleteLastForm; if formDocument=nil then formDocument:=TformDocument.Create(Self); formDocument.Parent:=UniContainerLoad; formDocument.Visible:=true; ActiveForm:=ldResolution; end; Использую Standalone Server. Когда работаю в одной сессии все замечательно. Когда открываю вторую - появляется ошибка TUniSimplePanel.SetParent(): Parent.OwnerForm must be same as Self.OwnerForm (H:\Framework\uniGUI\Source\Core\uniGUIClasses.pas, line 5584). Это особенность использования Standalone Server? Если нет - какие способы существуют решения данной проблемы? Спасибо Quote Link to comment Share on other sites More sharing options...
zilav Posted December 18, 2020 Share Posted December 18, 2020 Попробуйте врезать новый фрейм при этом удаляя старый и создавайте фреймы с Create(nil) Quote Link to comment Share on other sites More sharing options...
x11 Posted December 19, 2020 Share Posted December 19, 2020 Насколько я знаю, то при создании формы вручную, нужно указывать uniApplication в качестве owner UniForm := TUniForm.Create(UniApplication); Это если свободная форма. А вообще, uni-формы создавать не нужно, т.к. у каждой формы есть функция, которая создает, если нужно и возвращает экземпляр function fmmSelTree2: TfmmSelTree2; begin Result := TfmmSelTree2(UniMainModule.GetFormInstance(TfmmSelTree2)); end; да и неизвестно, что живет в DeleteLastForm() Quote Link to comment Share on other sites More sharing options...
Sergii Posted December 20, 2020 Author Share Posted December 20, 2020 On 12/18/2020 at 3:34 PM, Sergii said: Self.OwnerForm Итак в результате поиска путей решения было установлено. Как только Вы начинаете создавать программно фреймы во всем этом процессе есть ОЧЕНЬ БОЛЬШОЙ НЮАНС. А именно: у Вас есть UniFrame например с именем TExample. Вы создаете экземпляр фрейма eX:=TExample(Self). Весь прикол в том eX.Name=Example! Бинго! И когда вы выполняете eX.Free, экземпляр не удаляется и память не освобождается. Просто все свойства сбрасываются в nil. И поэтому это чудо корректно удаляется через if Assigned(FindComponent('Example')) then TExample(FindComponent('Example')).Free. Почему так? А потому как ваша переменная eX должна быть локальной переменной функции в которой создается экземпляр. Quote Link to comment Share on other sites More sharing options...
x11 Posted December 21, 2020 Share Posted December 21, 2020 14 hours ago, Sergii said: UniFrame например с именем TExample это не имя, а класс 14 hours ago, Sergii said: локальной переменной функции Не обязательно функции. Может быть полем класса (текущей формы) или полем главного модуля UniMainModule. Нужно понять, как работают веб-сессии и глобальные переменные приложения. Очень нежелательно использовать глобальные переменные вне класса. Потому что бэкэнд - это одно приложение для всех пользователей. И если один пользователь изменит глобальную переменную, то она изменится для всех, т.к. exe-программа для всех одна. Есть модуль данных, а есть серверный модуль. Модуль данных создается внутри сессии для каждого пользователя, а серверный модуль - общий, один на всех. Но тут есть подвох. Именно экземпляр модуля данных создается отдельно на каждого пользователя. Поэтому если ты объявишь переменную в pas-файле модуля данных, но вне объявления класса модуля данных, то такая переменная будет общая для всех пользователей, т.к. как будто ты ее обхявил в серверном модуле. Например, в Delphi принято объявлять переменную формы прямо в модуле (в pas-файле) этой формы. А вот в uniGUI так нельзя ибо будут грабли. Форма должна создаваться касательно текущей сессии, текущего контекста. Я не знаю, как бы правильно и полноценно это написать. Потому что я и сам влетел>> немного, работая с глобальными переменными. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.