Ошибка в вызове, чтобы переопределить ShowModal при показе модального - PullRequest
0 голосов
/ 05 марта 2019

Я работаю с модальной формой, которая отображается в полноэкранном режиме.Мне удается сделать это путем переопределения виртуального ShowModal() метода.

function TfrmComptoir.ShowModal: Integer;
begin
  FullScreen := ReadFromIni('Config.ini', Self.Name, 'FullScreen', False);
  if FullScreen then
  begin
    BorderStyle := bsNone;
    WindowState := wsMaximized;
    width := Screen.Width;
    Height := Screen.Height;
  end else
  begin
    BorderStyle := bsSizeable;
    WindowState := wsMaximized;
  end;

  Result := inherited;
end;

Это процедура, в которой я показываю форму:

procedure TfrmPrincipal.btnComptoirClick(Sender: TObject);
begin
  frmComptoir := TfrmComptoir.Create(nil);
  try
    frmComptoir.ShowModal;
  finally
    FreeAndNil(frmComptoir);
  end;
end;

В моей модальной форме у меня естькнопка, чтобы позволить пользователю переключаться между полноэкранным и нормальным режимом.Здесь проблема.Я не могу вызвать метод ShowModal() снова, так как получаю ошибку:

не может сделать видимое окно модальным

Что я могу сделать, чтобы это исправить?

1 Ответ

3 голосов
/ 05 марта 2019

Вы не можете позвонить ShowModal(), пока форма уже отображается.В отличие от Show(), ShowModal() можно вызывать только один раз за раз, форма должна быть закрыта до вызова ShowModal().

Вместо этого вы можете переместить код изменения свойств всобственный метод, а затем вызовите этот метод внутри ShowModal() и обработчика кнопки OnClick, например:

function TfrmComptoir.ShowModal: Integer;
begin
  SetFullScreen(ReadFromIni('Config.ini', Self.Name, 'FullScreen', False));
  Result := inherited;
  WriteToIni('Config.ini', Self.Name, 'FullScreen', FullScreen);
end;

procedure TfrmComptoir.Button1Click(Sender);
begin
  SetFullScreen(not FullScreen);
end;

procedure TfrmComptoir.SetFullScreen(Value: Boolean);
begin
  FullScreen := Value;
  if FullScreen then
  begin
    BorderStyle := bsNone;
    WindowState := wsMaximized;
    Width := Screen.Width;
    Height := Screen.Height;
  end
  else
  begin
    BorderStyle := bsSizeable;
    WindowState := wsMaximized;
  end;
end;
...