Jump to content

unimForm OnActivate


x11

Recommended Posts

Прошу совета.

В программе есть монитор сессий, где админ программы видит кто подключен к серверу: IP, тип устройства, логин, ID сессии, а так же есть дополнительные параметры типа UniMainModule.ActiveForm, т.е. админ видит, в каком модуле программы работает пользователь, что сейчас открыто на экране.

При создании или при показе окна есть код UniMainModule.ActiveForm := self.Caption. Теперь, если окно закрыть, то на экране смартфона будет предыдущее окно, при этом, у этого (предыдущего окна) нет никаких событий, чтобы программа поняла, что после закрытия какого-то окна уже активно другое предыдущее окно.

 

Как быть, что посоветуете?

Link to comment
Share on other sites

Есть идея, но она мне не очень нравится :(

В каждое окно придется добавить свойство типа "Заголовок предыдущего окна". В событии создания окна нужно будет определять откуда было вызвано окно и записывать это в специальное свойство, что-то типа:
 

NewForm.PreviousWindow := self.caption;

NewForm.Show;

 

Потом, в событии NewForm.OnClose придется добавить ещё одну строку для каждого окна:

UniMainModule.ActiveForm := self.PreviousWindow;

 

Link to comment
Share on other sites

On 7/16/2020 at 3:17 PM, x11 said:

При создании или при показе окна есть код UniMainModule.ActiveForm := self.Caption. Теперь, если окно закрыть, то на экране смартфона будет предыдущее окно, при этом, у этого (предыдущего окна) нет никаких событий, чтобы программа поняла, что после закрытия какого-то окна уже активно другое предыдущее окно.

 

Как быть, что посоветуете?

Здравствуйте,

Попробуйте это решение:

procedure TMainmForm.UnimFormCreate(Sender: TObject);
begin
  UniSession.AddJS(
    'uniVars.currentForm=[];'+
    'Ext.mixin.Observable.observe(Ext.Container, {'+
    '    destroy: function() {'+
    '        if (arguments[0].uname == "window") {'+
    '            uniVars.currentForm.pop();'+
    '            ajaxRequest('+ Self.WebForm.JSName +', "getActiveForm", ["activeForm="+uniVars.currentForm[uniVars.currentForm.length-1].uname]);'+
    '        }'+
    '    }, show: function() {'+
    '        if (arguments[0].uname == "window") {'+
    '            uniVars.currentForm.push(arguments[0].owner);'+
    '            ajaxRequest('+ Self.WebForm.JSName +', "getActiveForm", ["activeForm="+uniVars.currentForm[uniVars.currentForm.length-1].uname]);'+
    '        }'+
    '    }'+
    '});'
  );

end;
procedure TMainmForm.UnimFormAjaxEvent(Sender: TComponent; EventName: string;
  Params: TUniStrings);
begin
  if EventName = 'getActiveForm' then
    ShowMessage(Params.Values['activeForm']);

end;

 

  • Like 1
Link to comment
Share on other sites

17 hours ago, Sherzod said:

Попробуйте это решение

 

на дескопном браузере (в мобильном режиме) ошибок нет, но на смартфоне выдает ошибку:

Quote

cannot read property 'uname' of undefined

 

Link to comment
Share on other sites

13 minutes ago, Sherzod said:

Что выдает в консоли массив uniVars.currentForm, можете проверить?

 

это в консоли выдает Firefox после ошибки

 

Screenshot_5.jpg

Link to comment
Share on other sites

18 hours ago, Sherzod said:

destroy: function() {'+ ' if (arguments[0].uname == "window") {'+ ' uniVars.currentForm.pop();'+

Возможно этот код срабатывает и для других компонентов, которые не являются формой (menu, popup окна...)

Link to comment
Share on other sites

3 minutes ago, x11 said:

Ну может, но мне это ни о чем не говорит.

Остается мне воспроизвести, проанализировать для других элементов тоже, или же поискать другой способ.

  • Upvote 1
Link to comment
Share on other sites

  • 4 months later...
  • 2 weeks later...
On 7/20/2020 at 1:12 PM, Sherzod said:

Остается мне воспроизвести, проанализировать для других элементов тоже, или же поискать другой способ.

Есть решение? На сегодняшний день не возможно никаким образом воспроизвести нормальную работу события onActive.

UniFormAjaxEvent - тоже не рабочие. 

Остановилась разработка. Решение найдено или сроки когда будут исправления?

За ранее благодарен за ответ.

Link to comment
Share on other sites

Смотря что считается нормальной работой события.

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

Может можно описать задачу, чтобы понять, что вообще нужно? Т.е. решить задачу другим способом.

Link to comment
Share on other sites

Например, где-то (uniMainModule в виде свойства) хранить что-то вроде LastActiveForm: TunimForm и потом уже этим свойством манипулировать.

А при вызове очередной формы записывать туда вызывающую форму, потом, при закрытии этой вызываемой формы можно что-то сделать с той вызвавшей формой, которая хранится в LastActiveForm.

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

Link to comment
Share on other sites

Может быть у каждой формы добавить свойство-ссылку на CallBack-процедуру, которая должна будет выполниться при закрытии формы.

Link to comment
Share on other sites

On 7/19/2020 at 8:36 PM, Sherzod said:

procedure TMainmForm.UnimFormCreate(Sender: TObject);
begin
  UniSession.AddJS(
    'uniVars.currentForm=[];'+
    'Ext.mixin.Observable.observe(Ext.Container, {'+
    '    destroy: function() {'+
    '        if (arguments[0].uname == "window") {'+
    '            uniVars.currentForm.pop();'+
    '            ajaxRequest('+ Self.WebForm.JSName +', "getActiveForm", ["activeForm="+uniVars.currentForm[uniVars.currentForm.length-1].uname]);'+
    '        }'+
    '    }, show: function() {'+
    '        if (arguments[0].uname == "window") {'+
    '            uniVars.currentForm.push(arguments[0].owner);'+
    '            ajaxRequest('+ Self.WebForm.JSName +', "getActiveForm", ["activeForm="+uniVars.currentForm[uniVars.currentForm.length-1].uname]);'+
    '        }'+
    '    }'+
    '});'
  );

end;

procedure TMainmForm.UnimFormAjaxEvent(Sender: TComponent; EventName: string;
  Params: TUniStrings);
begin
  if EventName = 'getActiveForm' then
    ShowMessage(Params.Values['activeForm']);

end;

Нужно проанализировать больше, если у Вас есть тестовые случаи, прикрепите пожалуйста. Поскольку вышеуказанное решение работает для меня (на простом тестовом случае)...

Link to comment
Share on other sites

2 hours ago, Sherzod said:

Нужно проанализировать больше, если у Вас есть тестовые случаи, прикрепите пожалуйста. Поскольку вышеуказанное решение работает для меня (на простом тестовом случае)...

Вот тестовый пример.

ProjTest.zip

Link to comment
Share on other sites

2 hours ago, x11 said:

Может быть у каждой формы добавить свойство-ссылку на CallBack-процедуру, которая должна будет выполниться при закрытии формы.

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

 

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...