Несколько форм с Firemonkey, показывая несколько элементов в меню Windows - PullRequest
4 голосов
/ 13 декабря 2011

Я сейчас экспериментирую с Firemonkey и столкнулся с этим.При наличии нескольких форм в моем приложении я получаю одинаковое количество элементов в строке меню Windows для одного приложения (см. Скриншот).

В обычных приложениях VCL только один элемент идентифицирует приложение (поэтому мойснимок экрана будет содержать только элемент «Form2».

Кто-нибудь знает, как я могу выполнить то же поведение, что и приложение VCL, поэтому только один элемент для моего приложения с несколькими формами ???

multiple items

Заранее спасибо!

Thijs

Редактировать: мне удалось показать вторую форму, только один элемент в нижнем меню, но свойство "Прозрачность"формы должно быть правдой!Таким образом, чтобы сделать вторую форму видимой, необходимо поместить TRectangle во вторую форму (рамка с надписью и кнопками не видна) ...

1 Ответ

3 голосов
/ 14 декабря 2011

Я нашел обходной путь к этому.

Когда вы создаете форму с владельцем, FireMonkey должен передать владельца в функцию Windows CreateWindowEx, но это не так.

В единице FMX.Platform.Win, в функции CreateWindow() измените это:

  Wnd := CreateWindowEx(ExStyle, WindowClass.lpszClassName, PChar(AForm.Caption), Style,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
    GetDesktopWindow, 0, hInstance, nil);

К этому:

  // If there's an owner, and it's a form, then create the window as a child
  if (AForm <> nil) and (AForm.Owner <> nil) and (AForm.Owner is TForm) then
  begin
    // Child window
    Wnd := CreateWindowEx(ExStyle, WindowClass.lpszClassName, PChar(AForm.Caption), Style,
      Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
      HandleToHWND(TForm(AForm.Owner).Handle), 0, hInstance, nil);
  end
  else
  begin
    // Desktop window
    Wnd := CreateWindowEx(ExStyle, WindowClass.lpszClassName, PChar(AForm.Caption), Style,
      Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
      GetDesktopWindow, 0, hInstance, nil);
  end;

Итак, если вы собираетесь создать дочернюю, особенно модальную форму, убедитесь, что вы назначаете родительскую форму в качестве владельца, когда создаете ее следующим образом:

MyModalForm := TMyModalForm.Create(MyParentForm);
MyModalForm.ShowModal;

Тогда все будет работать, как и ожидалось, после исправления.

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

...