Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Ошибка с фиксацией окон  (Прочитано 5743 раз)

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Ошибка с фиксацией окон
« : 23 Октября 2020, 12:39:49 »
Добрый день. Появилась такая проблема недавно, после обновление было все ок, а через какое-то время открыл снова проект и окна больше не фиксируются после перемещения и как-будто им координаты не задаются.

Писал функцию, что по нажатию кнопки открывается окно с заданным положением. Галка Запоминать положение отключена, так как не однозначно мной трактуется (запоминать последнее положение после перемещения или запоминать последнее заданное положение (я ж могу из скрипта задавать положение)). Задаю положение окна из скрипта, по смене значений переменной даю другие координаты. - Потом все это похерилось, да и я уже понял, что слишком сложное сделал.

Начал тестить с просто по кнопке задавать координаты (нажали-открыли/записали, переместили, закрыли, нажали-открыли/записали). Галка все еще снята на запоминание положения. Так вот вроде окно должно быть в задаваемых координатах, а оно остается в последней позиции после перемещения.

Может я чего не так делаю?
Код
function TTMS_BT_CLR_CHNG (CallButt           :TM_Button;   //кнопка вызова экрана
                           CallWin            :TM_Window;

                           MenuSwitch         :TM_Variable; //отслеживание работы битов меню

                           Num_Bit,                         //номер бита
                           RON,GON,BON,                     //цвет нажатой кнопки
                           ROFF,GOFF,BOFF     :Integer      //цвет ненажатой кнопки
                           ):boolean;
begin
if GetBit(MenuSwitch.AsInt, Num_Bit) = true then begin      //нажата кнопка
  CallButt.States[1].Color := RGB(RON,GON,BON);             //поменяли цвет
  CallWin.ShowAll;
end
else begin                                                  //не нажата кнопка
  CallButt.States[1].Color := RGB(ROFF,GOFF,BOFF);          //поменяли цвет
  CallWin.CloseAll;
  CallWin.X :=80;
  CallWin.Y :=80;

end;
end;

Это функция которая вызывает окно, меняет цвет кнопки по биту слова, на которые затянуты кнопки. Пытался ее модифицировать, писал, что по изменению бита меняется цвет кнопки, закрывается окно и записываются координаты окна (заготовка, чтобы снова его открыть на первоначальном месте). В итоге он первый раз открывает там где надо, а после перемещения открывает там где остановились. Хотя галка на запоминание снята.

Есть сразу предложение: ввести возможность запрета перемещений окон. Сейчас такого параметра нет.

« Изменён: 26 Октября 2020, 10:05:53 от azrael454 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка с фиксацией окон
« Ответ #1 : 26 Октября 2020, 17:08:15 »
Здравствуйте.

В новых версиях скады координаты окон сохраняются только до тех пор, пока пользователь находится на какой-то странице. Т.е. можно открыть окно, переместить его, закрыть и открыть снова. Окно откроется в той позиции, в которой было в последний раз. Свойство "Запоминать положение" должно быть обязательно включено, иначе окно появится в изначальных координатах.
Но! Если перейти на другую страницу проекта, затем вернуться назад и снова открыть окно, то окно откроется в изначальных координатах.
Постараемся в одном из ближайших обновлений сделать сохранение позиции после перехода по страницам. 

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Ошибка с фиксацией окон
« Ответ #2 : 27 Октября 2020, 08:32:41 »
То есть, при снятой галке "Запоминать положение", окно после закрытия будет открываться на том месте, которое задано в редакторе?

Моя задача в том, что у пользователя есть возможность перемещать окна, но после того как он закрывает какое-либо окно, оно должно открываться в том месте, которое задается из редактора/скрипта. Сейчас получается, что после закрытия окна после перемещения, окно открывается в последней точке, в которой оно оказалось после перемещения. И задание из скрипта координат не работает или не получается у меня правильно реализовать.

