Jump to content

Определить координаты и размеры окна TUniForm при uniAlignmentClient


x11

Recommended Posts

Свойство TUniForm.AligmentControl := uniAlignmentClient.

Если в браузере перетаскивать окно мышкой и менять размеры, то при закрытии окна у экземпяра TUniForm остаются старые размеры.

Задача простая. Получить размеры и координаты окна, чтобы записать их в базу. Чтобы при следующем открытии окна эти сохраненные размеры и координаты.

Так вот, как в run-time получить РЕАЛЬНЫЕ свойства Top, Left, Width и Height при закрытии окна, если окно было перемещено и размер был изменен?

Спасибо.

 

Link to comment
Share on other sites

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

т.е. отправлять ajax-запросы на сервер?

так какое-же всё-таки использовать событие при изменении размера окна: window.resize или form.resize?

То же самое и для перемещения - что использовать: form.move или window.move?

Link to comment
Share on other sites

3 minutes ago, x11 said:

т.е. отправлять ajax-запросы на сервер?

Да.

4 minutes ago, x11 said:

window.resize

Зависит от UniServerModule.MainFormDisplayMode.

5 minutes ago, x11 said:

form.resize

Срабатывает всегда.

  • Like 1
Link to comment
Share on other sites

И автоматизировать это никак нельзя?

Я имею ввиду что, что это всё не зависело от uniAlignmentClient. Ну просто зашить это в исходники и всё на этом.

Link to comment
Share on other sites

Проблема с 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;

Проблема в том, что как только окно открывается, то оно "сжимается" и выглядит вот так:

Screenshot_3.jpg

Link to comment
Share on other sites

Проблема в том, что событие в бразуере срабатывает много раз.

Я окно мышкой не трогаю. Но событие срабатывает.

Link to comment
Share on other sites

Just now, x11 said:

Проблема в том, что событие в бразуере срабатывает много раз.

Я окно мышкой не трогаю. Но событие срабатывает.

Чтобы воспроизвести проблемный случай, пожалуйста, создайте тестовый случай...

Link to comment
Share on other sites

Теперь другая проблема. Сохраняю такого размера, как на картинке 1, а восстанавливается как на картинке 2.

Я так подразумеваю, что размер формы не учитывает заголовок? Или в чем-то другом проблема?

Screenshot_1.jpg

Screenshot_2.jpg

Link to comment
Share on other sites

Да, еще проблема с размерами.

По ширине и по высоте размеры не совпадают.

Т.е. js-форма не совпадает по размерам с vcl-формой.

Но ведь такой проблемы в случае с uniAlignmentServer нет. Получается, что разработчики uniGUI знают какой-то секрет, если размеры форм совпадают при uniAlignmentServer?

Link to comment
Share on other sites

вот мой код 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

10 hours ago, x11 said:

Да, еще проблема с размерами.

По ширине и по высоте размеры не совпадают.

Т.е. js-форма не совпадает по размерам с vcl-формой.

Если значение MainFormDisplayMode установлено по умолчанию (mfWindow), то используйте window.resize.

Да Вы правы, так как размеры form, меньше window. 

Link to comment
Share on other sites

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

Спасибо. Так лучше.

 

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]);
}

 

  • Upvote 1
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...