Jump to content

StandaloneServer TFrame


Sergii

Recommended Posts

Доброго времени суток

В проекте создаю динамически форму на основе 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? Если  нет  - какие способы существуют решения данной проблемы?

Спасибо

 

 

 

Link to comment
Share on other sites

Насколько я знаю, то при создании формы вручную, нужно указывать uniApplication в качестве owner

UniForm := TUniForm.Create(UniApplication);

Это если свободная форма. А вообще, uni-формы создавать не нужно, т.к. у каждой формы есть функция, которая создает, если нужно и возвращает экземпляр

function fmmSelTree2: TfmmSelTree2;
begin
  Result := TfmmSelTree2(UniMainModule.GetFormInstance(TfmmSelTree2));
end;

да и неизвестно, что живет в DeleteLastForm()

Link to comment
Share on other sites

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 должна быть локальной переменной функции в которой создается экземпляр.

Link to comment
Share on other sites

 

14 hours ago, Sergii said:

UniFrame например  с именем TExample

это не имя, а класс

14 hours ago, Sergii said:

локальной переменной функции

Не обязательно функции. Может быть полем класса (текущей формы) или полем главного модуля UniMainModule.

 

Нужно понять, как работают веб-сессии и глобальные переменные приложения. Очень нежелательно использовать глобальные переменные вне класса. Потому что бэкэнд - это одно приложение для всех пользователей. И если один пользователь изменит глобальную переменную, то она изменится для всех, т.к. exe-программа для всех одна. Есть модуль данных, а есть серверный модуль. Модуль данных создается внутри сессии для каждого пользователя, а серверный модуль - общий, один на всех. Но тут есть подвох. Именно экземпляр модуля данных создается отдельно на каждого пользователя. Поэтому если ты объявишь переменную в pas-файле модуля данных, но вне объявления класса модуля данных, то такая переменная будет общая для всех пользователей, т.к. как будто ты ее обхявил в серверном модуле.

Например, в Delphi принято объявлять переменную формы прямо в модуле (в pas-файле) этой формы. А вот в uniGUI так нельзя ибо будут грабли. Форма должна создаваться касательно текущей сессии, текущего контекста.

Я не знаю, как бы правильно и полноценно это написать.

Потому что я и сам влетел>> немного, работая с глобальными переменными.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...