Winston_D Ответов: 4

Не может сделать видимым модальное окно об ошибке, используя форму.метод showmodal'


Я пытаюсь создать мультиформное приложение, имея только основную форму, созданную при запуске, и создавая каждую новую дополнительную форму динамически по мере необходимости, создавая этот объект формы, используя его в качестве модального, и как только цель этой формы завершена, она освобождается из памяти после ее закрытия. Только моя основная форма "автоматически создана", все дополнительные формы установлены как "доступные" в параметрах проекта.

Вот пример кода.

форма результатов объявляется как глобальная переменная TResultForm.
procedure TMainForm.Button1Click(Sender: TObject);
begin
  ResultsForm := TResultForm.Create(self);
  try
    ResultsForm.ShowModal;
  finally
    ResultsForm.Free;
  end;
end;


В тот момент, когда я вызываю этот метод, нажав на кнопку, я получаю сообщение об ошибке:

- Не могу сделать видимое окно модальным.

На этой форме (ResultsForm) У меня есть базы данных, связанные с этой формой и отображаемые на экране. Код для этого работает, никаких проблем. После попытки использовать этот новый пример кода, полученный из справочного инструмента Embarcadero, загружаются только элементы управления новой формы (ResultsForm), а явно добавленный код в этой форме не инициируется.

4 Ответов

Рейтинг:
34

Winston_D

Кто-то показал мне, что есть только один маленький ключ, который я не сделал. Код:

Обратите внимание, что ResultForm может быть объявлена как глобальная переменная TResultForm или как локальная переменная. Хотя пока не уверен, что разница возникнет позже.

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ResultsForm := TResultForm.Create(self);
  try
    ResultsForm.ShowModal;
  finally
    ResultsForm.Free;
  end;
end;

для динамического создания новой формы это звучит разумно, но следует обратить внимание на то, что динамически созданная форма должна иметь свою видимость, установленную в FALSE. Иначе ошибка вроде:

- Не могу сделать видимое окно модальным.

появиться.

Наверное, это кажется очень логичным, надеюсь, никто больше не совершит такой же глупой ошибки!


Member 14705295

Это была именно моя проблема, спасибо!

Рейтинг:
14

Richard MacCutchan

Я думаю, что послание достаточно ясно. Модальный диалог используется как временное окно, которое появляется и либо отображает некоторую информацию, либо запрашивает ввод от пользователя. Он не должен быть глобальным объектом, а создаваться только при необходимости и уничтожаться после использования. Из вашего описания кажется, что вы пытаетесь использовать существующее окно и каким-то образом сделать его модальным.


Winston_D

Чтобы прояснить мою ситуацию. Результирующая форма создается только тогда, когда она необходима для получения результатов, и уничтожается сразу же после ее закрытия. Так что это временно. Даже если я объявляю ResultForm как локальный объект (локально объявленная переменная), я все равно получаю одно и то же сообщение об ошибке.

Если я использую метод "form.show "вместо". showmodal", у меня все равно появляется одно и то же сообщение об ошибке. Я использую модальный, потому что эта форма должна быть модальной.

Richard MacCutchan

Ты видел? это предложение?

Winston_D

спасибо за помощь

Рейтинг:
1

E.F. Nijboer

В случае, если пользователь закрывает модальную форму, она уже исчезла.

Удачи вам!


Рейтинг:
1

Member 10359545

function TMainForm.CreateModal(ModalForm: TFormClass): Integer;
begin
  with ModalForm.Create(Self) do
  try
    FormStyle := fsNormal;
    WindowState:=wsNormal;
    Hide;
    if (Self.Owner is TWinControlClass)and(Self.FormStyle=fsMDIChild) then
      begin//if Self is MDIChild then set positions by main window
        Top:=TWinControl(Self.Owner).Top+TWinControl(Self.Owner).Height-TWinControl(Self.Owner).ClientHeight+Self.Top;
        Left:=TWinControl(Self.Owner).Left+TWinControl(Self.Owner).Width-TWinControl(Self.Owner).ClientWidth+Self.Left;
      end
    else//if Self is MainWindow or sequence of ShowModal-Forms
      begin
        Top:=Self.Top;
        Left:=Self.Left;
      end;
    Width:=Self.Width;
    Height:=Self.Height;
    Result:=ShowModal;
  finally
    Free;
  end;
end;

Вызов
CreateModal(TResultForm);

Функция создаст вашу форму даже в ней MDIChild и вернет модальный результат.