Delphi Modal Форма позиции - PullRequest
3 голосов
/ 13 мая 2011

У меня есть форма, которая открывается другой формой.

Я установил Позицию как poOwnerFormCenter, чтобы новая форма открывалась там, где оригинал был

Однако, когда я перемещаю эту новую форму и затем возвращаюсь к оригиналу, она показывает, где она была, когда я впервые открывал новую форму, а не там, где я закрыл ее

Как бы это исправить?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 мая 2011

Я немного озадачен вашим вопросом, поэтому я уточню, что я здесь пытаюсь решить! ...

Я думаю, что вы пытаетесь сделать

Когда форма 2 открывается, она располагается по центру формы 1, а форма 1 скрыта.

Когда закрывается форма 2, отображается форма 1 (именно там, где она была спрятана).

Я думаю, что вы хотите сделать это, чтобы Form1 Show, где Form2 была закрыта.

Так что я предполагаю, что у вас есть какой-то код вроде ...

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Form2.ShowModal;
end;

и вы ожидали, что Form2 обновит позицию form1, потому что вы установили позицию Form2 на poOwnerFormCenter

Ну, если я угадал все это правильно, то все, что вам нужно сделать, чтобы обновить позицию Form1 при закрытии Form2, это

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Form2.ShowModal;
  Left := Form2.Left;
  Top := Form2.Top;
end;
1 голос
/ 13 мая 2011

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

Вариант 1

Вы можете уничтожать модальную форму каждый раз, когда она закрывается. Один из способов сделать это - использовать эту строку для события OnClose в форме:

Action = caFree;

Конечно, это означает, что вам необходимо каждый раз также воссоздавать модальную форму из вызывающей стороны.

Вариант 2

Вы должны вручную установить положение модальной формы для события OnShow.

Используйте вариант, который подходит вам больше всего.

1 голос
/ 13 мая 2011

Это (я думаю), потому что вы воссоздаете форму каждый раз, когда ее отображаете.То есть вы делаете

with TForm2.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;

Поскольку вы создаете новый экземпляр класса TForm2 каждый раз, когда вы его показываете, и уничтожаете его, когда форма закрыта, позиция меняется;действительно, новый объект TForm2 не может запомнить положение любого предыдущего объекта TForm2.Это два разных объекта (да, один и тот же класс, но это не имеет значения)!

Самое простое решение - добавить TForm2 в список «автоматического создания форм» в параметрах проекта.Он существует по умолчанию, но если вы создаете его вручную (как я думаю, и как в приведенном выше фрагменте кода), вы должны были удалить его из списка форм, которые создаются автоматически ...

Снимок экрана IDE http://privat.rejbrand.se/autocreateform.png

Затем убедитесь, что Unit1 использует Unit2, так что вы можете получить доступ к глобальной переменной Form2 в Unit2 из Form1, которая находится в Unit1,Во время редактирования Unit1 нажмите Alt + F11, чтобы сделать это.

Затем вы можете просто показать Form2, выполнив

Form2.ShowModal;

При первом показе он будет уважать егоPosition и расположите его над формой владельца.Но затем он запомнит свою позицию, поэтому во второй раз, когда вы отобразите его, он будет именно там, где он был закрыт в первый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...