Вопрос пользователя связан с необычным поведением компонентов 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 и установленными последними драйверами.
Шаги для воспроизведения проблемы:
Разместить TActionManager и TActionMainMenuBar на форме.
Наблюдать, как все предопределенные настройки исчезают (нужно закрыть 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.