Вопрос, поднятый в обсуждении, касается динамического изменения свойств компонентов, унаследованных от TAction, в среде разработки Delphi IDE, и активации кнопки "Сохранить всё" при модификации этих свойств. Давайте разберём проблему и предложим решения.
Проблема
Пользователь создал кастомный класс TXAction, унаследованный от TActon, с дополнительными свойствами (ActionCode, ActionID и т.д.). В методе Load этого класса он пытается динамически изменять свойства (например, подставлять имя формы в ActionDescription), но IDE не отмечает эти изменения как требующие сохранения (кнопка "Сохранить всё" остаётся неактивной).
Почему так происходит?
Время вызова Load
Метод Load выполняется при загрузке формы, но IDE не всегда воспринимает изменения в нём как "грязные" (требующие сохранения).
Отсутствие уведомления дизайнера
Для активации кнопки "Сохранить всё" необходимо явно уведомить дизайнер формы о модификации. Это можно сделать через свойство Designer формы.
Решение 1: Использование Designer.Modified
procedure TXAction.Loaded;
var
aIXRBaseForm: IXRBaseForm;
Form: TForm;
begin
inherited;
if (csDesigning in ComponentAction) and (Owner <> nil) then
begin
if Supports(Owner, IXRBaseForm, aIXRBaseForm) then
begin
if ActionCode = ('.' + IntToStr(ActionID)) then
ActionCode := aIXRBaseForm.FormCode + ActionCode;
if (AnsiPos('[fn]', ActionDescription) > 0) and (aIXRBaseForm.FormName <> '') then
begin
ActionDescription := StringReplace(ActionDescription, '[fn]', aIXRBaseForm.FormName, [rfReplaceAll]);
// Уведомляем дизайнер
if Owner is TForm then
begin
Form := TForm(Owner);
if Assigned(Form.Designer) then
Form.Designer.Modified;
end;
end;
end;
end;
end;
Решение 2: Перехват изменения имени формы
Если нужно реагировать на изменение имени формы, можно переопределить метод SetName в базовой форме:
procedure TBaseForm.SetName(const NewName: String);
begin
inherited;
// Обновляем все связанные действия
UpdateActions;
end;
procedure TBaseForm.UpdateActions;
var
i: Integer;
Action: TXAction;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TXAction then
begin
Action := TXAction(Components[i]);
Action.ActionDescription := StringReplace(Action.ActionDescription, '[fn]', Self.Name, [rfReplaceAll]);
end;
if Assigned(Designer) then
Designer.Modified;
end;
Решение 3: Использование TComponentDesigner (для пакетов)
Если компонент используется в дизайнерском пакете, можно уведомлять дизайнер через TComponentDesigner:
uses
DesignIntf;
procedure NotifyDesigner(Component: TComponent);
var
Designer: IDesigner;
begin
if Assigned(Component) and (Component.DesignInfo <> 0) then
begin
Designer := GetComponentDesigner(Component);
if Assigned(Designer) then
Designer.Modified;
end;
end;
Важные замечания
Проверка csDesigning
Все изменения должны выполняться только в режиме дизайнера.
Дизайнер может быть не доступен
В некоторых случаях (например, при загрузке формы) Designer может быть nil. Это нормально.
Альтернативный подход
Если динамическое изменение не критично, можно просто заполнять свойства в коде при создании формы.
Вывод
Для активации кнопки "Сохранить всё" при модификации свойств в дизайнере необходимо явно уведомлять дизайнер о изменениях через вызов Designer.Modified. Лучше всего это делать в момент фактического изменения свойства, а не в Loaded.
Для сложных сценариев (например, отслеживание изменений имени формы) стоит использовать механизмы уведомлений или перехватывать соответствующие методы.
Изложите краткое описание проблемы, связанной с динамическим изменением свойств компонентов, унаследованных от TAction, в Delphi IDE, и активацией кнопки "Сохранить всё" при их модификации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.