x11 Posted January 5, 2021 Share Posted January 5, 2021 Свойство TUniForm.AligmentControl := uniAlignmentClient. Если в браузере перетаскивать окно мышкой и менять размеры, то при закрытии окна у экземпяра TUniForm остаются старые размеры. Задача простая. Получить размеры и координаты окна, чтобы записать их в базу. Чтобы при следующем открытии окна эти сохраненные размеры и координаты. Так вот, как в run-time получить РЕАЛЬНЫЕ свойства Top, Left, Width и Height при закрытии окна, если окно было перемещено и размер был изменен? Спасибо. Link to comment Share on other sites More sharing options...
Sherzod Posted January 5, 2021 Share Posted January 5, 2021 12 minutes ago, x11 said: Свойство TUniForm.AligmentControl := uniAlignmentClient. Если в браузере перетаскивать окно мышкой и менять размеры, то при закрытии окна у экземпяра TUniForm остаются старые размеры. Задача простая. Получить размеры и координаты окна, чтобы записать их в базу. Чтобы при следующем открытии окна эти сохраненные размеры и координаты. Так вот, как в run-time получить РЕАЛЬНЫЕ свойства Top, Left, Width и Height при закрытии окна, если окно было перемещено и размер был изменен? Здравствуйте, В таком случае, Вы должны использовать клиентские события: function window.resize(sender, width, height, oldWidth, oldHeight, eOpts) { } function form.resize(sender, width, height, oldWidth, oldHeight, eOpts) { } Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 т.е. отправлять ajax-запросы на сервер? так какое-же всё-таки использовать событие при изменении размера окна: window.resize или form.resize? То же самое и для перемещения - что использовать: form.move или window.move? Link to comment Share on other sites More sharing options...
Sherzod Posted January 5, 2021 Share Posted January 5, 2021 3 minutes ago, x11 said: т.е. отправлять ajax-запросы на сервер? Да. 4 minutes ago, x11 said: window.resize Зависит от UniServerModule.MainFormDisplayMode. 5 minutes ago, x11 said: form.resize Срабатывает всегда. 1 Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 И автоматизировать это никак нельзя? Я имею ввиду что, что это всё не зависело от uniAlignmentClient. Ну просто зашить это в исходники и всё на этом. Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 Проблема с move function form.move(sender, x, y, eOpts) { ajaxRequest(sender, "FormMove", ['x=' + x, 'y=' + y]); } function form.resize(sender, width, height, oldWidth, oldHeight, eOpts) { ajaxRequest(sender, "FormResize", ['width=' + width, 'height=' + height]); } код на сервере: procedure TfmUserEdit.UniFormAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); const constFormResize = 'FormResize'; constFormMove = 'FormMove'; begin inherited; if self.AlignmentControl = uniAlignmentClient then begin if EventName = constFormResize then begin self.Width := Params.Values['width'].ToInteger; self.Height := Params.Values['height'].ToInteger; end; if EventName = constFormMove then begin self.Left := Params.Values['x'].ToInteger; self.Top := Params.Values['y'].ToInteger; end; end; end; Проблема в том, что как только окно открывается, то оно "сжимается" и выглядит вот так: Link to comment Share on other sites More sharing options...
Sherzod Posted January 5, 2021 Share Posted January 5, 2021 7 minutes ago, x11 said: if EventName = constFormResize then begin self.Width := Params.Values['width'].ToInteger; self.Height := Params.Values['height'].ToInteger; end; Скорее всего проблема здесь. Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 Проблема в том, что событие в бразуере срабатывает много раз. Я окно мышкой не трогаю. Но событие срабатывает. Link to comment Share on other sites More sharing options...
Sherzod Posted January 5, 2021 Share Posted January 5, 2021 Just now, x11 said: Проблема в том, что событие в бразуере срабатывает много раз. Я окно мышкой не трогаю. Но событие срабатывает. Чтобы воспроизвести проблемный случай, пожалуйста, создайте тестовый случай... Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 Я таскаю мышкой окно, но событие form.move не происходит Link to comment Share on other sites More sharing options...
Sherzod Posted January 5, 2021 Share Posted January 5, 2021 2 minutes ago, x11 said: Я таскаю мышкой окно, но событие form.move не происходит Для move используйте window.move. 1 Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 Теперь другая проблема. Сохраняю такого размера, как на картинке 1, а восстанавливается как на картинке 2. Я так подразумеваю, что размер формы не учитывает заголовок? Или в чем-то другом проблема? Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 Да, еще проблема с размерами. По ширине и по высоте размеры не совпадают. Т.е. js-форма не совпадает по размерам с vcl-формой. Но ведь такой проблемы в случае с uniAlignmentServer нет. Получается, что разработчики uniGUI знают какой-то секрет, если размеры форм совпадают при uniAlignmentServer? Link to comment Share on other sites More sharing options...
x11 Posted January 5, 2021 Author Share Posted January 5, 2021 вот мой код VCL procedure TfmUserEdit.UniFormAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin inherited; if self.AlignmentControl = uniAlignmentClient then begin if EventName = constFormResize then begin fWidth := Params.Values['width'].ToInteger; fHeight := Params.Values['height'].ToInteger; end; if EventName = constWindowMove then begin fTop := Params.Values['top'].ToInteger; fLeft := Params.Values['left'].ToInteger; end; end; end; procedure TfmUserEdit.UniFormClose(Sender: TObject; var Action: TCloseAction); begin self.Left := fLeft; self.Top := fTop; self.Width := fWidth; self.Height := fHeight; inherited;// сохранить параметры в базу при закрытии end; procedure TfmUserEdit.UniFormShow(Sender: TObject); begin inherited;// восстановить размеры // записать в переменные размеры по умолчанию fLeft := self.Left; fTop := self.Top; fWidth := self.Width; fHeight := self.Height; end; JS function window.move(sender, x, y, eOpts) { ajaxRequest(sender, "WindowMove", ['left=' + x, 'top=' + y]); } function form.resize(sender, width, height, oldWidth, oldHeight, eOpts) { ajaxRequest(sender, "FormResize", ['width=' + width, 'height=' + height]); } Link to comment Share on other sites More sharing options...
Sherzod Posted January 6, 2021 Share Posted January 6, 2021 10 hours ago, x11 said: Да, еще проблема с размерами. По ширине и по высоте размеры не совпадают. Т.е. js-форма не совпадает по размерам с vcl-формой. Если значение MainFormDisplayMode установлено по умолчанию (mfWindow), то используйте window.resize. Да Вы правы, так как размеры form, меньше window. Link to comment Share on other sites More sharing options...
x11 Posted January 6, 2021 Author Share Posted January 6, 2021 26 minutes ago, Sherzod said: Да Вы правы, так как размеры form, меньше window. И как быть тогда? Как правильно высчитать и передать на сервер правильные размеры и координаты? А вдруг это зависит от темы... Ведь как-то же при uniAlignmentServer размеры координаты передаются на сервер и обратно правильно. 28 minutes ago, Sherzod said: Если значение MainFormDisplayMode установлено по умолчанию (mfWindow), то используйте window.resize. Главная форма у меня на весь экран, т.е. в режиме mfPage. Приложение построено на базе PageControl + фреймы + некоторые сервисные формы, как эта, проблемная, в виде обычной uniForm. Link to comment Share on other sites More sharing options...
Sherzod Posted January 6, 2021 Share Posted January 6, 2021 Т.е., Вы хотите сохранить размеры сервисных форм? Link to comment Share on other sites More sharing options...
x11 Posted January 6, 2021 Author Share Posted January 6, 2021 да, любой отдельной формы, у которой uniAlignmentClient Link to comment Share on other sites More sharing options...
Sherzod Posted January 6, 2021 Share Posted January 6, 2021 6 minutes ago, x11 said: да, любой отдельной формы, у которой uniAlignmentClient OK, если для отдельной формы, попробуйте window.resize. 1 Link to comment Share on other sites More sharing options...
x11 Posted January 6, 2021 Author Share Posted January 6, 2021 Спасибо. Так лучше. procedure TfmUserEdit.UniFormAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin inherited; if self.AlignmentControl = uniAlignmentClient then begin if EventName = constWindowResize then begin self.Width := Params.Values['width'].ToInteger; self.Height := Params.Values['height'].ToInteger; end; if EventName = constWindowMove then begin self.Top := Params.Values['top'].ToInteger; self.Left := Params.Values['left'].ToInteger; end; end; end; function window.move(sender, x, y, eOpts) { ajaxRequest(sender, "WindowMove", ['left=' + x, 'top=' + y]); } function window.resize(sender, width, height, oldWidth, oldHeight, eOpts) { ajaxRequest(sender, "WindowResize", ['width=' + width, 'height=' + height]); } 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now