Добавлял функцию SetPosAll по событию OnShow и OnClose. Не реагирует на эту функцию.

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Ошибка с фиксацией окон
« Ответ #3 : 28 Октября 2020, 22:31:22 »
Здравствуйте.

Для текущей версии первый раз на странице окно открывается в положении задаваемым редактором, далее повторно открывается по внутренним координатам, включая их изменение пользователем или скриптом.
Для Вашей задачи можно использовать окно с положением "По заданным координатам", для которого начальное положение определяется парой свойств окна (.X, .Y).
Скрипт "Пользователь перешел на эту страницу" устанавливает значение пар (X, Y) для всех окон (с таким правилом поведения) данной страницы. Например, для одного окна при индивидуальным положении на каждой странице скрипт выглядит так (переменные или константы (X1,Y1) - координаты окна на первой странице, (X2,Y2) - на второй и т.д., свойство Tag страницы определяет номер набора):
Код: (delphi)
begin
  Window1.X := GetVariableByName('X' + IntToStr(Sender.Tag)).Value;
  Window1.Y := GetVariableByName('Y' + IntToStr(Sender.Tag)).Value;
end.
Для восстановления начального положения при повторном открывании окна необходимо установить координаты окна скриптом "Пользователь закрыл это окно":
Код: (delphi)
begin
  Window1.SetPosAll(Window1.X, Window1.Y);
end.
Пример во вложении (после разархивирования проекта его необходимо пересохранить).

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Ошибка с фиксацией окон
« Ответ #4 : 29 Октября 2020, 10:04:34 »
Здравствуйте.

Для текущей версии первый раз на странице окно открывается в положении задаваемым редактором, далее повторно открывается по внутренним координатам, включая их изменение пользователем или скриптом.
Для Вашей задачи можно использовать окно с положением "По заданным координатам", для которого начальное положение определяется парой свойств окна (.X, .Y).
Скрипт "Пользователь перешел на эту страницу" устанавливает значение пар (X, Y) для всех окон (с таким правилом поведения) данной страницы. Например, для одного окна при индивидуальным положении на каждой странице скрипт выглядит так (переменные или константы (X1,Y1) - координаты окна на первой странице, (X2,Y2) - на второй и т.д., свойство Tag страницы определяет номер набора):
Код: (delphi)
begin
  Window1.X := GetVariableByName('X' + IntToStr(Sender.Tag)).Value;
  Window1.Y := GetVariableByName('Y' + IntToStr(Sender.Tag)).Value;
end.
Для восстановления начального положения при повторном открывании окна необходимо установить координаты окна скриптом "Пользователь закрыл это окно":
Код: (delphi)
begin
  Window1.SetPosAll(Window1.X, Window1.Y);
end.
Пример во вложении (после разархивирования проекта его необходимо пересохранить).


Добрый день.

Если я вас правильно, то когда пользователь заходит на страницу, то он единовременно прописывает координаты для окна. После закрытия окна, оно обращается за координатами к той прописи, которая была в самом начале, так?

"Для Вашей задачи можно использовать окно с положением "По заданным координатам", для которого начальное положение определяется парой свойств окна (.X, .Y)." - я так и реализовывал.

У меня проект можно сказать одностраничный, в котором есть один главный экран, на котором будет вестись основная работа. Есть страницы с доп настройками, но согласитесь, что пользователю не нужно переходить между страницами, чтобы вернуть открываемые окна в то положение, в котором они должны быть.

Записал гифку с моими действиями. Попробовал интегрировать ваш код в свой, не срабатывается.
Внизу координаты окна, которые ему задаются и при которых оно открывается в первый раз и после смены страниц.
Открытие окна по событию кнопки OnClick
Код
begin
//Отображение текущих значений температуры и кнопок уставок
ShowWindow_Fix(Set_Temp,   //кнопка вызова настроек температуры
               Task_TempMenu,    //окно настроек температуры
               344,80 //координаты окна
               );
if Set_Switch_Set_Temp.AsBool then begin  //нажата кнопка вызова экрана настроек температур
  Set_Press.Visible := false;//скрыть кнопку вызова экрана настроек давления
