Добрый день. Появилась такая проблема недавно, после обновление было все ок, а через какое-то время открыл снова проект и окна больше не фиксируются после перемещения и как-будто им координаты не задаются.
Писал функцию, что по нажатию кнопки открывается окно с заданным положением. Галка Запоминать положение отключена, так как не однозначно мной трактуется (запоминать последнее положение после перемещения или запоминать последнее заданное положение (я ж могу из скрипта задавать положение)). Задаю положение окна из скрипта, по смене значений переменной даю другие координаты. - Потом все это похерилось, да и я уже понял, что слишком сложное сделал.
Начал тестить с просто по кнопке задавать координаты (нажали-открыли/записали, переместили, закрыли, нажали-открыли/записали). Галка все еще снята на запоминание положения. Так вот вроде окно должно быть в задаваемых координатах, а оно остается в последней позиции после перемещения.
Может я чего не так делаю?
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;
Это функция которая вызывает окно, меняет цвет кнопки по биту слова, на которые затянуты кнопки. Пытался ее модифицировать, писал, что по изменению бита меняется цвет кнопки, закрывается окно и записываются координаты окна (заготовка, чтобы снова его открыть на первоначальном месте). В итоге он первый раз открывает там где надо, а после перемещения открывает там где остановились. Хотя галка на запоминание снята.
Есть сразу предложение: ввести возможность запрета перемещений окон. Сейчас такого параметра нет.
Здравствуйте.
Для текущей версии первый раз на странице окно открывается в положении задаваемым редактором, далее повторно открывается по внутренним координатам, включая их изменение пользователем или скриптом.
Для Вашей задачи можно использовать окно с положением "По заданным координатам", для которого начальное положение определяется парой свойств окна (.X, .Y).
Скрипт "Пользователь перешел на эту страницу" устанавливает значение пар (X, Y) для всех окон (с таким правилом поведения) данной страницы. Например, для одного окна при индивидуальным положении на каждой странице скрипт выглядит так (переменные или константы (X1,Y1) - координаты окна на первой странице, (X2,Y2) - на второй и т.д., свойство Tag страницы определяет номер набора):begin
Window1.X := GetVariableByName('X' + IntToStr(Sender.Tag)).Value;
Window1.Y := GetVariableByName('Y' + IntToStr(Sender.Tag)).Value;
end.
Для восстановления начального положения при повторном открывании окна необходимо установить координаты окна скриптом "Пользователь закрыл это окно":begin
Window1.SetPosAll(Window1.X, Window1.Y);
end.
Пример во вложении (после разархивирования проекта его необходимо пересохранить).
Здравствуйте.
Для текущей версии первый раз на странице окно открывается в положении задаваемым редактором, далее повторно открывается по внутренним координатам, включая их изменение пользователем или скриптом.
Для Вашей задачи можно использовать окно с положением "По заданным координатам", для которого начальное положение определяется парой свойств окна (.X, .Y).
Скрипт "Пользователь перешел на эту страницу" устанавливает значение пар (X, Y) для всех окон (с таким правилом поведения) данной страницы. Например, для одного окна при индивидуальным положении на каждой странице скрипт выглядит так (переменные или константы (X1,Y1) - координаты окна на первой странице, (X2,Y2) - на второй и т.д., свойство Tag страницы определяет номер набора):begin
Window1.X := GetVariableByName('X' + IntToStr(Sender.Tag)).Value;
Window1.Y := GetVariableByName('Y' + IntToStr(Sender.Tag)).Value;
end.
Для восстановления начального положения при повторном открывании окна необходимо установить координаты окна скриптом "Пользователь закрыл это окно":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 (http://g.recordit.co/W7BD4VJ7UU.gif)