Перейти к содержанию
Fire Monkey от А до Я
  • 0

Несколько окон приложения в панели задач


AlexG

Вопрос

Раньше (в XE5), путем очень "мудрых" манипуляций, можно было сделать так, что несколько окон одного FMX-проекта (приложения) отображались в панели задач корректно (т.е. - как и другие приложения). Но теперь там ничего нет кроме одного значка главного окна приложения.

 

Вот и возникает соответствующий вопрос - как сделать так, чтобы каждое окно приложения имело значок на панели задач?

 

В качестве примера взял первое что "попалось под руку" - скайп. Так вот подобное невозможно в FMX-проекте (либо я чего-то не знаю...)

 

post-115-0-08606400-1409006022.png

 

Всякие свистопляски типа

{$IFDEF MSWINDOWS}
  Handle := WindowHandleToPlatform(AHandle).Wnd;
  SetWindowLong(Handle, GWL_EXSTYLE,
                GetWindowLong(Handle, gwl_exstyle) or WS_EX_APPWINDOW or WS_EX_ACCEPTFILES);
{$ENDIF}

ни к чему не приводят...

 

"Поможите, кто чем может!" (с)

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Как на счет такого варианта?

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Form2.Show;
end;

end.
unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

uses
  FMX.Platform.Win, Windows;

var
  FHandle: THandle;

procedure TForm2.FormCreate(Sender: TObject);
begin
   FHandle := WindowHandleToPlatform(Form2.Handle).Wnd;
   SetWindowLong(FHandle, GWL_EXSTYLE,
                 GetWindowLong(FHandle, gwl_exstyle) or WS_EX_APPWINDOW or WS_EX_ACCEPTFILES);
end;

end.

Demo.zip

Ссылка на комментарий
  • 0

Отлично!

Этот вариант работает.

Но работает он только в случае если форма имеет стандартные свойства.

Единственная не решенная проблема остается - когда форма Form2 имеет не стандарные свойства, например:

Transparency = True

или

BorderStyle = None

В этом случае нет нужного результата (т.е. не работает).

Хотя, думаю, стоит покрутить с параметрами SetWindowLong и GetWindowLong.

 

Есть у Вас на этот счет какие-нибудь готовые мысли?

Ссылка на комментарий
  • 0

Есть у Вас на этот счет какие-нибудь готовые мысли?

 

Есть, правда не знаю на сколько вас это устроит. При создании формы ручками ей стиль меняйте.

procedure TForm2.FormCreate(Sender: TObject);
begin
   FHandle := WindowHandleToPlatform(Form2.Handle).Wnd;
   SetWindowLong(FHandle, GWL_EXSTYLE,
                 GetWindowLong(FHandle, gwl_exstyle) or WS_EX_APPWINDOW or WS_EX_ACCEPTFILES);
   SetWindowLong(FHandle, GWL_STYLE,
                 GetWindowLong(FHandle, gwl_style) xor WS_THICKFRAME xor WS_POPUP xor WS_BORDER);
end;
Ссылка на комментарий
  • 0

Меня это вполне устроило бы, но никак не выходит. Либо я что-то упускаю в параметрах, либо что-то просто не работает.

Форма Form2  в моем случае имеет следующие свойства:

Border.Styling = False

BorderStyle = None

Transparency = True

Остальные значения свойств - стандартные.

 

P.S. Очень признателен Вам за оказанное внимание данной проблеме!

Ссылка на комментарий
  • 0

Вот Ваш же пример, но с добавленным на Form2 компонентом TCalloutPanel (просто в качестве примера).

Вот так должна выглядеть форма Form2 на рабочем столе (должен быть виден только один компонент TCalloutPanel).

post-115-0-68075600-1409042399.png

Но в данном случае в панели задач нет значка второй формы Form2.

 

Demo2.zip

Ссылка на комментарий
  • 0

Согласен ("не из простых")!

И ведь раньше (в XE5) это было возможно. А в XE6, не спорю - намного лучше все и стабильнее, но перестали работать некоторые вещи.

А главное - такое очень часто требуется (по крайней мере я часто с такими задачами сталкивался).

Изменено пользователем AlexG
Ссылка на комментарий
  • 0

Думаю это побочный эффект спешки. Вместо того, чтобы клепать по несколько релизов в год (включая апдейты), лучше бы делали по одному, и при этом больше времени уделяли тестированию. О чем говорить, если они целую вкладку в свойствах проекта потеряли http://fire-monkey.ru/topic/471-kuda-delas-vkladka-orientation/... Печально это, ведь нам, как конечным пользователям продукта, в первую очередь важно качество, а не количество...

Ссылка на комментарий
  • 0
   FHandle := WindowHandleToPlatform(Form2.Handle).Wnd;
   SetWindowLong(FHandle, GWL_EXSTYLE,
                 GetWindowLong(FHandle, gwl_exstyle) or WS_EX_APPWINDOW or WS_EX_ACCEPTFILES);

 

Этот код работает,только его надо переместить из обработчика события OnCreate в обработчик OnShow

Не знаю в чем проблема, но FHandle в этих событиях принимает разные значения и, как я понял, правильный именно в FormShow.

 

Как это работает можно посмотреть в приложении Clip2net (написано на Delphi XE6)

iYbCad.jpg

Ссылка на комментарий
  • 0
  • Администраторы

Здорово, я с вашего позволения опубликую ваше приложение в разделе Приложения, написанные с использованием FireMonkey

 

Хорошая работа.

Ссылка на комментарий
  • 0

Здорово, я с вашего позволения опубликую ваше приложение в разделе Приложения, написанные с использованием FireMonkey

 

Хорошая работа.

Публикуйте, конечно.

Спасибо за хороший отзыв.

Ссылка на комментарий
  • 0

Спасибо за ответ.

Действительно (как отметил Ярослав) - очень интересно видеть реальные и рабочие приложения написанные с использованием FMX.

Несколько уточняющих вопросов, так как мне так и не удалось добиться нужного результата в данном вопросе:

- где именно Вы используете данный код, при создании главной формы, второстепенных форм?

- что Вы пишете в событии OnCreate?

- до или после inherited в OnShow?

- какие свойства имеют формы? (Border; BorderIcons; BorderStyle; FormStyle; Transparency)

 

Повторюсь - вопросы возникли только потому, что все работает очень странно. Точнее-говоря не работает...

Если прописать это в главной форме, то появляется дулирующее "окно" в панели задач. Если во вторичных формах, то эффекта нет до тех пор, пока мы не "свернем" и "развернем" приложение. И т.д.

В общем - очень "глючное" поведение. Но я это связываю не с FMX в конкретном случае, а скорее-всего с непонимаем - где и как именно с этим работать.

 

Заранее благодарен за ответ!

Ссылка на комментарий
  • 0

Приложение убрано из панели задач

Свойства формы:

BorderStyle = None

Transparency = True

 

Немного поэкспериментировав нашел лучший способ:
...
TMyForm = class(TForm)
...
protected
    procedure CreateHandle; override;
...
end;
...
procedure TMyForm.CreateHandle;
begin
  inherited CreateHandle;

  SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE,
    GetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE) or WS_EX_APPWINDOW);
end;
...
end.
Этот код вставлять нужно в каждой форме, которую Вы хотите отобразить на панели задач
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...