Jump to content

Recommended Posts

Posted

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

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

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

 

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

Posted

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

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

NewForm.PreviousWindow := self.caption;

NewForm.Show;

 

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

UniMainModule.ActiveForm := self.PreviousWindow;

 

Posted
2 hours ago, x11 said:

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

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

Кажется я нашёл решение, пока тестирую. 

Posted
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
Posted

Было бы здорово, если бы разработчики добавили событие OnFormActivate для мобильных форм.

Posted
17 hours ago, Sherzod said:

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

 

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

Quote

cannot read property 'uname' of undefined

 

Posted

Ошибка и в Chrome, и в Firefox, но Firefox выдает больше информации

Screenshot_1.jpg

Posted

А если использовать такое условие?

if (arguments[0].uname && arguments[0].uname == "window")

вместо

if (arguments[0].uname == "window")

 

Posted

Всё равно ошибка.

Я думаю, что ошибка в этой части кода

Screenshot_2.jpg

Posted

Кстати, десктопный Firefox тоже выдает ошибку (в мобильном режиме)

Screenshot_4.jpg

Posted
13 minutes ago, Sherzod said:

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

 

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

 

Screenshot_5.jpg

Posted
18 hours ago, Sherzod said:

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

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

Posted
3 minutes ago, x11 said:

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

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

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

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

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

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

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

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

Posted

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

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

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

Posted

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

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

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

Posted

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

Posted
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;

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

Posted
2 hours ago, Sherzod said:

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

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

ProjTest.zip

Posted
2 hours ago, x11 said:

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

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

 

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...