Редактор компонентов не сразу запрашивает сохранение новых значений свойств


У меня есть пользовательский элемент управления, который имеет редактор компонентов (два разных экрана, доступных через два разных пункта контекстного меню). В обоих этих случаях, когда я изменяю свойства редактируемого компонента, IDE не признает, что были внесены какие-либо изменения, и поэтому кнопка "Сохранить все" в IDE Delphi остается неактивной (предполагая, что она была неактивной до изменений).

Хотя изменения свойств явно были применены к управлению временем проектирования, если я сразу после запуска проекта изменения, внесенные в Редакторе компонентов, не были применены во время выполнения. Мне пришлось сделать незначительные изменения в конструкторе форм / инспекторе объектов, чтобы включить кнопку "Сохранить все", чтобы я действительно мог сохранить изменения.

Вот как я выполняю выбор контекстного меню:

TMyControlEditor происходит от TDefaultEditor

procedure TMyControlEditor.ExecuteVerb(Index: Integer);
begin
  case Index of
    0: begin
      ExecEditor;
    end;
    1: ...
  end;
end;

procedure TMyControlEditor.ExecEditor;
var
  F: TfrmMyControlEditor;
begin
  F:= TfrmMyControlEditor.Create(TMyControl(Component));
  try
    case F.ShowModal of
      mrOK: begin
        F.SaveTo(TMyControl(Component));
      end;
    end;
  finally
    F.Free;
  end;
end;

procedure TfrmMyControlEditor.SaveTo(ADst: TMyControl);
begin
  ADst.ThisProperty:= chkThisProperty.Checked;
  ADst.ThatProperty:= txtThatProperty.Text;
  ADst.Width:= seWidth.Value;
  ADst.Height:= seHeight.Value;
  ADst.Visible:= chkVisible.Checked;
  ... set other properties ...
end;
Это происходит даже со свойствами, которые я даже не повторно ввожу, такими как Visible или Width. Если я изменю какое-либо свойство от этот редактор свойств, он сразу же показывает мне, что изменение в Инспекторе объектов. Однако остальная часть IDE не признает, что что-то изменилось, и поэтому не дает мне возможности сохранить мои изменения.

Как заставить IDE подтвердить, когда были внесены изменения в свойства моего элемента управления?

1 2

1 ответ:

Комментарии для интерфейса IComponentEditor в DesignIntf.pas есть несколько советов:

Всякий раз, когда компонент изменяет, компонент должен вызывать Designer.Modified, чтобы сообщить проектировщику, что форма была изменена.

Есть некоторые опечатки, но суть ясна: ваш редактор компонентов должен вызвать Designer.Modified.