Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы потери настроек `TActionMainMenuBar` и `TActionToolbar` в Delphi после запуска определенных приложений

Delphi , Интернет и Сети , Компоненты и Интернет

Вопрос пользователя связан с необычным поведением компонентов TActionMainMenuBar и TActionToolbar в среде разработки Delphi, при котором настройки этих компонентов теряются после запуска определенных приложений, таких как Photoshop CS5 или Internet Explorer 9. Пользователь столкнулся с проблемой, что цвета и шрифты, установленные в компонентах, исчезают после запуска указанных приложений, и просит помощи в решении данной проблемы.

Оригинальный заголовок:

TActionMainMenuBar и TActionToolbar теряют настройки

Описание проблемы (вопрос):

При использовании TActionMainMenuBar (или TActionToolBar) в программе, после компиляции и запуска, и последующего запуска Photoshop CS5 или Internet Explorer 9, настройки этих компонентов исчезают. Цвета, определенные в назначенной цветовой карте, и настройки шрифтов также теряются. Проблема наблюдается в средах разработки D2007 Pro и D2010 Pro, на операционной системе Vista Home Premium 32 bit, с видеокартой NVidia GForce 8600 GT и установленными последними драйверами.

Шаги для воспроизведения проблемы:

  1. Разместить TActionManager и TActionMainMenuBar на форме.
  2. Создать категорию с некоторыми пунктами меню.
  3. Перетащить категорию на ActionMainMenuBar.
  4. Назначить цветовую карту TwilightColorMap компоненту ActionMainMenuBar.
  5. Запустить программу.
  6. Запустить IE9 или Photoshop CS5.
  7. Наблюдать, как все предопределенные настройки исчезают (нужно закрыть IE9, чтобы увидеть эффект).

Подтвержденный ответ:

Проблема связана с обработкой сообщения WM_SETTINGCHANGE, которое может вызывать потерю настроек компонентов. В коде компонентов TActionMainMenuBar и TActionColorMap присутствует обработка этого сообщения, которая приводит к сбросу настроек.

Решение:

Создать производный класс для цветовой карты и переопределить метод UpdateColors, чтобы предотвратить сброс настроек при получении сообщения CM_WININICHANGE. Также необходимо сохранить исходные настройки шрифта в момент создания формы и восстанавливать их при получении сообщения WM_SETTINGCHANGE.

Пример кода:

type
  TTwilightColorMapCustom = class(actncolormaps.TTwilightColorMap)
  public
    procedure UpdateColors; override;
  end;

procedure TTwilightColorMapCustom.UpdateColors;
begin
  // Здесь можно оставить логику по восстановлению исходных цветов,
  // если это необходимо, или просто не вызывать базовый метод.
  // inherited;
end;

type
  TForm1 = class(TForm)
  private
    FSaveMenuFont: TFont; // Сохранение исходного шрифта главного меню
  protected
    procedure WMSettingChange(var Message: TWMSettingChange);
    message WM_SETTINGCHANGE;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FSaveMenuFont := TFont.Create;
  FSaveMenuFont.Assign(ActionMainMenuBar1.Font);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FSaveMenuFont.Destroy;
end;

procedure TForm1.WMSettingChange(var Message: TWMSettingChange);
begin
  inherited;
  // Восстанавливаем шрифт главного меню
  ActionMainMenuBar1.Font.Assign(FSaveMenuFont);
  // Восстанавливаем цветовую карту, если она была переопределена
  ActionMainMenuBar1.ColorMap.Assign(FSaveColormap);
end;

Также пользователь нашел решение, заключающееся в сохранении текущей цветовой карты и восстановлении её после получения сообщения WM_SETTINGCHANGE.

Альтернативный ответ:

Пользователь обнаружил, что проблема заключается в сбросе свойства ColorMap компонента ActionMainMenuBar1 на значение ActionMainMenuBar1.DefaultColormap каждый раз при запуске/закрытии IE9 или Photoshop CS5. Решением стало сохранение текущей цветовой карты и восстановление её после получения сообщения WM_SETTINGCHANGE.

Пример окончательного кода:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ...
  FSaveColormap := TTwilightColorMap.Create(Self);
  FSaveColormap.Assign(ActionMainMenuBar1.Colormap);
  // ...
end;

procedure TForm1.WMSettingChange(var Message: TWMSettingChange);
begin
  // ...
  ActionMainMenuBar1.ColorMap.Assign(FSaveColormap);
  // ...
end;

procedure TForm1.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar;
  AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
begin
  ActionMainMenuBar1.ColorMap.Assign(FSaveColormap);
end;

Этот код позволяет сохранить и восстановить настройки цветовой карты, что решает проблему потери настроек TActionMainMenuBar и TActionToolbar после запуска определенных приложений.

Заключение:

Проблема, с которой столкнулся пользователь, связана с обработкой системных сообщений в компонентах TActionMainMenuBar и TActionToolbar. Решение заключается в создании механизма для сохранения и восстановления настроек этих компонентов. Приведенные примеры кода демонстрируют, как можно реализовать такой механизм, используя Object Pascal (Delphi).

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой потери настроек компонентов `TActionMainMenuBar` и `TActionToolbar` в среде разработки Delphi после запуска определенных приложений, таких как Photoshop CS5 или Internet Explorer 9.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты и Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 07:07:42/0.0060029029846191/1