Отключить или удалить дочернюю форму MDI, минимизировать и восстановить действия

Я хочу удалить или отключить кнопки внутри главного меню, которые управляют дочерней формой (свернуть, восстановить) моего приложения.

убрать кнопки в красном прямоугольнике

Приложение должно выглядеть как «браузер», в котором дочерние формы MDI должны постоянно оставаться развернутыми.

Я уже пытался отключить их, установив

BoderIcons := [biSystemMenu];

Но я получил это:

кнопки

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

procedure WMInitMenu(var Message: TWMInitMenu); message WM_INITMENU;

procedure TMyMDIChildForm.WMInitMenu(var Message: TWMInitMenu);
begin
  inherited;
  EnableMenuItem(Message.Menu, SC_MAXIMIZE, MF_BYCOMMAND or MF_GRAYED);
  EnableMenuItem(Message.Menu, SC_MINIMIZE, MF_BYCOMMAND or MF_GRAYED);
end;

Я использую:

  • Делфи 7.1 Корпоративная
  • Windows 7 Pro x64

person Beto Neto    schedule 01.10.2013    source источник
comment
Почему бы вам не использовать обычную форму и управление вкладками или страницами? Кажется, вам действительно не нужен MDI?   -  person Andrei Galatyn    schedule 01.10.2013
comment
Это устаревшее приложение... мы адаптируем его к новому пользовательскому интерфейсу с минимальным возможным воздействием.   -  person Beto Neto    schedule 01.10.2013


Ответы (4)


Вы в конечном итоге будете сражаться почти со всем, что делает MDI тем, чем он является. Вместо использования MDI рассмотрите возможность использования фреймов. Создайте потомка TFrame для представления одного экрана вашего пользовательского интерфейса. Вы можете поместить экземпляры на TPageControl, чтобы упростить их организацию. (Установите для свойства TabVisible каждой страницы значение false, если вы хотите предоставить свой собственный метод навигации между экранами.)

person Rob Kennedy    schedule 01.10.2013

Я решил, перехватив WM_COMMAND в MainForm, как показано в следующем коде:

type
  TMDIMainForm = class(TForm)
  protected
    procedure WMCommand(var Message: TWMCommand); message WM_COMMAND;
  end;

implementation

procedure TMDIMainForm.WMCommand(var Message: TWMCommand);
begin
  case Message.ItemID of
    SC_CLOSE, SC_MINIMIZE, SC_RESTORE, SC_MAXIMIZE:
      begin
        Message.Result := 0;
        Exit;
      end;
  else
    inherited;
  end;
end;

В дочерних формах я просто разместил это:

procedure TMDIChild.OnCreate(Sender: TObject);
begin
  WindowState := wsMaximized;
end;

Теперь мои дочерние MDI остаются максимальными, и пользователь не может восстановить или свернуть их.

person Beto Neto    schedule 09.10.2013

MDI - это именно механизм для того, чтобы from (дочерний) плавал внутри другой формы (родительской). Не вижу смысла постоянно максимизировать его.

Если вы хотите отделить код и разместить его в другом блоке, вы можете использовать фрейм (который можно вставить во время разработки или во время выполнения) или формы (используя что-то из следующего кода)

procedure TParentForm.FormCreate(ASender: TObject);
begin
  FEmbeddedForm := TEmbeddedForm.Create(self);
  FEmbeddedForm.Parent := Panel1;
  FEmbeddedForm.Align := alClient;
  FEmbeddedForm.BorderStyle := bsNone;
  FEmbeddedForm.Visible := True;
end; 
person Qsebas    schedule 01.10.2013

Почему-то принятый ответ у меня не работает. Вместо этого это работает для меня: MDIChildForm.BorderIcons := MDIChildForm.BorderIcons - [biSystemMenu];

person Silent Sojourner    schedule 12.08.2018