Обработка копирования компонента из одной формы в другую в Delphi

Написание собственного компонента Delphi VCL, унаследованного от TComponent, с набором свойств, которые должны быть уникальными для формы владельца компонента. Когда я копирую компонент из одной формы в другую (с помощью простых Ctrl+C, Ctrl-V), все свойства также копируются. Любые идеи о том, где (или как) я могу обработать копирование или вставку компонента в форму и очистить скопированные значения (или установить их по умолчанию)? На данный момент я пришел к идее сохранить имя формы владельца компонента (или другое уникальное свойство) в специальном свойстве компонента и сравнить его с фактическим именем владельца в методе Loaded компонента. Может есть способ попроще или изящнее?

1 ответ

Решение

Решение нашел сам. Это своего рода взлом, но тем не менее он работает.

Прежде всего, когда мы копируем компонент, Delphi копирует только опубликованные свойства - они записываются в файл dfm. Правильнее сказать, что Delphi скопирует реализацию компонента в формате dfm. В этом легко убедиться, скопировав компонент и вставив его в Блокнот. Итак, теперь мы можем использовать буфер обмена, чтобы проанализировать его во вновь вставленном экземпляре нашего компонента и решить, очищать ли свойства или нет (или делать что-то еще).

Небольшой пример такой проверки - процедура, анализирующая значения в буфере обмена на соответствие текущему компоненту:

function CheckClipboard:boolean;
begin
 try
  if (pos('object', Clipboard.AsText) <> 0)
    and (pos('object', Clipboard.AsText) < pos('TComponent', Clipboard.AsText))
    and (pos('TComponent', Clipboard.AsText) < pos(#13#10, Clipboard.AsText))
    and (pos(#13#10, Clipboard.AsText) < pos('end', Clipboard.AsText))
    and (TForm(Owner).Showing) then //This is for the function to not execute when the owner form is created or opened
       Result:=true
  else
    Result := false;
 except
  on E : Exception do
  begin
   MessageDlg('Clipboard error: '+E.Message, mtError, mbOKCancel, 0);
   Result := false;
  end;
 end;
end;

Он возвращает true, если буфер обмена содержит такой компонент, и false, если нет. Я использую его в методе Loaded моего компонента.

Другие вопросы по тегам