• 0
Авторизация  
AlexG

FMX TTaskbar

Вопросы

Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.

Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".

Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.

Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

  • 0
6 часов назад, AlexG сказал:

Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.

Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".

Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.

Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?

Самое очевидное, посмотреть как реализован TTaskBar и сделать аналог для FMX, или сильно урезанный аналог с необходимым вам функционалом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Самое простое решение ("на коленке"):

uses
  ...
  {$IFDEF MSWINDOWS}
  System.Win.ComObj,
  Winapi.ShlObj,
  {$ENDIF}
  ...
//-------------------------------------------------
type
  TTaskBarState = record
    name : string;
    value : byte;
  end;

  TFMXTaskBar = class(TPersistent)
  private
    fTaskBarList : ITaskBarList3;
    fTaskBarState : integer;
    fTaskBarProgress : integer;
    fAlertState : Boolean;
    procedure setTaskBarState(newState:integer);
    procedure setTaskBarProgress(newValue : integer);
    procedure setAlertState(const Value: Boolean);
  protected
  public
    property AlertState: Boolean read fAlertState write setAlertState;
    property TaskBarState : integer read fTaskBarState write setTaskBarState;
    property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress;
    constructor Create;
    destructor Destroy; override;
  end;
//-------------------------------------------------

const
  taskStates : array [0..4] of TTaskBarState = (
            (name: 'TBPF_NOPROGRESS';    value: TBPF_NOPROGRESS),
            (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE),
            (name: 'TBPF_NORMAL';        value: TBPF_NORMAL),
            (name: 'TBPF_ERROR';         value: TBPF_ERROR),
            (name: 'TBPF_PAUSED';        value: TBPF_PAUSED));
//-------------------------------------------------
var
  MainTaskBar: TFMXTaskBar;
//-------------------------------------------------

{ TFMXTaskBar }

constructor TFMXTaskBar.Create;
var
  tbList : ITaskBarList;
  hr : HRESULT;
begin
  tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList;
  hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList);
  if hr <> S_OK then
  begin
    fTaskBarList := nil;
    tbList._Release;
  end;
end;

destructor TFMXTaskBar.Destroy;
begin

  inherited;
end;

procedure TFMXTaskBar.setAlertState(const Value: Boolean);
begin
  if assigned(fTaskBarList) then
    if fAlertState <> Value then
    begin
      fAlertState := Value;

      if Value then
      begin
        setTaskBarState(3);       // TBPF_ERROR
        setTaskBarProgress(100);
      end else
      begin
        setTaskBarState(0);
        setTaskBarProgress(0);
      end;
    end;
end;

procedure TFMXTaskBar.setTaskBarProgress(newValue: integer);
begin
  if assigned(fTaskBarList) then
    fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100);
end;

procedure TFMXTaskBar.setTaskBarState(newState: integer);
begin
  if assigned(fTaskBarList) then
    fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value);
end;
//-------------------------------------------------

initialization
  MainTaskBar := TFMXTaskBar.Create;

finalization
  if Assigned(MainTaskBar) then
    FreeAndNil(MainTaskBar);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