end
else begin
  Set_Press.Visible := true;//показать кнопку вызова экрана настроек давления
end;
end.

Функция открытия окна с фиксированным положением
Код
function ShowWindow_Fix (CallButt   : TM_Button;
                        CallWin     : TM_Window;
                        XCall,YCall : Single
                        ): boolean;
begin
if CallButt.AsBool = true then begin                //нажата кнопка
   CallWin.ShowAll;                                 //показать экран
   CallButt.States[1].Color := RGB(137,197,214);    //поменять цвет кнопки, индикация открытия окна
end

else begin                                          //отжата кнопка
  CallWin.CloseAll;                                 //спрятать экран
  CallButt.States[1].Color := RGB(255,255,255);     //поменять цвет кнопки, индикация закрытия окна
  CallWin.X := XCall;                               //Х - окно настроек
  CallWin.Y := YCall;                               //У - окно настроек
  CallWin.SetPosAll(XCall,YCall);
end;
end;

Стоит галка "Запоминать положение" и выбран вариант "По заданным координатам"

http://g.recordit.co/W7BD4VJ7UU.gif

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Ошибка с фиксацией окон
« Ответ #5 : 01 Ноября 2020, 15:58:25 »
    Здравствуйте.

Стоит галка "Запоминать положение" и выбран вариант "По заданным координатам"
Описание галки в редакторе: "Сохранить положение окна после перемещения". При снятой - следует ожидать, что положение открываемого окна определяется "Положением окна при первом открытии".
Тесты не подтвердили это утверждение, в некоторых оно работало, в некоторых - нет. Так что с галкой полный туман.
Вариант "По заданным координатам" правильный - положение окна при первом открытии определяется парой свойств окна (.X, .Y). Далее подразумевается что все окна "По заданным координатам".

Цитировать
... то когда пользователь заходит на страницу, то он единовременно прописывает координаты для окна. После закрытия окна, оно обращается за координатами к той прописи, которая была в самом начале, ...
Только для окон с изменяемым начальным положением, прописывать координаты для окон с фиксированным положением нет необходимости.
При закрытии окна функция SetPosAll(Xокна,Yокна) перемещает окно к начальному положению (делает то, что ожидалось от снятой галки "Запоминать положение").

Цитировать
... но согласитесь, что пользователю не нужно переходить между страницами, чтобы вернуть открываемые окна в то положение, в котором они должны быть ...
Так это и не требуется, т.к. закрытие окна по любой причине (прямое закрытие окна или из скрипта) перемещает окно в начальное положение. А поскольку окна не привязаны к страницам, то следует ожидать что переход на любую страницу устанавливает все окна в начальные положения.

Цитировать
Записал гифку с моими действиями...
Пример управления окнами по Вашим действиям во вложении - проект "Начальные_Положения_Окон". Проект содержит два "лишних" скрипта из-за особенностей текущей реализации возвращаемых значений функции SetPos.


      Теперь о проблеме позиционирования окон, как она выглядит со стороны пользователя.

Предположительно, функция SetPos возвращает результат через указатель, инициализируемый при первой, после перехода на страницу, визуализации окна.
Порядок инициализации должен соответствовать порядку окон в списке команды "Открыть окно".
Предположение можно проверить в проекте "Test_SetPos". Тест основан на синхронных перемещениях окна и обрамляющего его прямоугольника. Для перемещения необходимо изменить любую координату.
В ручном режиме можно проверить:
- неактивированные окна не перемещаются;
- активировать окна в любом порядке, синхронные перемещения возможны только при правильном порядке активации окон.
В автоматическом можно запустить тест без ошибок или с ошибкой. Тесты отличаются только порядком активации окон.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка с фиксацией окон
« Ответ #6 : 09 Ноября 2020, 09:42:28 »
Здравствуйте.

В обновление 2.4.0.10 добавлены изменения связанные с позиционированием окон и работой свойства "Запоминать положение".