x11 Posted July 16, 2020 Posted July 16, 2020 Прошу совета. В программе есть монитор сессий, где админ программы видит кто подключен к серверу: IP, тип устройства, логин, ID сессии, а так же есть дополнительные параметры типа UniMainModule.ActiveForm, т.е. админ видит, в каком модуле программы работает пользователь, что сейчас открыто на экране. При создании или при показе окна есть код UniMainModule.ActiveForm := self.Caption. Теперь, если окно закрыть, то на экране смартфона будет предыдущее окно, при этом, у этого (предыдущего окна) нет никаких событий, чтобы программа поняла, что после закрытия какого-то окна уже активно другое предыдущее окно. Как быть, что посоветуете? Quote
x11 Posted July 16, 2020 Author Posted July 16, 2020 Есть идея, но она мне не очень нравится В каждое окно придется добавить свойство типа "Заголовок предыдущего окна". В событии создания окна нужно будет определять откуда было вызвано окно и записывать это в специальное свойство, что-то типа: NewForm.PreviousWindow := self.caption; NewForm.Show; Потом, в событии NewForm.OnClose придется добавить ещё одну строку для каждого окна: UniMainModule.ActiveForm := self.PreviousWindow; Quote
Sherzod Posted July 16, 2020 Posted July 16, 2020 2 hours ago, x11 said: Как быть, что посоветуете? Здравствуйте, Кажется я нашёл решение, пока тестирую. Quote
Sherzod Posted July 19, 2020 Posted July 19, 2020 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; 1 Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 Было бы здорово, если бы разработчики добавили событие OnFormActivate для мобильных форм. Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 17 hours ago, Sherzod said: Попробуйте это решение на дескопном браузере (в мобильном режиме) ошибок нет, но на смартфоне выдает ошибку: Quote cannot read property 'uname' of undefined Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 Ошибка и в Chrome, и в Firefox, но Firefox выдает больше информации Quote
Sherzod Posted July 20, 2020 Posted July 20, 2020 А если использовать такое условие? if (arguments[0].uname && arguments[0].uname == "window") вместо if (arguments[0].uname == "window") Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 Всё равно ошибка. Я думаю, что ошибка в этой части кода Quote
Sherzod Posted July 20, 2020 Posted July 20, 2020 Что выдает в консоли массив uniVars.currentForm, можете проверить? Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 это выдает десктопный Chrome в мобильном режиме Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 Кстати, десктопный Firefox тоже выдает ошибку (в мобильном режиме) Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 13 minutes ago, Sherzod said: Что выдает в консоли массив uniVars.currentForm, можете проверить? это в консоли выдает Firefox после ошибки Quote
Sherzod Posted July 20, 2020 Posted July 20, 2020 18 hours ago, Sherzod said: destroy: function() {'+ ' if (arguments[0].uname == "window") {'+ ' uniVars.currentForm.pop();'+ Возможно этот код срабатывает и для других компонентов, которые не являются формой (menu, popup окна...) Quote
x11 Posted July 20, 2020 Author Posted July 20, 2020 Ну может, но мне это ни о чем не говорит. 1 Quote
Sherzod Posted July 20, 2020 Posted July 20, 2020 3 minutes ago, x11 said: Ну может, но мне это ни о чем не говорит. Остается мне воспроизвести, проанализировать для других элементов тоже, или же поискать другой способ. 1 Quote
Sherzod Posted December 2, 2020 Posted December 2, 2020 On 7/20/2020 at 2:18 PM, x11 said: Всё равно ошибка. Извините, я забыл про этот запрос... Quote
dbf_usr Posted December 11, 2020 Posted December 11, 2020 On 7/20/2020 at 1:12 PM, Sherzod said: Остается мне воспроизвести, проанализировать для других элементов тоже, или же поискать другой способ. Есть решение? На сегодняшний день не возможно никаким образом воспроизвести нормальную работу события onActive. UniFormAjaxEvent - тоже не рабочие. Остановилась разработка. Решение найдено или сроки когда будут исправления? За ранее благодарен за ответ. Quote
x11 Posted December 11, 2020 Author Posted December 11, 2020 Смотря что считается нормальной работой события. Почитай на сайте extJS, может оно так и должно работать - т.е. срабатывать только один раз при открытии формы. А то, что мы хотим - это уже не предусмотрено разработчиками фрейморка изначально и нужно пилить самому, если вообще получится. Может можно описать задачу, чтобы понять, что вообще нужно? Т.е. решить задачу другим способом. Quote
x11 Posted December 11, 2020 Author Posted December 11, 2020 Например, где-то (uniMainModule в виде свойства) хранить что-то вроде LastActiveForm: TunimForm и потом уже этим свойством манипулировать. А при вызове очередной формы записывать туда вызывающую форму, потом, при закрытии этой вызываемой формы можно что-то сделать с той вызвавшей формой, которая хранится в LastActiveForm. Может быть у каждой формы добавить свойство типа TunimForm, где и будет храниться форма, которая вызвала текущую форму. Quote
x11 Posted December 11, 2020 Author Posted December 11, 2020 Может быть у каждой формы добавить свойство-ссылку на CallBack-процедуру, которая должна будет выполниться при закрытии формы. Quote
Sherzod Posted December 11, 2020 Posted December 11, 2020 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; Нужно проанализировать больше, если у Вас есть тестовые случаи, прикрепите пожалуйста. Поскольку вышеуказанное решение работает для меня (на простом тестовом случае)... Quote
dbf_usr Posted December 11, 2020 Posted December 11, 2020 2 hours ago, Sherzod said: Нужно проанализировать больше, если у Вас есть тестовые случаи, прикрепите пожалуйста. Поскольку вышеуказанное решение работает для меня (на простом тестовом случае)... Вот тестовый пример. ProjTest.zip Quote
dbf_usr Posted December 11, 2020 Posted December 11, 2020 2 hours ago, x11 said: Может быть у каждой формы добавить свойство-ссылку на CallBack-процедуру, которая должна будет выполниться при закрытии формы. Все это уже проделано много раз и в разных вариантах. Это не подходит, поскольку у меня сначала стартует новая форма, в которой делаются запросы и настройки, а потом закрывается старая, которая все сбрасывает. А надо что бы сбрасывались настройки не при закрытии старой формы, а когда определенная форма становится активной. А это может происходить в разных последовательностях и очередностях вызова различных форм. Отслеживать все действия пользователя и по принципу метода исключения определять какая сейчас форма активна - это реально надо писать еще один компонент... Quote
Sherzod Posted December 11, 2020 Posted December 11, 2020 3 hours ago, dbf_usr said: Вот тестовый пример. ProjTest.zip 57.28 kB · 1 download Вы спрашиваете для десктопной версии? Quote
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.