Авторизация  

  • Похожий контент

    • От Вадим Смоленский
      Разрабатывая свою софтину, о сенсорных экранах я совсем не думал (отстал от прогресса). Но один тестер сейчас погонял текущую сборку на планшете. Оказалось, что почти всё работает хорошо, но в некоторых местах по нажатию пальцем отрабатывается не OnClick и не OnMouseUp, а почему-то OnMouseMove. Прежде чем изобретать велосипед, хочу спросить у знающих людей: а как вообще лучше организовывать работу с мышью/пальцем, чтобы она одинаково хорошо шла в обоих вариантах? Есть ли здесь четкие рекомендации? Вот, например, я вижу событие OnTap: стоит ли задействовать его? Или это только для мобильных платформ?
    • От YPOK5C
      Добрый день ! Кто подсказки почему при компиляции приложения под Андроид через USB выдаёт такие ошибки, при этом все apk файлы создаётся все они рабочие.  Unable to crete process unable to install Failure install failed update incompatible

    • От Вадим Смоленский
      В своем проекте (это японско-русский словарь) мне приходится выводить на TImage.Bitmap.Canvas хранящиеся в юникоде иероглифы, причем шрифт пользователь может выбрать сам. Столкнулся с неприятным явлением: разные шрифты располагают выводимый символ на разной высоте, в результате чего иероглиф часто не вписывается в предназначенную для него область. По умолчанию принят шрифт Tahoma, с ним всё хорошо:

      Но вот шрифт Yu Mincho:

      А вот, еще хлеще, Kozuka Gothic:

      Вопрос: что за параметр регулирует вертикальное смещение, можно ли его вынуть и с ним работать?
    • От zekelive
      Добрый день, товарищи. Если кто сталкивался, подскажите) в потоке создаются картинкив виде плиток и прочие компоненты и падают на scrollbox.  Но в runtime пролистывание лагает, да в целом вся программа подлагивает. Можно ли как то реализовать подгрузка в фоне без ущерба? Или может ещё какой способ есть?
    • От Вадим Смоленский
      Некоторые юзеры (видимо, из близоруких) прибегают к масштабированию экрана и требуют, чтобы ваше приложение тоже масштабировалось. Когда мой проект был в VCL, я смотрел на параметр Screen.PixelsPerInch и учитывал его значение в своем коде. В FireMonkey этого нет. Я пытался понять, как это делать теперь, и окончательно запутался. Microsoft на официальном сайте упоминает функцию SystemParametersInfo с параметром SPI_GETLOGICALDPIOVERRIDE, но делает оговорку, что такую конфигурацию лучше не использовать - дескать, в новых версиях Windows она не будет работать. Взамен рекомендуют функцию GetScaleFactorForDevice, но тут же заявляют, что под Windows 8 и она работать не будет, а будет работать только GetScaleFactorForMonitor. Голова кругом. Нет ли у кого, случаем, готового решения, которое работало бы на любых Windows - хотя бы от семерки до десятки?
      Еще один момент, который я не могу понять - в Windows 10 в настройках экрана, помимо масштаба в процентах, можно выбирать еще и разрешение в пикселях. По-моему, раньше такого разделения не было, хотя могу ошибаться. Связаны ли эти настройки друг с другом? И как они соотносятся со старым добрым DPI?
    • От Вадим Смоленский
      Работая в Berlin, подправил стиль для одного компонента посредством вызова "Edit Custom Style" во всплывающем меню. Потом перешел на Tokyo; потом поменял компьютер и установил на него Tokyo заново. Сейчас вижу, что компонент отображается в стиле по умолчанию. Никаких сообщений по поводу пропавшего стиля не припомню. Где мне найти и как опять подключить мой отредактированный стиль?
    • От Вадим Смоленский
      В своем проекте (это японско-русский словарь) я часто вывожу текст на TImage методом TCanvas.FillText, и результат выглядит так:

      Один из тестеров, у которого установлена Windows XP, прислал скриншот того, что выводится у него:

      Ровно такую же безобразную картину я видел у себя, когда, экспериментируя с быстродействием, вставлял в файл dpr операторы  FMX.Types.GlobalUseDX:=False или FMX.Types.GlobalUseDirect2D:=False
      То ли в XP эти установки приняты по умолчанию, то ли так сконфигурирована система у тестера. Первое, что приходит в голову - вставить в код присвоение обеим упомянутым переменным значения True. Но прежде, чем предпринять такую попытку, хотелось бы услышать мнение экспертов. В чем здесь корень зла?
    • От Вадим Смоленский
      Записываю русский текст в файл:
      procedure WriteToFile; var F: TextFile; S: string; begin S:='Русский текст'; AssignFile(F,MyFile.txt'); ReWrite(F); WriteLn(F,S); CloseFile(F); end; Тип данных string - по идее, то же, что WideString. То бишь, в строку S записан юникод. Тем не менее, открывая потом файл, вижу, что русский текст сохранен в ANSI. Как добиться его сохранения в юникоде?
    • От Виталий Иванов
      Ошибка при запуске программы на отладку:
       
      "
      Can't open socket: Permission denied 
      Exiting
      .
      "
       
      кто знает как побороть ? 
       
      Отладку запускаю на OnePlus3 с Android 8.0.0, драйвера Google USB переустанавливал. 

    • От Вадим Смоленский
      Писал на Delphi 10.2 Tokyo под Windows. У тестеров приложение валится при первой же попытке обращения к БД с сообщением "unable to open database file". У меня на компе всё нормально. Файл sqlite3.dll версии 3.21.0.0 в дистрибутив включен, кладется рядом с исполнимым файлом. Что может быть не так?
  • Последние посетители   0 пользователей онлайн

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